No Slide Title

Download Report

Transcript No Slide Title

Add a Physics Scheme
into WRF Model
Shu-hua Chen
UC Davis/AFWA
Physics implementation features
Adding a physics scheme
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
Rules for WRF Physics

Naming rules
Naming Rules
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
Naming Rules
RXXYYTEN (tendencies)
XX = variable (th, u, v, qv, qc, … )
YY = ra
bl
cu
is for radiation
is for PBL
is for cumulus
ex, RTHBLTEN
Rules for WRF Physics

Naming rules

One scheme one module

Coding rules (later)
WRF Physics Features
•
Unified global constatnts
(module_model_constants.F)
REAL
REAL
REAL
REAL
.
.
, PARAMETER :: r_d
, PARAMETER :: r_v
, PARAMETER :: cp
, PARAMETER :: cv
= 287.
= 461.6
= 7.*r_d/2.
= cp-r_d
WRF Physics Features
•
Unified global constatnts
(module_model_constants.F)
•
Unified common calculations
(saturation mixing ratio)
•
Vertical index
(kms is at the bottom)
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)
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)
. . .
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)
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
Prepare your code
1.F90
a) Replace continuation characters in the
6th column with f90 continuation `&‘ at
end of previous line
F77
Subroutine kessler(QV, T,
&
its,ite,jts,jte,kts,kte,
&
ims,ime,jms,jme,kms,kme,
&
ids,ide,jds,jde,kds,kde)
F90
Subroutine kessler(QV, T, . . .
&
its,ite,jts,jte,kts,kte,&
ims,ime,jms,jme,kms,kme,&
ids,ide,jds,jde,kds,kde )
Prepare your code
1.F90
a) Replace continuation characters in the
6th column with f90 continuation `&‘ at
end of previous line
b)Replace the 1st column `C` for comment
with `!`
F77
c
This is a test
F90
!
This is a test
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
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
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
Prepare your code
1.F90
2.No common block
3.Use “ implicit none
do ”j = jts, jte
do k = kts, kte
4.Use “ intent ”
do i = its, ite
...
enddo
5.Variable dimensions
enddo
enddo
6.Do loops
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
- -
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 ncepcloud3
mp_physics==3 - moist:qv,qc,qr
package ncepcloud5
mp_physics==4 - moist:qv,qc,
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
(dyn_em)
(start_em.F)
* start_domain_em
(dyn_em)
WRF
…….
*
solve_em
(phys)
(module_physics_init.F)
phy_init
cu_init
phys/module_physics_init.F
 Pass new variables down to cu_init
(dyn_em)
(start_em.F)
* start_domain_em
(dyn_em)
WRF
…….
*
solve_em
(phys)
(module_physics_init.F)
phy_init
cu_init
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
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(...)
Match the package
CASE (CHENSCHEME)
name in Registry
CALL cheninit(...)
CASE DEFAULT
END SELECT cps_select
phy_prep
…
WRF
…
phy_init
solve_em
.
DYNAMICS
.
moist_physics_prep
phy_prep/moist_physics_prep
• Calculate required variables
• Convert variables from C grid
to A grid
phy_prep
…
phy_init
radiation_driver
pbl_driver
cumulus_driver
WRF
…
solve_em
.
DYNAMICS
.
moist_physics_prep
microphysics_driver
chencps
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 )
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)
cumulus_driver.F
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(...)
Match the package
CASE (CHENSCHEME)
name in Registry
CALL CHENCPS(...)
CASE DEFAULT
END SELECT cps_select
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,
&
ims,ime,jms,jme,kms,kme, &
ids,ide,jds,jde,kds,kde
REAL, INTENT(IN)
:: arg1, arg2
REAL, INTENT(OUT), DIMENSION(kms:kme) ::
newvar1,newvar2,….
&
phy_prep
cumulus_driver
solve_em
chencps
calculate_phy_tend
update_phy_ten
DYNAMICS
.
phy_cu_ten
Might
need to
call MPP
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
)
.
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
)