Skip to content

Commit 6741f01

Browse files
authored
Add incremental analysis update capability (#2151)
TYPE: new feature KEYWORDS: data assimilation, incremental analysis update SOURCE: Min Chen of IUM/CMA and internal DESCRIPTION OF CHANGES: Add incremental analysis update capability. In the DA code, code is added to write out analysis increments for all variables in WRF netCDF format using auxiliary history output stream #5. In the model, analysis increments are divided by the number of time steps in a specified time window and added to the model similar to physics tendencies. The input stream for the model is 15. The capability is turned on by adding iau = 1 and iau_time_window_sec in &time_control. For example: ``` auxinput15_inname = "wrfiauinp_d01" io_form_auxinput15 = 2 auxinput15_interval = 360, iau = 1 iau_time_window_sec = 3600. ``` LIST OF MODIFIED FILES: M Registry/Registry.EM_COMMON.var M Registry/Registry.wrfvar M Registry/registry.em_shared_collection A Registry/registry.iau M dyn_em/module_em.F M dyn_em/module_first_rk_step_part2.F M phys/module_physics_addtendc.F M var/build/da.make M var/build/depend.txt M var/da/da_main/da_solve.inc M var/da/da_main/da_wrfvar_io.f90 M var/da/da_main/da_wrfvar_top.f90 A var/da/da_main/da_write_anaincrements.inc M var/da/da_transfer_model/da_transfer_xatowrf.inc TESTS CONDUCTED: The Jenkins tests have passed. RELEASE NOTE: This PR adds an incremental analysis update capability. In the DA code, code is added to write out analysis increments for all variables in WRF netCDF format using auxiliary history output stream #5. In the model, analysis increments are divided by the number of time steps in a specified time window and added to the model similar to physics tendencies. The input stream for the model is 15. The capability is turned on by adding iau = 1 and iau_time_window_sec in &time_control. The way the increments are added to the model is similar to what described by the paper by Chen et al. (https://doi-org.cuucar.idm.oclc.org/10.1175/WAF-D-22-0127.1).
1 parent 70855a7 commit 6741f01

14 files changed

+461
-8
lines changed

Registry/Registry.EM_COMMON.var

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,20 @@ state real QFX ij misc 1 - irh "Q
347347
state real REGIME ij misc 1 - irh "REGIME" "FLAGS: 1=Night/Stable, 2=Mechanical Turbulent, 3=Forced Conv, 4=Free Conv" ""
348348
state integer KPBL ij misc 1 - irh "KPBL" "LEVEL OF PBL TOP" ""
349349

350+
# Increment Output
351+
state real u_iau ijk dyn_em 1 X ih5 "U_IAU" "x-wind component inc" "m s-1"
352+
state real v_iau ijk dyn_em 1 Y ih5 "V_IAU" "y-wind component inc" "m s-1"
353+
state real t_iau ijk dyn_em 1 - ih5 "T_IAU" "potential temp inc" "K"
354+
state real w_iau ijk dyn_em 1 - ih5 "W_IAU" "z-wind component inc" "m s-1"
355+
state real qv_iau ijk dyn_em 1 - ih5 "QV_IAU" "water water mixing ratio inc" "kg kg-1"
356+
state real qc_iau ijk dyn_em 1 - ih5 "QC_IAU" "cloud water mixing ratio inc" "kg kg-1"
357+
state real qr_iau ijk dyn_em 1 - ih5 "QR_IAU" "rain water mixing ratio inc" "kg kg-1"
358+
state real qi_iau ijk dyn_em 1 - ih5 "QI_IAU" "ice water mixing ratio inc" "kg kg-1"
359+
state real qs_iau ijk dyn_em 1 - ih5 "QS_IAU" "snow water mixing ratio inc" "kg kg-1"
360+
state real qg_iau ijk dyn_em 1 - ih5 "QG_IAU" "graupel mixing ratio inc" "kg kg-1"
361+
state real ph_iau ijk dyn_em 1 - ih5 "PH_IAU" "perturbation geopotential inc" "m2 s-2"
362+
state real mu_iau ij dyn_em 1 - ih5 "MU_IAU" "dry air mass inc" "pa"
363+
350364
#
351365
#---------------------------------------------------------------------------------------------------------------------------------------
352366
#

Registry/Registry.wrfvar

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ state real - ijkft g_scalar 1 - - -
1010

1111
state real landmask ij misc 1 - i012rhd=(interp_fcnm)u=(copy_fcnm) "LANDMASK" "LAND MASK (1 FOR LAND, 0 FOR WATER)" ""
1212

13-
state real SST ij misc 1 - i01245rh05d=(interp_mask_water_field:lu_index,iswater) "SST" "SEA SURFACE TEMPERATURE" "K"
13+
state real SST ij misc 1 - i01245rd=(interp_mask_water_field:lu_index,iswater) "SST" "SEA SURFACE TEMPERATURE" "K"
1414

1515
# Registry entries that are exclusive to Registry.EM
1616

Registry/registry.em_shared_collection

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,5 @@ include registry.new3d_wif
2828
include registry.trad_fields
2929
include registry.solar_fields
3030
include registry.diags
31+
include registry.iau
3132
include registry.CMAQ

Registry/registry.iau

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# IAU variables
2+
3+
state character iau_time - - - - i{15}r "TIME_IAU" " " " "
4+
state real mu_iau ij misc 1 - i{15}r "MU_IAU" "mu analysis increments array" " "
5+
state real u_iau ikj misc 1 - i{15}r "U_IAU" "u analysis increments array" " "
6+
state real v_iau ikj misc 1 - i{15}r "V_IAU" "v analysis increments array" " "
7+
state real w_iau ikj misc 1 - i{15}r "W_IAU" "w analysis increments array" " "
8+
state real p_iau ikj misc 1 - i{15}r "P_IAU" "p analysis increments array" " "
9+
state real t_iau ikj misc 1 - i{15}r "T_IAU" "t analysis increments array" " "
10+
state real ph_iau ikj misc 1 - i{15}r "PH_IAU" "ph analysis increments array" " "
11+
state real qv_iau ikj misc 1 - i{15}r "QV_IAU" "qv analysis increments array" " "
12+
state real qr_iau ikj misc 1 - i{15}r "QR_IAU" "qr analysis increments array" " "
13+
state real qc_iau ikj misc 1 - i{15}r "QC_IAU" "qc analysis increments array" " "
14+
state real qs_iau ikj misc 1 - i{15}r "QS_IAU" "qs analysis increments array" " "
15+
state real qi_iau ikj misc 1 - i{15}r "QI_IAU" "qice analysis increments array" " "
16+
state real qg_iau ikj misc 1 - i{15}r "QG_IAU" "qgraupel analysis increments array" " "
17+
18+
state real RUIAUTEN ikj misc 1 X r "RUIAUTEN" "X WIND TENDENCY DUE TO IAU" "m s-2"
19+
state real RVIAUTEN ikj misc 1 Y r "RVIAUTEN" "Y WIND TENDENCY DUE TO IAU" "m s-2"
20+
state real RTHIAUTEN ikj misc 1 - r "RTHIAUTEN" "THETA TENDENCY DUE TO IAU" "K s-1"
21+
state real RPHIAUTEN ikj misc 1 - r "RPHIAUTEN" "GEOPOTENTIAL TENDENCY DUE TO IAU" "m2 s-3"
22+
state real RQVIAUTEN ikj misc 1 - r "RQVIAUTEN" "Q_V TENDENCY DUE TO IAU" "kg kg-1 s-1"
23+
state real RQCIAUTEN ikj misc 1 - r "RQCIAUTEN" "Q_C TENDENCY DUE TO IAU" "kg kg-1 s-1"
24+
state real RQRIAUTEN ikj misc 1 - r "RQRIAUTEN" "Q_R TENDENCY DUE TO IAU" "kg kg-1 s-1"
25+
state real RQIIAUTEN ikj misc 1 - r "RQIIAUTEN" "Q_I TENDENCY DUE TO IAU" "kg kg-1 s-1"
26+
state real RQSIAUTEN ikj misc 1 - r "RQSIAUTEN" "Q_S TENDENCY DUE TO IAU" "kg kg-1 s-1"
27+
state real RQGIAUTEN ikj misc 1 - r "RQGIAUTEN" "Q_G TENDENCY DUE TO IAU" "kg kg-1 s-1"
28+
state real RMUIAUTEN ij misc 1 - r "RMUIAUTEN" "MU TENDENCY DUE TO IAU" "Pa s-1"
29+
30+
# IAU namelist options
31+
32+
rconfig integer iau namelist,time_control max_domains 0 irh "analysis increments read" "0/1 ACTIVATE FOR ANALYSIS INCREMENTS UPDATES" ""
33+
rconfig real iau_time_window_sec namelist,time_control max_domains 3600. irh "iau_time_window_sec" "TIME WINDOW OF INCREMENTS ANALYSIS UPDATES" "SECONDS"
34+
35+
# IAU packages
36+
37+
package noiau iau==0 - -
38+
package iau iau==1 - state:u_iau,v_iau,w_iau,p_iau,t_iau,ph_iau,qqv_iau,qqr_iau,qqc_iau,qqs_iau,qqi_iau,qqg_iau,ruiauten,rviauten,rthiauten,rqviauten,rqciauten,rqriauten,rqiiauten,rqsiauten,rqgiauten

dyn_em/module_em.F

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2089,6 +2089,14 @@ SUBROUTINE calculate_phy_tend (config_flags,c1,c2, &
20892089
RQISHTEN,RQSSHTEN,RQGSHTEN, &
20902090
RUNDGDTEN,RVNDGDTEN,RTHNDGDTEN,RQVNDGDTEN, &
20912091
RMUNDGDTEN, &
2092+
ruiauten,rviauten,rthiauten, &
2093+
rqviauten,rqciauten,rqriauten, &
2094+
rqiiauten,rqsiauten,rqgiauten, &
2095+
rmuiauten,rphiauten, &
2096+
u_iau,v_iau,t_iau,ph_iau, &
2097+
mu_iau,qv_iau,qc_iau,qr_iau, &
2098+
qi_iau,qs_iau,qg_iau, &
2099+
itimestep, &
20922100
scalar, scalar_tend, num_scalar, &
20932101
tracer, tracer_tend, num_tracer, &
20942102
ids,ide, jds,jde, kds,kde, &
@@ -2163,16 +2171,52 @@ SUBROUTINE calculate_phy_tend (config_flags,c1,c2, &
21632171
REAL, DIMENSION( ims:ime, jms:jme ) , &
21642172
INTENT(INOUT) :: RMUNDGDTEN
21652173

2174+
! iau
2175+
REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
2176+
INTENT(INOUT) :: RUIAUTEN, &
2177+
RVIAUTEN, &
2178+
RTHIAUTEN, &
2179+
RPHIAUTEN, &
2180+
RQVIAUTEN, &
2181+
RQCIAUTEN, &
2182+
RQRIAUTEN, &
2183+
RQIIAUTEN, &
2184+
RQSIAUTEN, &
2185+
RQGIAUTEN
2186+
2187+
REAL, DIMENSION( ims:ime, jms:jme ), &
2188+
INTENT(INOUT) :: RMUIAUTEN
2189+
2190+
REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
2191+
INTENT(IN ) :: &
2192+
u_iau, &
2193+
v_iau, &
2194+
t_iau, &
2195+
ph_iau, &
2196+
qv_iau, &
2197+
qc_iau, &
2198+
qr_iau, &
2199+
qs_iau, &
2200+
qi_iau, &
2201+
qg_iau
2202+
2203+
REAL, DIMENSION( ims:ime, jms:jme ), &
2204+
INTENT(IN ) :: mu_iau
2205+
21662206
! 4d arrays
21672207

21682208
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme,num_tracer),INTENT(INOUT) :: tracer
21692209
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme,num_tracer),INTENT(INOUT) :: tracer_tend
21702210
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme,num_scalar),INTENT(INOUT) :: scalar
21712211
REAL ,DIMENSION(ims:ime,kms:kme,jms:jme,num_scalar),INTENT(INOUT) :: scalar_tend
21722212

2213+
INTEGER :: itimestep
21732214
INTEGER :: i,k,j, im
21742215
INTEGER :: itf,ktf,jtf,itsu,jtsv
21752216

2217+
! local
2218+
real :: wgt_iau
2219+
21762220
!-----------------------------------------------------------------------
21772221

21782222
!<DESCRIPTION>
@@ -2448,6 +2492,88 @@ SUBROUTINE calculate_phy_tend (config_flags,c1,c2, &
24482492
ENDDO
24492493
ENDDO
24502494

2495+
! IAU (Incremental Analysis Updates)
2496+
2497+
IF (config_flags%iau .gt. 0) THEN
2498+
2499+
wgt_iau = iau_coef(config_flags%iau_time_window_sec,config_flags%dt,itimestep)
2500+
2501+
DO J=jts,jtf
2502+
DO K=kts,ktf
2503+
DO I=its,itf
2504+
RUIAUTEN(I,K,J) =(c1(k)*mut(I,J)+c2(k))*U_IAU(I,K,J)*WGT_IAU
2505+
RVIAUTEN(I,K,J) =(c1(k)*mut(I,J)+c2(k))*V_IAU(I,K,J)*WGT_IAU
2506+
RTHIAUTEN(I,K,J)=(c1(k)*mut(I,J)+c2(k))*T_IAU(I,K,J)*WGT_IAU
2507+
RQVIAUTEN(I,K,J)=(c1(k)*mut(I,J)+c2(k))*QV_IAU(I,K,J)*WGT_IAU
2508+
ENDDO
2509+
ENDDO
2510+
ENDDO
2511+
2512+
DO J=jts,jtf
2513+
DO K=kts,ktf+1
2514+
DO I=its,itf
2515+
RPHIAUTEN(I,K,J)=PH_IAU(I,K,J)*WGT_IAU
2516+
ENDDO
2517+
ENDDO
2518+
ENDDO
2519+
2520+
DO J=jts,jtf
2521+
DO I=its,itf
2522+
RMUIAUTEN(I,J) =MU_IAU(I,J)*WGT_IAU
2523+
ENDDO
2524+
ENDDO
2525+
2526+
IF (P_QC .ge. PARAM_FIRST_SCALAR)THEN
2527+
DO J=jts,jtf
2528+
DO K=kts,ktf
2529+
DO I=its,itf
2530+
RQCIAUTEN(I,K,J)=(c1(k)*mut(I,J)+c2(k))*QC_IAU(I,K,J)*WGT_IAU
2531+
ENDDO
2532+
ENDDO
2533+
ENDDO
2534+
ENDIF
2535+
2536+
IF (P_QR .ge. PARAM_FIRST_SCALAR)THEN
2537+
DO J=jts,jtf
2538+
DO K=kts,ktf
2539+
DO I=its,itf
2540+
RQRIAUTEN(I,K,J)=(c1(k)*mut(I,J)+c2(k))*QR_IAU(I,K,J)*WGT_IAU
2541+
ENDDO
2542+
ENDDO
2543+
ENDDO
2544+
ENDIF
2545+
2546+
IF (P_QI .ge. PARAM_FIRST_SCALAR)THEN
2547+
DO J=jts,jtf
2548+
DO K=kts,ktf
2549+
DO I=its,itf
2550+
RQIIAUTEN(I,K,J)=(c1(k)*mut(I,J)+c2(k))*QI_IAU(I,K,J)*WGT_IAU
2551+
ENDDO
2552+
ENDDO
2553+
ENDDO
2554+
ENDIF
2555+
2556+
IF(P_QS .ge. PARAM_FIRST_SCALAR)THEN
2557+
DO J=jts,jtf
2558+
DO K=kts,ktf
2559+
DO I=its,itf
2560+
RQSIAUTEN(I,K,J)=(c1(k)*mut(I,J)+c2(k))*QS_IAU(I,K,J)*WGT_IAU
2561+
ENDDO
2562+
ENDDO
2563+
ENDDO
2564+
ENDIF
2565+
2566+
IF(P_QG .ge. PARAM_FIRST_SCALAR)THEN
2567+
DO J=jts,jtf
2568+
DO K=kts,ktf
2569+
DO I=its,itf
2570+
RQGIAUTEN(I,K,J)=(c1(k)*mut(I,J)+c2(k))*QG_IAU(I,K,J)*WGT_IAU
2571+
ENDDO
2572+
ENDDO
2573+
ENDDO
2574+
ENDIF
2575+
2576+
ENDIF
24512577

24522578
END SUBROUTINE calculate_phy_tend
24532579

@@ -3018,4 +3144,22 @@ subroutine trajmapproj (grid,config_flags,ts_proj)
30183144

30193145
end subroutine trajmapproj
30203146

3147+
FUNCTION iau_coef (iau_time_window_sec, dt, itimestep) result(wgt_iau)
3148+
3149+
implicit none
3150+
3151+
! This function returns the coeficient for IAU
3152+
3153+
INTEGER :: itimestep
3154+
INTEGER :: nsteps_iau
3155+
REAL :: wgt_iau, iau_time_window_sec, dt
3156+
3157+
wgt_iau = 0.
3158+
nsteps_iau = nint(iau_time_window_sec / dt)
3159+
if (itimestep <= nsteps_iau) then
3160+
wgt_iau = 1.0/iau_time_window_sec
3161+
endif
3162+
3163+
END FUNCTION iau_coef
3164+
30213165
END MODULE module_em

dyn_em/module_first_rk_step_part2.F

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,14 @@ SUBROUTINE first_rk_step_part2 ( grid , config_flags &
402402
grid%rqishten,grid%rqsshten,grid%rqgshten, &
403403
grid%RUNDGDTEN,grid%RVNDGDTEN,grid%RTHNDGDTEN,grid%RQVNDGDTEN, &
404404
grid%RMUNDGDTEN, &
405+
grid%ruiauten,grid%rviauten,grid%rthiauten, &
406+
grid%rqviauten,grid%rqciauten,grid%rqriauten, &
407+
grid%rqiiauten,grid%rqsiauten,grid%rqgiauten, &
408+
grid%rmuiauten,grid%rphiauten, &
409+
grid%u_iau,grid%v_iau,grid%t_iau,grid%ph_iau, &
410+
grid%mu_iau,grid%qv_iau,grid%qc_iau,grid%qr_iau, &
411+
grid%qs_iau,grid%qi_iau,grid%qg_iau, &
412+
grid%itimestep, &
405413
scalar, scalar_tend, num_scalar, &
406414
tracer, tracer_tend, num_tracer, &
407415
ids,ide, jds,jde, kds,kde, &
@@ -807,6 +815,10 @@ SUBROUTINE first_rk_step_part2 ( grid , config_flags &
807815
grid%RVNDGDTEN,grid%RTHNDGDTEN,grid%RPHNDGDTEN, &
808816
grid%RQVNDGDTEN,grid%RMUNDGDTEN, &
809817
grid%rthfrten,grid%rqvfrten, & ! fire
818+
grid%ruiauten,grid%rviauten,grid%rthiauten, &
819+
grid%rqviauten,grid%rqciauten,grid%rqriauten, &
820+
grid%rqiiauten,grid%rqsiauten,grid%rqgiauten, &
821+
grid%rphiauten,grid%rmuiauten, &
810822
num_moist,num_scalar,config_flags,rk_step, &
811823
grid%adv_moist_cond, &
812824
ids, ide, jds, jde, kds, kde, &

0 commit comments

Comments
 (0)