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

Last change on this file since 3527 was 3527, checked in by jbclement, 25 hours ago

PEM:

  • Removing redundant Norbert Schorghofer's subroutines/parameters (follow-up of r3526);
  • Making all Norbert Schorghofer's subroutines with modern explicit interface via modules;
  • Cleaning of "glaciers_mod.F90";
  • Optimization for the computation of ice density according to temperature by using a function.

JBC

File size: 61.8 KB
Line 
1!------------------------
2! I   Initialization
3!    I_a Read the "run.def"
4!    I_b Read the "start.nc" and "startfi.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 the initial 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.nc" and "restartfi.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, 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: icetable_depth, icetable_thickness, end_ice_table, ice_porefilling, &
57                                      ini_ice_table, icetable_equilibrium, icetable_dynamic, 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
72use layering_mod,               only: d_dust, ptrarray, stratum, layering, ini_layering, del_layering, make_layering, get_nb_str_max, nb_str_max, layering_algo
73use dyn_ss_ice_m_mod,           only: dyn_ss_ice_m
74
75#ifndef CPP_STD
76    use comsoil_h,          only: tsoil, nsoilmx, ini_comsoil_h, inertiedat, mlayer, inertiesoil, flux_geo, nqsoil, qsoil
77    use surfdat_h,          only: tsurf, emis, qsurf, watercap, ini_surfdat_h, &
78                                  albedodat, zmea, zstd, zsig, zgam, zthe,     &
79                                  albedo_h2o_frost,frost_albedo_threshold,     &
80                                  emissiv, watercaptag, perennial_co2ice, emisice, albedice
81    use dimradmars_mod,     only: totcloudfrac, albedo
82    use dust_param_mod,     only: tauscaling
83    use tracer_mod,         only: noms, igcm_h2o_ice, igcm_co2, mmol, igcm_h2o_vap ! Tracer names and molar masses
84    use mod_phys_lmdz_para, only: is_parallel, is_sequential, is_mpi_root, is_omp_root, is_master
85    use planete_h,          only: aphelie, periheli, year_day, peri_day, obliquit, iniorbit
86    use comcstfi_h,         only: pi, rad, g, mugaz, r
87    use surfini_mod,        only: surfini
88    use comconst_mod,       only: kappa, cpp
89#else
90    use tracer_h,           only: noms, igcm_h2o_ice, igcm_co2 ! Tracer names
91    use phys_state_var_mod, only: cloudfrac, totcloudfrac, albedo_snow_SPECTV,HICE,RNAT,   &
92                                  PCTSRF_SIC, TSLAB, TSEA_ICE, SEA_ICE, ALBEDO_BAREGROUND, &
93                                  ALBEDO_CO2_ICE_SPECTV, phys_state_var_init
94    use aerosol_mod,        only: iniaerosol
95    use planete_mod,        only: apoastr, periastr, year_day, peri_day, obliquit
96    use comcstfi_mod,       only: pi, rad, g, mugaz, r
97#endif
98
99#ifndef CPP_1D
100    use iniphysiq_mod,            only: iniphysiq
101    use control_mod,              only: iphysiq, day_step, nsplit_phys
102#else
103    use time_phylmdz_mod,         only: iphysiq, steps_per_sol
104    use regular_lonlat_mod,       only: init_regular_lonlat
105    use physics_distribution_mod, only: init_physics_distribution
106    use mod_grid_phy_lmdz,        only: regular_lonlat
107    use init_testphys1d_mod,      only: init_testphys1d
108    use comvert_mod,              only: ap, bp
109    use writerestart1D_mod,       only: writerestart1D
110#endif
111
112implicit none
113
114include "dimensions.h"
115include "paramet.h"
116include "comgeom.h"
117include "iniprint.h"
118include "callkeys.h"
119
120integer ngridmx
121parameter(ngridmx = 2 + (jjm - 1)*iim - 1/jjm)
122
123! Same variable names as in the PCM
124integer, parameter :: nlayer = llm ! Number of vertical layer
125integer            :: ngrid        ! Number of physical grid points
126integer            :: nq           ! Number of tracer
127integer            :: day_ini      ! First day of the simulation
128real               :: pday         ! Physical day
129real               :: time_phys    ! Same as in PCM
130real               :: ptimestep    ! Same as in PCM
131real               :: ztime_fin     ! Same as in PCM
132
133! Variables to read start.nc
134character(*), parameter :: start_name = "start.nc" ! Name of the file used to initialize the PEM
135
136! Dynamic variables
137real, dimension(ip1jm,llm)          :: vcov          ! vents covariants
138real, dimension(ip1jmp1,llm)        :: ucov          ! vents covariants
139real, dimension(ip1jmp1,llm)        :: teta          ! temperature potentielle
140real, dimension(:,:,:), allocatable :: q             ! champs advectes
141real, dimension(ip1jmp1)            :: ps            ! pression au sol
142real, dimension(ip1jmp1)            :: ps0           ! pression au sol initiale
143real, dimension(:),     allocatable :: ps_start_PCM  ! (ngrid) surface pressure
144real, dimension(:,:),   allocatable :: ps_timeseries ! (ngrid x timelen) instantaneous surface pressure
145real, dimension(ip1jmp1,llm)        :: masse         ! masse d'air
146real, dimension(ip1jmp1)            :: phis          ! geopotentiel au sol
147real                                :: time_0
148
149! Variables to read starfi.nc
150character(*), parameter :: startfi_name = "startfi.nc" ! Name of the file used to initialize the PEM
151character(2)            :: str2
152integer                 :: ncid, status                           ! Variable for handling opening of files
153integer                 :: lonvarid, latvarid, areavarid, sdvarid ! Variable ID for Netcdf files
154integer                 :: apvarid, bpvarid                       ! Variable ID for Netcdf files
155
156! Variables to read starfi.nc and write restartfi.nc
157real, dimension(:), allocatable :: longitude     ! Longitude read in startfi_name and written in restartfi
158real, dimension(:), allocatable :: latitude      ! Latitude read in startfi_name and written in restartfi
159real, dimension(:), allocatable :: cell_area     ! Cell_area read in startfi_name and written in restartfi
160real                            :: Total_surface ! Total surface of the planet
161
162! Variables for h2o_ice evolution
163real, dimension(:,:),    allocatable  :: h2o_ice              ! h2o ice in the PEM
164real, dimension(:,:,:),  allocatable  :: min_h2o_ice          ! Minima of h2o ice at each point for the PCM years [kg/m^2]
165real                                  :: h2oice_ini_surf      ! Initial surface of sublimating h2o ice
166logical, dimension(:,:), allocatable  :: ini_h2oice_sublim    ! Logical array to know if h2o ice is sublimating
167real                                  :: global_avg_press_PCM ! constant: global average pressure retrieved in the PCM [Pa]
168real                                  :: global_avg_press_old ! constant: Global average pressure of initial/previous time step
169real                                  :: global_avg_press_new ! constant: Global average pressure of current time step
170real,   dimension(:,:),   allocatable :: zplev_new            ! Physical x Atmospheric field: mass of the atmospheric  layers in the pem at current time step [kg/m^2]
171real,   dimension(:,:),   allocatable :: zplev_PCM            ! same but retrieved from the PCM [kg/m^2]
172real,   dimension(:,:,:), allocatable :: zplev_new_timeseries ! Physical x Atmospheric x Time: same as zplev_new, but in times series [kg/m ^2]
173real,   dimension(:,:,:), allocatable :: zplev_old_timeseries ! same but with the time series, for oldest time step
174integer                               :: 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
175real, save                            :: A, B, mmean          ! Molar mass: intermediate A, B for computations of the  mean molar mass of the layer [mol/kg]
176real,   dimension(:,:),   allocatable :: q_h2o_PEM_phys       ! Physics x Times: h2o mass mixing ratio computed in the PEM, first value comes from PCM [kg/kg]
177integer                               :: timelen              ! # time samples
178real                                  :: ave                  ! intermediate varibale to compute average
179real,   dimension(:,:),   allocatable :: p                    ! Physics x Atmosphere: pressure to recompute and write in restart (ngrid,llmp1)
180real                                  :: extra_mass           ! Intermediate variables Extra mass of a tracer if it is greater than 1
181
182! Variables for co2_ice evolution
183real,    dimension(:,:), allocatable :: co2_ice           ! co2 ice in the PEM
184logical, dimension(:,:), allocatable :: is_co2ice_ini     ! Was there co2 ice initially in the PEM?
185real,  dimension(:,:,:), allocatable :: min_co2_ice       ! Minimum of co2 ice at each point for the first year [kg/m^2]
186real                                 :: co2ice_ini_surf   ! Initial surface of sublimating co2 ice
187logical, dimension(:,:), allocatable :: ini_co2ice_sublim ! Logical array to know if co2 ice is sublimating
188real,    dimension(:,:), allocatable :: vmr_co2_PCM       ! Physics x Times co2 volume mixing ratio retrieve from the PCM [m^3/m^3]
189real,    dimension(:,:), allocatable :: vmr_co2_PEM_phys  ! Physics x Times co2 volume mixing ratio used in the PEM
190real,    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]
191
192! Variables for stratification (layering) evolution
193type(layering), dimension(:,:), allocatable :: stratif                     ! Layering (linked list of "stratum") for each grid point and slope
194type(ptrarray), dimension(:,:), allocatable :: current1, current2          ! Current active stratum in the layering
195logical,        dimension(:,:), allocatable :: new_str, new_lag1, new_lag2 ! Flags for the layering algorithm
196
197! Variables for slopes
198real, dimension(:,:),   allocatable :: d_co2ice          ! physical point x slope field: Tendency of evolution of perennial co2 ice over a year
199real, dimension(:,:),   allocatable :: d_co2ice_ini      ! physical point x slope field: Tendency of evolution of perennial co2 ice over a year in the PCM
200real, dimension(:,:),   allocatable :: d_h2oice          ! physical point x slope field: Tendency of evolution of perennial h2o ice
201real, dimension(:,:),   allocatable :: flag_co2flow      ! (ngrid,nslope): Flag where there is a CO2 glacier flow
202real, dimension(:),     allocatable :: flag_co2flow_mesh ! (ngrid)       : Flag where there is a CO2 glacier flow
203real, dimension(:,:),   allocatable :: flag_h2oflow      ! (ngrid,nslope): Flag where there is a H2O glacier flow
204real, dimension(:),     allocatable :: flag_h2oflow_mesh ! (ngrid)       : Flag where there is a H2O glacier flow
205
206! Variables for surface and soil
207real, dimension(:,:),     allocatable :: tsurf_avg                        ! Physic x SLOPE field: Averaged Surface Temperature [K]
208real, dimension(:,:,:),   allocatable :: tsoil_avg                        ! Physic x SOIL x SLOPE field: Averaged Soil Temperature [K]
209real, dimension(:,:,:),   allocatable :: tsurf_PCM_timeseries             ! ngrid x SLOPE x TIMES field: Surface Temperature in timeseries [K]
210real, dimension(:,:,:,:), allocatable :: tsoil_phys_PEM_timeseries        ! IG x SOIL x SLOPE x TIMES field: Non averaged Soil Temperature [K]
211real, dimension(:,:,:,:), allocatable :: tsoil_anom                       ! IG x SOIL x SLOPE x TIMES field: Amplitude between instataneous and yearly average soil temperature at the beginning [K]
212real, dimension(:,:),     allocatable :: tsurf_avg_yr1                    ! Physic x SLOPE field: Averaged Surface Temperature of first call of the PCM [K]
213real, dimension(:,:),     allocatable :: Tsoil_locslope                   ! Physic x Soil: Intermediate when computing Tsoil [K]
214real, dimension(:),       allocatable :: Tsurf_locslope                   ! Physic x Soil: Intermediate surface temperature to compute Tsoil [K]
215real, dimension(:,:,:,:), allocatable :: watersoil_density_timeseries     ! Physic x Soil x Slope x Times water soil density, time series [kg /m^3]
216real, dimension(:,:),     allocatable :: watersurf_density_avg            ! Physic x Slope, water surface density, yearly averaged [kg/m^3]
217real, dimension(:,:,:,:), allocatable :: watersoil_density_PEM_timeseries ! Physic x Soil x Slope x Times, water soil density, time series [kg/m^3]
218real, dimension(:,:,:),   allocatable :: watersoil_density_PEM_avg        ! Physic x Soil x Slopes, water soil density, yearly averaged [kg/m^3]
219real, dimension(:,:),     allocatable :: Tsurfavg_before_saved            ! Surface temperature saved from previous time step [K]
220real, dimension(:),       allocatable :: delta_co2_adsorbded              ! Physics: quantity of CO2 that is exchanged because of adsorption / desorption [kg/m^2]
221real, dimension(:),       allocatable :: delta_h2o_adsorbded              ! Physics: quantity of H2O that is exchanged because of adsorption / desorption [kg/m^2]
222real                                  :: totmassco2_adsorbded             ! Total mass of CO2 that is exchanged because of adsorption / desoprtion over the planets [kg]
223real                                  :: totmassh2o_adsorbded             ! Total mass of H2O that is exchanged because of adsorption / desoprtion over the planets [kg]
224logical                               :: bool_sublim                      ! logical to check if there is sublimation or not
225logical, dimension(:,:),  allocatable :: co2ice_disappeared               ! logical to check if a co2 ice reservoir already disappeared at a previous timestep
226real, dimension(:,:),     allocatable :: icetable_thickness_old           ! ngrid x nslope: Thickness of the ice table at the previous iteration [m]
227real, dimension(:,:,:),   allocatable :: ice_porefilling_old              ! ngrid x nslope: Ice pore filling at the previous iteration [m]
228real, dimension(:),       allocatable :: delta_h2o_icetablesublim         ! ngrid x Total mass of the H2O that has sublimated / condenses from the ice table [kg]
229real, dimension(:),       allocatable :: porefill                         ! Pore filling (output) to compute the dynamic ice table
230real                                  :: ssi_depth                        ! Ice table depth (output) to compute the dynamic ice table
231
232! Some variables for the PEM run
233real, parameter :: year_step = 1   ! Timestep for the pem
234real            :: i_myear_leg       ! Number of iteration
235real            :: n_myear_leg     ! Maximum number of iterations before stopping
236real            :: i_myear         ! Global number of Martian years of the chained simulations
237real            :: n_myear         ! Maximum number of Martian years of the chained simulations
238real            :: timestep        ! Timestep [s]
239character(20)   :: job_id          ! Job id provided as argument passed on the command line when the program was invoked
240logical         :: timewall        ! Flag to use the time limit stopping criterion in case of a PEM job
241integer(kind=8) :: cr              ! Number of clock ticks per second (count rate)
242integer(kind=8) :: c1, c2          ! Counts of processor clock
243character(100)  :: chtimelimit     ! Time limit for the PEM job outputted by the SLURM command
244real            :: timelimit       ! Time limit for the PEM job in seconds
245real, parameter :: antetime = 1200 ! Anticipation time to prevent reaching the time limit: 1200 s = 20 min by default
246integer         :: cstat, days, hours, minutes, seconds
247character(1)    :: sep
248
249#ifdef CPP_STD
250    real                                :: frost_albedo_threshold = 0.05 ! frost albedo threeshold to convert fresh frost to old ice
251    real                                :: albedo_h2o_frost              ! albedo of h2o frost
252    real, dimension(:),     allocatable :: tsurf_read_generic            ! Temporary variable to do the subslope transfert dimension when reading form generic
253    real, dimension(:,:),   allocatable :: qsurf_read_generic            ! Temporary variable to do the subslope transfert dimension when reading form generic
254    real, dimension(:,:),   allocatable :: tsoil_read_generic            ! Temporary variable to do the subslope transfert dimension when reading form generic
255    real, dimension(:),     allocatable :: emis_read_generic             ! Temporary variable to do the subslope transfert dimension when reading form generic
256    real, dimension(:,:),   allocatable :: albedo_read_generic           ! Temporary variable to do the subslope transfert dimension when reading form generic
257    real, dimension(:,:),   allocatable :: tsurf                         ! Subslope variable, only needed in the GENERIC case
258    real, dimension(:,:,:), allocatable :: qsurf                         ! Subslope variable, only needed in the GENERIC case
259    real, dimension(:,:,:), allocatable :: tsoil                         ! Subslope variable, only needed in the GENERIC case
260    real, dimension(:,:),   allocatable :: emis                          ! Subslope variable, only needed in the GENERIC case
261    real, dimension(:,:),   allocatable :: watercap                      ! Subslope variable, only needed in the GENERIC case =0 no watercap in generic model
262    logical, dimension(:),  allocatable :: watercaptag                   ! Subslope variable, only needed in the GENERIC case =false no watercaptag in generic model
263    real, dimension(:,:,:), allocatable :: albedo                        ! Subslope variable, only needed in the GENERIC case
264    real, dimension(:,:,:), allocatable :: inertiesoil                   ! Subslope variable, only needed in the GENERIC case
265#endif
266
267#ifdef CPP_1D
268    integer            :: nsplit_phys
269    integer, parameter :: jjm_value = jjm - 1
270    integer            :: day_step
271
272    ! Dummy variables to use the subroutine 'init_testphys1d'
273    logical                             :: therestart1D, therestartfi
274    integer                             :: ndt, day0
275    real                                :: ptif, pks, day, gru, grv, atm_wat_profile, atm_wat_tau
276    real, dimension(:),     allocatable :: zqsat
277    real, dimension(:,:,:), allocatable :: dq, dqdyn
278    real, dimension(nlayer)             :: play, w
279    real, dimension(nlayer + 1)         :: plev
280#else
281    integer, parameter              :: jjm_value = jjm
282    real, dimension(:), allocatable :: ap ! Coefficient ap read in start_name and written in restart
283    real, dimension(:), allocatable :: bp ! Coefficient bp read in start_name and written in restart
284#endif
285
286! Loop variables
287integer :: i, l, ig, nnq, t, islope, ig_loop, islope_loop, isoil, icap
288
289! Elapsed time with system clock
290call system_clock(count_rate = cr)
291call system_clock(c1)
292timewall = .true.
293timelimit = 86400 ! 86400 seconds = 24 h by default
294if (command_argument_count() > 0) then
295    ! Read the job id passed as argument to the program
296    call get_command_argument(1,job_id)
297    ! Execute the system command
298    call execute_command_line('squeue -j '//trim(job_id)//' -h --Format TimeLimit > tmp_cmdout.txt',cmdstat = cstat)
299    if (cstat /= 0) then
300        call execute_command_line('qstat -f '//trim(job_id)//' | grep "Walltime" | awk ''{print $3}'' > tmp_cmdout.txt', cmdstat = cstat)
301        if (cstat > 0) then
302            error stop 'pem: command execution failed!'
303        else if (cstat < 0) then
304            error stop 'pem: command execution not supported (neither SLURM nor PBS/TORQUE is installed)!'
305        endif
306    endif
307    ! Read the output
308    open(1,file = 'tmp_cmdout.txt',status = 'old')
309    read(1,'(a)') chtimelimit
310    close(1)
311    chtimelimit = trim(chtimelimit)
312    call execute_command_line('rm tmp_cmdout.txt',cmdstat = cstat)
313    if (cstat > 0) then
314        error stop 'pem: command execution failed!'
315    else if (cstat < 0) then
316        error stop 'pem: command execution not supported!'
317    endif
318    if (index(chtimelimit,'-') > 0) then ! 'chtimelimit' format is "D-HH:MM:SS"
319        read(chtimelimit,'(i1,a1,i2,a1,i2,a1,i2)') days, sep, hours, sep, minutes, sep, seconds
320        timelimit = days*86400 + hours*3600 + minutes*60 + seconds
321    else if (index(chtimelimit,':') > 0 .and. len_trim(chtimelimit) > 5) then ! 'chtimelimit' format is "HH:MM:SS"
322        read(chtimelimit,'(i2,a1,i2,a1,i2)') hours, sep, minutes, sep, seconds
323        timelimit = hours*3600 + minutes*60 + seconds
324    else ! 'chtimelimit' format is "MM:SS"
325        read(chtimelimit,'(i2,a1,i2)') minutes, sep, seconds
326        timelimit = minutes*60 + seconds
327    endif
328else
329    timewall = .false.
330endif
331
332! Parallel variables
333#ifndef CPP_STD
334    is_sequential = .true.
335    is_parallel = .false.
336    is_mpi_root = .true.
337    is_omp_root = .true.
338    is_master = .true.
339#endif
340
341! Some constants
342day_ini = 0    ! test
343time_phys = 0. ! test
344ngrid = ngridmx
345A = (1/m_co2 - 1/m_noco2)
346B = 1/m_noco2
347year_day = 669
348daysec = 88775.
349timestep = year_day*daysec*year_step
350
351!----------------------------- INITIALIZATION --------------------------
352!------------------------
353! I   Initialization
354!    I_a Read the "run.def"
355!------------------------
356#ifndef CPP_1D
357    dtphys = daysec/48. ! Dummy value (overwritten in phyetat0)
358    call conf_gcm(99,.true.)
359    call infotrac_init
360    nq = nqtot
361    allocate(q(ip1jmp1,llm,nqtot))
362    allocate(longitude(ngrid),latitude(ngrid),cell_area(ngrid))
363#else
364    allocate(q(1,llm,nqtot))
365    allocate(longitude(1),latitude(1),cell_area(1))
366
367    therestart1D = .false. ! Default value
368    inquire(file = 'start1D.txt',exist = therestart1D)
369    if (.not. therestart1D) then
370        write(*,*) 'There is no "start1D.txt" file!'
371        error stop 'Initialization cannot be done for the 1D PEM.'
372    endif
373    therestartfi = .false. ! Default value
374    inquire(file = 'startfi.nc',exist = therestartfi)
375    if (.not. therestartfi) then
376        write(*,*) 'There is no "startfi.nc" file!'
377        error stop 'Initialization cannot be done for the 1D PEM.'
378    endif
379
380    call init_testphys1d('start1D.txt','startfi.nc',therestart1D,therestartfi,ngrid,nlayer,610.,nq,q,        &
381                         time_0,ps(1),ucov,vcov,teta,ndt,ptif,pks,dtphys,zqsat,dq,dqdyn,day0,day,gru,grv,w,  &
382                         play,plev,latitude,longitude,cell_area,atm_wat_profile,atm_wat_tau)
383    ps(2) = ps(1)
384    nsplit_phys = 1
385    day_step = steps_per_sol
386#endif
387
388call conf_pem(i_myear,n_myear)
389
390!------------------------
391! I   Initialization
392!    I_b Read of the "start.nc" and starfi_evol.nc
393!------------------------
394! I_b.1 Read "start.nc"
395allocate(ps_start_PCM(ngrid))
396#ifndef CPP_1D
397    call dynetat0(start_name,vcov,ucov,teta,q,masse,ps,phis,time_0)
398
399    call gr_dyn_fi(1,iip1,jjp1,ngridmx,ps,ps_start_PCM)
400
401    call iniconst !new
402    call inigeom
403
404    allocate(ap(nlayer + 1))
405    allocate(bp(nlayer + 1))
406    status = nf90_open(start_name,NF90_NOWRITE,ncid)
407    status = nf90_inq_varid(ncid,"ap",apvarid)
408    status = nf90_get_var(ncid,apvarid,ap)
409    status = nf90_inq_varid(ncid,"bp",bpvarid)
410    status = nf90_get_var(ncid,bpvarid,bp)
411    status = nf90_close(ncid)
412
413    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)
414#else
415    ps_start_PCM(1) = ps(1)
416#endif
417
418! Save initial surface pressure
419ps0 = ps
420
421! In the PCM, these values are given to the physic by the dynamic.
422! Here we simply read them in the "startfi.nc" file
423status = nf90_open(startfi_name, NF90_NOWRITE, ncid)
424
425status = nf90_inq_varid(ncid,"longitude",lonvarid)
426status = nf90_get_var(ncid,lonvarid,longitude)
427
428status = nf90_inq_varid(ncid,"latitude",latvarid)
429status = nf90_get_var(ncid,latvarid,latitude)
430
431status = nf90_inq_varid(ncid,"area",areavarid)
432status = nf90_get_var(ncid,areavarid,cell_area)
433
434status = nf90_inq_varid(ncid,"soildepth",sdvarid)
435status = nf90_get_var(ncid,sdvarid,mlayer)
436
437status = nf90_close(ncid)
438
439! I_b.2 Read the "startfi.nc"
440! First we read the initial state (starfi.nc)
441#ifndef CPP_STD
442    call phyetat0(startfi_name,0,0,nsoilmx,ngrid,nlayer,nq,nqsoil,day_ini,time_phys,tsurf, &
443                  tsoil,albedo,emis,q2,qsurf,qsoil,tauscaling,totcloudfrac,wstar,          &
444                  watercap,perennial_co2ice,def_slope,def_slope_mean,subslope_dist)
445
446    ! Remove unphysical values of surface tracer
447    where (qsurf < 0.) qsurf = 0.
448
449    call surfini(ngrid,nslope,qsurf)
450#else
451    call phys_state_var_init(nq)
452    if (.not. allocated(noms)) allocate(noms(nq)) ! (because noms is an argument of physdem1 whether or not tracer is on)
453    call initracer(ngrid,nq)
454    call iniaerosol()
455    allocate(tsurf_read_generic(ngrid))
456    allocate(qsurf_read_generic(ngrid,nq))
457    allocate(tsoil_read_generic(ngrid,nsoilmx))
458    allocate(qsoil_read_generic(ngrid,nsoilmx,nqsoil,nslope))
459    allocate(emis_read_generic(ngrid))
460    allocate(tsurf(ngrid,1))
461    allocate(qsurf(ngrid,nq,1))
462    allocate(tsoil(ngrid,nsoilmx,1))
463    allocate(emis(ngrid,1))
464    allocate(watercap(ngrid,1))
465    allocate(watercaptag(ngrid))
466    allocate(albedo_read_generic(ngrid,2))
467    allocate(albedo(ngrid,2,1))
468    allocate(inertiesoil(ngrid,nsoilmx,1))
469    call phyetat0(.true.,ngrid,nlayer,startfi_name,0,0,nsoilmx,nq,nqsoil,day_ini,time_phys, &
470                  tsurf_read_generic,tsoil_read_generic,emis_read_generic,q2,               &
471                  qsurf_read_generic,qsoil_read_generic,cloudfrac,totcloudfrac,hice,        &
472                  rnat,pctsrf_sic,tslab,tsea_ice,sea_ice)
473    call surfini(ngrid,nq,qsurf_read_generic,albedo_read_generic,albedo_bareground,albedo_snow_SPECTV,albedo_co2_ice_SPECTV)
474
475    nslope = 1
476    call ini_comslope_h(ngrid,1)
477
478    qsurf(:,:,1) = qsurf_read_generic
479    tsurf(:,1) = tsurf_read_generic
480    tsoil(:,:,1) = tsoil_read_generic
481    emis(:,1) = emis_read_generic
482    watercap(:,1) = 0.
483    watercaptag(:) = .false.
484    albedo(:,1,1) = albedo_read_generic(:,1)
485    albedo(:,2,1) = albedo_read_generic(:,2)
486    inertiesoil(:,:,1) = inertiedat
487
488    if (nslope == 1) then
489        def_slope(1) = 0
490        def_slope(2) = 0
491        def_slope_mean = 0
492        subslope_dist(:,1) = 1.
493    endif
494
495    ! Remove unphysical values of surface tracer
496    qsurf(:,:,1) = qsurf_read_generic
497    where (qsurf < 0.) qsurf = 0.
498#endif
499
500do nnq = 1,nqtot  ! Why not using ini_tracer ?
501    if (noms(nnq) == "h2o_ice") igcm_h2o_ice = nnq
502    if (noms(nnq) == "h2o_vap") then
503        igcm_h2o_vap = nnq
504        mmol(igcm_h2o_vap) = 18.
505    endif
506    if (noms(nnq) == "co2") igcm_co2 = nnq
507enddo
508r = 8.314511*1000./mugaz
509
510!------------------------
511! I   Initialization
512!    I_c Subslope parametrisation
513!------------------------
514! Define some slope statistics
515iflat = 1
516do islope = 2,nslope
517    if (abs(def_slope_mean(islope)) < abs(def_slope_mean(iflat))) iflat = islope
518enddo
519
520write(*,*) 'Flat slope for islope = ',iflat
521write(*,*) 'corresponding criterium = ',def_slope_mean(iflat)
522
523allocate(flag_co2flow(ngrid,nslope))
524allocate(flag_co2flow_mesh(ngrid))
525allocate(flag_h2oflow(ngrid,nslope))
526allocate(flag_h2oflow_mesh(ngrid))
527
528flag_co2flow = 0
529flag_co2flow_mesh = 0
530flag_h2oflow = 0
531flag_h2oflow_mesh = 0
532
533!------------------------
534! I   Initialization
535!    I_d Read the PCM data and convert them to the physical grid
536!------------------------
537! 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
538call nb_time_step_PCM("data_PCM_Y1.nc",timelen)
539
540allocate(tsoil_avg(ngrid,nsoilmx,nslope))
541allocate(watersoil_density_PEM_avg(ngrid,nsoilmx_PEM,nslope))
542allocate(vmr_co2_PCM(ngrid,timelen))
543allocate(ps_timeseries(ngrid,timelen))
544allocate(min_co2_ice(ngrid,nslope,2))
545allocate(min_h2o_ice(ngrid,nslope,2))
546allocate(tsurf_avg_yr1(ngrid,nslope))
547allocate(tsurf_avg(ngrid,nslope))
548allocate(tsurf_PCM_timeseries(ngrid,nslope,timelen))
549allocate(tsoil_anom(ngrid,nsoilmx,nslope,timelen))
550allocate(q_co2_PEM_phys(ngrid,timelen))
551allocate(q_h2o_PEM_phys(ngrid,timelen))
552allocate(watersurf_density_avg(ngrid,nslope))
553allocate(watersoil_density_timeseries(ngrid,nsoilmx,nslope,timelen))
554allocate(Tsurfavg_before_saved(ngrid,nslope))
555allocate(tsoil_phys_PEM_timeseries(ngrid,nsoilmx_PEM,nslope,timelen))
556allocate(watersoil_density_PEM_timeseries(ngrid,nsoilmx_PEM,nslope,timelen))
557allocate(delta_co2_adsorbded(ngrid))
558allocate(co2ice_disappeared(ngrid,nslope))
559allocate(icetable_thickness_old(ngrid,nslope))
560allocate(ice_porefilling_old(ngrid,nsoilmx_PEM,nslope))
561allocate(delta_h2o_icetablesublim(ngrid))
562allocate(delta_h2o_adsorbded(ngrid))
563allocate(vmr_co2_PEM_phys(ngrid,timelen))
564
565write(*,*) "Downloading data Y1..."
566call 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), &
567                   tsurf_avg_yr1,tsoil_avg,tsurf_PCM_timeseries,tsoil_anom,q_co2_PEM_phys,q_h2o_PEM_phys,                     &
568                   watersurf_density_avg,watersoil_density_timeseries)
569write(*,*) "Downloading data Y1 done!"
570
571! 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
572write(*,*) "Downloading data Y2..."
573call 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), &
574                   tsurf_avg,tsoil_avg,tsurf_PCM_timeseries,tsoil_anom,q_co2_PEM_phys,q_h2o_PEM_phys,                         &
575                   watersurf_density_avg,watersoil_density_timeseries)
576write(*,*) "Downloading data Y2 done!"
577
578!------------------------
579! I   Initialization
580!    I_e Initialization of the PEM variables and soil
581!------------------------
582call end_comsoil_h_PEM
583call ini_comsoil_h_PEM(ngrid,nslope)
584call end_adsorption_h_PEM
585call ini_adsorption_h_PEM(ngrid,nslope,nsoilmx_PEM)
586call end_ice_table
587call ini_ice_table(ngrid,nslope,nsoilmx_PEM)
588
589if (soil_pem) then
590    do t = 1,timelen
591        tsoil_anom(:,:,:,t) = tsoil_anom(:,:,:,t) - tsoil_avg ! compute anomaly between Tsoil(t) in the startfi - <Tsoil> to recompute properly tsoil in the restart
592    enddo
593    call soil_settings_PEM(ngrid,nslope,nsoilmx_PEM,nsoilmx,inertiesoil,TI_PEM)
594    tsoil_PEM(:,1:nsoilmx,:) = tsoil_avg
595    tsoil_phys_PEM_timeseries(:,1:nsoilmx,:,:) = tsoil_anom
596    watersoil_density_PEM_timeseries(:,1:nsoilmx,:,:) = watersoil_density_timeseries
597    do l = nsoilmx + 1,nsoilmx_PEM
598        tsoil_PEM(:,l,:) = tsoil_avg(:,nsoilmx,:)
599        watersoil_density_PEM_timeseries(:,l,:,:) = watersoil_density_timeseries(:,nsoilmx,:,:)
600    enddo
601    watersoil_density_PEM_avg = sum(watersoil_density_PEM_timeseries,4)/timelen
602endif !soil_pem
603deallocate(tsoil_avg)
604
605!------------------------
606! I   Initialization
607!    I_f Compute tendencies
608!------------------------
609allocate(d_co2ice(ngrid,nslope),d_h2oice(ngrid,nslope))
610allocate(d_co2ice_ini(ngrid,nslope))
611
612! Compute the tendencies of the evolution of ice over the years
613call compute_tend(ngrid,nslope,min_co2_ice,d_co2ice)
614call compute_tend(ngrid,nslope,min_h2o_ice,d_h2oice)
615d_co2ice_ini = d_co2ice
616deallocate(min_co2_ice,min_h2o_ice)
617
618!------------------------
619! I   Initialization
620!    I_g Save the initial situation
621!------------------------
622allocate(zplev_PCM(ngrid,nlayer + 1))
623Total_surface = 0.
624do ig = 1,ngrid
625    Total_surface = Total_surface + cell_area(ig)
626    zplev_PCM(ig,:) = ap + bp*ps_start_PCM(ig)
627enddo
628global_avg_press_old = sum(cell_area*ps_start_PCM)/Total_surface
629global_avg_press_PCM = global_avg_press_old
630global_avg_press_new = global_avg_press_old
631write(*,*) "Total surface of the planet =", Total_surface
632write(*,*) "Initial global average pressure =", global_avg_press_PCM
633
634!------------------------
635! I   Initialization
636!    I_h Read the "startpem.nc"
637!------------------------
638allocate(co2_ice(ngrid,nslope),h2o_ice(ngrid,nslope))
639
640allocate(stratif(ngrid,nslope))
641if (layering_algo) then
642    do islope = 1,nslope
643        do i = 1,ngrid
644            call ini_layering(stratif(i,islope))
645        enddo
646    enddo
647endif
648
649call pemetat0("startpem.nc",ngrid,nsoilmx,nsoilmx_PEM,nslope,timelen,timestep,TI_PEM,tsoil_PEM,icetable_depth, &
650              icetable_thickness,ice_porefilling,tsurf_avg_yr1,tsurf_avg,q_co2_PEM_phys,q_h2o_PEM_phys,        &
651              ps_timeseries,tsoil_phys_PEM_timeseries,d_h2oice,d_co2ice,co2_ice,h2o_ice,                       &
652              global_avg_press_PCM,watersurf_density_avg,watersoil_density_PEM_avg,co2_adsorbded_phys,         &
653              delta_co2_adsorbded,h2o_adsorbded_phys,delta_h2o_adsorbded,stratif)
654
655! We save the places where h2o ice is sublimating
656! We compute the surface of h2o ice sublimating
657allocate(ini_co2ice_sublim(ngrid,nslope),ini_h2oice_sublim(ngrid,nslope),is_co2ice_ini(ngrid,nslope))
658co2ice_ini_surf = 0.
659h2oice_ini_surf = 0.
660ini_co2ice_sublim = .false.
661ini_h2oice_sublim = .false.
662is_co2ice_ini = .false.
663co2ice_disappeared = .false.
664do i = 1,ngrid
665    do islope = 1,nslope
666        if (co2_ice(i,islope) > 0.) is_co2ice_ini(i,islope) = .true.
667        if (d_co2ice(i,islope) < 0. .and. co2_ice(i,islope) > 0.) then
668            ini_co2ice_sublim(i,islope) = .true.
669            co2ice_ini_surf = co2ice_ini_surf + cell_area(i)*subslope_dist(i,islope)
670        endif
671        if (d_h2oice(i,islope) < 0. .and. h2o_ice(i,islope) > 0.) then
672            ini_h2oice_sublim(i,islope) = .true.
673            h2oice_ini_surf = h2oice_ini_surf + cell_area(i)*subslope_dist(i,islope)
674        endif
675    enddo
676enddo
677write(*,*) "Total initial surface of co2 ice sublimating (slope) =", co2ice_ini_surf
678write(*,*) "Total initial surface of h2o ice sublimating (slope) =", h2oice_ini_surf
679
680delta_h2o_icetablesublim = 0.
681
682if (adsorption_pem) then
683    totmassco2_adsorbded = 0.
684    totmassh2o_adsorbded = 0.
685    do ig = 1,ngrid
686        do islope = 1,nslope
687            do l = 1,nsoilmx_PEM - 1
688                if (l==1) then
689                   totmassco2_adsorbded = totmassco2_adsorbded + co2_adsorbded_phys(ig,l,islope)*(layer_PEM(l))* &
690                                       subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.)*cell_area(ig)
691                   totmassh2o_adsorbded = totmassh2o_adsorbded + h2o_adsorbded_phys(ig,l,islope)*(layer_PEM(l))* &
692                                       subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.)*cell_area(ig)
693                else
694                   totmassco2_adsorbded = totmassco2_adsorbded + co2_adsorbded_phys(ig,l,islope)*(layer_PEM(l) - layer_PEM(l-1))* &
695                                       subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.)*cell_area(ig)
696                   totmassh2o_adsorbded = totmassh2o_adsorbded + h2o_adsorbded_phys(ig,l,islope)*(layer_PEM(l) - layer_PEM(l-1))* &
697                                       subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.)*cell_area(ig)
698                endif
699            enddo
700        enddo
701    enddo
702    write(*,*) "Tot mass of CO2 in the regolith =", totmassco2_adsorbded
703    write(*,*) "Tot mass of H2O in the regolith =", totmassh2o_adsorbded
704endif ! adsorption
705deallocate(tsurf_avg_yr1)
706
707!------------------------
708! I   Initialization
709!    I_i Compute orbit criterion
710!------------------------
711#ifndef CPP_STD
712    call iniorbit(aphelie,periheli,year_day,peri_day,obliquit)
713#else
714    call iniorbit(apoastr,periastr,year_day,peri_day,obliquit)
715#endif
716
717n_myear_leg = Max_iter_pem
718if (evol_orbit_pem) call orbit_param_criterion(i_myear,n_myear_leg)
719
720!-------------------------- END INITIALIZATION -------------------------
721
722!-------------------------------- RUN ----------------------------------
723!------------------------
724! II  Run
725!    II_a Update pressure, ice and tracers
726!------------------------
727i_myear_leg = 0
728stopPEM = 0
729if (layering_algo) then
730    allocate(new_str(ngrid,nslope),new_lag1(ngrid,nslope),new_lag2(ngrid,nslope),current1(ngrid,nslope),current2(ngrid,nslope))
731    new_str = .true.
732    new_lag1 = .true.
733    new_lag2 = .true.
734    do islope = 1,nslope
735        do ig = 1,ngrid
736            current1(ig,islope)%p => stratif(ig,islope)%top
737            current2(ig,islope)%p => stratif(ig,islope)%top
738        enddo
739    enddo
740endif
741
742do while (i_myear_leg < n_myear_leg .and. i_myear < n_myear)
743! II.a.1. Compute updated global pressure
744    write(*,*) "Recomputing the new pressure..."
745    do i = 1,ngrid
746        do islope = 1,nslope
747            global_avg_press_new = global_avg_press_new - CO2cond_ps*g*cell_area(i)*d_co2ice(i,islope)*subslope_dist(i,islope)/cos(pi*def_slope_mean(islope)/180.)/Total_surface
748        enddo
749    enddo
750
751    if (adsorption_pem) then
752        do i = 1,ngrid
753            global_avg_press_new = global_avg_press_new - g*cell_area(i)*delta_co2_adsorbded(i)/Total_surface
754        enddo
755    endif
756    write(*,*) 'Global average pressure old time step',global_avg_press_old
757    write(*,*) 'Global average pressure new time step',global_avg_press_new
758
759! II.a.2. Old pressure levels for the timeseries, this value is deleted when unused and recreated each time (big memory consumption)
760    allocate(zplev_old_timeseries(ngrid,nlayer + 1,timelen))
761    write(*,*) "Recomputing the old pressure levels timeserie adapted to the old pressure..."
762    do l = 1,nlayer + 1
763        do ig = 1,ngrid
764            zplev_old_timeseries(ig,l,:) = ap(l) + bp(l)*ps_timeseries(ig,:)
765        enddo
766    enddo
767
768! II.a.3. Surface pressure timeseries
769    write(*,*) "Recomputing the surface pressure timeserie adapted to the new pressure..."
770    do ig = 1,ngrid
771        ps_timeseries(ig,:) = ps_timeseries(ig,:)*global_avg_press_new/global_avg_press_old
772    enddo
773
774! II.a.4. New pressure levels timeseries
775    allocate(zplev_new_timeseries(ngrid,nlayer + 1,timelen))
776    write(*,*) "Recomputing the new pressure levels timeserie adapted to the new pressure..."
777    do l = 1,nlayer + 1
778        do ig = 1,ngrid
779            zplev_new_timeseries(ig,l,:) = ap(l) + bp(l)*ps_timeseries(ig,:)
780        enddo
781    enddo
782
783! II.a.5. Tracers timeseries
784    write(*,*) "Recomputing of tracer VMR timeseries for the new pressure..."
785
786    l = 1
787    do ig = 1,ngrid
788        do t = 1,timelen
789            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))/ &
790                                   (zplev_new_timeseries(ig,l,t) - zplev_new_timeseries(ig,l + 1,t))
791            if (q_h2o_PEM_phys(ig,t) < 0) then
792                q_h2o_PEM_phys(ig,t) = 1.e-30
793            else if (q_h2o_PEM_phys(ig,t) > 1) then
794                q_h2o_PEM_phys(ig,t) = 1.
795            endif
796        enddo
797    enddo
798
799    do ig = 1,ngrid
800        do t = 1,timelen
801            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))/ &
802                                   (zplev_new_timeseries(ig,l,t) - zplev_new_timeseries(ig,l + 1,t))                       &
803                                + ((zplev_new_timeseries(ig,l,t) - zplev_new_timeseries(ig,l + 1,t))                       &
804                                -  (zplev_old_timeseries(ig,l,t) - zplev_old_timeseries(ig,l + 1,t)))/                     &
805                                   (zplev_new_timeseries(ig,l,t) - zplev_new_timeseries(ig,l + 1,t))
806            if (q_co2_PEM_phys(ig,t) < 0) then
807                q_co2_PEM_phys(ig,t) = 1.e-30
808            else if (q_co2_PEM_phys(ig,t) > 1) then
809                q_co2_PEM_phys(ig,t) = 1.
810            endif
811            mmean=1/(A*q_co2_PEM_phys(ig,t) + B)
812            vmr_co2_PEM_phys(ig,t) = q_co2_PEM_phys(ig,t)*mmean/m_co2
813        enddo
814    enddo
815
816    deallocate(zplev_new_timeseries,zplev_old_timeseries)
817
818!------------------------
819! II  Run
820!    II_b Evolution of ice
821!------------------------
822    call evol_h2o_ice(ngrid,nslope,cell_area,delta_h2o_adsorbded,delta_h2o_icetablesublim,h2o_ice,d_h2oice,stopPEM)
823    call evol_co2_ice(ngrid,nslope,co2_ice,d_co2ice)
824    if (layering_algo) then
825        do islope = 1,nslope
826            do ig = 1,ngrid
827                call make_layering(stratif(ig,islope),d_co2ice(ig,islope),d_h2oice(ig,islope),d_dust,new_str(ig,islope),new_lag1(ig,islope),new_lag2(ig,islope),stopPEM,current1(ig,islope)%p,current2(ig,islope)%p)
828            enddo
829        enddo
830    endif
831
832!------------------------
833! II  Run
834!    II_c Flow of glaciers
835!------------------------
836    if (co2ice_flow .and. nslope > 1) call flow_co2glaciers(timelen,ngrid,nslope,iflat,subslope_dist,def_slope_mean,vmr_co2_PEM_phys,ps_timeseries, &
837                                                            global_avg_press_PCM,global_avg_press_new,co2_ice,flag_co2flow,flag_co2flow_mesh)
838    if (h2oice_flow .and. nslope > 1) call flow_h2oglaciers(timelen,ngrid,nslope,iflat,subslope_dist,def_slope_mean,tsurf_avg,h2o_ice,flag_h2oflow,flag_h2oflow_mesh)
839
840!------------------------
841! II  Run
842!    II_d Update surface and soil temperatures
843!------------------------
844! II_d.1 Update Tsurf
845    write(*,*) "Updating the new Tsurf"
846    bool_sublim = .false.
847    Tsurfavg_before_saved = tsurf_avg
848    do ig = 1,ngrid
849        do islope = 1,nslope
850            if (is_co2ice_ini(ig,islope) .and. co2_ice(ig,islope) < 1.e-10 .and. .not. co2ice_disappeared(ig,islope)) then ! co2 ice disappeared, look for closest point without co2ice
851                co2ice_disappeared(ig,islope) = .true.
852                if (latitude_deg(ig) > 0) then
853                    do ig_loop = ig,ngrid
854                        do islope_loop = islope,iflat,-1
855                            if (.not. is_co2ice_ini(ig_loop,islope_loop) .and. co2_ice(ig_loop,islope_loop) < 1.e-10) then
856                                tsurf_avg(ig,islope) = tsurf_avg(ig_loop,islope_loop)
857                                bool_sublim = .true.
858                                exit
859                            endif
860                        enddo
861                        if (bool_sublim) exit
862                    enddo
863                else
864                    do ig_loop = ig,1,-1
865                        do islope_loop = islope,iflat
866                            if (.not. is_co2ice_ini(ig_loop,islope_loop) .and. co2_ice(ig_loop,islope_loop) < 1.e-10) then
867                                tsurf_avg(ig,islope) = tsurf_avg(ig_loop,islope_loop)
868                                bool_sublim = .true.
869                                exit
870                            endif
871                        enddo
872                        if (bool_sublim) exit
873                    enddo
874                endif
875                if ((co2_ice(ig,islope) < 1.e-10) .and. (h2o_ice(ig,islope) > frost_albedo_threshold)) then
876                    albedo(ig,1,islope) = albedo_h2o_frost
877                    albedo(ig,2,islope) = albedo_h2o_frost
878                else
879                    albedo(ig,1,islope) = albedodat(ig)
880                    albedo(ig,2,islope) = albedodat(ig)
881                    emis(ig,islope) = emissiv
882                endif
883            else if ((co2_ice(ig,islope) > 1.e-3) .and. (d_co2ice(ig,islope) > 1.e-10)) then ! Put tsurf as tcond co2
884                ave = 0.
885                do t = 1,timelen
886                    ave = ave + beta_clap_co2/(alpha_clap_co2 - log(vmr_co2_PEM_phys(ig,t)*ps_timeseries(ig,t)/100.))
887                enddo
888                tsurf_avg(ig,islope) = ave/timelen
889            endif
890        enddo
891    enddo
892
893    do t = 1,timelen
894        tsurf_PCM_timeseries(:,:,t) = tsurf_PCM_timeseries(:,:,t) + tsurf_avg - Tsurfavg_before_saved
895    enddo
896    ! for the start
897    do ig = 1,ngrid
898        do islope = 1,nslope
899            tsurf(ig,islope) =  tsurf(ig,islope) - (Tsurfavg_before_saved(ig,islope) - tsurf_avg(ig,islope))
900        enddo
901    enddo
902
903    if (soil_pem) then
904
905! II_d.2 Update soil temperature
906        write(*,*)"Updating soil temperature"
907        allocate(Tsoil_locslope(ngrid,nsoilmx_PEM))
908        do islope = 1,nslope
909            call compute_tsoil_pem(ngrid,nsoilmx_PEM,.true.,TI_PEM(:,:,islope),timestep,tsurf_avg(:,islope),tsoil_PEM(:,:,islope))
910            call compute_tsoil_pem(ngrid,nsoilmx_PEM,.false.,TI_PEM(:,:,islope),timestep,tsurf_avg(:,islope),tsoil_PEM(:,:,islope))
911
912            do t = 1,timelen
913                Tsoil_locslope(:,1:nsoilmx) = tsoil_PEM(:,1:nsoilmx,islope) + tsoil_anom(:,:,islope,t)
914                Tsoil_locslope(:,nsoilmx + 1:) = tsoil_PEM(:,nsoilmx + 1:,islope)
915                do ig = 1,ngrid
916                    do isoil = 1,nsoilmx_PEM
917                        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)
918                        if (isnan(tsoil_PEM(ig,isoil,islope))) call abort_pem("PEM - Update Tsoil","NaN detected in tsoil_PEM",1)
919                    enddo
920                enddo
921            enddo
922        enddo
923        watersoil_density_PEM_avg = sum(watersoil_density_PEM_timeseries,4)/timelen
924
925        write(*,*) "Update of soil temperature done"
926
927        deallocate(Tsoil_locslope)
928
929! II_d.3 Update the ice table
930        if (icetable_equilibrium) then
931            write(*,*) "Compute ice table (equilibrium method)"
932            icetable_thickness_old = icetable_thickness
933            call computeice_table_equilibrium(ngrid,nslope,nsoilmx_PEM,watercaptag,watersurf_density_avg,watersoil_density_PEM_avg,TI_PEM(:,1,:),icetable_depth,icetable_thickness)
934            call compute_massh2o_exchange_ssi(ngrid,nslope,nsoilmx_PEM,icetable_thickness_old,ice_porefilling_old,tsurf_avg,tsoil_PEM,delta_h2o_icetablesublim) ! Mass of H2O exchange between the ssi and the atmosphere
935        else if (icetable_dynamic) then
936            write(*,*) "Compute ice table (dynamic method)"
937            ice_porefilling_old = ice_porefilling
938            allocate(porefill(nsoilmx_PEM))
939            do ig = 1,ngrid
940                do islope = 1,nslope
941                    call dyn_ss_ice_m(icetable_depth(ig,islope),tsurf_avg(ig,islope),tsoil_PEM(ig,:,islope),nsoilmx_PEM,TI_PEM(ig,1,nslope),ps(ig),sum(q_h2o_PEM_phys(ig,:))/size(q_h2o_PEM_phys,2),ice_porefilling(ig,:,islope),porefill,ssi_depth)
942                    icetable_depth(ig,islope) = ssi_depth
943                    ice_porefilling(ig,:,islope) = porefill
944                enddo
945            enddo
946            deallocate(porefill)
947            call compute_massh2o_exchange_ssi(ngrid,nslope,nsoilmx_PEM,icetable_thickness_old,ice_porefilling_old,tsurf_avg, tsoil_PEM,delta_h2o_icetablesublim) ! Mass of H2O exchange between the ssi and the atmosphere
948        endif
949
950! II_d.4 Update the soil thermal properties
951        call update_soil_thermalproperties(ngrid,nslope,nsoilmx_PEM,d_h2oice,h2o_ice,global_avg_press_new,icetable_depth,icetable_thickness,ice_porefilling,icetable_equilibrium,icetable_dynamic,TI_PEM)
952
953! II_d.5 Update the mass of the regolith adsorbed
954        if (adsorption_pem) then
955            call regolith_adsorption(ngrid,nslope,nsoilmx_PEM,timelen,d_h2oice,d_co2ice,                           &
956                                     h2o_ice,co2_ice,tsoil_PEM,TI_PEM,ps_timeseries,q_co2_PEM_phys,q_h2o_PEM_phys, &
957                                     h2o_adsorbded_phys,delta_h2o_adsorbded,co2_adsorbded_phys,delta_co2_adsorbded)
958
959            totmassco2_adsorbded = 0.
960            totmassh2o_adsorbded = 0.
961            do ig = 1,ngrid
962                do islope = 1,nslope
963                    do l = 1,nsoilmx_PEM
964                        if (l == 1) then
965                            totmassco2_adsorbded = totmassco2_adsorbded + co2_adsorbded_phys(ig,l,islope)*(layer_PEM(l))* &
966                                       subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.)*cell_area(ig)
967                            totmassh2o_adsorbded = totmassh2o_adsorbded + h2o_adsorbded_phys(ig,l,islope)*(layer_PEM(l))* &
968                                       subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.)*cell_area(ig)
969                        else
970                            totmassco2_adsorbded = totmassco2_adsorbded + co2_adsorbded_phys(ig,l,islope)*(layer_PEM(l) - layer_PEM(l - 1))* &
971                                       subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.)*cell_area(ig)
972                            totmassh2o_adsorbded = totmassh2o_adsorbded + h2o_adsorbded_phys(ig,l,islope)*(layer_PEM(l) - layer_PEM(l - 1))* &
973                                       subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.)*cell_area(ig)
974                        endif
975                    enddo
976                enddo
977            enddo
978            write(*,*) "Tot mass of CO2 in the regolith=", totmassco2_adsorbded
979            write(*,*) "Tot mass of H2O in the regolith=", totmassh2o_adsorbded
980        endif
981    endif !soil_pem
982
983!------------------------
984! II  Run
985!    II_e Outputs
986!------------------------
987    call writediagpem(ngrid,'ps_avg','Global average pressure','Pa',0,(/global_avg_press_new/))
988    do islope = 1,nslope
989        write(str2(1:2),'(i2.2)') islope
990        call writediagpem(ngrid,'h2o_ice_slope'//str2,'H2O ice','kg.m-2',2,h2o_ice(:,islope))
991        call writediagpem(ngrid,'co2_ice_slope'//str2,'CO2 ice','kg.m-2',2,co2_ice(:,islope))
992        call writediagpem(ngrid,'d_h2oice_slope'//str2,'H2O ice tend','kg.m-2.year-1',2,d_h2oice(:,islope))
993        call writediagpem(ngrid,'d_co2ice_slope'//str2,'CO2 ice tend','kg.m-2.year-1',2,d_co2ice(:,islope))
994        call writediagpem(ngrid,'Flow_co2ice_slope'//str2,'CO2 ice flow','Boolean',2,flag_co2flow(:,islope))
995        call writediagpem(ngrid,'tsurf_slope'//str2,'tsurf','K',2,tsurf(:,islope))
996        if (icetable_equilibrium) then
997            call writediagpem(ngrid,'ssi_depth_slope'//str2,'ice table depth','m',2,icetable_depth(:,islope))
998            call writediagpem(ngrid,'ssi_thick_slope'//str2,'ice table depth','m',2,icetable_thickness(:,islope))
999        else if (icetable_dynamic) then
1000            call writediagpem(ngrid,'ssi_depth_slope'//str2,'ice table depth','m',2,icetable_depth(:,islope))
1001            call writediagpem(ngrid,'ssi_thick_slope'//str2,'ice table depth','m',2,icetable_thickness(:,islope))
1002        endif
1003
1004        if (soil_pem) then
1005            call writediagsoilpem(ngrid,'tsoil_PEM_slope'//str2,'tsoil_PEM','K',3,tsoil_PEM(:,:,islope))
1006            call writediagsoilpem(ngrid,'inertiesoil_PEM_slope'//str2,'TI_PEM','K',3,TI_PEM(:,:,islope))
1007            if (adsorption_pem) then
1008                call writediagsoilpem(ngrid,'co2_ads_slope'//str2,'co2_ads','K',3,co2_adsorbded_phys(:,:,islope))
1009                call writediagsoilpem(ngrid,'h2o_ads_slope'//str2,'h2o_ads','K',3,h2o_adsorbded_phys(:,:,islope))
1010            endif                       
1011        endif
1012    enddo
1013
1014!------------------------
1015! II  Run
1016!    II_f Update the tendencies
1017!------------------------
1018    call recomp_tend_co2_slope(ngrid,nslope,timelen,d_co2ice,d_co2ice_ini,co2_ice,emis,vmr_co2_PCM,vmr_co2_PEM_phys,ps_timeseries,global_avg_press_PCM,global_avg_press_new)
1019
1020!------------------------
1021! II  Run
1022!    II_g Checking the stopping criterion
1023!------------------------
1024
1025    write(*,*) "Checking the stopping criteria..."
1026    call stopping_crit_h2o_ice(cell_area,h2oice_ini_surf,ini_h2oice_sublim,h2o_ice,stopPEM,ngrid)
1027    call stopping_crit_co2(cell_area,co2ice_ini_surf,ini_co2ice_sublim,co2_ice,stopPEM,ngrid,global_avg_press_PCM,global_avg_press_new,nslope)
1028    i_myear_leg = i_myear_leg + dt
1029    i_myear = i_myear + dt
1030    if (stopPEM <= 0 .and. i_myear_leg >= n_myear_leg) stopPEM = 5
1031    if (stopPEM <= 0 .and. i_myear >= n_myear) stopPEM = 6
1032    call system_clock(c2)
1033    if (stopPEM <= 0 .and. timewall .and. real((c2 - c1)/cr) >= timelimit - antetime) stopPEM = 7
1034    if (stopPEM > 0) then
1035        select case (stopPEM)
1036            case(1)
1037                write(*,*) "STOPPING because surface of h2o ice sublimating is too low:", stopPEM, "See message above."
1038            case(2)
1039                write(*,*) "STOPPING because tendencies on h2o ice = 0:", stopPEM, "See message above."
1040            case(3)
1041                write(*,*) "STOPPING because surface of co2 ice sublimating is too low:", stopPEM, "See message above."
1042            case(4)
1043                write(*,*) "STOPPING because surface global pressure changed too much:", stopPEM, "See message above."
1044            case(5)
1045                write(*,*) "STOPPING because maximum number of iterations is reached (possibly due to orbital parameters):", stopPEM
1046            case(6)
1047                write(*,*) "STOPPING because maximum number of Martian years to be simulated is reached:", stopPEM
1048            case(7)
1049                write(*,*) "STOPPING because the time limit for the PEM job will be reached soon:", stopPEM
1050            case(8)
1051                write(*,*) "STOPPING because the layering algorithm met an hasty end:", stopPEM
1052            case default
1053                write(*,*) "STOPPING with unknown stopping criterion code:", stopPEM
1054        end select
1055        exit
1056    else
1057        write(*,*) "The PEM can continue!"
1058        write(*,*) "Number of iterations of the PEM: i_myear_leg =", i_myear_leg
1059        write(*,*) "Number of simulated Martian years: i_myear =", i_myear
1060    endif
1061
1062    global_avg_press_old = global_avg_press_new
1063
1064enddo ! big time iteration loop of the pem
1065!------------------------------ END RUN --------------------------------
1066
1067!------------------------------- OUTPUT --------------------------------
1068!------------------------
1069! III Output
1070!    III_a Update surface value for the PCM start files
1071!------------------------
1072! III_a.1 Ice update (for startfi)
1073
1074watercap = 0.
1075perennial_co2ice = co2_ice
1076do ig = 1,ngrid
1077    ! H2O ice metamorphism
1078    if (metam_h2oice .and. sum(qsurf(ig,igcm_h2o_ice,:)*subslope_dist(ig,:)/cos(pi*def_slope_mean(:)/180.)) > metam_h2oice_threshold) then
1079        h2o_ice(ig,:) = h2o_ice(ig,:) + qsurf(ig,igcm_h2o_ice,:) - metam_h2oice_threshold
1080        qsurf(ig,igcm_h2o_ice,:) = metam_h2oice_threshold
1081    endif
1082
1083    ! Is H2O ice still considered as an infinite reservoir for the PCM?
1084    if (sum(h2o_ice(ig,:)*subslope_dist(ig,:)/cos(pi*def_slope_mean(:)/180.)) > inf_h2oice_threshold) then
1085        ! There is enough ice to be considered as an infinite reservoir
1086        watercaptag(ig) = .true.
1087    else
1088        ! There too little ice to be considered as an infinite reservoir so ice is transferred to the frost
1089        watercaptag(ig) = .false.
1090        qsurf(ig,igcm_h2o_ice,:) = qsurf(ig,igcm_h2o_ice,:) + h2o_ice(ig,:)
1091        h2o_ice(ig,:) = 0.
1092    endif
1093
1094    ! CO2 ice metamorphism
1095    if (metam_co2ice .and. sum(qsurf(ig,igcm_co2,:)*subslope_dist(ig,:)/cos(pi*def_slope_mean(:)/180.)) > metam_co2ice_threshold) then
1096        perennial_co2ice(ig,:) = perennial_co2ice(ig,:) + qsurf(ig,igcm_co2,:) - metam_co2ice_threshold
1097        qsurf(ig,igcm_co2,:) = metam_co2ice_threshold
1098    endif
1099enddo
1100
1101! III_a.2 Tsoil update (for startfi)
1102if (soil_pem) then
1103    call interpol_TI_PEM2PCM(ngrid,nslope,nsoilmx_PEM,nsoilmx,TI_PEM,inertiesoil)
1104    tsoil = tsoil_PEM(:,1:nsoilmx,:) + tsoil_anom(:,:,:,timelen)
1105#ifndef CPP_STD
1106    flux_geo = fluxgeo
1107#endif
1108endif
1109deallocate(tsoil_anom)
1110
1111! III_a.4 Pressure (for start)
1112ps = ps*global_avg_press_new/global_avg_press_PCM
1113ps_start_PCM = ps_start_PCM*global_avg_press_new/global_avg_press_PCM
1114
1115! III_a.5 Tracer (for start)
1116allocate(zplev_new(ngrid,nlayer + 1))
1117
1118do l = 1,nlayer + 1
1119    zplev_new(:,l) = ap(l) + bp(l)*ps_start_PCM
1120enddo
1121
1122do nnq = 1,nqtot
1123    if (noms(nnq) /= "co2") then
1124        do l = 1,llm - 1
1125            do ig = 1,ngrid
1126                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))
1127            enddo
1128            q(:,llm,nnq) = q(:,llm - 1,nnq)
1129        enddo
1130    else
1131        do l = 1,llm - 1
1132            do ig = 1,ngrid
1133                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)) &
1134                              + ((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))
1135            enddo
1136            q(:,llm,nnq) = q(:,llm - 1,nnq)
1137        enddo
1138    endif
1139enddo
1140
1141! Conserving the tracers mass for PCM start files
1142do nnq = 1,nqtot
1143    do ig = 1,ngrid
1144        do l = 1,llm - 1
1145            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
1146                extra_mass = (q(ig,l,nnq) - 1)*(zplev_new(ig,l) - zplev_new(ig,l + 1))
1147                q(ig,l,nnq) = 1.
1148                q(ig,l + 1,nnq) = q(ig,l + 1,nnq) + extra_mass*(zplev_new(ig,l + 1) - zplev_new(ig,l + 2))
1149                write(*,*) 'extra ',noms(nnq),extra_mass, noms(nnq) /= "dust_number",noms(nnq) /= "ccn_number"
1150           endif
1151            if (q(ig,l,nnq) < 0) q(ig,l,nnq) = 1.e-30
1152        enddo
1153    enddo
1154enddo
1155
1156if (evol_orbit_pem) call recomp_orb_param(i_myear,i_myear_leg)
1157
1158!------------------------
1159! III Output
1160!    III_b Write "restart.nc" and "restartfi.nc"
1161!------------------------
1162! III_b.1 Write "restart.nc"
1163ptimestep = iphysiq*daysec/real(day_step)/nsplit_phys ! dtphys/nsplit_phys
1164pday = day_ini
1165ztime_fin = time_phys
1166
1167allocate(p(ip1jmp1,nlayer + 1))
1168#ifndef CPP_1D
1169    ! Correction on teta due to surface pressure changes
1170    do l = 1,nlayer
1171        do i = 1,ip1jmp1
1172            teta(i,l)= teta(i,l)*(ps0(i)/ps(i))**kappa
1173        enddo
1174    enddo
1175    ! Correction on atmospheric pressure
1176    call pression(ip1jmp1,ap,bp,ps,p)
1177    ! Correction on the mass of atmosphere
1178    call massdair(p,masse)
1179    call dynredem0("restart.nc",day_ini,phis)
1180    call dynredem1("restart.nc",time_0,vcov,ucov,teta,q,masse,ps)
1181    write(*,*) "restart.nc has been written"
1182#else
1183    call writerestart1D('restart1D.txt',ps(1),tsurf(1,:),nlayer,size(tsurf,2),teta,ucov,vcov,nq,noms,qsurf(1,:,:),q)
1184    write(*,*) "restart1D.txt has been written"
1185#endif
1186
1187! III_b.2 Write the "restartfi.nc"
1188#ifndef CPP_STD
1189    call physdem0("restartfi.nc",longitude,latitude,nsoilmx,ngrid, &
1190                  nlayer,nq,ptimestep,pday,0.,cell_area,albedodat, &
1191                  inertiedat,def_slope,subslope_dist)
1192    call physdem1("restartfi.nc",nsoilmx,ngrid,nlayer,nq,nqsoil,      &
1193                  ptimestep,ztime_fin,tsurf,tsoil,inertiesoil,        &
1194                  albedo,emis,q2,qsurf,qsoil,tauscaling,totcloudfrac, &
1195                  wstar,watercap,perennial_co2ice)
1196#else
1197    call physdem0("restartfi.nc",longitude,latitude,nsoilmx,ngrid, &
1198                  nlayer,nq,ptimestep,pday,time_phys,cell_area,    &
1199                  albedo_bareground,inertiedat,zmea,zstd,zsig,zgam,zthe)
1200    call physdem1("restartfi.nc",nsoilmx,ngrid,nlayer,nq,nqsoil,       &
1201                  ptimestep,ztime_fin,tsurf,tsoil,emis,q2,qsurf,qsoil, &
1202                  cloudfrac,totcloudfrac,hice,rnat,pctsrf_sic,tslab,   &
1203                  tsea_ice,sea_ice)
1204#endif
1205write(*,*) "restartfi.nc has been written"
1206
1207!------------------------
1208! III Output
1209!    III_c Write the "restartpem.nc"
1210!------------------------
1211if (layering_algo) nb_str_max = get_nb_str_max(stratif,ngrid,nslope) ! Get the maximum number of "stratum" in the stratification (layerings)
1212call pemdem0("restartpem.nc",longitude,latitude,cell_area,ngrid,nslope,def_slope,subslope_dist)
1213call pemdem1("restartpem.nc",i_myear,nsoilmx_PEM,ngrid,nslope,tsoil_PEM, &
1214             TI_PEM,icetable_depth,icetable_thickness,ice_porefilling,   &
1215             co2_adsorbded_phys,h2o_adsorbded_phys,h2o_ice,stratif)
1216write(*,*) "restartpem.nc has been written"
1217
1218call info_PEM(i_myear_leg,stopPEM,i_myear,n_myear)
1219
1220write(*,*) "The PEM has run for", i_myear_leg, "Martian years."
1221write(*,*) "The chained simulation has run for", i_myear, "Martian years =", i_myear*convert_years, "Earth years."
1222write(*,*) "The reached date is now", (year_bp_ini + i_myear)*convert_years, "Earth years."
1223write(*,*) "PEM: so far, so good!"
1224
1225if (layering_algo) then
1226    do islope = 1,nslope
1227        do i = 1,ngrid
1228            call del_layering(stratif(i,islope))
1229        enddo
1230    enddo
1231    deallocate(new_str,new_lag1,new_lag2,current1,current2)
1232endif
1233deallocate(vmr_co2_PCM,ps_timeseries,tsurf_PCM_timeseries,q_co2_PEM_phys,q_h2o_PEM_phys)
1234deallocate(watersurf_density_avg,watersoil_density_timeseries,Tsurfavg_before_saved)
1235deallocate(tsoil_phys_PEM_timeseries,watersoil_density_PEM_timeseries,watersoil_density_PEM_avg)
1236deallocate(delta_co2_adsorbded,delta_h2o_adsorbded,vmr_co2_PEM_phys,delta_h2o_icetablesublim)
1237deallocate(icetable_thickness_old,ice_porefilling_old)
1238deallocate(is_co2ice_ini,co2ice_disappeared,ini_co2ice_sublim,ini_h2oice_sublim,stratif)
1239!----------------------------- END OUTPUT ------------------------------
1240
1241END PROGRAM pem
Note: See TracBrowser for help on using the repository browser.