MPAS | FDDA

Links

  1. https://mpas-dev.github.io/
  2. /MPAS-Model/releases
  3. MPAS-Atmosphere Users' Guide V4.0
  4. MPAS-Atmosphere Users' Guide V5.3
  5. MPAS-Atmosphere Users' Guide V6.3
  6. MPAS-Atmosphere Users' Guide V7.0
  7. MPAS-Atmosphere Users' Guide V8.2.0
  8. Joint WRF/MPAS Users Workshop 2024

References

MPAS-Release-4.0_plusFDDA.tar.gz

  • https://doi.org/10.5281/zenodo.1101204
  • ./core_atmosphere/Registry.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <var name="rthfddaten"/>
    <var name="rqvfddaten"/>
    <var name="rufddaten"/>
    <var name="rvfddaten"/>
    <var name="th_fdda_old"/>
    <var name="qv_fdda_old"/>
    <var name="u_fdda_old"/>
    <var name="v_fdda_old"/>
    <var name="th_fdda_new"/>
    <var name="qv_fdda_new"/>
    <var name="u_fdda_new"/>
    <var name="v_fdda_new"/>

mpas_stream_manager.F

  • MPAS_stream_mgr_get_property
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
interface MPAS_stream_mgr_get_property
module procedure MPAS_stream_mgr_get_property_int
module procedure MPAS_stream_mgr_get_property_char
module procedure MPAS_stream_mgr_get_property_logical
end interface

!-----------------------------------------------------------------------
! routine MPAS_stream_mgr_get_property_int
!
!> \brief Gets a property of a stream in an MPAS stream manager.
!> \author Michael Duda, Doug Jacobsen
!> \date 13 June 2014
!> \details
!> Retrieves the value of a stream property within an MPAS stream manager.
!> NOTE: This routine does not support streamID regular expressions
!
!-----------------------------------------------------------------------
subroutine MPAS_stream_mgr_get_property_int(manager, streamID, propertyName, propertyValue, direction, ierr)

./core_atmosphere/physics/mpas_atmphys_fdda.F

  • Author comments,
    • !> * Modified to only require reads of "fdda_new" data arrays. "fdda_old" is initially set to initial conditions. At end of FDDA data interval, "fdda_old" is set to "fdda_new" and updated "fdda_new" data comes from FDDA input stream. By O. Russell Bullock Jr. (bullock.russell@epa.gov) / 2016-08-30.

and then,

  • Assign value
1
2
3
4
5
6
7
8
9
10
11
12
call mpas_pool_get_array(fdda,'qv_fdda_old',qv_fdda_old)
call mpas_pool_get_array(fdda,'th_fdda_old',th_fdda_old)
call mpas_pool_get_array(fdda,'u_fdda_old', u_fdda_old )
call mpas_pool_get_array(fdda,'v_fdda_old', v_fdda_old )
call mpas_pool_get_array(fdda,'qv_fdda_new',qv_fdda_new)
call mpas_pool_get_array(fdda,'th_fdda_new',th_fdda_new)
call mpas_pool_get_array(fdda,'u_fdda_new', u_fdda_new )
call mpas_pool_get_array(fdda,'v_fdda_new', v_fdda_new )
call mpas_pool_get_array(tend_physics,'rthfddaten',rthfddaten)
call mpas_pool_get_array(tend_physics,'rqvfddaten',rqvfddaten)
call mpas_pool_get_array(tend_physics,'rufddaten' ,rufddaten )
call mpas_pool_get_array(tend_physics,'rvfddaten' ,rvfddaten )
  • No need to generate first time step and obtained FDDA value from init.nc
1
2
3
4
5
6
7
8
!check to see if 'old' FDDA target values need to be defined from initial conditions
if(first_call .and. .not. config_do_restart) then
qv_fdda_old = qv
th_fdda_old = theta_m / (1._RKIND + rvrd * qv)
u_fdda_old = u
v_fdda_old = v
first_call = .false.
endif
  • define the FDDA target data interval, tfrac
1
2
!calculate time fraction within FDDA target data interval
tfrac = mod(xtime_s,fdda_int)/fdda_int
  • take t_target as example,
1
2
3
4
5
6
7
8
9
10
11
12
13
case("analysis")

DO i=its,ite
DO k=kts,kte

theta_p = theta_m(k,i) / (1._RKIND + rvrd * qv(k,i))

if (fdda_t .and. k.gt.fdda_t_min_layer .and. (fdda_t_in_pbl .or. k.gt.kpbl(i))) then
t_target = (1.0-tfrac)*th_fdda_old(k,i)+tfrac*th_fdda_new(k,i)
rthfddaten(k,i) = fdda_t_coef * ( t_target - theta_p )
else
rthfddaten(k,i) = 0.
endif
  • update old by new if it is on the last time step.
1
2
3
4
5
6
7
8
9
10
!check to see if this is the last time step within the current FDDA target data interval and 
!if so, save the current "new" targets as the "old" targets for the next time step
if(mod(xtime_s+config_dt,fdda_int)/fdda_int .lt. tfrac) then
th_fdda_old = th_fdda_new
qv_fdda_old = qv_fdda_new
u_fdda_old = u_fdda_new
v_fdda_old = v_fdda_new
endif

write(0,*) '--- exit apply_fdda'

Important issue

The value of fdda_old is set to fdda_new, and the updated fdda_new data is obtained from the FDDA input stream.

At t=0, the fdda_old values are sourced from init.nc, and an additional data entry is required for fdda_new. One straightforward approach is to read the FDDA input file 00.nc at t=0, which contains data for t=3 (or the next FDDA time) to serve as fdda_new.

For example,

Take FDDA time interval as 3 hours,

There is no real fdda.000.nc that contains FDDA data at t=0.

  • t=0, fdda_old from init.nc and fdda_new from fdda.000.nc that contains FDDA value at t=3.
  • t=3, fdda_old from fdda.000.nc and fdda_new from fdda.003.nc that contains FDDA value at t=6.
  • t=6, fdda_old from fdda.003.nc and fdda_new from fdda.006.nc that contains FDDA value at t=9.
  • t=9, fdda_old from fdda.006.nc and fdda_new from fdda.009.nc that contains FDDA value at t=12.
  • ......
  • and no final time step FDDA file.

Therefore, we have to prepare the fdda.ttt.nc with ttt + Next FDDA time !!!

The purpose of this approach is to reduce storage usage.

  • The simple way is reading FDDA(\(t_0\)) ad \(t=t_0\), and no need to add time shift in code.
  • Anothher way is reading FDD(\(t_{next fdda time}\)) at \(t=t_0\), and no need to mismatch FDDA files with time shift.

Which one is better? Up to you. I like the second one la.

FDDA schemes

  • 'off'
  • 'analysis'
  • 'scaled'

WRF namelist

Steps to run analysis nudging in WRF-ARW:

  1. Set up the analysis nudging fdda namelist. Carefully read test/em_real/README.namelist file to understand the meaning of each namelist variable in the FDDA section, which is also listed below:
&fdda
grid_fdda (max_dom)                 = 1        ; grid-nudging fdda on (=0 off) for each domain
                                    = 2        ; spectral nudging
gfdda_inname                        = "wrffdda_d<domain>" ; defined name in real
gfdda_interval_m (max_dom)          = 360      ; time interval (in min) between analysis times (must use minutes)
gfdda_end_h (max_dom)               = 6        ; time (in hours) to stop nudging after start of forecast
io_form_gfdda                       = 2        ; analysis data io format (2 = netCDF)
fgdt (max_dom)                      = 0        ; calculation frequency (minutes) for grid-nudging (0=every step)
if_no_pbl_nudging_uv (max_dom)      = 0        ; 1= no nudging of u and v in the pbl, 0=nudging in the pbl
if_no_pbl_nudging_t (max_dom)       = 0        ; 1= no nudging of temp in the pbl, 0=nudging in the pbl
if_no_pbl_nudging_q (max_dom)       = 0        ; 1= no nudging of qvapor in the pbl, 0=nudging in the pbl
if_zfac_uv (max_dom)                = 0        ; 0= nudge u and v in all layers, 1= limit nudging to levels above k_zfac_uv
k_zfac_uv (max_dom)                = 10       ; 10=model level below which nudging is switched off for u and v
if_zfac_t (max_dom)                 = 0        ; 0= nudge temp in all layers, 1= limit nudging to levels above k_zfac_t
k_zfac_t (max_dom)                 = 10       ; 10=model level below which nudging is switched off for temp
if_zfac_q (max_dom)                 = 0        ; 0= nudge qvapor in all layers, 1= limit nudging to levels above k_zfac_q
k_zfac_q (max_dom)                 = 10       ; 10=model level below which nudging is switched off for qvapor
guv (max_dom)                       = 0.0003   ; nudging coefficient for u and v (sec-1)
gt (max_dom)                        = 0.0003   ; nudging coefficient for temp (sec-1)
gq (max_dom)                        = 0.0003   ; nudging coefficient for qvapor (sec-1)
if_ramping                          = 0        ; 0= nudging ends as a step function, 1= ramping nudging down at end of period
dtramp_min                          = 60.0     ; time (min) for ramping function, 60.0=ramping starts at last analysis time, 
                                                                                 -60.0=ramping ends at last analysis time

The following are for spectral nudging:
fgdtzero (max_dom)                  = 0,       ; 1= nudging tendencies are set to zero in between fdda calls
if_no_pbl_nudging_ph                = 0,       ; 1= no nudging of ph in the pbl, 0= nuding in the pbl
if_zfac_ph (max_dom)                = 0,       ; 0= nudge ph in all layers, 1= limit nudging to levels above k_zfac_ph
k_zfac_ph (max_dom)                = 10,      ; 10= model level below which nudging is switched off for ph
dk_zfac_uv (max_dom)                = 1,       ; depth in k between k_zfac_X to dk_zfac_X where nudging increases 
                                                linearly to full strength
dk_zfac_t  (max_dom)                = 1,
dk_zfac_ph (max_dom)                = 1,
gph (max_dom)                       = 0.0003,
xwavenum (max_dom)                  = 3,       ; top wave number to nudge in x direction
ywavenum (max_dom)                  = 3,       ; top wave number to nudge in y direction

Defining spectral nudging wave number

  • Defining spectral nudging wave number | Aug 30, 2018
    • The wave number for spectral nudging is simply (domain width in x or y)/(wave length to be nudged), so if you would like to nudge any waves longer than 1000 km in your 6000 km domain, then your wave number would be 6.

Obs FDDA?

Any Observation FDDA in MPAS is in progress? No

In WRF,

US-EPA

  • Add 3-D grid analysis nudging FDDA to MPAS-A #995 | Oct 8, 2022
    • from jherwehe:atmosphere/develop-EPA_FDDA
    • This EPA_FDDA PR will add 3-D grid analysis nudging FDDA to MPAS-A as an option to assist in keeping retrospective simulations dynamically on track to improve evaluation against observations. This FDDA development for MPAS-A (Bullock et al., 2018) nudges temperature, humidity, and wind toward target values and is based on the comparable FDDA feature available in WRF, including MPAS-A versions of many of the WRF FDDA options. Enabling grid analysis nudging FDDA in MPAS-A maintains high fidelity to the reference fields while still conserving mass.
  • Add the Pleim-Xiu (P-X) LSM and FDDA to MPAS-A #1027 | Jan 26, 2023
    • from jherwehe:atmosphere/develop-EPA_PXLSM_with_FDDA
    • This EPA_PXLSM_with_FDDA PR will add the Pleim-Xiu land surface model codes (PR #1025) and the 3-D grid analysis nudging FDDA codes (PR #995) to MPAS-A.

MPAS | FDDA
https://waipangsze.github.io/2025/03/13/MPAS-FDDA/
Author
wpsze
Posted on
March 13, 2025
Updated on
May 22, 2025
Licensed under