source: trunk/LMDZ.MARS/libf/phymars/phyredem.F90 @ 2220

Last change on this file since 2220 was 2220, checked in by dbardet, 5 years ago

Update the nonorographic gravity waves drag parametrization (from the r3599 of Earth s model LMDZ6): 1) add east_ and west_gwdstress variables, 2) delete aleas function: random waves are producted by the MOD function, 3) reproductibility concerning the number of procs is now validated, 4) changing name of some variables like RUW, RVW, ZOP, ZOM,..., 5) tendency of winds due to GW drag are now module variables and written in restart files.

File size: 10.0 KB
RevLine 
[1130]1module phyredem
2
3implicit none
4
5contains
6
7subroutine physdem0(filename,lonfi,latfi,nsoil,ngrid,nlay,nq, &
8                         phystep,day_ini,time,airefi, &
[1974]9                         alb,ith,pzmea,pzstd,pzsig,pzgam,pzthe, &
[2079]10                         phmons,psummit,pbase)
[1130]11! create physics restart file and write time-independent variables
12  use comsoil_h, only: inertiedat, volcapa, mlayer
[1543]13  use geometry_mod, only: cell_area
[1221]14  use surfdat_h, only: zmea, zstd, zsig, zgam, zthe, &
[1130]15                       z0_default, albedice, emisice, emissiv, &
[1974]16                       iceradius, dtemisice, phisfi, z0,   &
[2079]17                       hmons,summit,base
[1246]18  use dimradmars_mod, only: tauvis
[1130]19  use iostart, only : open_restartphy, close_restartphy, &
20                      put_var, put_field, length
21  use mod_grid_phy_lmdz, only : klon_glo
[1524]22  use planete_h, only: aphelie, emin_turb, lmixmin, obliquit, &
23                       peri_day, periheli, year_day
24  use comcstfi_h, only: g, mugaz, omeg, rad, rcp
25  use time_phylmdz_mod, only: daysec
[1130]26  implicit none
27 
28  character(len=*), intent(in) :: filename
29  real,intent(in) :: lonfi(ngrid)
30  real,intent(in) :: latfi(ngrid)
31  integer,intent(in) :: nsoil
32  integer,intent(in) :: ngrid
33  integer,intent(in) :: nlay
34  integer,intent(in) :: nq
35  real,intent(in) :: phystep
36  real,intent(in) :: day_ini
37  real,intent(in) :: time
38  real,intent(in) :: airefi(ngrid)
39  real,intent(in) :: alb(ngrid)
40  real,intent(in) :: ith(ngrid,nsoil)
41  real,intent(in) :: pzmea(ngrid)
42  real,intent(in) :: pzstd(ngrid)
43  real,intent(in) :: pzsig(ngrid)
44  real,intent(in) :: pzgam(ngrid)
45  real,intent(in) :: pzthe(ngrid)
[1974]46  real,intent(in) :: phmons(ngrid)
[2079]47  real,intent(in) :: psummit(ngrid)
48  real,intent(in) :: pbase(ngrid)
[1974]49
[1130]50  real :: tab_cntrl(length) ! nb "length=100" defined in iostart module
51 
52  ! Create physics start file
53  call open_restartphy(filename)
54 
55  ! Build tab_cntrl(:) array
56  tab_cntrl(:)=0.0
57  !cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
58  ! Fill control array tab_cntrl(:) with parameters for this run
59  !cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
60  ! Informations on the physics grid
61  tab_cntrl(1) = float(klon_glo)  ! total number of nodes on physics grid
62  tab_cntrl(2) = float(nlay) ! number of atmospheric layers
63  tab_cntrl(3) = day_ini + int(time)      ! initial day
64  tab_cntrl(4) = time -int(time)          ! initial time of day
65
66  ! Informations about Mars, used by dynamics and physics
67  tab_cntrl(5) = rad      ! radius of Mars (m) ~3397200
68  tab_cntrl(6) = omeg     ! rotation rate (rad.s-1)
69  tab_cntrl(7) = g        ! gravity (m.s-2) ~3.72
70  tab_cntrl(8) = mugaz    ! Molar mass of the atmosphere (g.mol-1) ~43.49
71  tab_cntrl(9) = rcp      !  = r/cp  ~0.256793 (=kappa dans dynamique)
72  tab_cntrl(10) = daysec  ! length of a sol (s)  ~88775
73
74  tab_cntrl(11) = phystep  ! time step in the physics
75  tab_cntrl(12) = 0.
76  tab_cntrl(13) = 0.
77
78  ! Informations about Mars, only for physics
79  tab_cntrl(14) = year_day  ! length of year (sols) ~668.6
80  tab_cntrl(15) = periheli  ! min. Sun-Mars distance (Mkm) ~206.66
81  tab_cntrl(16) = aphelie   ! max. SUn-Mars distance (Mkm) ~249.22
82  tab_cntrl(17) = peri_day  ! date of perihelion (sols since N. spring)
83  tab_cntrl(18) = obliquit  ! Obliquity of the planet (deg) ~23.98
84
85  ! Boundary layer and turbulence
86  tab_cntrl(19) = z0_default   ! default surface roughness (m) ~0.01
87  tab_cntrl(20) = lmixmin   ! mixing length ~100
88  tab_cntrl(21) = emin_turb ! minimal energy ~1.e-8
89
90  ! Optical properties of polar caps and ground emissivity
91  tab_cntrl(22) = albedice(1)  ! Albedo of northern cap ~0.5
92  tab_cntrl(23) = albedice(2)  ! Albedo of southern cap ~0.5
93  tab_cntrl(24) = emisice(1)   ! Emissivity of northern cap ~0.95
94  tab_cntrl(25) = emisice(2)   ! Emissivity of southern cap ~0.95
95  tab_cntrl(26) = emissiv      ! Emissivity of martian soil ~.95
96  tab_cntrl(31) = iceradius(1) ! mean scat radius of CO2 snow (north)
97  tab_cntrl(32) = iceradius(2) ! mean scat radius of CO2 snow (south)
98  tab_cntrl(33) = dtemisice(1) ! time scale for snow metamorphism (north)
99  tab_cntrl(34) = dtemisice(2) ! time scale for snow metamorphism (south)
100
101  ! dust aerosol properties
102  tab_cntrl(27) = tauvis      ! mean visible optical depth
103
104  ! Soil properties:
105  tab_cntrl(35) = volcapa ! soil volumetric heat capacity
106
107  ! Write the controle array
108  call put_var("controle","Control parameters",tab_cntrl)
109 
110  ! Write the mid-layer depths
111  call put_var("soildepth","Soil mid-layer depth",mlayer)
112 
113  ! Write longitudes
114  call put_field("longitude","Longitudes of physics grid",lonfi)
115 
116  ! Write latitudes
117  call put_field("latitude","Latitudes of physics grid",latfi)
118 
119  ! Write mesh areas
[1541]120  call put_field("area","Mesh area",cell_area)
[1130]121 
122  ! Write surface geopotential
123  call put_field("phisfi","Geopotential at the surface",phisfi)
124 
125  ! Write surface albedo
[1221]126  call put_field("albedodat","Albedo of bare ground",alb)
[1130]127 
128  ! Subgrid topogaphy variables
129  call put_field("ZMEA","Relief: mean relief",zmea)
130  call put_field("ZSTD","Relief: standard deviation",zstd)
131  call put_field("ZSIG","Relief: sigma parameter",zsig)
132  call put_field("ZGAM","Relief: gamma parameter",zgam)
133  call put_field("ZTHE","Relief: theta parameter",zthe)
[2079]134  call put_field("hmons","Relief: hmons parameter (summit - base)",hmons)
135  call put_field("summit","Relief: altitude from the aeroid of the summit of the highest subgrid topography",summit)
136  call put_field("base","Relief: altitude from the aeroid of the base of the highest subgrid topography",base)
[1974]137     
[1130]138  ! Soil thermal inertia
[1210]139  call put_field("inertiedat","Soil thermal inertia",ith)
[1130]140 
141  ! Surface roughness length
142  call put_field("z0","Surface roughness length",z0)
143 
144  ! Close file
145  call close_restartphy
146 
147end subroutine physdem0
148
149subroutine physdem1(filename,nsoil,ngrid,nlay,nq, &
[1944]150                    phystep,time,tsurf,tsoil,co2ice,albedo,emis,q2,qsurf,&
151                    tauscaling,totcloudfrac,wstar, &
152                    mem_Mccn_co2,mem_Nccn_co2,mem_Mh2o_co2)
[1130]153  ! write time-dependent variable to restart file
154  use iostart, only : open_restartphy, close_restartphy, &
155                      put_var, put_field
[1621]156  use tracer_mod, only: noms ! tracer names
[2220]157  use nonoro_gwd_ran_mod, only: du_nonoro_gwd, dv_nonoro_gwd
[1922]158
[1130]159  implicit none
[1922]160 
161  include "callkeys.h"
162 
[1130]163  character(len=*),intent(in) :: filename
164  integer,intent(in) :: nsoil
165  integer,intent(in) :: ngrid
166  integer,intent(in) :: nlay
167  integer,intent(in) :: nq
168  real,intent(in) :: phystep
169  real,intent(in) :: time
170  real,intent(in) :: tsurf(ngrid)
171  real,intent(in) :: tsoil(ngrid,nsoil)
172  real,intent(in) :: co2ice(ngrid)
[1944]173  real,intent(in) :: albedo(ngrid,2)
[1130]174  real,intent(in) :: emis(ngrid)
175  real,intent(in) :: q2(ngrid,nlay+1)
176  real,intent(in) :: qsurf(ngrid,nq)
[1208]177  real,intent(in) :: tauscaling(ngrid)
[1922]178  real,intent(in) :: totcloudfrac(ngrid)
[1944]179  real,intent(in) :: wstar(ngrid)
[1922]180  real,intent(in) :: mem_Mccn_co2(ngrid,nlay) ! CCN mass of H2O and dust used by CO2
181  real,intent(in) :: mem_Nccn_co2(ngrid,nlay) ! CCN number of H2O and dust used by CO2
182  real,intent(in) :: mem_Mh2o_co2(ngrid,nlay) ! H2O mass integred into CO2 crystal
[1130]183 
184  integer :: iq
185  character(len=30) :: txt ! to store some text
186  ! indexes of water vapour & water ice tracers (if any):
187  integer :: i_h2o_vap=0
188  integer :: i_h2o_ice=0
189
190 
191  ! Open file
192  call open_restartphy(filename)
193 
194  ! First variable to write must be "Time", in order to correctly
195  ! set time counter in file
196  call put_var("Time","Temps de simulation",time)
197 
198  ! CO2 ice layer
199  call put_field("co2ice","CO2 ice cover",co2ice,time)
200 
201  ! Surface temperature
202  call put_field("tsurf","Surface temperature",tsurf,time)
203 
204  ! Soil temperature
205  call put_field("tsoil","Soil temperature",tsoil,time)
206 
[1944]207  ! Albedo of the surface
208  call put_field("albedo","Surface albedo",albedo(:,1),time)
209 
[1130]210  ! Emissivity of the surface
211  call put_field("emis","Surface emissivity",emis,time)
212 
213  ! Planetary Boundary Layer
214  call put_field("q2","pbl wind variance",q2,time)
[1711]215
216  ! Sub-grid cloud fraction
217  call put_field("totcloudfrac","Total cloud fraction",totcloudfrac,time)
218 
[1208]219  ! Dust conversion factor
220  ! Only to be read by newstart to convert to actual dust values
221  ! Or by any user who wants to reconstruct dust, opacity from the start files.
222  call put_field("tauscaling","dust conversion factor",tauscaling,time)
223
[1944]224  if (calltherm) then
225    call put_field("wstar","Max vertical velocity in thermals",wstar,time)
226  endif
227
[1130]228  ! Tracers on the surface
229  ! preliminary stuff: look for water vapour & water ice tracers (if any)
230  do iq=1,nq
[1621]231    if (noms(iq).eq."h2o_vap") then
[1130]232      i_h2o_vap=iq
233    endif
[1621]234    if (noms(iq).eq."h2o_ice") then
[1130]235      i_h2o_ice=iq
236    endif
237  enddo
238 
239  if (nq.gt.0) then
240    do iq=1,nq
[1621]241      txt=noms(iq)
[1130]242      ! Exception: there is no water vapour surface tracer
243      if (txt.eq."h2o_vap") then
244        write(*,*)"physdem1: skipping water vapour tracer"
245        if (i_h2o_ice.eq.i_h2o_vap) then
246          ! then there is no "water ice" tracer; but still
247          ! there is some water ice on the surface
248          write(*,*)"          writing water ice instead"
249          txt="h2o_ice"
250        else
251          ! there is a "water ice" tracer which has been / will be
252          ! delt with in due time
253          cycle
254        endif ! of if (igcm_h2o_ice.eq.igcm_h2o_vap)
255      endif ! of if (txt.eq."h2o_vap")
256      call put_field(trim(txt),"tracer on surface",qsurf(:,iq),time)
257    enddo
258  endif
[1922]259  ! Memory of the origin of the co2 particles
260  if (co2useh2o) then
261     call put_field("mem_Mccn_co2","CCN mass of H2O and dust used by CO2",mem_Mccn_co2,time)
262     call put_field("mem_Nccn_co2","CCN number of H2O and dust used by CO2",mem_Nccn_co2,time)
263     call put_field("mem_Mh2o_co2","H2O mass integred into CO2 crystal",mem_Mh2o_co2,time)
264  endif
[2220]265 
266  ! Non-orographic gavity waves
267  if (calllott_nonoro) then
268     call put_field("du_nonoro_gwd","Zonal wind tendency due to GW",du_nonoro_gwd,time)
269     call put_field("dv_nonoro_gwd","Meridional wind tendency due to GW",dv_nonoro_gwd,time)
270  endif
[1130]271  ! Close file
272  call close_restartphy
273 
274end subroutine physdem1
275
276end module phyredem
Note: See TracBrowser for help on using the repository browser.