Download presentation
Presentation is loading. Please wait.
1
Add a Physics Scheme into WRF Model
Shu-hua Chen UC Davis/AFWA Physics implementation features Adding a physics scheme
2
Three Sets of Dimensions
Domain size: ids, ide, jds, jde, kds, kde Memory size: ims, ime, jms, jme, kms, kme Tile size: its, ite, jts, jte, kts, kte
3
Rules for WRF Physics Naming rules
4
Naming Rules ex, module_cu_kf.F cu is for cumulus
module_yy_xxx.F (module) yy = ra is for radiation bl is for PBL cu is for cumulus mp is for microphysics. xxx = individual scheme ex, module_cu_kf.F
5
Naming Rules ex, RTHBLTEN cu is for cumulus RXXYYTEN (tendencies)
XX = variable (th, u, v, qv, qc, … ) YY = ra is for radiation bl is for PBL cu is for cumulus ex, RTHBLTEN
6
Rules for WRF Physics Naming rules One scheme one module
Coding rules (later)
7
WRF Physics Features • Unified global constatnts
(module_model_constants.F) REAL , PARAMETER :: r_d = 287. REAL , PARAMETER :: r_v = 461.6 REAL , PARAMETER :: cp = 7.*r_d/2. REAL , PARAMETER :: cv = cp-r_d .
8
WRF Physics Features • Unified global constatnts
(module_model_constants.F) • Unified common calculations (saturation mixing ratio) • Vertical index (kms is at the bottom)
9
WRF Language • 4D Moisture field, moist(i,k,j,?)
? = P_QV (water vapor) P_QC (cloud water) P_QI (cloud ice) P_QR (rain) P_QS (snow) P_QG (graupel) (module_state_description.F)
10
WRF Language • 4D Moisture field, moist(i,k,j,?) • PARAM_FIRST_SCALAR
IF ( P_QI .ge. PARAM_FIRST_SCALAR ) (the memory of cloud ice is allocated) . . .
11
Implement a new physics scheme
Prepare your code Create a new module Declare new variables and a new package in Registry Modify namelist Do initialization Modify solve_em.F (solve_eh.F) Modify phy_prep (module_em.F)
12
Implement a new physics scheme
Modify cumulus_driver.F Modify physics_drive.int Modify calculate_phy_ten (module_em.F) Modify phy_cu_ten (module_physics_addtendc.F) Modify Makefile Compile and test
13
Prepare your code 1.F90 Replace continuation characters in the 6th column with f90 continuation `&‘ at end of previous line Subroutine kessler(QV, T, & its,ite,jts,jte,kts,kte, & ims,ime,jms,jme,kms,kme, & ids,ide,jds,jde,kds,kde) F77 Subroutine kessler(QV, T, & its,ite,jts,jte,kts,kte,& ims,ime,jms,jme,kms,kme,& ids,ide,jds,jde,kds,kde ) F90
14
Prepare your code 1.F90 Replace continuation characters in the 6th column with f90 continuation `&‘ at end of previous line b)Replace the 1st column `C` for comment with `!` c This is a test F77 ! This is a test F90
15
Prepare your code 1.F90 2.No common block F77 common/var1/T,q,p, … F90
Subroutine sub(T,q,p, ….) real,intent(out), & dimension(ims:ime,kms:kme,jms:jme):: T,q,p F90
16
Prepare your code 1.F90 2.No common block 3.Use “ implicit none ”
4.Use “ intent ” Subroutine sub(T,q,p, ….) real,intent(out), & dimension(ims:ime,kms:kme,jms:jme):: T real,intent( in), & dimension(ims:ime,kms:kme,jms:jme):: q real,intent(inout), & dimension(ims:ime,kms:kme,jms:jme):: p
17
Prepare your code 1.F90 2.No common block 3.Use “ implicit none ”
4.Use “ intent ” 5.Variable dimensions Subroutine sub(glo,….) real,intent(out), & dimension(ims:ime,kms:kme,jms:jme):: glo real,dimension(its:ite,kts:kte,jts:jte):: loc
18
Prepare your code 1.F90 2.No common block 3.Use “ implicit none ”
do j = jts, jte do k = kts, kte do i = its, ite ... enddo 3.Use “ implicit none ” 4.Use “ intent ” 5.Variable dimensions 6.Do loops
19
Implement a new physics scheme
Create a new module ex, module_cu_chen.F (put all your codes in) Go Registry and declare a new package (and new variables) (WRFV1/Registry) package kfscheme cu_physics==1 - - package bmjscheme cu_physics==2 - - package chenscheme cu_physics==3 - -
20
Implement a new physics scheme
Create a new module ex, module_cu_chen.F (put all your codes in) Go Registry and declare a new package (and new variables) (WRFV1/Registry) Cloud microphysics package kesslerscheme mp_physics==1 - moist:qv,qc,qr package linscheme mp_physics==2 - moist:qv,qc,qr,qi,qs,qg package ncepcloud mp_physics==3 - moist:qv,qc,qr package ncepcloud mp_physics==4 - moist:qv,qc,
21
Implement a new physics scheme
Create a new module ex, module_cu_chen.F (put all your codes in) Go Registry and declare a new package (and new variables) (WRFV1/Registry) Modify namelist.input and assign cu_physics = 3
22
(module_physics_init.F)
(dyn_em) (start_em.F) (phys) (module_physics_init.F) phy_init cu_init * start_domain_em INIT (dyn_em) WRF solve_em …….
23
phys/module_physics_init.F
Pass new variables down to cu_init
24
(module_physics_init.F)
(dyn_em) (start_em.F) (phys) (module_physics_init.F) phy_init cu_init * start_domain_em INIT (dyn_em) WRF solve_em …….
25
phys/module_physics_init.F
Pass new variables down to cu_init Go subroutine cu_init Include the new module and create a new SELECT case
26
phys/module_physics_init.F
Subroutine cu_init(…) . USE module_cu_kf USE module_cu_bmj USE module_cu_chen cps_select: SELECT CASE(config_flags%cu_physics) CASE (KFSCHEME) CALL kfinit(...) CASE (BMJSCHEME) CALL bmjinit(...) CASE DEFAULT END SELECT cps_select Match the package name in Registry CASE (CHENSCHEME) CALL cheninit(...) Put into module_cu_chen.F
27
. . phy_prep phy_init solve_em INIT DYNAMICS moist_physics_prep … WRF
28
phy_prep/moist_physics_prep
• Calculate required variables • Convert variables from C grid to A grid
29
. . phy_prep phy_init radiation_driver pbl_driver cumulus_driver
… radiation_driver INIT pbl_driver cumulus_driver chencps WRF solve_em . … DYNAMICS . moist_physics_prep microphysics_driver
30
Three-level structure
solve_em Physics_driver SELECT CASE (CHOICE) CASE ( NOPHY ) CASE ( SCHEME1 ) CALL XXX CASE ( SCHEME2 ) CALL YYY . CASE DEFAULT END SELECT Individual physics scheme ( XXX )
31
cumulus_driver.F Go physics driver (cumulus_driver.F)
Include the new module and create a new SELECT CASE in driver Check available variables in drivers (variables are explained inside drivers)
32
cumulus_driver.F . USE module_cu_kf USE module_bmj_kf
Subroutine cumulus_driver . USE module_cu_kf USE module_bmj_kf USE module_cu_chen cps_select: SELECT CASE(config_flags%cu_physics) CASE (KFSCHEME) CALL KFCPS(...) CASE (BMJSCHEME) CALL BMJCPS(...) CASE DEFAULT END SELECT cps_select Match the package name in Registry CASE (CHENSCHEME) CALL CHENCPS(...) Put in module_cu_chen.F
33
Physics_drive.int SUBROUTINE cumulus_driver(arg1, arg2, … &
newvar1, newvar2,… & its,ite,jts,jte,kts,kte, & ims,ime,jms,jme,kms,kme, & ids,ide,jds,jde,kds,kde ) INTEGER, INTENT(IN) :: its,ite,jts,jte,kts,kte, & ids,ide,jds,jde,kds,kde REAL, INTENT(IN) :: arg1, arg2 REAL, INTENT(OUT), DIMENSION(kms:kme) :: & newvar1,newvar2,….
34
. phy_prep chencps cumulus_driver solve_em calculate_phy_tend Might
update_phy_ten phy_cu_ten Might need to call MPP DYNAMICS .
35
phys/module_physics_addtendc.F
Subroutine phy_cu_ten (… ) . CASE(BMJSCHEME) CASE (CHENSCHEME) CALL add_a2a (rt_tendf, RTHCUTEN,… ) CALL add_a2c_u(ru_tendf,RUBLTEN,… ) CALL add_a2c_v(rv_tendf,RVBLTEN,… ) if (P_QS .ge. PARAM_FIRST_SCALAR) & CALL add_a2a(moist_tendf(ims,kms,jms,P_QS),RQSCUTEN, .. & ids,ide, jds, jde, kds, kde, & ims, ime, jms, jme, kms, kme, & its, ite, jts, jte, kts, kte )
36
module_cu_chen.F MODULE_CU_CHEN CONTRAINS
! SUBROUTINE cheninit (arg1, arg2, … ) . ENDSUBROUTINE cheninit SUBROUTINE chencps (arg3, arg4, … ) END SUBROUTINE chencps END MODULE_CU_CHEN
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.