source: trunk/LMDZ.COMMON/libf/evolution/clim_state_init.F90 @ 4134

Last change on this file since 4134 was 4134, checked in by jbclement, 11 days ago

PEM:

  • Add a periodic backup based on a single wrapper which builds PCM-compatible climate state and writes "restart" files.
  • Remove condition "if (.not. allocated(*))" for more strict safeguard.

JBC

File size: 22.3 KB
Line 
1MODULE clim_state_init
2!-----------------------------------------------------------------------
3! NAME
4!     clim_state_init
5!
6! DESCRIPTION
7!     Read the start files to initialize the climate state.
8!
9! AUTHORS & DATE
10!     JB Clement, 12/2025
11!
12! NOTES
13!
14!-----------------------------------------------------------------------
15
16! DEPENDENCIES
17! ------------
18use numerics,  only: dp, di, k4
19use io_netcdf, only: open_nc, close_nc, get_var_nc, get_dim_nc, put_var_nc, start_name, start1D_name, startfi_name, startevo_name
20
21! DECLARATION
22! -----------
23implicit none
24
25contains
26!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
27
28!=======================================================================
29SUBROUTINE read_start()
30!-----------------------------------------------------------------------
31! NAME
32!     read_start
33!
34! DESCRIPTION
35!     Read the file "start.nc".
36!
37! AUTHORS & DATE
38!     JB Clement, 12/2025
39!
40! NOTES
41!
42!-----------------------------------------------------------------------
43
44! DEPENDENCIES
45! ------------
46use geometry,   only: nlayer, nlon, nlat, ngrid
47use atmosphere, only: set_ap, set_bp, set_ps_PCM, set_teta_PCM
48use tracers,    only: nq, qnames, set_q_PCM
49use stoppage,   only: stop_clean
50use display,    only: print_msg, LVL_NFO
51
52! DECLARATION
53! -----------
54implicit none
55
56! LOCAL VARIABLES
57! ---------------
58real(dp), dimension(nlayer + 1)           :: tmp1d
59real(dp), dimension(nlon + 1,nlat)        :: tmp2d
60real(dp), dimension(nlon + 1,nlat,nlayer) :: tmp3d
61logical(k4)                               :: here
62integer(di)                               :: i
63
64! CODE
65! ----
66! In case of 1D
67! ~~~~~~~~~~~~~
68if (ngrid == 1) then
69    call read_start1D()
70    return
71end if
72
73! In case of 3D
74! ~~~~~~~~~~~~~
75! Open
76inquire(file = start_name,exist = here)
77if (.not. here) call stop_clean(__FILE__,__LINE__,'cannot find required file "'//start_name//'"!',1)
78call print_msg('> Reading "'//start_name//'"',LVL_NFO)
79call open_nc(start_name,'read')
80
81! Get the variables
82call get_var_nc('ap',tmp1d)
83call set_ap(tmp1d)
84
85call get_var_nc('bp',tmp1d)
86call set_bp(tmp1d)
87
88call get_var_nc('ps',tmp2d)
89call set_ps_PCM(tmp2d)
90
91call get_var_nc('teta',tmp3d)
92call set_teta_PCM(tmp3d)
93
94do i = 1,nq
95    call get_var_nc(trim(qnames(i)),tmp3d)
96    call set_q_PCM(tmp3d,i)
97end do
98
99! Close
100call close_nc(start_name)
101
102END SUBROUTINE read_start
103!=======================================================================
104
105!=======================================================================
106SUBROUTINE read_start1D()
107!-----------------------------------------------------------------------
108! NAME
109!     read_start1D
110!
111! DESCRIPTION
112!     Read the file "start1D.txt".
113!
114! AUTHORS & DATE
115!     JB Clement, 12/2025
116!
117! NOTES
118!
119!-----------------------------------------------------------------------
120
121! DEPENDENCIES
122! ------------
123use geometry,   only: nlayer
124use atmosphere, only: set_ap, set_bp, set_ps_PCM, set_teta_PCM, set_u_PCM, set_v_PCM, compute_alt_coord, set_ap, set_bp
125use tracers,    only: nq, set_q_PCM
126use stoppage,   only: stop_clean
127use display,    only: print_msg, LVL_NFO
128
129! DECLARATION
130! -----------
131implicit none
132
133! LOCAL VARIABLES
134! ---------------
135integer(di)                     :: i, k, ierr, funit
136character(30)                   :: header
137real(dp), dimension(1,1)        :: tmp
138real(dp), dimension(1,1,nlayer) :: q_tmp, teta_tmp, wind_tmp
139real(dp), dimension(nlayer + 1) :: ap_tmp, bp_tmp
140real(dp)                        :: pa, preff
141logical(k4)                     :: here
142
143! CODE
144! ----
145! Open "start1D.txt"
146inquire(file = start1D_name,exist = here)
147if (.not. here) call stop_clean(__FILE__,__LINE__,'cannot find required file "'//start1D_name//'"!',1)
148call print_msg('> Reading "'//start1D_name//'"',LVL_NFO)
149open(newunit = funit,file = start1D_name,status = "old",action = "read",iostat = ierr)
150if (ierr /= 0) call stop_clean(__FILE__,__LINE__,'error opening file "'//start1D_name//'"!',ierr)
151
152! Get the variables
153read(funit,*) header, tmp, pa, preff
154call set_ps_PCM(tmp)
155
156do i = 1,nq
157    read(funit,*,iostat = ierr) header, (q_tmp(1,1,k),k = 1,nlayer)
158    if (ierr /= 0) call stop_clean(__FILE__,__LINE__,'not enough atmospheric layers defined in the file "'//start1D_name//'" for the tracer "'//trim(header)//'"!',1)
159    call set_q_PCM(q_tmp,i)
160end do
161read(funit,*,iostat = ierr) header, (wind_tmp(1,1,k),k = 1,nlayer)
162call set_u_PCM(wind_tmp)
163read(funit,*,iostat = ierr) header, (wind_tmp(1,1,k),k = 1,nlayer)
164call set_v_PCM(wind_tmp)
165read(funit,*,iostat = ierr) header, (teta_tmp(1,1,k),k = 1,nlayer)
166call set_teta_PCM(teta_tmp)
167
168! Close
169close(funit)
170
171! Construct altitude coordinates (not stored in "start1D.txt")
172call compute_alt_coord(pa,preff,ap_tmp,bp_tmp)
173call set_ap(ap_tmp)
174call set_bp(bp_tmp)
175
176END SUBROUTINE read_start1D
177!=======================================================================
178
179!=======================================================================
180SUBROUTINE read_startfi()
181!-----------------------------------------------------------------------
182! NAME
183!     read_startfi
184!
185! DESCRIPTION
186!     Read the file "startfi.nc".
187!
188! AUTHORS & DATE
189!     JB Clement, 12/2025
190!
191! NOTES
192!
193!-----------------------------------------------------------------------
194
195! DEPENDENCIES
196! ------------
197use geometry,  only: ngrid, nslope, nsoil_PCM
198use stoppage,  only: stop_clean
199use config,    only: read_control_data
200use slopes,    only: set_def_slope_mean, set_subslope_dist, set_iflat
201use surface,   only: set_albedodat_PCM, set_albedo_PCM, set_emissivity_PCM
202use surf_temp, only: set_tsurf_PCM
203use soil_temp, only: set_tsoil_PCM, set_flux_geo_PCM
204use frost,     only: set_h2ofrost_PCM, set_co2frost_PCM
205use surf_ice,  only: set_is_h2o_perice_PCM, set_co2_perice_PCM
206use soil,      only: set_TI_PCM, set_inertiedat_PCM
207use display,   only: print_msg, LVL_NFO
208
209! DECLARATION
210! -----------
211implicit none
212
213! LOCAL VARIABLES
214! ---------------
215real(dp), dimension(:),   allocatable       :: tmp1d
216real(dp), dimension(:,:), allocatable       :: tmp2d
217real(dp), dimension(ngrid,nsoil_PCM,nslope) :: tmp3d
218logical(k4)                                 :: here
219
220! CODE
221! ----
222inquire(file = startfi_name,exist = here)
223if (.not. here) call stop_clean(__FILE__,__LINE__,'cannot find required file "'//startfi_name//'"!',1)
224
225! Allocate the array to store the variables
226call print_msg('> Reading "'//startfi_name//'"',LVL_NFO)
227allocate(tmp1d(nslope + 1),tmp2d(ngrid,nslope))
228
229! Get control data
230call read_control_data()
231
232! Open
233call open_nc(startfi_name,'read')
234
235! Get the variables
236if (nslope > 1) then
237    call get_var_nc('def_slope_mean',tmp1d)
238    call set_def_slope_mean(tmp1d)
239
240    call get_var_nc('subslope_dist',tmp2d)
241    call set_subslope_dist(tmp2d)
242end if
243
244call get_var_nc('flux_geo',tmp2d)
245call set_flux_geo_PCM(tmp2d)
246
247call get_var_nc('h2o_ice',tmp2d)
248where (tmp2d < 0.) tmp2d = 0._dp ! Remove unphysical values of surface tracer
249call set_h2ofrost_PCM(tmp2d)
250
251call get_var_nc('co2',tmp2d)
252where (tmp2d < 0.) tmp2d = 0._dp ! Remove unphysical values of surface tracer
253call set_co2frost_PCM(tmp2d)
254
255call get_var_nc('perennial_co2ice',tmp2d)
256where (tmp2d < 0.) tmp2d = 0._dp ! Remove unphysical values of surface tracer
257call set_co2_perice_PCM(tmp2d)
258
259deallocate(tmp1d); allocate(tmp1d(ngrid))
260call get_var_nc('watercaptag',tmp1d)
261call set_is_h2o_perice_PCM(tmp1d)
262
263call get_var_nc('albedodat',tmp1d)
264call set_albedodat_PCM(tmp1d)
265
266call get_var_nc('albedo',tmp2d)
267call set_albedo_PCM(tmp2d)
268
269call get_var_nc('emis',tmp2d)
270call set_emissivity_PCM(tmp2d)
271
272call get_var_nc('tsurf',tmp2d)
273call set_tsurf_PCM(tmp2d)
274
275call get_var_nc('tsoil',tmp3d)
276call set_tsoil_PCM(tmp3d)
277
278deallocate(tmp2d); allocate(tmp2d(ngrid,nsoil_PCM))
279call get_var_nc('inertiedat',tmp2d)
280call set_inertiedat_PCM(tmp2d)
281
282call get_var_nc('inertiesoil',tmp3d)
283call set_TI_PCM(tmp3d)
284
285! To do?
286!   h2oice_depth
287!   d_coef
288!   lag_co2_ice
289
290! Close/Deallocate
291call close_nc(startfi_name)
292deallocate(tmp1d,tmp2d)
293
294END SUBROUTINE read_startfi
295!=======================================================================
296
297!=======================================================================
298SUBROUTINE read_startpem(tsurf_avg_yr1,tsurf_avg_yr2,ps_avg_glob,ps_ts,q_co2_ts,q_h2o_ts,h2o_surfdensity_avg,h2o_ice,co2_ice, &
299                         tsoil_avg,h2o_soildensity_avg,icetable_depth,icetable_thickness,ice_porefilling,layerings_map,       &
300                         h2o_ads_reg,co2_ads_reg,delta_h2o_ads,delta_co2_ads)
301!-----------------------------------------------------------------------
302! NAME
303!     read_startpem
304!
305! DESCRIPTION
306!     Read the file "startevo.nc" which stores the PEM state.
307!
308! AUTHORS & DATE
309!     L. Lange, 2023
310!     JB Clement, 2023-2026
311!
312! NOTES
313!
314!-----------------------------------------------------------------------
315
316! DEPENDENCIES
317! ------------
318use stoppage,           only: stop_clean
319use geometry,           only: ngrid, nslope, nsoil, nsoil_PCM
320use evolution,          only: dt
321use physics,            only: mugaz, r
322use planet,             only: TI_breccia, TI_bedrock, alpha_clap_h2o, beta_clap_h2o
323use frost,              only: h2ofrost_PCM, h2o_frost4PCM, co2frost_PCM, co2_frost4PCM
324use surf_ice,           only: is_h2o_perice_PCM, h2oice_huge_ini, co2_perice_PCM, threshold_h2oice_cap
325use soil,               only: do_soil, TI, depth_breccia, depth_bedrock, index_breccia, index_bedrock, inertiedat, layer, inertiedat_PCM
326use soil_temp,          only: ini_tsoil_pem, compute_tsoil
327use soil_therm_inertia, only: update_soil_TI
328use ice_table,          only: icetable_equilibrium, icetable_dynamic, computeice_table_equilibrium
329use sorption,           only: do_sorption, evolve_regolith_adsorption
330use tracers,            only: mmol, iPCM_qh2o
331use layered_deposits,   only: layering, do_layering, array2map, ini_layering, add_stratum
332use surf_ice,           only: rho_co2ice, rho_h2oice
333use slopes,             only: subslope_dist, def_slope_mean
334use maths,              only: pi
335use display,            only: print_msg, LVL_WRN, LVL_NFO, LVL_ERR
336use utility,            only: int2str
337
338! DECLARATION
339! -----------
340implicit none
341
342! ARGUMENTS
343! ---------
344real(dp),       dimension(:,:),   intent(in)    :: tsurf_avg_yr1, tsurf_avg_yr2 ! Surface temperature at the last but one PCM run and at the last PCM run
345real(dp),                         intent(in)    :: ps_avg_glob                  ! Mean average pressure on the planet
346real(dp),       dimension(:,:),   intent(in)    :: ps_ts                        ! Surface pressure timeseries
347real(dp),       dimension(:,:),   intent(in)    :: q_co2_ts, q_h2o_ts           ! MMR of CO2 and H2O
348real(dp),       dimension(:,:),   intent(in)    :: h2o_surfdensity_avg          ! Average of surface water density
349real(dp),       dimension(:,:),   intent(inout) :: h2o_ice, co2_ice             ! Surface ice
350real(dp),       dimension(:,:,:), intent(inout) :: tsoil_avg                    ! Soil temperature
351real(dp),       dimension(:,:,:), intent(inout) :: h2o_soildensity_avg          ! Average of soil water soil density
352real(dp),       dimension(:,:),   intent(inout) :: icetable_depth               ! Ice table depth
353real(dp),       dimension(:,:),   intent(inout) :: icetable_thickness           ! Ice table thickness
354real(dp),       dimension(:,:,:), intent(inout) :: ice_porefilling              ! Subsurface ice pore filling
355real(dp),       dimension(:,:,:), intent(inout) :: h2o_ads_reg, co2_ads_reg     ! Mass of H2O and CO2 adsorbed
356type(layering), dimension(:,:),   intent(inout) :: layerings_map                ! Layerings
357real(dp),       dimension(:),     intent(inout) :: delta_h2o_ads, delta_co2_ads ! Mass of H2O and CO2 exchanged due to adsorption/desorption
358
359! LOCAL VARIABLES
360! ---------------
361logical(k4)                               :: here
362integer(di)                               :: i, islope, k, nb_str_max, nsoil_startpem
363real(dp)                                  :: delta           ! Depth of the interface regolith/breccia, breccia/bedrock [m]
364real(dp), dimension(ngrid,nsoil,nslope)   :: TI_startpem     ! Soil thermal inertia saved in the startevo [SI]
365real(dp), dimension(ngrid,nsoil,nslope)   :: tsoil_startpem  ! Soil temperature saved in the startevo [K]
366real(dp), dimension(:,:,:,:), allocatable :: layerings_array ! Array for layerings
367
368! CODE
369! ----
370! Check if the file exists
371inquire(file = startevo_name,exist = here)
372
373! If the file is not here
374! ~~~~~~~~~~~~~~~~~~~~~~~
375if (.not. here) then
376    ! It is possibly because it is the very first PEM run so everything needs to be initalized
377    call print_msg('> The file "'//startevo_name//'" was not found (possibly because this is the first PEM run)',LVL_WRN)
378
379    ! H2O ice
380    call print_msg("'h2o_ice' is initialized with default value 'h2oice_huge_ini' where 'watercaptag' is true and where yearly minimum of frost can be considered as a huge reservoir ('threshold_h2oice_cap').",LVL_NFO)
381    h2o_ice(:,:) = 0._dp
382    do i = 1,ngrid
383        if (is_h2o_perice_PCM(i)) then
384            h2o_ice(i,:) = h2oice_huge_ini
385        else if (sum((h2ofrost_PCM(i,:) - h2o_frost4PCM(i,:))*subslope_dist(i,:)/cos(pi*def_slope_mean(:)/180._dp)) > threshold_h2oice_cap) then
386            h2o_ice(i,:) = h2oice_huge_ini
387        end if
388    end do
389
390    ! CO2 ice
391    call print_msg("'co2_ice' is initialized with 'perennial_co2ice' and yearly minimum of frost found in the PCM.",LVL_NFO)
392    co2_ice(:,:) = co2_perice_PCM(:,:) + co2frost_PCM(:,:) - co2_frost4PCM(:,:)
393
394    if (do_soil) then
395        ! Thermal inertia
396        do islope = 1,nslope
397            do i = 1,ngrid
398                if (TI(i,index_breccia,islope) < TI_breccia) then
399                    !!! transition
400                    delta = depth_breccia
401                    TI(i,index_breccia + 1,islope) = sqrt((layer(index_breccia + 1) - layer(index_breccia))/                       &
402                                                               (((delta - layer(index_breccia))/(TI(i,index_breccia,islope)**2)) + &
403                                                               ((layer(index_breccia + 1) - delta)/(TI_breccia**2))))
404                    do k = index_breccia + 2,index_bedrock
405                        TI(i,k,islope) = TI_breccia
406                    end do
407                else ! we keep the high ti values
408                    do k = index_breccia + 1,index_bedrock
409                        TI(i,k,islope) = TI(i,index_breccia,islope)
410                    end do
411                end if
412                !! transition
413                delta = depth_bedrock
414                TI(i,index_bedrock + 1,islope) = sqrt((layer(index_bedrock + 1) - layer(index_bedrock))/                   &
415                                                       (((delta - layer(index_bedrock))/(TI(i,index_bedrock,islope)**2)) + &
416                                                       ((layer(index_bedrock + 1) - delta)/(TI_breccia**2))))
417                do k = index_bedrock + 2,nsoil
418                    TI(i,k,islope) = TI_bedrock
419                end do
420            end do
421        end do
422
423        do k = 1,nsoil_PCM
424            inertiedat(:,k) = inertiedat_PCM(:,k)
425        end do
426        !!! zone de transition
427        delta = depth_breccia
428        do i = 1,ngrid
429            if (inertiedat(i,index_breccia) < TI_breccia) then
430                inertiedat(i,index_breccia + 1) = sqrt((layer(index_breccia + 1) - layer(index_breccia))/                    &
431                                                        (((delta - layer(index_breccia))/(inertiedat(i,index_breccia)**2)) + &
432                                                        ((layer(index_breccia + 1) - delta)/(TI_breccia**2))))
433                do k = index_breccia + 2,index_bedrock
434                    inertiedat(i,k) = TI_breccia
435                end do
436            else
437                do k = index_breccia + 1,index_bedrock
438                    inertiedat(i,k) = inertiedat(i,index_breccia)
439                end do
440            end if
441        end do
442        !!! zone de transition
443        delta = depth_bedrock
444        do i = 1,ngrid
445            inertiedat(i,index_bedrock + 1) = sqrt((layer(index_bedrock + 1) - layer(index_bedrock))/                    &
446                                                    (((delta - layer(index_bedrock))/(inertiedat(i,index_bedrock)**2)) + &
447                                                    ((layer(index_bedrock + 1) - delta)/(TI_bedrock**2))))
448        end do
449
450        do k = index_bedrock + 2,nsoil
451            do i = 1,ngrid
452                inertiedat(i,k) = TI_bedrock
453            end do
454        end do
455
456        ! Soil temperature
457        do islope = 1,nslope
458            call ini_tsoil_pem(ngrid,nsoil,TI(:,:,islope),tsurf_avg_yr2(:,islope),tsoil_avg(:,:,islope))
459            call compute_tsoil(ngrid,nsoil,.true.,TI(:,:,islope),dt,tsurf_avg_yr2(:,islope),tsoil_avg(:,:,islope))
460
461            ! First raw initialization
462            h2o_soildensity_avg(:,nsoil_PCM + 1:nsoil,islope) = exp(beta_clap_h2o/tsoil_avg(:,nsoil_PCM + 1:nsoil,islope) + alpha_clap_h2o)/tsoil_avg(:,nsoil_PCM + 1:nsoil,islope)**mmol(iPCM_qh2o)/(mugaz*r)
463        end do
464
465        ! Ice table
466        if (icetable_equilibrium) then
467            call computeice_table_equilibrium(is_h2o_perice_PCM,h2o_surfdensity_avg,h2o_soildensity_avg,TI(:,1,:),icetable_depth,icetable_thickness)
468            call update_soil_TI(h2o_ice,ps_avg_glob,icetable_depth,icetable_thickness,ice_porefilling,icetable_equilibrium,icetable_dynamic,TI)
469            do islope = 1,nslope
470                call ini_tsoil_pem(ngrid,nsoil,TI(:,:,islope),tsurf_avg_yr2(:,islope),tsoil_avg(:,:,islope))
471            end do
472        else if (icetable_dynamic) then
473            call update_soil_TI(h2o_ice,ps_avg_glob,icetable_depth,icetable_thickness,ice_porefilling,icetable_equilibrium,icetable_dynamic,TI)
474            do islope = 1,nslope
475                call ini_tsoil_pem(ngrid,nsoil,TI(:,:,islope),tsurf_avg_yr2(:,islope),tsoil_avg(:,:,islope))
476            end do
477        end if
478
479        ! Absorption in regolith
480        if (do_sorption) then
481            h2o_ads_reg = 0._dp
482            co2_ads_reg = 0._dp
483            call evolve_regolith_adsorption(h2o_ice,co2_ice,tsoil_avg,TI,ps_ts,q_h2o_ts,q_co2_ts,h2o_ads_reg,co2_ads_reg,delta_h2o_ads,delta_co2_ads)
484        end if ! do_sorption
485    end if ! do_soil
486
487    ! Layering
488    if (do_layering) then
489        call print_msg('layerings_map is initialized with sub-surface strata.',LVL_NFO)
490        call print_msg("Ice is added with 'h2oice_huge_ini' where 'watercaptag' is true and otherwise with 'perennial_co2ice' found in the PCM.",LVL_NFO)
491        do i = 1,ngrid
492            if (is_h2o_perice_PCM(i)) then
493                do islope = 1,nslope
494                    call ini_layering(layerings_map(i,islope))
495                    call add_stratum(layerings_map(i,islope),1.05_dp*h2oice_huge_ini/rho_h2oice,0._dp,h2oice_huge_ini/rho_h2oice,0.05_dp*h2oice_huge_ini/rho_h2oice,0._dp,0._dp)
496                end do
497            else
498                do islope = 1,nslope
499                    call ini_layering(layerings_map(i,islope))
500                    if (co2_perice_PCM(i,islope) > 0.) call add_stratum(layerings_map(i,islope),1.05_dp*co2_perice_PCM(i,islope)/rho_co2ice,co2_perice_PCM(i,islope)/rho_co2ice,0._dp,0.05_dp*co2_perice_PCM(i,islope)/rho_co2ice,0._dp,0._dp)
501                end do
502            end if
503        end do
504    end if ! do_layering
505
506    return
507end if
508
509! If the file is present
510! ~~~~~~~~~~~~~~~~~~~~~~
511call print_msg('> Reading "'//startevo_name//'"',LVL_NFO)
512call open_nc(startevo_name,'read')
513
514! H2O ice
515h2o_ice(:,:) = 0._dp
516call get_var_nc('h2o_ice',h2o_ice(:,:))
517
518! CO2 ice
519co2_ice(:,:) = 0._dp
520call get_var_nc('co2_ice',co2_ice(:,:))
521
522if (do_soil) then
523    ! Check if the number of soil layers is compatible
524    call get_dim_nc('subsurface_layers',nsoil_startpem)
525    if (nsoil_startpem /= nsoil) then
526        call print_msg('nsoil (PEM) = '//int2str(nsoil)//' | nsoil ("'//startevo_name//'") = '//int2str(nsoil_startpem),LVL_ERR)
527        call stop_clean(__FILE__,__LINE__,'nsoil defined in the PEM is different from the one read in "'//startevo_name//'"!',1)
528    end if
529
530    do islope = 1,nslope
531        ! Soil temperature
532        call get_var_nc('tsoil',tsoil_startpem(:,:,islope))
533        ! Predictor-corrector: due to changes of surface temperature in the PCM, the tsoil_startpem is adapted firstly
534        !                      for PCM year 1 and then for PCM year 2 in order to build the evolution of the profile at depth
535        call compute_tsoil(ngrid,nsoil,.true.,TI(:,:,islope),dt,tsurf_avg_yr1(:,islope),tsoil_startpem(:,:,islope))
536        call compute_tsoil(ngrid,nsoil,.false.,TI(:,:,islope),dt,tsurf_avg_yr1(:,islope),tsoil_startpem(:,:,islope))
537        call compute_tsoil(ngrid,nsoil,.false.,TI(:,:,islope),dt,tsurf_avg_yr2(:,islope),tsoil_startpem(:,:,islope))
538    end do
539    tsoil_avg(:,nsoil_PCM + 1:nsoil,:) = tsoil_startpem(:,nsoil_PCM + 1:nsoil,:)
540    if (any(isnan(tsoil_avg(:,:,:)))) call stop_clean(__FILE__,__LINE__,"NaN detected in 'tsoil_avg'",1)
541
542    ! Thermal inertia
543    call get_var_nc('TI',TI_startpem(:,:,:))
544    TI(:,nsoil_PCM + 1:nsoil,:) = TI_startpem(:,nsoil_PCM + 1:nsoil,:) ! 1st layers can change because of the presence of ice at the surface, so we don't change it here
545    call get_var_nc('inertiedat',inertiedat(:,:))
546
547    ! Ice table
548    call get_var_nc('icetable_depth',icetable_depth(:,:))
549    if (icetable_dynamic) call get_var_nc('ice_porefilling',ice_porefilling(:,:,:))
550    if (icetable_equilibrium) then
551        call get_var_nc('icetable_thickness',icetable_thickness(:,:))
552    else if (icetable_dynamic) then
553        call get_var_nc('ice_porefilling',ice_porefilling(:,:,:))
554    end if
555
556    ! Absorption in regolith
557    if (do_sorption) then
558        call get_var_nc('co2_ads_reg',co2_ads_reg(:,:,:))
559        call get_var_nc('h2o_ads_reg',h2o_ads_reg(:,:,:))
560        call evolve_regolith_adsorption(h2o_ice,co2_ice,tsoil_avg,TI,ps_ts,q_h2o_ts,q_co2_ts,h2o_ads_reg,co2_ads_reg,delta_h2o_ads,delta_co2_ads)
561    end if ! do_sorption
562end if ! do_soil
563
564! Layering
565if (do_layering) then
566    call get_dim_nc('nb_str_max',nb_str_max)
567    allocate(layerings_array(ngrid,nslope,nb_str_max,6))
568    layerings_array = 0.
569    call get_var_nc('stratif_top_elevation',layerings_array(:,:,:,1))
570    call get_var_nc('stratif_h_co2ice',layerings_array(:,:,:,2))
571    call get_var_nc('stratif_h_h2oice',layerings_array(:,:,:,3))
572    call get_var_nc('stratif_h_dust',layerings_array(:,:,:,4))
573    call get_var_nc('stratif_h_pore',layerings_array(:,:,:,5))
574    call get_var_nc('stratif_poreice_volfrac',layerings_array(:,:,:,6))
575    call array2map(layerings_array,layerings_map)
576    deallocate(layerings_array)
577end if
578
579! Close
580call close_nc(startevo_name)
581
582END SUBROUTINE read_startpem
583!=======================================================================
584
585END MODULE clim_state_init
Note: See TracBrowser for help on using the repository browser.