source: trunk/LMDZ.COMMON/libf/evolution/pem.F90 @ 3242

Last change on this file since 3242 was 3207, checked in by jbclement, 2 years ago

Mars PCM:
Modification of r3200 for the 1D model: the 'CO2cond_ps' coefficient (now defined in "co2condens_mod.F") is applied not only to update the surface pressure but also all the tracers and the winds from now on. It is done in "physiq_mod.F" just after the call to 'co2condens'.
JBC

File size: 54.4 KB
Line 
1!------------------------
2! I   Initialization
3!    I_a Read the "run.def"
4!    I_b Read the "start_evol.nc" and "startfi_evol.nc"
5!    I_c Subslope parametrisation
6!    I_d Read the PCM data and convert them to the physical grid
7!    I_e Initialization of the PEM variable and soil
8!    I_f Compute tendencies
9!    I_g Save initial PCM situation
10!    I_h Read the "startpem.nc"
11!    I_i Compute orbit criterion
12
13! II  Run
14!    II_a Update pressure, ice and tracers
15!    II_b Evolution of ice
16!    II_c Flow of glaciers
17!    II_d Update surface and soil temperatures
18!    II_e Outputs
19!    II_f Update the tendencies
20!    II_g Checking the stopping criterion
21
22! III Output
23!    III_a Update surface value for the PCM start files
24!    III_b Write the "restart_evol.nc" and "restartfi_evol.nc"
25!    III_c Write the "restartpem.nc"
26!------------------------
27
28PROGRAM pem
29
30use phyetat0_mod,               only: phyetat0
31use phyredem,                   only: physdem0, physdem1
32use netcdf,                     only: nf90_open, NF90_NOWRITE, nf90_get_var, nf90_inq_varid, nf90_close
33use turb_mod,                   only: q2, wstar
34use comslope_mod,               only: nslope, def_slope, def_slope_mean, subslope_dist, iflat, ini_comslope_h
35use logic_mod,                  only: iflag_phys
36use mod_const_mpi,              only: COMM_LMDZ
37use infotrac
38use geometry_mod,               only: latitude_deg
39use conf_pem_mod,               only: conf_pem
40use pemredem,                   only: pemdem0, pemdem1
41use glaciers_mod,               only: flow_co2glaciers, flow_h2oglaciers, co2ice_flow, h2oice_flow, inf_h2oice_threshold, &
42                                      metam_h2oice_threshold, metam_co2ice_threshold, metam_h2oice, metam_co2ice
43use stopping_crit_mod,          only: stopping_crit_h2o_ice, stopping_crit_co2
44use constants_marspem_mod,      only: alpha_clap_co2, beta_clap_co2, alpha_clap_h2o, beta_clap_h2o, m_co2, m_noco2
45use evol_ice_mod,               only: evol_co2_ice, evol_h2o_ice
46use comsoil_h_PEM,              only: soil_pem, ini_comsoil_h_PEM, end_comsoil_h_PEM, nsoilmx_PEM, &
47                                      TI_PEM,                           & ! soil thermal inertia
48                                      tsoil_PEM, layer_PEM, & ! Soil temp, number of subsurface layers, soil mid layer depths
49                                      fluxgeo                             ! Geothermal flux for the PEM and PCM
50use adsorption_mod,             only: regolith_adsorption, adsorption_pem,        & ! Bool to check if adsorption, main subroutine
51                                      ini_adsorption_h_PEM, end_adsorption_h_PEM, & ! Allocate arrays
52                                      co2_adsorbded_phys, h2o_adsorbded_phys        ! Mass of co2 and h2O adsorbded
53use time_evol_mod,              only: dt_pem, evol_orbit_pem, Max_iter_pem, convert_years, year_bp_ini
54use orbit_param_criterion_mod,  only: orbit_param_criterion
55use recomp_orb_param_mod,       only: recomp_orb_param
56use ice_table_mod,              only: porefillingice_depth, porefillingice_thickness, end_ice_table_porefilling, &
57                                      ini_ice_table_porefilling, icetable_equilibrium, computeice_table_equilibrium,compute_massh2o_exchange_ssi
58use soil_thermalproperties_mod, only: update_soil_thermalproperties
59use time_phylmdz_mod,           only: daysec, dtphys
60use abort_pem_mod,              only: abort_pem
61use soil_settings_PEM_mod,      only: soil_settings_PEM
62use compute_tend_mod,           only: compute_tend
63use info_PEM_mod,               only: info_PEM
64use interpol_TI_PEM2PCM_mod,    only: interpol_TI_PEM2PCM
65use nb_time_step_PCM_mod,       only: nb_time_step_PCM
66use pemetat0_mod,               only: pemetat0
67use read_data_PCM_mod,          only: read_data_PCM
68use recomp_tend_co2_slope_mod,  only: recomp_tend_co2_slope
69use compute_soiltemp_mod,       only: compute_tsoil_pem
70use writediagpem_mod,           only: writediagpem, writediagsoilpem
71use co2condens_mod,             only: CO2cond_ps
72
73#ifndef CPP_STD
74    use comsoil_h,          only: tsoil, nsoilmx, ini_comsoil_h, inertiedat, mlayer, inertiesoil, flux_geo, nqsoil, qsoil
75    use surfdat_h,          only: tsurf, emis, qsurf, watercap, ini_surfdat_h, &
76                                  albedodat, zmea, zstd, zsig, zgam, zthe,     &
77                                  albedo_h2o_frost,frost_albedo_threshold,     &
78                                  emissiv, watercaptag, perennial_co2ice, emisice, albedice
79    use dimradmars_mod,     only: totcloudfrac, albedo
80    use dust_param_mod,     only: tauscaling
81    use tracer_mod,         only: noms, igcm_h2o_ice, igcm_co2, mmol, igcm_h2o_vap ! Tracer names and molar masses
82    use mod_phys_lmdz_para, only: is_parallel, is_sequential, is_mpi_root, is_omp_root, is_master
83    use planete_h,          only: aphelie, periheli, year_day, peri_day, obliquit, iniorbit
84    use comcstfi_h,         only: pi, rad, g, mugaz, r
85    use surfini_mod,        only: surfini
86#else
87    use tracer_h,           only: noms, igcm_h2o_ice, igcm_co2 ! Tracer names
88    use phys_state_var_mod, only: cloudfrac, totcloudfrac, albedo_snow_SPECTV,HICE,RNAT,   &
89                                  PCTSRF_SIC, TSLAB, TSEA_ICE, SEA_ICE, ALBEDO_BAREGROUND, &
90                                  ALBEDO_CO2_ICE_SPECTV, phys_state_var_init
91    use aerosol_mod,        only: iniaerosol
92    use planete_mod,        only: apoastr, periastr, year_day, peri_day, obliquit
93    use comcstfi_mod,       only: pi, rad, g, mugaz, r
94#endif
95
96#ifndef CPP_1D
97    use iniphysiq_mod,            only: iniphysiq
98    use control_mod,              only: iphysiq, day_step, nsplit_phys
99#else
100    use time_phylmdz_mod,         only: iphysiq, day_step
101    use regular_lonlat_mod,       only: init_regular_lonlat
102    use physics_distribution_mod, only: init_physics_distribution
103    use mod_grid_phy_lmdz,        only: regular_lonlat
104    use init_testphys1d_mod,      only: init_testphys1d
105    use comvert_mod,              only: ap, bp
106    use writerestart1D_mod,       only: writerestart1D
107#endif
108
109implicit none
110
111include "dimensions.h"
112include "paramet.h"
113include "comgeom.h"
114include "iniprint.h"
115include "callkeys.h"
116
117integer ngridmx
118parameter(ngridmx = 2 + (jjm - 1)*iim - 1/jjm)
119
120! Same variable names as in the PCM
121integer, parameter :: nlayer = llm ! Number of vertical layer
122integer            :: ngrid        ! Number of physical grid points
123integer            :: nq           ! Number of tracer
124integer            :: day_ini      ! First day of the simulation
125real               :: pday         ! Physical day
126real               :: time_phys    ! Same as in PCM
127real               :: ptimestep    ! Same as in PCM
128real               :: ztime_fin    ! Same as in PCM
129
130! Variables to read start.nc
131character(*), parameter :: start_name = "start_evol.nc" ! Name of the file used to initialize the PEM
132
133! Dynamic variables
134real, dimension(ip1jm,llm)          :: vcov          ! vents covariants
135real, dimension(ip1jmp1,llm)        :: ucov          ! vents covariants
136real, dimension(ip1jmp1,llm)        :: teta          ! temperature potentielle
137real, dimension(:,:,:), allocatable :: q             ! champs advectes
138real, dimension(ip1jmp1)            :: ps            ! pression au sol
139real, dimension(:),     allocatable :: ps_start_PCM  ! (ngrid) surface pressure
140real, dimension(:,:),   allocatable :: ps_timeseries ! (ngrid x timelen) instantaneous surface pressure
141real, dimension(ip1jmp1,llm)        :: masse         ! masse d'air
142real, dimension(ip1jmp1)            :: phis          ! geopotentiel au sol
143real                                :: time_0
144
145! Variables to read starfi.nc
146character(*), parameter :: startfi_name = "startfi_evol.nc" ! Name of the file used to initialize the PEM
147character(2)            :: str2
148integer                 :: ncid, status                           ! Variable for handling opening of files
149integer                 :: lonvarid, latvarid, areavarid, sdvarid ! Variable ID for Netcdf files
150integer                 :: apvarid, bpvarid                       ! Variable ID for Netcdf files
151
152! Variables to read starfi.nc and write restartfi.nc
153real, dimension(:), allocatable :: longitude     ! Longitude read in startfi_name and written in restartfi
154real, dimension(:), allocatable :: latitude      ! Latitude read in startfi_name and written in restartfi
155real, dimension(:), allocatable :: cell_area     ! Cell_area read in startfi_name and written in restartfi
156real                            :: Total_surface ! Total surface of the planet
157
158! Variables for h2o_ice evolution
159real, dimension(:,:),   allocatable :: h2o_ice              ! h2o ice in the PEM
160real, dimension(:,:,:), allocatable :: min_h2o_ice          ! Minima of h2o ice at each point for the PCM years [kg/m^2]
161real                                :: h2o_surf_ini         ! Initial surface of sublimating h2o ice
162real                                :: global_avg_press_PCM ! constant: global average pressure retrieved in the PCM [Pa]
163real                                :: global_avg_press_old ! constant: Global average pressure of initial/previous time step
164real                                :: global_avg_press_new ! constant: Global average pressure of current time step
165real, dimension(:,:),   allocatable :: zplev_new            ! Physical x Atmospheric field: mass of the atmospheric  layers in the pem at current time step [kg/m^2]
166real, dimension(:,:),   allocatable :: zplev_PCM            ! same but retrieved from the PCM [kg/m^2]
167real, dimension(:,:,:), allocatable :: zplev_new_timeseries ! Physical x Atmospheric x Time: same as zplev_new, but in times series [kg/m ^2]
168real, dimension(:,:,:), allocatable :: zplev_old_timeseries ! same but with the time series, for oldest time step
169integer                             :: stopPEM              ! which criterion is reached? 0 = no stopping; 1 = h2o ice surf; 2 = no h2o ice; 3 = co2 ice surf; 4 = ps; 5 = orb param; 6 = end of simu
170real, save                          :: A, B, mmean          ! Molar mass: intermediate A, B for computations of the  mean molar mass of the layer [mol/kg]
171real, dimension(:,:),   allocatable :: q_h2o_PEM_phys       ! Physics x Times: h2o mass mixing ratio computed in the PEM, first value comes from PCM [kg/kg]
172integer                             :: timelen              ! # time samples
173real                                :: ave                  ! intermediate varibale to compute average
174real, dimension(:,:),   allocatable :: p                    ! Physics x Atmosphere: pressure to recompute and write in restart (ngrid,llmp1)
175real                                :: extra_mass           ! Intermediate variables Extra mass of a tracer if it is greater than 1
176
177! Variables for co2_ice evolution
178real, dimension(:,:),   allocatable :: co2_ice          ! co2 ice in the PEM
179real, dimension(:,:),   allocatable :: co2_ice_ini      ! Initial amount of co2 ice in the PEM
180real, dimension(:,:,:), allocatable :: min_co2_ice      ! Minimum of co2 ice at each point for the first year [kg/m^2]
181real                                :: co2_surf_ini     ! Initial surface of sublimating co2 ice
182real, dimension(:,:),   allocatable :: vmr_co2_PCM      ! Physics x Times co2 volume mixing ratio retrieve from the PCM [m^3/m^3]
183real, dimension(:,:),   allocatable :: vmr_co2_PEM_phys ! Physics x Times co2 volume mixing ratio used in the PEM
184real, dimension(:,:),   allocatable :: q_co2_PEM_phys   ! Physics x Times co2 mass mixing ratio in the first layer computed in the PEM, first value comes from PCM [kg/kg]
185
186! Variables for slopes
187real, dimension(:,:,:), allocatable :: co2_ice_PCM        ! Physics x NSLOPE x Times field: co2 ice given by the PCM [kg/m^2]
188real, dimension(:,:),   allocatable :: tend_co2_ice       ! physical point x slope field: Tendency of evolution of perennial co2 ice over a year
189real, dimension(:,:),   allocatable :: tend_co2_ice_ini   ! physical point x slope field x nslope: Tendency of evolution of perennial co2 ice over a year in the PCM
190real, dimension(:,:),   allocatable :: tend_h2o_ice       ! physical point x slope  field: Tendency of evolution of perennial h2o ice
191real, dimension(:,:),   allocatable :: flag_co2flow       ! (ngrid,nslope): Flag where there is a CO2 glacier flow
192real, dimension(:),     allocatable :: flag_co2flow_mesh  ! (ngrid)       : Flag where there is a CO2 glacier flow
193real, dimension(:,:),   allocatable :: flag_h2oflow       ! (ngrid,nslope): Flag where there is a H2O glacier flow
194real, dimension(:),     allocatable :: flag_h2oflow_mesh  ! (ngrid)       : Flag where there is a H2O glacier flow
195
196! Variables for surface and soil
197real, dimension(:,:),     allocatable :: tsurf_ave                          ! Physic x SLOPE field: Averaged Surface Temperature [K]
198real, dimension(:,:,:),   allocatable :: tsoil_ave                          ! Physic x SOIL x SLOPE field: Averaged Soil Temperature [K]
199real, dimension(:,:,:),   allocatable :: tsoil_anom                         ! Amplitude between instataneous and yearly average soil temperature [K]
200real, dimension(:,:,:),   allocatable :: tsurf_PCM_timeseries               ! ngrid x SLOPE XTULES field: Surface Temperature in timeseries [K]
201real, dimension(:,:,:,:), allocatable :: tsoil_phys_PEM_timeseries          ! IG x SLOPE XTULES field: Non averaged Soil Temperature [K]
202real, dimension(:,:,:,:), allocatable :: tsoil_PCM_timeseries               ! IG x SLOPE XTULES field: Non averaged Soil Temperature [K]
203real, dimension(:,:),     allocatable :: tsurf_avg_yr1                      ! Physic x SLOPE field: Averaged Surface Temperature of first call of the PCM [K]
204real, dimension(:,:),     allocatable :: TI_locslope                        ! Physic x Soil: Intermediate thermal inertia  to compute Tsoil [SI]
205real, dimension(:,:),     allocatable :: Tsoil_locslope                     ! Physic x Soil: intermediate when computing Tsoil [K]
206real, dimension(:),       allocatable :: Tsurf_locslope                     ! Physic x Soil: Intermediate surface temperature to compute Tsoil [K]
207real, dimension(:,:,:,:), allocatable :: watersoil_density_timeseries       ! Physic x Soil x Slope x Times water soil density, time series [kg /m^3]
208real, dimension(:,:),     allocatable :: watersurf_density_ave              ! Physic x Slope, water surface density, yearly averaged [kg/m^3]
209real, dimension(:,:,:,:), allocatable :: watersoil_density_PEM_timeseries   ! Physic x Soil x Slope x Times, water soil density, time series [kg/m^3]
210real, dimension(:,:,:),   allocatable :: watersoil_density_PEM_ave          ! Physic x Soil x SLopes, water soil density, yearly averaged [kg/m^3]
211real, dimension(:,:),     allocatable :: Tsurfavg_before_saved              ! Surface temperature saved from previous time step [K]
212real, dimension(:),       allocatable :: delta_co2_adsorbded                ! Physics: quantity of CO2 that is exchanged because of adsorption / desorption [kg/m^2]
213real, dimension(:),       allocatable :: delta_h2o_adsorbded                ! Physics: quantity of H2O that is exchanged because of adsorption / desorption [kg/m^2]
214real                                  :: totmassco2_adsorbded               ! Total mass of CO2 that is exchanged because of adsorption / desoprtion over the planets [kg]
215real                                  :: totmassh2o_adsorbded               ! Total mass of H2O that is exchanged because of adsorption / desoprtion over the planets [kg]
216logical                               :: bool_sublim                        ! logical to check if there is sublimation or not
217real, dimension(:,:),     allocatable :: porefillingice_thickness_prev_iter ! ngrid x nslope: Thickness of the ice table at the previous iteration [m]
218real, dimension(:),       allocatable :: delta_h2o_icetablesublim           ! ngrid x Total mass of the H2O that has sublimated / condenses from the ice table [kg]
219
220! Some variables for the PEM run
221real, parameter :: year_step = 1 ! timestep for the pem
222integer         :: year_iter     ! number of iteration
223integer         :: year_iter_max ! maximum number of iterations before stopping
224integer         :: i_myear       ! Global number of Martian years of the chained simulations
225integer         :: n_myear       ! Maximum number of Martian years of the chained simulations
226real            :: timestep      ! timestep [s]
227
228#ifdef CPP_STD
229    real                                :: frost_albedo_threshold = 0.05 ! frost albedo threeshold to convert fresh frost to old ice
230    real                                :: albedo_h2o_frost              ! albedo of h2o frost
231    real, dimension(:),     allocatable :: tsurf_read_generic            ! Temporary variable to do the subslope transfert dimension when reading form generic
232    real, dimension(:,:),   allocatable :: qsurf_read_generic            ! Temporary variable to do the subslope transfert dimension when reading form generic
233    real, dimension(:,:),   allocatable :: tsoil_read_generic            ! Temporary variable to do the subslope transfert dimension when reading form generic
234    real, dimension(:),     allocatable :: emis_read_generic             ! Temporary variable to do the subslope transfert dimension when reading form generic
235    real, dimension(:,:),   allocatable :: albedo_read_generic           ! Temporary variable to do the subslope transfert dimension when reading form generic
236    real, dimension(:,:),   allocatable :: tsurf                         ! Subslope variable, only needed in the GENERIC case
237    real, dimension(:,:,:), allocatable :: qsurf                         ! Subslope variable, only needed in the GENERIC case
238    real, dimension(:,:,:), allocatable :: tsoil                         ! Subslope variable, only needed in the GENERIC case
239    real, dimension(:,:),   allocatable :: emis                          ! Subslope variable, only needed in the GENERIC case
240    real, dimension(:,:),   allocatable :: watercap                      ! Subslope variable, only needed in the GENERIC case =0 no watercap in generic model
241    logical, dimension(:),  allocatable :: watercaptag                   ! Subslope variable, only needed in the GENERIC case =false no watercaptag in generic model
242    real, dimension(:,:,:), allocatable :: albedo                        ! Subslope variable, only needed in the GENERIC case
243    real, dimension(:,:,:), allocatable :: inertiesoil                   ! Subslope variable, only needed in the GENERIC case
244#endif
245
246#ifdef CPP_1D
247    integer            :: nsplit_phys
248    integer, parameter :: jjm_value = jjm - 1
249
250    ! Dummy variables to use the subroutine 'init_testphys1d'
251    logical                             :: therestart1D, therestartfi
252    integer                             :: ndt, day0
253    real                                :: ptif, pks, day, gru, grv, atm_wat_profile, atm_wat_tau
254    real, dimension(:),     allocatable :: zqsat
255    real, dimension(:,:,:), allocatable :: dq, dqdyn
256    real, dimension(nlayer)             :: play, w
257    real, dimension(nlayer + 1)         :: plev
258#else
259    integer, parameter              :: jjm_value = jjm
260    real, dimension(:), allocatable :: ap ! Coefficient ap read in start_name and written in restart
261    real, dimension(:), allocatable :: bp ! Coefficient bp read in start_name and written in restart
262#endif
263
264! Loop variables
265integer :: i, l, ig, nnq, t, islope, ig_loop, islope_loop, isoil, icap
266
267! Parallel variables
268#ifndef CPP_STD
269    is_sequential = .true.
270    is_parallel = .false.
271    is_mpi_root = .true.
272    is_omp_root = .true.
273    is_master = .true.
274#endif
275
276! Some constants
277day_ini = 0    ! test
278time_phys = 0. ! test
279ngrid = ngridmx
280A = (1/m_co2 - 1/m_noco2)
281B = 1/m_noco2
282year_day = 669
283daysec = 88775.
284timestep = year_day*daysec/year_step
285
286!----------------------------- INITIALIZATION --------------------------
287!------------------------
288! I   Initialization
289!    I_a Read the "run.def"
290!------------------------
291#ifndef CPP_1D
292    dtphys = 0
293    call conf_gcm(99,.true.)
294    call infotrac_init
295    nq = nqtot
296    allocate(q(ip1jmp1,llm,nqtot))
297    allocate(longitude(ngrid),latitude(ngrid),cell_area(ngrid))
298#else
299    allocate(q(1,llm,nqtot))
300    allocate(longitude(1),latitude(1),cell_area(1))
301
302    therestart1D = .false. ! Default value
303    inquire(file = 'start1D_evol.txt',exist = therestart1D)
304    if (.not. therestart1D) then
305        write(*,*) 'There is no "start1D_evol.txt" file!'
306        error stop 'Initialization cannot be done for the 1D PEM.'
307    endif
308    therestartfi = .false. ! Default value
309    inquire(file = 'startfi_evol.nc',exist = therestartfi)
310    if (.not. therestartfi) then
311        write(*,*) 'There is no "startfi_evol.nc" file!'
312        error stop 'Initialization cannot be done for the 1D PEM.'
313    endif
314
315    call init_testphys1d('start1D_evol.txt','startfi_evol.nc',therestart1D,therestartfi,ngrid,nlayer,610.,nq,q, &
316                         time_0,ps(1),ucov,vcov,teta,ndt,ptif,pks,dtphys,zqsat,dq,dqdyn,day0,day,gru,grv,w,     &
317                         play,plev,latitude,longitude,cell_area,atm_wat_profile,atm_wat_tau)
318    ps(2) = ps(1)
319    nsplit_phys = 1
320#endif
321
322call conf_pem(i_myear,n_myear)
323
324!------------------------
325! I   Initialization
326!    I_b Read of the "start_evol.nc" and starfi_evol.nc
327!------------------------
328! I_b.1 Read "start_evol.nc"
329allocate(ps_start_PCM(ngrid))
330#ifndef CPP_1D
331    call dynetat0(start_name,vcov,ucov,teta,q,masse,ps,phis,time_0)
332
333    call gr_dyn_fi(1,iip1,jjp1,ngridmx,ps,ps_start_PCM)
334
335    call iniconst !new
336    call inigeom
337
338    allocate(ap(nlayer + 1))
339    allocate(bp(nlayer + 1))
340    status = nf90_open(start_name,NF90_NOWRITE,ncid)
341    status = nf90_inq_varid(ncid,"ap",apvarid)
342    status = nf90_get_var(ncid,apvarid,ap)
343    status = nf90_inq_varid(ncid,"bp",bpvarid)
344    status = nf90_get_var(ncid,bpvarid,bp)
345    status = nf90_close(ncid)
346
347    call iniphysiq(iim,jjm,llm,(jjm-1)*iim+2,comm_lmdz,daysec,day_ini,dtphys/nsplit_phys,rlatu,rlatv,rlonu,rlonv,aire,cu,cv,rad,g,r,cpp,iflag_phys)
348#else
349    ps_start_PCM(1) = ps(1)
350#endif
351
352! In the PCM, these values are given to the physic by the dynamic.
353! Here we simply read them in the "startfi_evol.nc" file
354status = nf90_open(startfi_name, NF90_NOWRITE, ncid)
355
356status = nf90_inq_varid(ncid,"longitude",lonvarid)
357status = nf90_get_var(ncid,lonvarid,longitude)
358
359status = nf90_inq_varid(ncid,"latitude",latvarid)
360status = nf90_get_var(ncid,latvarid,latitude)
361
362status = nf90_inq_varid(ncid,"area",areavarid)
363status = nf90_get_var(ncid,areavarid,cell_area)
364
365status = nf90_inq_varid(ncid,"soildepth",sdvarid)
366status = nf90_get_var(ncid,sdvarid,mlayer)
367
368status = nf90_close(ncid)
369
370! I_b.2 Read the "startfi_evol.nc"
371! First we read the initial state (starfi.nc)
372#ifndef CPP_STD
373    call phyetat0(startfi_name,0,0,nsoilmx,ngrid,nlayer,nq,nqsoil,day_ini,time_phys,tsurf, &
374                  tsoil,albedo,emis,q2,qsurf,qsoil,tauscaling,totcloudfrac,wstar,          &
375                  watercap,perennial_co2ice,def_slope,def_slope_mean,subslope_dist)
376
377    ! Remove unphysical values of surface tracer
378    where (qsurf < 0.) qsurf = 0.
379
380    call surfini(ngrid,nslope,qsurf)
381#else
382    call phys_state_var_init(nq)
383    if (.not. allocated(noms)) allocate(noms(nq)) ! (because noms is an argument of physdem1 whether or not tracer is on)
384    call initracer(ngrid,nq)
385    call iniaerosol()
386    allocate(tsurf_read_generic(ngrid))
387    allocate(qsurf_read_generic(ngrid,nq))
388    allocate(tsoil_read_generic(ngrid,nsoilmx))
389    allocate(qsoil_read_generic(ngrid,nsoilmx,nqsoil,nslope))
390    allocate(emis_read_generic(ngrid))
391    allocate(tsurf(ngrid,1))
392    allocate(qsurf(ngrid,nq,1))
393    allocate(tsoil(ngrid,nsoilmx,1))
394    allocate(emis(ngrid,1))
395    allocate(watercap(ngrid,1))
396    allocate(watercaptag(ngrid))
397    allocate(albedo_read_generic(ngrid,2))
398    allocate(albedo(ngrid,2,1))
399    allocate(inertiesoil(ngrid,nsoilmx,1))
400    call phyetat0(.true.,ngrid,nlayer,startfi_name,0,0,nsoilmx,nq,nqsoil,day_ini,time_phys, &
401                  tsurf_read_generic,tsoil_read_generic,emis_read_generic,q2,               &
402                  qsurf_read_generic,qsoil_read_generic,cloudfrac,totcloudfrac,hice,        &
403                  rnat,pctsrf_sic,tslab,tsea_ice,sea_ice)
404    call surfini(ngrid,nq,qsurf_read_generic,albedo_read_generic,albedo_bareground,albedo_snow_SPECTV,albedo_co2_ice_SPECTV)
405
406    nslope = 1
407    call ini_comslope_h(ngrid,1)
408
409    qsurf(:,:,1) = qsurf_read_generic
410    tsurf(:,1) = tsurf_read_generic
411    tsoil(:,:,1) = tsoil_read_generic
412    emis(:,1) = emis_read_generic
413    watercap(:,1) = 0.
414    watercaptag(:) = .false.
415    albedo(:,1,1) = albedo_read_generic(:,1)
416    albedo(:,2,1) = albedo_read_generic(:,2)
417    inertiesoil(:,:,1) = inertiedat
418
419    if (nslope == 1) then
420        def_slope(1) = 0
421        def_slope(2) = 0
422        def_slope_mean = 0
423        subslope_dist(:,1) = 1.
424    endif
425
426    ! Remove unphysical values of surface tracer
427    qsurf(:,:,1) = qsurf_read_generic
428    where (qsurf < 0.) qsurf = 0.
429#endif
430
431do nnq = 1,nqtot  ! Why not using ini_tracer ?
432    if (noms(nnq) == "h2o_ice") igcm_h2o_ice = nnq
433    if (noms(nnq) == "h2o_vap") then
434        igcm_h2o_vap = nnq
435        mmol(igcm_h2o_vap) = 18.
436    endif
437    if (noms(nnq) == "co2") igcm_co2 = nnq
438enddo
439r = 8.314511*1000./mugaz
440
441!------------------------
442! I   Initialization
443!    I_c Subslope parametrisation
444!------------------------
445! Define some slope statistics
446iflat = 1
447do islope = 2,nslope
448    if (abs(def_slope_mean(islope)) < abs(def_slope_mean(iflat))) iflat = islope
449enddo
450
451write(*,*) 'Flat slope for islope = ',iflat
452write(*,*) 'corresponding criterium = ',def_slope_mean(iflat)
453
454allocate(flag_co2flow(ngrid,nslope))
455allocate(flag_co2flow_mesh(ngrid))
456allocate(flag_h2oflow(ngrid,nslope))
457allocate(flag_h2oflow_mesh(ngrid))
458
459flag_co2flow = 0
460flag_co2flow_mesh = 0
461flag_h2oflow = 0
462flag_h2oflow_mesh = 0
463
464!------------------------
465! I   Initialization
466!    I_d Read the PCM data and convert them to the physical grid
467!------------------------
468! First we read the evolution of water and co2 ice (and the mass mixing ratio) over the first year of the PCM run, saving only the minimum value
469call nb_time_step_PCM("data_PCM_Y1.nc",timelen)
470
471allocate(tsoil_ave(ngrid,nsoilmx,nslope))
472allocate(watersoil_density_PEM_ave(ngrid,nsoilmx_PEM,nslope))
473allocate(vmr_co2_PCM(ngrid,timelen))
474allocate(ps_timeseries(ngrid,timelen))
475allocate(min_co2_ice(ngrid,nslope,2))
476allocate(min_h2o_ice(ngrid,nslope,2))
477allocate(tsurf_avg_yr1(ngrid,nslope))
478allocate(tsurf_ave(ngrid,nslope))
479allocate(tsurf_PCM_timeseries(ngrid,nslope,timelen))
480allocate(tsoil_PCM_timeseries(ngrid,nsoilmx,nslope,timelen))
481allocate(q_co2_PEM_phys(ngrid,timelen))
482allocate(q_h2o_PEM_phys(ngrid,timelen))
483allocate(co2_ice_PCM(ngrid,nslope,timelen))
484allocate(watersurf_density_ave(ngrid,nslope))
485allocate(watersoil_density_timeseries(ngrid,nsoilmx,nslope,timelen))
486allocate(Tsurfavg_before_saved(ngrid,nslope))
487allocate(tsoil_phys_PEM_timeseries(ngrid,nsoilmx_PEM,nslope,timelen))
488allocate(watersoil_density_PEM_timeseries(ngrid,nsoilmx_PEM,nslope,timelen))
489allocate(delta_co2_adsorbded(ngrid))
490allocate(porefillingice_thickness_prev_iter(ngrid,nslope))
491allocate(delta_h2o_icetablesublim(ngrid))
492allocate(delta_h2o_adsorbded(ngrid))
493allocate(vmr_co2_PEM_phys(ngrid,timelen))
494
495write(*,*) "Downloading data Y1..."
496call read_data_PCM("data_PCM_Y1.nc",timelen,iim,jjm_value,ngrid,nslope,vmr_co2_PCM,ps_timeseries,min_co2_ice(:,:,1),min_h2o_ice(:,:,1), &
497                   tsurf_avg_yr1,tsoil_ave,tsurf_PCM_timeseries,tsoil_PCM_timeseries,q_co2_PEM_phys,q_h2o_PEM_phys,                      &
498                   co2_ice_PCM,watersurf_density_ave,watersoil_density_timeseries)
499write(*,*) "Downloading data Y1 done!"
500
501! Then we read the evolution of water and co2 ice (and the mass mixing ratio) over the second year of the PCM run, saving only the minimum value
502write(*,*) "Downloading data Y2..."
503call read_data_PCM("data_PCM_Y2.nc",timelen,iim,jjm_value,ngrid,nslope,vmr_co2_PCM,ps_timeseries,min_co2_ice(:,:,2),min_h2o_ice(:,:,2), &
504                   tsurf_ave,tsoil_ave,tsurf_PCM_timeseries,tsoil_PCM_timeseries,q_co2_PEM_phys,q_h2o_PEM_phys,                         &
505                   co2_ice_PCM,watersurf_density_ave,watersoil_density_timeseries)
506write(*,*) "Downloading data Y2 done!"
507
508!------------------------
509! I   Initialization
510!    I_e Initialization of the PEM variables and soil
511!------------------------
512call end_comsoil_h_PEM
513call ini_comsoil_h_PEM(ngrid,nslope)
514call end_adsorption_h_PEM
515call ini_adsorption_h_PEM(ngrid,nslope,nsoilmx_PEM)
516call end_ice_table_porefilling
517call ini_ice_table_porefilling(ngrid,nslope)
518
519if (soil_pem) then
520    allocate(tsoil_anom(ngrid,nsoilmx,nslope))
521    tsoil_anom = tsoil - tsoil_ave ! compute anomaly between Tsoil(t) in the startfi - <Tsoil> to recompute properly tsoil in the restart
522    call soil_settings_PEM(ngrid,nslope,nsoilmx_PEM,nsoilmx,inertiesoil,TI_PEM)
523    tsoil_PEM(:,1:nsoilmx,:) = tsoil_ave
524    tsoil_phys_PEM_timeseries(:,1:nsoilmx,:,:) = tsoil_PCM_timeseries
525    watersoil_density_PEM_timeseries(:,1:nsoilmx,:,:) = watersoil_density_timeseries
526    do l = nsoilmx + 1,nsoilmx_PEM
527        tsoil_PEM(:,l,:) = tsoil_ave(:,nsoilmx,:)
528        watersoil_density_PEM_timeseries(:,l,:,:) = watersoil_density_timeseries(:,nsoilmx,:,:)
529    enddo
530    watersoil_density_PEM_ave = sum(watersoil_density_PEM_timeseries,4)/timelen
531endif !soil_pem
532deallocate(tsoil_ave,tsoil_PCM_timeseries)
533
534!------------------------
535! I   Initialization
536!    I_f Compute tendencies
537!------------------------
538allocate(tend_co2_ice(ngrid,nslope),tend_h2o_ice(ngrid,nslope))
539allocate(tend_co2_ice_ini(ngrid,nslope))
540
541! Compute the tendencies of the evolution of ice over the years
542call compute_tend(ngrid,nslope,min_co2_ice,tend_co2_ice)
543call compute_tend(ngrid,nslope,min_h2o_ice,tend_h2o_ice)
544tend_co2_ice_ini = tend_co2_ice
545
546!------------------------
547! I   Initialization
548!    I_g Save initial PCM situation
549!------------------------
550! We save the places where h2o ice is sublimating
551! We compute the surface of h2o ice sublimating
552co2_surf_ini = 0.
553h2o_surf_ini = 0.
554Total_surface = 0.
555do i = 1,ngrid
556    Total_surface = Total_surface + cell_area(i)
557    do islope = 1,nslope
558        if (tend_co2_ice(i,islope) < 0.) co2_surf_ini = co2_surf_ini + cell_area(i)*subslope_dist(i,islope)
559        if (tend_h2o_ice(i,islope) < 0.) h2o_surf_ini = h2o_surf_ini + cell_area(i)*subslope_dist(i,islope)
560    enddo
561enddo
562
563write(*,*) "Total initial surface of co2 ice sublimating (slope) =", co2_surf_ini
564write(*,*) "Total initial surface of h2o ice sublimating (slope) =", h2o_surf_ini
565write(*,*) "Total surface of the planet =", Total_surface
566allocate(zplev_PCM(ngrid,nlayer + 1))
567
568do ig = 1,ngrid
569    zplev_PCM(ig,:) = ap + bp*ps_start_PCM(ig)
570enddo
571
572global_avg_press_old = sum(cell_area*ps_start_PCM)/Total_surface
573global_avg_press_PCM = global_avg_press_old
574global_avg_press_new = global_avg_press_old
575write(*,*) "Initial global average pressure =", global_avg_press_PCM
576
577!------------------------
578! I   Initialization
579!    I_h Read the "startpem.nc"
580!------------------------
581allocate(co2_ice(ngrid,nslope),h2o_ice(ngrid,nslope))
582deallocate(min_co2_ice,min_h2o_ice)
583
584call pemetat0("startpem.nc",ngrid,nsoilmx,nsoilmx_PEM,nslope,timelen,timestep,TI_PEM,tsoil_PEM,porefillingice_depth, &
585              porefillingice_thickness,tsurf_avg_yr1,tsurf_ave,q_co2_PEM_phys,q_h2o_PEM_phys,ps_timeseries,          &
586              tsoil_phys_PEM_timeseries,tend_h2o_ice,tend_co2_ice,co2_ice,h2o_ice,global_avg_press_PCM,              &
587              watersurf_density_ave,watersoil_density_PEM_ave,co2_adsorbded_phys,delta_co2_adsorbded,                &
588              h2o_adsorbded_phys,delta_h2o_adsorbded)
589
590allocate(co2_ice_ini(ngrid,nslope))
591co2_ice_ini = co2_ice
592
593delta_h2o_icetablesublim = 0.
594
595if (adsorption_pem) then
596    totmassco2_adsorbded = 0.
597    totmassh2o_adsorbded = 0.
598    do ig = 1,ngrid
599        do islope = 1,nslope
600            do l = 1,nsoilmx_PEM - 1
601                totmassco2_adsorbded = totmassco2_adsorbded + co2_adsorbded_phys(ig,l,islope)*(layer_PEM(l + 1) - layer_PEM(l))* &
602                                       subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.)*cell_area(ig)
603                totmassh2o_adsorbded = totmassh2o_adsorbded + h2o_adsorbded_phys(ig,l,islope)*(layer_PEM(l + 1) - layer_PEM(l))* &
604                                       subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.)*cell_area(ig)
605            enddo
606        enddo
607    enddo
608    write(*,*) "Tot mass of CO2 in the regolith =", totmassco2_adsorbded
609    write(*,*) "Tot mass of H2O in the regolith =", totmassh2o_adsorbded
610endif ! adsorption
611deallocate(tsurf_avg_yr1)
612
613!------------------------
614! I   Initialization
615!    I_i Compute orbit criterion
616!------------------------
617#ifndef CPP_STD
618    call iniorbit(aphelie,periheli,year_day,peri_day,obliquit)
619#else
620    call iniorbit(apoastr,periastr,year_day,peri_day,obliquit)
621#endif
622
623if (evol_orbit_pem) then
624    call orbit_param_criterion(i_myear,year_iter_max)
625else
626    year_iter_max = Max_iter_pem
627endif
628!-------------------------- END INITIALIZATION -------------------------
629
630!-------------------------------- RUN ----------------------------------
631!------------------------
632! II  Run
633!    II_a Update pressure, ice and tracers
634!------------------------
635year_iter = 0
636stopPEM = 0
637
638do while (year_iter < year_iter_max .and. i_myear < n_myear)
639! II.a.1. Compute updated global pressure
640    write(*,*) "Recomputing the new pressure..."
641    do i = 1,ngrid
642        do islope = 1,nslope
643            global_avg_press_new = global_avg_press_new - CO2cond_ps*g*cell_area(i)*tend_co2_ice(i,islope)*subslope_dist(i,islope)/cos(pi*def_slope_mean(islope)/180.)/Total_surface
644        enddo
645    enddo
646
647    if (adsorption_pem) then
648        do i = 1,ngrid
649            global_avg_press_new = global_avg_press_new - g*cell_area(i)*delta_co2_adsorbded(i)/Total_surface
650        enddo
651    endif
652    write(*,*) 'Global average pressure old time step',global_avg_press_old
653    write(*,*) 'Global average pressure new time step',global_avg_press_new
654
655! II.a.2. Old pressure levels for the timeseries, this value is deleted when unused and recreated each time (big memory consumption)
656    allocate(zplev_old_timeseries(ngrid,nlayer + 1,timelen))
657    write(*,*) "Recomputing the old pressure levels timeserie adapted to the old pressure..."
658    do l = 1,nlayer + 1
659        do ig = 1,ngrid
660            zplev_old_timeseries(ig,l,:) = ap(l) + bp(l)*ps_timeseries(ig,:)
661        enddo
662    enddo
663
664! II.a.3. Surface pressure timeseries
665    write(*,*) "Recomputing the surface pressure timeserie adapted to the new pressure..."
666    do ig = 1,ngrid
667        ps_timeseries(ig,:) = ps_timeseries(ig,:)*global_avg_press_new/global_avg_press_old
668    enddo
669
670! II.a.4. New pressure levels timeseries
671    allocate(zplev_new_timeseries(ngrid,nlayer + 1,timelen))
672    write(*,*) "Recomputing the new pressure levels timeserie adapted to the new pressure..."
673    do l = 1,nlayer + 1
674        do ig = 1,ngrid
675            zplev_new_timeseries(ig,l,:) = ap(l) + bp(l)*ps_timeseries(ig,:)
676        enddo
677    enddo
678
679! II.a.5. Tracers timeseries
680    write(*,*) "Recomputing of tracer VMR timeseries for the new pressure..."
681
682    l = 1
683    do ig = 1,ngrid
684        do t = 1,timelen
685            q_h2o_PEM_phys(ig,t) = q_h2o_PEM_phys(ig,t)*(zplev_old_timeseries(ig,l,t) - zplev_old_timeseries(ig,l + 1,t))/ &
686                                   (zplev_new_timeseries(ig,l,t) - zplev_new_timeseries(ig,l + 1,t))
687            if (q_h2o_PEM_phys(ig,t) < 0) then
688                q_h2o_PEM_phys(ig,t) = 1.e-30
689            else if (q_h2o_PEM_phys(ig,t) > 1) then
690                q_h2o_PEM_phys(ig,t) = 1.
691            endif
692        enddo
693    enddo
694
695    do ig = 1,ngrid
696        do t = 1,timelen
697            q_co2_PEM_phys(ig,t) = q_co2_PEM_phys(ig,t)*(zplev_old_timeseries(ig,l,t) - zplev_old_timeseries(ig,l + 1,t))/ &
698                                   (zplev_new_timeseries(ig,l,t) - zplev_new_timeseries(ig,l + 1,t))                       &
699                                + ((zplev_new_timeseries(ig,l,t) - zplev_new_timeseries(ig,l + 1,t))                       &
700                                -  (zplev_old_timeseries(ig,l,t) - zplev_old_timeseries(ig,l + 1,t)))/                     &
701                                   (zplev_new_timeseries(ig,l,t) - zplev_new_timeseries(ig,l + 1,t))
702            if (q_co2_PEM_phys(ig,t) < 0) then
703                q_co2_PEM_phys(ig,t) = 1.e-30
704            else if (q_co2_PEM_phys(ig,t) > 1) then
705                q_co2_PEM_phys(ig,t) = 1.
706            endif
707            mmean=1/(A*q_co2_PEM_phys(ig,t) + B)
708            vmr_co2_PEM_phys(ig,t) = q_co2_PEM_phys(ig,t)*mmean/m_co2
709        enddo
710    enddo
711
712    deallocate(zplev_new_timeseries,zplev_old_timeseries)
713
714!------------------------
715! II  Run
716!    II_b Evolution of ice
717!------------------------
718    call evol_h2o_ice(ngrid,nslope,cell_area,delta_h2o_adsorbded,delta_h2o_icetablesublim,h2o_ice,tend_h2o_ice,stopPEM)
719    call evol_co2_ice(ngrid,nslope,co2_ice,tend_co2_ice)
720
721!------------------------
722! II  Run
723!    II_c Flow of glaciers
724!------------------------
725    if (co2ice_flow .and. nslope > 1) call flow_co2glaciers(timelen,ngrid,nslope,iflat,subslope_dist,def_slope_mean,vmr_co2_PEM_phys,ps_timeseries, &
726                                            global_avg_press_PCM,global_avg_press_new,co2_ice,flag_co2flow,flag_co2flow_mesh)
727    if (h2oice_flow .and. nslope > 1) call flow_h2oglaciers(timelen,ngrid,nslope,iflat,subslope_dist,def_slope_mean,tsurf_ave,h2o_ice,flag_h2oflow,flag_h2oflow_mesh)
728
729!------------------------
730! II  Run
731!    II_d Update surface and soil temperatures
732!------------------------
733! II_d.1 Update Tsurf
734    write(*,*) "Updating the new Tsurf"
735    bool_sublim = .false.
736    Tsurfavg_before_saved = tsurf_ave
737    do ig = 1,ngrid
738        do islope = 1,nslope
739            if (co2_ice_ini(ig,islope) > 0.5 .and. co2_ice(ig,islope) < 1.e-10) then ! co2 ice disappeared, look for closest point without co2ice
740                if (latitude_deg(ig) > 0) then
741                    do ig_loop = ig,ngrid
742                        do islope_loop = islope,iflat,-1
743                            if (co2_ice_ini(ig_loop,islope_loop) < 0.5 .and. co2_ice(ig_loop,islope_loop) < 1.e-10) then
744                                tsurf_ave(ig,islope) = tsurf_ave(ig_loop,islope_loop)
745                                bool_sublim = .true.
746                                exit
747                            endif
748                        enddo
749                        if (bool_sublim) exit
750                    enddo
751                else
752                    do ig_loop = ig,1,-1
753                        do islope_loop = islope,iflat
754                            if(co2_ice_ini(ig_loop,islope_loop) < 0.5 .and. co2_ice(ig_loop,islope_loop) < 1.e-10) then
755                                tsurf_ave(ig,islope) = tsurf_ave(ig_loop,islope_loop)
756                                bool_sublim = .true.
757                                exit
758                            endif
759                        enddo
760                        if (bool_sublim) exit
761                    enddo
762                endif
763                co2_ice_ini(ig,islope) = 0
764                if ((co2_ice(ig,islope) < 1.e-10) .and. (h2o_ice(ig,islope) > frost_albedo_threshold)) then
765                    albedo(ig,1,islope) = albedo_h2o_frost
766                    albedo(ig,2,islope) = albedo_h2o_frost
767                else
768                    albedo(ig,1,islope) = albedodat(ig)
769                    albedo(ig,2,islope) = albedodat(ig)
770                    emis(ig,islope) = emissiv
771                endif
772            else if ((co2_ice(ig,islope) > 1.e-3) .and. (tend_co2_ice(ig,islope) > 1.e-10)) then ! Put tsurf as tcond co2
773                ave = 0.
774                do t = 1,timelen
775                    if (co2_ice_PCM(ig,islope,t) > 1.e-3) then
776                        ave = ave + beta_clap_co2/(alpha_clap_co2 - log(vmr_co2_PEM_phys(ig,t)*ps_timeseries(ig,t)/100.))
777                    else
778                        ave = ave + tsurf_PCM_timeseries(ig,islope,t)
779                    endif
780                enddo
781                tsurf_ave(ig,islope) = ave/timelen
782                ! set the surface albedo to be the ice albedo
783                if (latitude_deg(ig) > 0) then
784                   icap = 1
785                else
786                   icap = 2
787                endif
788                albedo(ig,1,islope) = albedice(icap)
789                albedo(ig,2,islope) = albedice(icap)
790                emis(ig,islope) = emisice(icap)
791            endif
792        enddo
793    enddo
794
795    do t = 1,timelen
796        tsurf_PCM_timeseries(:,:,t) = tsurf_PCM_timeseries(:,:,t) + tsurf_ave - Tsurfavg_before_saved
797    enddo
798    ! for the start
799    do ig = 1,ngrid
800        do islope = 1,nslope
801            tsurf(ig,islope) =  tsurf(ig,islope) - (Tsurfavg_before_saved(ig,islope) - tsurf_ave(ig,islope))
802        enddo
803    enddo
804
805    if (soil_pem) then
806
807! II_d.2 Update soil temperature
808        allocate(TI_locslope(ngrid,nsoilmx_PEM))
809        allocate(Tsoil_locslope(ngrid,nsoilmx_PEM))
810        allocate(Tsurf_locslope(ngrid))
811        write(*,*)"Updating soil temperature"
812
813        ! Soil averaged
814        do islope = 1,nslope
815            TI_locslope = TI_PEM(:,:,islope)
816            do t = 1,timelen
817                Tsoil_locslope = tsoil_phys_PEM_timeseries(:,:,islope,t)
818                Tsurf_locslope = tsurf_PCM_timeseries(:,islope,t)
819                call compute_tsoil_pem(ngrid,nsoilmx_PEM,.true.,TI_locslope,timestep/timelen,Tsurf_locslope,Tsoil_locslope)
820                call compute_tsoil_pem(ngrid,nsoilmx_PEM,.false.,TI_locslope,timestep/timelen,Tsurf_locslope,Tsoil_locslope)
821                tsoil_phys_PEM_timeseries(:,:,islope,t) = Tsoil_locslope
822                do ig = 1,ngrid
823                    do isoil = 1,nsoilmx_PEM
824                        watersoil_density_PEM_timeseries(ig,isoil,islope,t) = exp(beta_clap_h2o/Tsoil_locslope(ig,isoil) + alpha_clap_h2o)/Tsoil_locslope(ig,isoil)*mmol(igcm_h2o_vap)/(mugaz*r)
825                        if (isnan(Tsoil_locslope(ig,isoil))) call abort_pem("PEM - Update Tsoil","NaN detected in Tsoil ",1)
826                    enddo
827                enddo
828            enddo
829        enddo
830        tsoil_PEM = sum(tsoil_phys_PEM_timeseries,4)/timelen
831        watersoil_density_PEM_ave = sum(watersoil_density_PEM_timeseries,4)/timelen
832
833        write(*,*) "Update of soil temperature done"
834
835        deallocate(TI_locslope,Tsoil_locslope,Tsurf_locslope)
836
837! II_d.3 Update the ice table
838        if (icetable_equilibrium) then
839            write(*,*) "Compute ice table"
840            porefillingice_thickness_prev_iter = porefillingice_thickness
841            call computeice_table_equilibrium(ngrid,nslope,nsoilmx_PEM,watercaptag,watersurf_density_ave,watersoil_density_PEM_ave,TI_PEM(:,1,:),porefillingice_depth,porefillingice_thickness)
842            call compute_massh2o_exchange_ssi(ngrid,nslope,nsoilmx_PEM,porefillingice_thickness_prev_iter,porefillingice_thickness,porefillingice_depth,tsoil_PEM,delta_h2o_icetablesublim) ! Mass of H2O exchange between the ssi and the atmosphere
843        endif
844! II_d.4 Update the soil thermal properties
845        call update_soil_thermalproperties(ngrid,nslope,nsoilmx_PEM,tend_h2o_ice,h2o_ice,global_avg_press_new,porefillingice_depth,porefillingice_thickness,TI_PEM)
846
847! II_d.5 Update the mass of the regolith adsorbed
848        if (adsorption_pem) then
849            call regolith_adsorption(ngrid,nslope,nsoilmx_PEM,timelen,tend_h2o_ice,tend_co2_ice,                   &
850                                     h2o_ice,co2_ice,tsoil_PEM,TI_PEM,ps_timeseries,q_co2_PEM_phys,q_h2o_PEM_phys, &
851                                     h2o_adsorbded_phys,delta_h2o_adsorbded,co2_adsorbded_phys,delta_co2_adsorbded)
852
853            totmassco2_adsorbded = 0.
854            totmassh2o_adsorbded = 0.
855            do ig = 1,ngrid
856                do islope =1, nslope
857                    do l = 1,nsoilmx_PEM - 1
858                        totmassco2_adsorbded = totmassco2_adsorbded + co2_adsorbded_phys(ig,l,islope)*(layer_PEM(l + 1) - layer_PEM(l))* &
859                                               subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.)*cell_area(ig)
860                        totmassh2o_adsorbded = totmassh2o_adsorbded + h2o_adsorbded_phys(ig,l,islope)*(layer_PEM(l + 1) - layer_PEM(l))* &
861                                               subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.)*cell_area(ig)
862                    enddo
863                enddo
864            enddo
865            write(*,*) "Tot mass of CO2 in the regolith=", totmassco2_adsorbded
866            write(*,*) "Tot mass of H2O in the regolith=", totmassh2o_adsorbded
867        endif
868    endif !soil_pem
869
870!------------------------
871! II  Run
872!    II_e Outputs
873!------------------------
874    call writediagpem(ngrid,'ps_ave','Global average pressure','Pa',0,(/global_avg_press_new/))
875    do islope = 1,nslope
876        write(str2(1:2),'(i2.2)') islope
877        call writediagpem(ngrid,'h2o_ice_slope'//str2,'H2O ice','kg.m-2',2,h2o_ice(:,islope))
878        call writediagpem(ngrid,'co2_ice_slope'//str2,'CO2 ice','kg.m-2',2,co2_ice(:,islope))
879        call writediagpem(ngrid,'tend_h2o_ice_slope'//str2,'H2O ice tend','kg.m-2.year-1',2,tend_h2o_ice(:,islope))
880        call writediagpem(ngrid,'tend_co2_ice_slope'//str2,'CO2 ice tend','kg.m-2.year-1',2,tend_co2_ice(:,islope))
881        call writediagpem(ngrid,'Flow_co2ice_slope'//str2,'CO2 ice flow','Boolean',2,flag_co2flow(:,islope))
882        call writediagpem(ngrid,'tsurf_slope'//str2,'tsurf','K',2,tsurf(:,islope))
883        if(icetable_equilibrium) then
884            call writediagpem(ngrid,'ssi_depth_slope'//str2,'ice table depth','m',2,porefillingice_depth(:,islope))
885            call writediagpem(ngrid,'ssi_thick_slope'//str2,'ice table depth','m',2,porefillingice_thickness(:,islope))
886        endif
887        if(soil_pem) then
888            call writediagsoilpem(ngrid,'tsoil_PEM_slope'//str2,'tsoil_PEM','K',3,tsoil_PEM(:,:,islope))
889            call writediagsoilpem(ngrid,'inertiesoil_PEM_slope'//str2,'TI_PEM','K',3,TI_PEM(:,:,islope))
890            if (adsorption_pem) then
891                call writediagsoilpem(ngrid,'co2_ads_slope'//str2,'co2_ads','K',3,co2_adsorbded_phys(:,:,islope))
892                call writediagsoilpem(ngrid,'h2o_ads_slope'//str2,'h2o_ads','K',3,h2o_adsorbded_phys(:,:,islope))
893            endif                       
894        endif
895    enddo
896
897!------------------------
898! II  Run
899!    II_f Update the tendencies
900!------------------------
901    call recomp_tend_co2_slope(ngrid,nslope,timelen,tend_co2_ice,tend_co2_ice_ini,co2_ice,emis,vmr_co2_PCM,vmr_co2_PEM_phys,ps_timeseries, &
902                               global_avg_press_PCM,global_avg_press_new)
903
904!------------------------
905! II  Run
906!    II_g Checking the stopping criterion
907!------------------------
908    call stopping_crit_h2o_ice(cell_area,h2o_surf_ini,h2o_ice,stopPEM,ngrid)
909    call stopping_crit_co2(cell_area,co2_surf_ini,co2_ice,stopPEM,ngrid,global_avg_press_PCM,global_avg_press_new,nslope)
910
911    year_iter = year_iter + dt_pem
912    i_myear = i_myear + dt_pem
913
914    write(*,*) "Checking the stopping criteria..."
915    if (year_iter >= year_iter_max) stopPEM = 5
916    if (i_myear >= n_myear) stopPEM = 6
917    if (stopPEM > 0) then
918        select case (stopPEM)
919            case(1)
920                write(*,*) "STOPPING because surface of h2o ice sublimating is too low:", stopPEM, "See message above."
921            case(2)
922                write(*,*) "STOPPING because tendencies on h2o ice = 0:", stopPEM, "See message above."
923            case(3)
924                write(*,*) "STOPPING because surface of co2 ice sublimating is too low:", stopPEM, "See message above."
925            case(4)
926                write(*,*) "STOPPING because surface global pressure changed too much:", stopPEM, "See message above."
927            case(5)
928                write(*,*) "STOPPING because maximum number of iterations due to orbital parameters is reached:", stopPEM
929            case(6)
930                write(*,*) "STOPPING because maximum number of Martian years to be simulated is reached:", stopPEM
931            case default
932                write(*,*) "STOPPING with unknown stopping criterion code:", stopPEM
933        end select
934        exit
935    else
936        write(*,*) "The PEM can continue!"
937        write(*,*) "Number of iterations of the PEM: year_iter =", year_iter
938        write(*,*) "Number of simulated Martian years: i_myear =", i_myear
939    endif
940
941    global_avg_press_old = global_avg_press_new
942
943enddo ! big time iteration loop of the pem
944!------------------------------ END RUN --------------------------------
945
946!------------------------------- OUTPUT --------------------------------
947!------------------------
948! III Output
949!    III_a Update surface value for the PCM start files
950!------------------------
951! III_a.1 Ice update (for startfi)
952
953watercap = 0.
954perennial_co2ice = co2_ice
955do ig = 1,ngrid
956    ! H2O ice metamorphism
957    if (metam_h2oice .and. sum(qsurf(ig,igcm_h2o_ice,:)*subslope_dist(ig,:)/cos(pi*def_slope_mean(:)/180.)) > metam_h2oice_threshold) then
958        h2o_ice(ig,:) = h2o_ice(ig,:) + qsurf(ig,igcm_h2o_ice,:) - metam_h2oice_threshold/subslope_dist(ig,:)*cos(pi*def_slope_mean(:)*180.)
959        qsurf(ig,igcm_h2o_ice,:) = metam_h2oice_threshold/subslope_dist(ig,:)*cos(pi*def_slope_mean(:)*180.)
960    endif
961
962    ! Is H2O ice still considered as an infinite reservoir for the PCM?
963    if (sum(h2o_ice(ig,:)*subslope_dist(ig,:)/cos(pi*def_slope_mean(:)/180.)) > inf_h2oice_threshold) then
964        ! There is enough ice to be considered as an infinite reservoir
965        watercaptag(ig) = .true.
966    else
967        ! There too little ice to be considered as an infinite reservoir so ice is transferred to the frost
968        watercaptag(ig) = .false.
969        qsurf(ig,igcm_h2o_ice,:) = qsurf(ig,igcm_h2o_ice,:) + h2o_ice(ig,:)
970        h2o_ice(ig,:) = 0.
971    endif
972
973    ! CO2 ice metamorphism
974    if (metam_co2ice .and. sum(qsurf(ig,igcm_co2,:)*subslope_dist(ig,:)/cos(pi*def_slope_mean(:)/180.)) > metam_co2ice_threshold) then
975        perennial_co2ice(ig,:) = perennial_co2ice(ig,:) + qsurf(ig,igcm_co2,:) - metam_co2ice_threshold/subslope_dist(ig,:)*cos(pi*def_slope_mean(:)*180.)
976        qsurf(ig,igcm_co2,:) = metam_co2ice_threshold/subslope_dist(ig,:)*cos(pi*def_slope_mean(:)*180.)
977    endif
978enddo
979
980! III_a.2  Tsoil update (for startfi)
981if (soil_pem) then
982    call interpol_TI_PEM2PCM(ngrid,nslope,nsoilmx_PEM,nsoilmx,TI_PEM,inertiesoil)
983    tsoil = tsoil_PEM(:,1:nsoilmx,:) + tsoil_anom
984    deallocate(tsoil_anom)
985#ifndef CPP_STD
986    flux_geo = fluxgeo
987#endif
988endif
989
990! III_a.4 Pressure (for start)
991ps = ps*global_avg_press_new/global_avg_press_PCM
992ps_start_PCM = ps_start_PCM*global_avg_press_new/global_avg_press_PCM
993
994! III_a.5 Tracer (for start)
995allocate(zplev_new(ngrid,nlayer + 1))
996
997do l = 1,nlayer + 1
998    zplev_new(:,l) = ap(l) + bp(l)*ps_start_PCM
999enddo
1000
1001do nnq = 1,nqtot
1002    if (noms(nnq) /= "co2") then
1003        do l = 1,llm - 1
1004            do ig = 1,ngrid
1005                q(ig,l,nnq) = q(ig,l,nnq)*(zplev_PCM(ig,l) - zplev_PCM(ig,l + 1))/(zplev_new(ig,l) - zplev_new(ig,l + 1))
1006            enddo
1007            q(:,llm,nnq) = q(:,llm - 1,nnq)
1008        enddo
1009    else
1010        do l = 1,llm - 1
1011            do ig = 1,ngrid
1012                q(ig,l,nnq) = q(ig,l,nnq)*(zplev_PCM(ig,l) - zplev_PCM(ig,l + 1))/(zplev_new(ig,l) - zplev_new(ig,l + 1)) &
1013                              + ((zplev_new(ig,l) - zplev_new(ig,l + 1)) - (zplev_PCM(ig,l) - zplev_PCM(ig,l + 1)))/(zplev_new(ig,l) - zplev_new(ig,l + 1))
1014            enddo
1015            q(:,llm,nnq) = q(:,llm - 1,nnq)
1016        enddo
1017    endif
1018enddo
1019
1020! Conserving the tracers mass for PCM start files
1021do nnq = 1,nqtot
1022    do ig = 1,ngrid
1023        do l = 1,llm - 1
1024            if (q(ig,l,nnq) > 1 .and. (noms(nnq) /= "dust_number") .and. (noms(nnq) /= "ccn_number") .and. (noms(nnq) /= "stormdust_number") .and. (noms(nnq) /= "topdust_number")) then
1025                extra_mass = (q(ig,l,nnq) - 1)*(zplev_new(ig,l) - zplev_new(ig,l + 1))
1026                q(ig,l,nnq) = 1.
1027                q(ig,l + 1,nnq) = q(ig,l + 1,nnq) + extra_mass*(zplev_new(ig,l + 1) - zplev_new(ig,l + 2))
1028                write(*,*) 'extra ',noms(nnq),extra_mass, noms(nnq) /= "dust_number",noms(nnq) /= "ccn_number"
1029           endif
1030            if (q(ig,l,nnq) < 0) q(ig,l,nnq) = 1.e-30
1031        enddo
1032    enddo
1033enddo
1034
1035if (evol_orbit_pem) call recomp_orb_param(i_myear,year_iter)
1036
1037!------------------------
1038! III Output
1039!    III_b Write "restart_evol.nc" and "restartfi_evol.nc"
1040!------------------------
1041! III_b.1 Write "restart_evol.nc"
1042ptimestep = iphysiq*daysec/real(day_step)/nsplit_phys ! dtphys/nsplit_phys
1043pday = day_ini
1044ztime_fin = time_phys
1045
1046allocate(p(ip1jmp1,nlayer + 1))
1047#ifndef CPP_1D
1048    call pression (ip1jmp1,ap,bp,ps,p)
1049    call massdair(p,masse)
1050    call dynredem0("restart_evol.nc",day_ini,phis)
1051    call dynredem1("restart_evol.nc",time_0,vcov,ucov,teta,q,masse,ps)
1052    write(*,*) "restart_evol.nc has been written"
1053#else
1054    call writerestart1D('restart1D_evol.txt',ps(1),tsurf(1,:),nlayer,size(tsurf,2),teta,ucov,vcov,nq,noms,qsurf(1,:,:),q)
1055    write(*,*) "restart1D_evol.txt has been written"
1056#endif
1057
1058! III_b.2 Write the "restartfi_evol.nc"
1059#ifndef CPP_STD
1060    call physdem0("restartfi_evol.nc",longitude,latitude,nsoilmx,ngrid, &
1061                  nlayer,nq,ptimestep,pday,0.,cell_area,albedodat,      &
1062                  inertiedat,def_slope,subslope_dist)
1063    call physdem1("restartfi_evol.nc",nsoilmx,ngrid,nlayer,nq,nqsoil, &
1064                  ptimestep,ztime_fin,tsurf,tsoil,inertiesoil,        &
1065                  albedo,emis,q2,qsurf,qsoil,tauscaling,totcloudfrac, &
1066                  wstar,watercap,perennial_co2ice)
1067#else
1068    call physdem0("restartfi_evol.nc",longitude,latitude,nsoilmx,ngrid, &
1069                  nlayer,nq,ptimestep,pday,time_phys,cell_area,         &
1070                  albedo_bareground,inertiedat,zmea,zstd,zsig,zgam,zthe)
1071    call physdem1("restartfi_evol.nc",nsoilmx,ngrid,nlayer,nq,nqsoil,  &
1072                  ptimestep,ztime_fin,tsurf,tsoil,emis,q2,qsurf,qsoil, &
1073                  cloudfrac,totcloudfrac,hice,rnat,pctsrf_sic,tslab,   &
1074                  tsea_ice,sea_ice)
1075#endif
1076write(*,*) "restartfi_evol.nc has been written"
1077
1078!------------------------
1079! III Output
1080!    III_c Write the "restartpem.nc"
1081!------------------------
1082call pemdem0("restartpem.nc",longitude,latitude,cell_area,ngrid,nslope,def_slope,subslope_dist)
1083call pemdem1("restartpem.nc",i_myear,nsoilmx_PEM,ngrid,nslope,tsoil_PEM, &
1084             TI_PEM, porefillingice_depth,porefillingice_thickness,      &
1085             co2_adsorbded_phys,h2o_adsorbded_phys,h2o_ice)
1086write(*,*) "restartpem.nc has been written"
1087
1088call info_PEM(year_iter,stopPEM,i_myear,n_myear)
1089
1090write(*,*) "The PEM has run for", year_iter, "Martian years."
1091write(*,*) "The chained simulation has run for", i_myear, "Martian years =", i_myear*convert_years, "Earth years."
1092write(*,*) "The reached date is now", (year_bp_ini + i_myear)*convert_years, "Earth years."
1093write(*,*) "LL & RV & JBC: so far, so good!"
1094
1095deallocate(vmr_co2_PCM,ps_timeseries,tsurf_PCM_timeseries,q_co2_PEM_phys,q_h2o_PEM_phys)
1096deallocate(co2_ice_PCM,watersurf_density_ave,watersoil_density_timeseries,Tsurfavg_before_saved)
1097deallocate(tsoil_phys_PEM_timeseries,watersoil_density_PEM_timeseries,watersoil_density_PEM_ave)
1098deallocate(delta_co2_adsorbded,delta_h2o_adsorbded,vmr_co2_PEM_phys,delta_h2o_icetablesublim,porefillingice_thickness_prev_iter)
1099deallocate(co2_ice_ini)
1100!----------------------------- END OUTPUT ------------------------------
1101
1102END PROGRAM pem
Note: See TracBrowser for help on using the repository browser.