source: trunk/LMDZ.GENERIC/libf/phystd/phyredem.F90 @ 3552

Last change on this file since 3552 was 3552, checked in by emillour, 10 days ago

Generic PCM

Modify iostart routines to take netcdf index as an argument in order to
be used to read/write in other files than startfi.nc (preparing 1D
restart)

MM

File size: 11.1 KB
Line 
1module phyredem
2
3implicit none
4
5INTEGER,SAVE :: nid_restart ! NetCDF file identifier for restartfi.nc file
6
7contains
8
9subroutine physdem0(filename,lonfi,latfi,nsoil,ngrid,nlay,nq, &
10                         phystep,day_ini,time,airefi, &
11                         alb,ith,pzmea,pzstd,pzsig,pzgam,pzthe)
12! create physics restart file and write time-independent variables
13  use comsoil_h, only: volcapa, mlayer
14  use geometry_mod, only: cell_area
15  use surfdat_h, only: zmea, zstd, zsig, zgam, zthe, &
16                       emisice, emissiv,             &
17                       iceradius, dtemisice, phisfi
18  use iostart, only : create_restartphy, close_restartphy, &
19                      put_var, put_field, length, ldscrpt, ndscrpt
20  use mod_grid_phy_lmdz, only : klon_glo
21  use planete_mod, only: year_day, periastr, apoastr, peri_day, &
22                         obliquit, z0
23  use comcstfi_mod, only: rad, omeg, g, mugaz, rcp
24  use time_phylmdz_mod, only: daysec
25
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)
46 
47  character(ndscrpt), dimension(ldscrpt), parameter :: dscrpt_tab_cntrl = (/ &
48      "(1)  Number of atmospheric columns in physics     ", &
49      "(2)  Number of atmospheric layers                 ", &
50      "(3)  Final day                                    ", &
51      "(4)  Final time of day                            ", &
52      "(5)  Planet radius (m)                            ", &
53      "(6)  Rotation rate (rad.s-1)                      ", &
54      "(7)  Gravity (m.s-2)                              ", &
55      "(8)  Molar mass of the atmosphere (g.mol-1)       ", &
56      "(9)  = r/Cp           (=kappa in the dynamics)    ", &
57      "(10) Length of a solar day (s)                    ", &
58      "(11) Physics time step (s)                        ", &
59      "(12) -                                            ", &
60      "(13) -                                            ", &
61      "(14) Length of year (in solar days)               ", &
62      "(15) Minimum star-planet distance (AU)            ", &
63      "(16) Maximum star-planet distance (AU)            ", &
64      "(17) Date of periastro (sols since N. spring)     ", &
65      "(18) Obliquity of the planet (deg)                ", &
66      "(19) Default surface roughness (m)                ", &
67      "(20) -                                            ", &
68      "(21) -                                            ", &
69      "(22) -                                            ", &
70      "(23) -                                            ", &
71      "(24) Emissivity of northern cap ~0.95             ", &
72      "(25) Emissivity of southern cap ~0.95             ", &
73      "(26) Emissivity of martian soil ~.95              ", &
74      "(27) -                                            ", &
75      "(28) -                                            ", &
76      "(29) -                                            ", &
77      "(30) -                                            ", &
78      "(31) Mean scat radius of CO2 snow (north)         ", &
79      "(32) Mean scat radius of CO2 snow (south)         ", &
80      "(33) Time scale for snow metamorphism (north)     ", &
81      "(34) Time scale for snow metamorphism (south)     ", &
82      "(35) Soil volumetric heat capacity                "/)
83  real :: tab_cntrl(length) ! nb "length=100" defined in iostart module
84 
85  ! Create physics start file
86  call create_restartphy(filename,nid_restart)
87
88! tab_cntrl() contains run parameters
89  tab_cntrl(:)=0 ! initialization
90!cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
91! Fill control array tab_cntrl(:) with paramleters for this run
92!cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
93! Informations on the physics grid
94  tab_cntrl(1) = float(klon_glo)  ! number of atmospheric columns in physics
95  tab_cntrl(2) = float(nlay) ! number of atmospheric layers
96  tab_cntrl(3) = day_ini + int(time)         ! final day
97  tab_cntrl(4) = time -int(time)            ! final time of day
98
99! Informations about the planet, used by dynamics and physics
100  tab_cntrl(5) = rad      ! planet radius (m)
101  tab_cntrl(6) = omeg     ! rotation rate (rad.s-1)
102  tab_cntrl(7) = g        ! gravity (m.s-2)
103  tab_cntrl(8) = mugaz    ! Molar mass of the atmosphere (g.mol-1)
104  tab_cntrl(9) = rcp      !  = r/cp  (=kappa in the dynamics)
105  tab_cntrl(10) = daysec  ! length of a solar day (s)
106
107  tab_cntrl(11) = phystep  ! physics time step (s)
108  tab_cntrl(12) = 0.
109  tab_cntrl(13) = 0.
110
111! Informations about the planet, only for physics
112  tab_cntrl(14) = year_day  ! length of year (in solar days)
113  tab_cntrl(15) = periastr  ! minimum star-planet distance (AU)
114  tab_cntrl(16) = apoastr   ! maximum star-planet distance (AU)
115  tab_cntrl(17) = peri_day  ! date of periastron (sols since N. spring)
116  tab_cntrl(18) = obliquit  ! Obliquity of the planet (deg)
117
118! Boundary layer and turbulence
119  tab_cntrl(19) = z0        ! surface roughness (m)
120!  tab_cntrl(20) = lmixmin   ! mixing length (m)
121!  tab_cntrl(21) = emin_turb ! minimal energy
122
123! Optical properties of polar caps and ground emissivity
124  tab_cntrl(24) = emisice(1)   ! Emissivity of northern cap ~0.95
125  tab_cntrl(25) = emisice(2)   ! Emissivity of southern cap ~0.95
126  tab_cntrl(26) = emissiv      ! Emissivity of martian soil ~.95
127  tab_cntrl(31) = iceradius(1) ! mean scat radius of CO2 snow (north)
128  tab_cntrl(32) = iceradius(2) ! mean scat radius of CO2 snow (south)
129  tab_cntrl(33) = dtemisice(1) ! time scale for snow metamorphism (north)
130  tab_cntrl(34) = dtemisice(2) ! time scale for snow metamorphism (south)
131
132  tab_cntrl(28) = 0.
133  tab_cntrl(29) = 0.
134  tab_cntrl(30) = 0.
135! Soil properties:
136  tab_cntrl(35) = volcapa ! soil volumetric heat capacity
137
138  ! Write the controle array
139  call put_var(nid_restart,"controle","Control parameters",tab_cntrl)
140 
141  ! Write the controle array descriptor
142  call put_var(nid_restart,"controle_descriptor",&
143               "Description of control parameters",dscrpt_tab_cntrl)
144 
145  ! Write the mid-layer depths
146  call put_var(nid_restart,"soildepth","Soil mid-layer depth",mlayer)
147 
148  ! Write longitudes
149  call put_field(nid_restart,"longitude","Longitudes of physics grid",lonfi)
150 
151  ! Write latitudes
152  call put_field(nid_restart,"latitude","Latitudes of physics grid",latfi)
153 
154  ! Write mesh areas
155  call put_field(nid_restart,"area","Mesh area",cell_area)
156 
157  ! Write surface geopotential
158  call put_field(nid_restart,"phisfi","Geopotential at the surface",phisfi)
159 
160  ! Write surface albedo
161  call put_field(nid_restart,"albedodat","Albedo of bare ground",alb)
162 
163  ! Subgrid topogaphy variables
164  call put_field(nid_restart,"ZMEA","Relief: mean relief",zmea)
165  call put_field(nid_restart,"ZSTD","Relief: standard deviation",zstd)
166  call put_field(nid_restart,"ZSIG","Relief: sigma parameter",zsig)
167  call put_field(nid_restart,"ZGAM","Relief: gamma parameter",zgam)
168  call put_field(nid_restart,"ZTHE","Relief: theta parameter",zthe)
169 
170  ! Soil thermal inertia
171  call put_field(nid_restart,"inertiedat","Soil thermal inertia",ith)
172 
173  ! Close file
174  call close_restartphy(nid_restart)
175 
176end subroutine physdem0
177
178subroutine physdem1(filename,nsoil,ngrid,nlay,nq, &
179                    phystep,time,tsurf,tsoil,emis,albedo,q2,qsurf, &
180                    cloudfrac,totcloudfrac,hice, &
181                    rnat,pctsrf_sic,tslab,tsea_ice,tice,sea_ice)
182  ! write time-dependent variable to restart file
183  use iostart, only : open_restartphy, close_restartphy, &
184                      put_var, put_field
185  use tracer_h, only: noms
186  USE radinc_h, ONLY: L_NSPECTV
187!  use slab_ice_h, only: noceanmx
188  USE ocean_slab_mod, ONLY: nslay
189  use callkeys_mod, only: ok_slab_ocean, calllott_nonoro
190  use nonoro_gwd_ran_mod, only: du_nonoro_gwd, dv_nonoro_gwd, &
191                                east_gwstress, west_gwstress
192
193  implicit none
194
195  character(len=*),intent(in) :: filename
196  integer,intent(in) :: nsoil
197  integer,intent(in) :: ngrid
198  integer,intent(in) :: nlay
199  integer,intent(in) :: nq
200  real,intent(in) :: phystep
201  real,intent(in) :: time
202  real,intent(in) :: tsurf(ngrid)
203  real,intent(in) :: tsoil(ngrid,nsoil)
204  real,intent(in) :: emis(ngrid)
205  real,intent(in) :: albedo(ngrid,L_NSPECTV)
206  real,intent(in) :: q2(ngrid,nlay+1)
207  real,intent(in) :: qsurf(ngrid,nq)
208  real,intent(in) :: cloudfrac(ngrid,nlay)
209  real,intent(in) :: totcloudfrac(ngrid)
210  real,intent(in) :: hice(ngrid)
211  real,intent(in) :: rnat(ngrid)
212  real,intent(in) :: pctsrf_sic(ngrid)
213  real,intent(in) :: tslab(ngrid,nslay)
214  real,intent(in) :: tsea_ice(ngrid)
215  real,intent(in) :: sea_ice(ngrid)
216  real,intent(in) :: tice(ngrid)
217
218  integer :: iq
219 
220  ! Open file
221  call open_restartphy(filename,nid_restart)
222
223  ! First variable to write must be "Time", in order to correctly
224  ! set time counter in file
225  !call put_var("Time","Temps de simulation",time)
226 
227  ! Surface temperature
228  call put_field(nid_restart,"tsurf","Surface temperature",tsurf)
229 
230  ! Soil temperature
231  call put_field(nid_restart,"tsoil","Soil temperature",tsoil)
232 
233  ! Emissivity of the surface
234  call put_field(nid_restart,"emis","Surface emissivity",emis)
235 
236  ! Surface albedo (assume homegeneous spectral albedo for now)
237  call put_field(nid_restart,"albedo","Surface albedo",albedo(:,1))
238 
239  ! Planetary Boundary Layer
240  call put_field(nid_restart,"q2","pbl wind variance",q2)
241 
242! cloud fraction and sea ice (NB: these should be optional... to be improved)
243  call put_field(nid_restart,"cloudfrac","Cloud fraction",cloudfrac)
244  call put_field(nid_restart,"totcloudfrac","Total fraction",totcloudfrac)
245  call put_field(nid_restart,"hice","Height of oceanic ice",hice)
246
247 !Slab ocean
248 if(ok_slab_ocean) then
249   call put_field(nid_restart,"rnat","Nature of surface",rnat)
250   call put_field(nid_restart,"pctsrf_sic","Pourcentage sea ice",pctsrf_sic)
251   call put_field(nid_restart,"tslab","Temperature slab ocean",tslab)
252   call put_field(nid_restart,"tsea_ice","Temperature of top layer (seaice or snow)",tsea_ice)
253   call put_field(nid_restart,"tice","Temperature of seaice",tice)
254   call put_field(nid_restart,"sea_ice","Sea ice mass",sea_ice)
255 endif!(ok_slab_ocean)
256
257! tracers
258  if (nq>0) then
259    do iq=1,nq
260      call put_field(nid_restart,noms(iq),"tracer on surface",qsurf(:,iq))
261    enddo
262  endif ! of if (nq>0)
263
264! Non-orographic gavity waves
265if (calllott_nonoro) then
266   call put_field(nid_restart,"du_nonoro_gwd","Zonal wind tendency due to GW",du_nonoro_gwd)
267   call put_field(nid_restart,"dv_nonoro_gwd","Meridional wind tendency due to GW",dv_nonoro_gwd)
268   call put_field(nid_restart,"east_gwstress","Eastward stress profile due to GW",east_gwstress)
269   call put_field(nid_restart,"west_gwstress","Westward stress profile due to GW",west_gwstress)
270endif
271
272! close file
273      CALL close_restartphy(nid_restart)
274!$OMP BARRIER
275
276end subroutine physdem1
277
278end module phyredem
Note: See TracBrowser for help on using the repository browser.