Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add incremental analysis update capability #2151

Merged
merged 7 commits into from
Jan 29, 2025
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions Registry/Registry.EM_COMMON.var
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,20 @@ state real QFX ij misc 1 - irh "Q
state real REGIME ij misc 1 - irh "REGIME" "FLAGS: 1=Night/Stable, 2=Mechanical Turbulent, 3=Forced Conv, 4=Free Conv" ""
state integer KPBL ij misc 1 - irh "KPBL" "LEVEL OF PBL TOP" ""

# Increment Output
state real u_iau ijk dyn_em 1 X ih5 "U_IAU" "x-wind component inc" "m s-1"
state real v_iau ijk dyn_em 1 Y ih5 "V_IAU" "y-wind component inc" "m s-1"
state real t_iau ijk dyn_em 1 - ih5 "T_IAU" "potential temp inc" "K"
state real w_iau ijk dyn_em 1 - ih5 "W_IAU" "z-wind component inc" "m s-1"
state real qv_iau ijk dyn_em 1 - ih5 "QV_IAU" "water water mixing ratio inc" "kg kg-1"
state real qc_iau ijk dyn_em 1 - ih5 "QC_IAU" "cloud water mixing ratio inc" "kg kg-1"
state real qr_iau ijk dyn_em 1 - ih5 "QR_IAU" "rain water mixing ratio inc" "kg kg-1"
state real qi_iau ijk dyn_em 1 - ih5 "QI_IAU" "ice water mixing ratio inc" "kg kg-1"
state real qs_iau ijk dyn_em 1 - ih5 "QS_IAU" "snow water mixing ratio inc" "kg kg-1"
state real qg_iau ijk dyn_em 1 - ih5 "QG_IAU" "graupel mixing ratio inc" "kg kg-1"
state real ph_iau ijk dyn_em 1 - ih5 "PH_IAU" "perturbation geopotential inc" "m2 s-2"
state real mu_iau ij dyn_em 1 - ih5 "MU_IAU" "dry air mass inc" "pa"

#
#---------------------------------------------------------------------------------------------------------------------------------------
#
Expand Down
2 changes: 1 addition & 1 deletion Registry/Registry.wrfvar
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ state real - ijkft g_scalar 1 - - -

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

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

# Registry entries that are exclusive to Registry.EM

Expand Down
1 change: 1 addition & 0 deletions Registry/registry.em_shared_collection
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,5 @@ include registry.new3d_wif
include registry.trad_fields
include registry.solar_fields
include registry.diags
include registry.iau
include registry.CMAQ
38 changes: 38 additions & 0 deletions Registry/registry.iau
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# IAU variables

state character iau_time - - - - i{15}r "TIME_IAU" " " " "
state real mu_iau ij misc 1 - i{15}r "MU_IAU" "mu analysis increments array" " "
state real u_iau ikj misc 1 - i{15}r "U_IAU" "u analysis increments array" " "
state real v_iau ikj misc 1 - i{15}r "V_IAU" "v analysis increments array" " "
state real w_iau ikj misc 1 - i{15}r "W_IAU" "w analysis increments array" " "
state real p_iau ikj misc 1 - i{15}r "P_IAU" "p analysis increments array" " "
state real t_iau ikj misc 1 - i{15}r "T_IAU" "t analysis increments array" " "
state real ph_iau ikj misc 1 - i{15}r "PH_IAU" "ph analysis increments array" " "
state real qv_iau ikj misc 1 - i{15}r "QV_IAU" "qv analysis increments array" " "
state real qr_iau ikj misc 1 - i{15}r "QR_IAU" "qr analysis increments array" " "
state real qc_iau ikj misc 1 - i{15}r "QC_IAU" "qc analysis increments array" " "
state real qs_iau ikj misc 1 - i{15}r "QS_IAU" "qs analysis increments array" " "
state real qi_iau ikj misc 1 - i{15}r "QI_IAU" "qice analysis increments array" " "
state real qg_iau ikj misc 1 - i{15}r "QG_IAU" "qgraupel analysis increments array" " "

state real RUIAUTEN ikj misc 1 X r "RUIAUTEN" "X WIND TENDENCY DUE TO IAU" "m s-2"
state real RVIAUTEN ikj misc 1 Y r "RVIAUTEN" "Y WIND TENDENCY DUE TO IAU" "m s-2"
state real RTHIAUTEN ikj misc 1 - r "RTHIAUTEN" "THETA TENDENCY DUE TO IAU" "K s-1"
state real RPHIAUTEN ikj misc 1 - r "RPHIAUTEN" "GEOPOTENTIAL TENDENCY DUE TO IAU" "m2 s-3"
state real RQVIAUTEN ikj misc 1 - r "RQVIAUTEN" "Q_V TENDENCY DUE TO IAU" "kg kg-1 s-1"
state real RQCIAUTEN ikj misc 1 - r "RQCIAUTEN" "Q_C TENDENCY DUE TO IAU" "kg kg-1 s-1"
state real RQRIAUTEN ikj misc 1 - r "RQRIAUTEN" "Q_R TENDENCY DUE TO IAU" "kg kg-1 s-1"
state real RQIIAUTEN ikj misc 1 - r "RQIIAUTEN" "Q_I TENDENCY DUE TO IAU" "kg kg-1 s-1"
state real RQSIAUTEN ikj misc 1 - r "RQSIAUTEN" "Q_S TENDENCY DUE TO IAU" "kg kg-1 s-1"
state real RQGIAUTEN ikj misc 1 - r "RQGIAUTEN" "Q_G TENDENCY DUE TO IAU" "kg kg-1 s-1"
state real RMUIAUTEN ij misc 1 - r "RMUIAUTEN" "MU TENDENCY DUE TO IAU" "Pa s-1"

# IAU namelist options

rconfig integer iau namelist,time_control max_domains 0 irh "analysis increments read" "0/1 ACTIVATE FOR ANALYSIS INCREMENTS UPDATES" ""
rconfig real iau_time_window_sec namelist,time_control max_domains 3600. irh "iau_time_window_sec" "TIME WINDOW OF INCREMENTS ANALYSIS UPDATES" "SECONDS"

# IAU packages

package noiau iau==0 - -
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
144 changes: 144 additions & 0 deletions dyn_em/module_em.F
Original file line number Diff line number Diff line change
Expand Up @@ -2089,6 +2089,14 @@ SUBROUTINE calculate_phy_tend (config_flags,c1,c2, &
RQISHTEN,RQSSHTEN,RQGSHTEN, &
RUNDGDTEN,RVNDGDTEN,RTHNDGDTEN,RQVNDGDTEN, &
RMUNDGDTEN, &
ruiauten,rviauten,rthiauten, &
rqviauten,rqciauten,rqriauten, &
rqiiauten,rqsiauten,rqgiauten, &
rmuiauten,rphiauten, &
u_iau,v_iau,t_iau,ph_iau, &
mu_iau,qv_iau,qc_iau,qr_iau, &
qi_iau,qs_iau,qg_iau, &
itimestep, &
scalar, scalar_tend, num_scalar, &
tracer, tracer_tend, num_tracer, &
ids,ide, jds,jde, kds,kde, &
Expand Down Expand Up @@ -2163,16 +2171,52 @@ SUBROUTINE calculate_phy_tend (config_flags,c1,c2, &
REAL, DIMENSION( ims:ime, jms:jme ) , &
INTENT(INOUT) :: RMUNDGDTEN

! iau
REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
INTENT(INOUT) :: RUIAUTEN, &
RVIAUTEN, &
RTHIAUTEN, &
RPHIAUTEN, &
RQVIAUTEN, &
RQCIAUTEN, &
RQRIAUTEN, &
RQIIAUTEN, &
RQSIAUTEN, &
RQGIAUTEN

REAL, DIMENSION( ims:ime, jms:jme ), &
INTENT(INOUT) :: RMUIAUTEN

REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
INTENT(IN ) :: &
u_iau, &
v_iau, &
t_iau, &
ph_iau, &
qv_iau, &
qc_iau, &
qr_iau, &
qs_iau, &
qi_iau, &
qg_iau

REAL, DIMENSION( ims:ime, jms:jme ), &
INTENT(IN ) :: mu_iau

! 4d arrays

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

INTEGER :: itimestep
INTEGER :: i,k,j, im
INTEGER :: itf,ktf,jtf,itsu,jtsv

! local
real :: wgt_iau

!-----------------------------------------------------------------------

!<DESCRIPTION>
Expand Down Expand Up @@ -2448,6 +2492,88 @@ SUBROUTINE calculate_phy_tend (config_flags,c1,c2, &
ENDDO
ENDDO

! IAU (Incremental Analysis Updates)

IF (config_flags%iau .gt. 0) THEN

wgt_iau = iau_coef(config_flags%iau_time_window_sec,config_flags%dt,itimestep)

DO J=jts,jtf
DO K=kts,ktf
DO I=its,itf
RUIAUTEN(I,K,J) =(c1(k)*mut(I,J)+c2(k))*U_IAU(I,K,J)*WGT_IAU
RVIAUTEN(I,K,J) =(c1(k)*mut(I,J)+c2(k))*V_IAU(I,K,J)*WGT_IAU
RTHIAUTEN(I,K,J)=(c1(k)*mut(I,J)+c2(k))*T_IAU(I,K,J)*WGT_IAU
RQVIAUTEN(I,K,J)=(c1(k)*mut(I,J)+c2(k))*QV_IAU(I,K,J)*WGT_IAU
ENDDO
ENDDO
ENDDO

DO J=jts,jtf
DO K=kts,ktf+1
DO I=its,itf
RPHIAUTEN(I,K,J)=PH_IAU(I,K,J)*WGT_IAU
ENDDO
ENDDO
ENDDO

DO J=jts,jtf
DO I=its,itf
RMUIAUTEN(I,J) =MU_IAU(I,J)*WGT_IAU
ENDDO
ENDDO

IF (P_QC .ge. PARAM_FIRST_SCALAR)THEN
DO J=jts,jtf
DO K=kts,ktf
DO I=its,itf
RQCIAUTEN(I,K,J)=(c1(k)*mut(I,J)+c2(k))*QC_IAU(I,K,J)*WGT_IAU
ENDDO
ENDDO
ENDDO
ENDIF

IF (P_QR .ge. PARAM_FIRST_SCALAR)THEN
DO J=jts,jtf
DO K=kts,ktf
DO I=its,itf
RQRIAUTEN(I,K,J)=(c1(k)*mut(I,J)+c2(k))*QR_IAU(I,K,J)*WGT_IAU
ENDDO
ENDDO
ENDDO
ENDIF

IF (P_QI .ge. PARAM_FIRST_SCALAR)THEN
DO J=jts,jtf
DO K=kts,ktf
DO I=its,itf
RQIIAUTEN(I,K,J)=(c1(k)*mut(I,J)+c2(k))*QI_IAU(I,K,J)*WGT_IAU
ENDDO
ENDDO
ENDDO
ENDIF

IF(P_QS .ge. PARAM_FIRST_SCALAR)THEN
DO J=jts,jtf
DO K=kts,ktf
DO I=its,itf
RQSIAUTEN(I,K,J)=(c1(k)*mut(I,J)+c2(k))*QS_IAU(I,K,J)*WGT_IAU
ENDDO
ENDDO
ENDDO
ENDIF

IF(P_QG .ge. PARAM_FIRST_SCALAR)THEN
DO J=jts,jtf
DO K=kts,ktf
DO I=its,itf
RQGIAUTEN(I,K,J)=(c1(k)*mut(I,J)+c2(k))*QG_IAU(I,K,J)*WGT_IAU
ENDDO
ENDDO
ENDDO
ENDIF

ENDIF

END SUBROUTINE calculate_phy_tend

Expand Down Expand Up @@ -3018,4 +3144,22 @@ subroutine trajmapproj (grid,config_flags,ts_proj)

end subroutine trajmapproj

FUNCTION iau_coef (iau_time_window_sec, dt, itimestep) result(wgt_iau)

implicit none

! This function returns the coeficient for IAU

INTEGER :: itimestep
INTEGER :: nsteps_iau
REAL :: wgt_iau, iau_time_window_sec, dt

wgt_iau = 0.
nsteps_iau = nint(iau_time_window_sec / dt)
if (itimestep <= nsteps_iau) then
wgt_iau = 1.0/iau_time_window_sec
endif

END FUNCTION iau_coef

END MODULE module_em
12 changes: 12 additions & 0 deletions dyn_em/module_first_rk_step_part2.F
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,14 @@ SUBROUTINE first_rk_step_part2 ( grid , config_flags &
grid%rqishten,grid%rqsshten,grid%rqgshten, &
grid%RUNDGDTEN,grid%RVNDGDTEN,grid%RTHNDGDTEN,grid%RQVNDGDTEN, &
grid%RMUNDGDTEN, &
grid%ruiauten,grid%rviauten,grid%rthiauten, &
grid%rqviauten,grid%rqciauten,grid%rqriauten, &
grid%rqiiauten,grid%rqsiauten,grid%rqgiauten, &
grid%rmuiauten,grid%rphiauten, &
grid%u_iau,grid%v_iau,grid%t_iau,grid%ph_iau, &
grid%mu_iau,grid%qv_iau,grid%qc_iau,grid%qr_iau, &
grid%qs_iau,grid%qi_iau,grid%qg_iau, &
grid%itimestep, &
scalar, scalar_tend, num_scalar, &
tracer, tracer_tend, num_tracer, &
ids,ide, jds,jde, kds,kde, &
Expand Down Expand Up @@ -807,6 +815,10 @@ SUBROUTINE first_rk_step_part2 ( grid , config_flags &
grid%RVNDGDTEN,grid%RTHNDGDTEN,grid%RPHNDGDTEN, &
grid%RQVNDGDTEN,grid%RMUNDGDTEN, &
grid%rthfrten,grid%rqvfrten, & ! fire
grid%ruiauten,grid%rviauten,grid%rthiauten, &
grid%rqviauten,grid%rqciauten,grid%rqriauten, &
grid%rqiiauten,grid%rqsiauten,grid%rqgiauten, &
grid%rphiauten,grid%rmuiauten, &
num_moist,num_scalar,config_flags,rk_step, &
grid%adv_moist_cond, &
ids, ide, jds, jde, kds, kde, &
Expand Down
Loading