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

Last change on this file since 4138 was 4135, checked in by jbclement, 12 days ago

PEM:
Relocate Mars-specific parameters out of "planet" module and into the modules that own their physics domain.
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, alpha_clap_h2o, beta_clap_h2o
322use frost,              only: h2ofrost_PCM, h2o_frost4PCM, co2frost_PCM, co2_frost4PCM
323use surf_ice,           only: is_h2o_perice_PCM, h2oice_huge_ini, co2_perice_PCM, threshold_h2oice_cap
324use soil,               only: do_soil, TI, depth_breccia, depth_bedrock, index_breccia, index_bedrock, inertiedat, layer, inertiedat_PCM
325use soil_temp,          only: ini_tsoil_pem, compute_tsoil
326use soil_therm_inertia, only: update_soil_TI, TI_breccia, TI_bedrock
327use ice_table,          only: icetable_equilibrium, icetable_dynamic, computeice_table_equilibrium
328use sorption,           only: do_sorption, evolve_regolith_adsorption
329use tracers,            only: mmol, iPCM_qh2o
330use layered_deposits,   only: layering, do_layering, array2map, ini_layering, add_stratum
331use surf_ice,           only: rho_co2ice, rho_h2oice
332use slopes,             only: subslope_dist, def_slope_mean
333use maths,              only: pi
334use display,            only: print_msg, LVL_WRN, LVL_NFO, LVL_ERR
335use utility,            only: int2str
336
337! DECLARATION
338! -----------
339implicit none
340
341! ARGUMENTS
342! ---------
343real(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
344real(dp),                         intent(in)    :: ps_avg_glob                  ! Mean average pressure on the planet
345real(dp),       dimension(:,:),   intent(in)    :: ps_ts                        ! Surface pressure timeseries
346real(dp),       dimension(:,:),   intent(in)    :: q_co2_ts, q_h2o_ts           ! MMR of CO2 and H2O
347real(dp),       dimension(:,:),   intent(in)    :: h2o_surfdensity_avg          ! Average of surface water density
348real(dp),       dimension(:,:),   intent(inout) :: h2o_ice, co2_ice             ! Surface ice
349real(dp),       dimension(:,:,:), intent(inout) :: tsoil_avg                    ! Soil temperature
350real(dp),       dimension(:,:,:), intent(inout) :: h2o_soildensity_avg          ! Average of soil water soil density
351real(dp),       dimension(:,:),   intent(inout) :: icetable_depth               ! Ice table depth
352real(dp),       dimension(:,:),   intent(inout) :: icetable_thickness           ! Ice table thickness
353real(dp),       dimension(:,:,:), intent(inout) :: ice_porefilling              ! Subsurface ice pore filling
354real(dp),       dimension(:,:,:), intent(inout) :: h2o_ads_reg, co2_ads_reg     ! Mass of H2O and CO2 adsorbed
355type(layering), dimension(:,:),   intent(inout) :: layerings_map                ! Layerings
356real(dp),       dimension(:),     intent(inout) :: delta_h2o_ads, delta_co2_ads ! Mass of H2O and CO2 exchanged due to adsorption/desorption
357
358! LOCAL VARIABLES
359! ---------------
360logical(k4)                               :: here
361integer(di)                               :: i, islope, k, nb_str_max, nsoil_startpem
362real(dp)                                  :: delta           ! Depth of the interface regolith/breccia, breccia/bedrock [m]
363real(dp), dimension(ngrid,nsoil,nslope)   :: TI_startpem     ! Soil thermal inertia saved in the startevo [SI]
364real(dp), dimension(ngrid,nsoil,nslope)   :: tsoil_startpem  ! Soil temperature saved in the startevo [K]
365real(dp), dimension(:,:,:,:), allocatable :: layerings_array ! Array for layerings
366
367! CODE
368! ----
369! Check if the file exists
370inquire(file = startevo_name,exist = here)
371
372! If the file is not here
373! ~~~~~~~~~~~~~~~~~~~~~~~
374if (.not. here) then
375    ! It is possibly because it is the very first PEM run so everything needs to be initalized
376    call print_msg('> The file "'//startevo_name//'" was not found (possibly because this is the first PEM run)',LVL_WRN)
377
378    ! H2O ice
379    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)
380    h2o_ice(:,:) = 0._dp
381    do i = 1,ngrid
382        if (is_h2o_perice_PCM(i)) then
383            h2o_ice(i,:) = h2oice_huge_ini
384        else if (sum((h2ofrost_PCM(i,:) - h2o_frost4PCM(i,:))*subslope_dist(i,:)/cos(pi*def_slope_mean(:)/180._dp)) > threshold_h2oice_cap) then
385            h2o_ice(i,:) = h2oice_huge_ini
386        end if
387    end do
388
389    ! CO2 ice
390    call print_msg("'co2_ice' is initialized with 'perennial_co2ice' and yearly minimum of frost found in the PCM.",LVL_NFO)
391    co2_ice(:,:) = co2_perice_PCM(:,:) + co2frost_PCM(:,:) - co2_frost4PCM(:,:)
392
393    if (do_soil) then
394        ! Thermal inertia
395        do islope = 1,nslope
396            do i = 1,ngrid
397                if (TI(i,index_breccia,islope) < TI_breccia) then
398                    !!! transition
399                    delta = depth_breccia
400                    TI(i,index_breccia + 1,islope) = sqrt((layer(index_breccia + 1) - layer(index_breccia))/                       &
401                                                               (((delta - layer(index_breccia))/(TI(i,index_breccia,islope)**2)) + &
402                                                               ((layer(index_breccia + 1) - delta)/(TI_breccia**2))))
403                    do k = index_breccia + 2,index_bedrock
404                        TI(i,k,islope) = TI_breccia
405                    end do
406                else ! we keep the high ti values
407                    do k = index_breccia + 1,index_bedrock
408                        TI(i,k,islope) = TI(i,index_breccia,islope)
409                    end do
410                end if
411                !! transition
412                delta = depth_bedrock
413                TI(i,index_bedrock + 1,islope) = sqrt((layer(index_bedrock + 1) - layer(index_bedrock))/                   &
414                                                       (((delta - layer(index_bedrock))/(TI(i,index_bedrock,islope)**2)) + &
415                                                       ((layer(index_bedrock + 1) - delta)/(TI_breccia**2))))
416                do k = index_bedrock + 2,nsoil
417                    TI(i,k,islope) = TI_bedrock
418                end do
419            end do
420        end do
421
422        do k = 1,nsoil_PCM
423            inertiedat(:,k) = inertiedat_PCM(:,k)
424        end do
425        !!! zone de transition
426        delta = depth_breccia
427        do i = 1,ngrid
428            if (inertiedat(i,index_breccia) < TI_breccia) then
429                inertiedat(i,index_breccia + 1) = sqrt((layer(index_breccia + 1) - layer(index_breccia))/                    &
430                                                        (((delta - layer(index_breccia))/(inertiedat(i,index_breccia)**2)) + &
431                                                        ((layer(index_breccia + 1) - delta)/(TI_breccia**2))))
432                do k = index_breccia + 2,index_bedrock
433                    inertiedat(i,k) = TI_breccia
434                end do
435            else
436                do k = index_breccia + 1,index_bedrock
437                    inertiedat(i,k) = inertiedat(i,index_breccia)
438                end do
439            end if
440        end do
441        !!! zone de transition
442        delta = depth_bedrock
443        do i = 1,ngrid
444            inertiedat(i,index_bedrock + 1) = sqrt((layer(index_bedrock + 1) - layer(index_bedrock))/                    &
445                                                    (((delta - layer(index_bedrock))/(inertiedat(i,index_bedrock)**2)) + &
446                                                    ((layer(index_bedrock + 1) - delta)/(TI_bedrock**2))))
447        end do
448
449        do k = index_bedrock + 2,nsoil
450            do i = 1,ngrid
451                inertiedat(i,k) = TI_bedrock
452            end do
453        end do
454
455        ! Soil temperature
456        do islope = 1,nslope
457            call ini_tsoil_pem(ngrid,nsoil,TI(:,:,islope),tsurf_avg_yr2(:,islope),tsoil_avg(:,:,islope))
458            call compute_tsoil(ngrid,nsoil,.true.,TI(:,:,islope),dt,tsurf_avg_yr2(:,islope),tsoil_avg(:,:,islope))
459
460            ! First raw initialization
461            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)
462        end do
463
464        ! Ice table
465        if (icetable_equilibrium) then
466            call computeice_table_equilibrium(is_h2o_perice_PCM,h2o_surfdensity_avg,h2o_soildensity_avg,TI(:,1,:),icetable_depth,icetable_thickness)
467            call update_soil_TI(h2o_ice,ps_avg_glob,icetable_depth,icetable_thickness,ice_porefilling,icetable_equilibrium,icetable_dynamic,TI)
468            do islope = 1,nslope
469                call ini_tsoil_pem(ngrid,nsoil,TI(:,:,islope),tsurf_avg_yr2(:,islope),tsoil_avg(:,:,islope))
470            end do
471        else if (icetable_dynamic) then
472            call update_soil_TI(h2o_ice,ps_avg_glob,icetable_depth,icetable_thickness,ice_porefilling,icetable_equilibrium,icetable_dynamic,TI)
473            do islope = 1,nslope
474                call ini_tsoil_pem(ngrid,nsoil,TI(:,:,islope),tsurf_avg_yr2(:,islope),tsoil_avg(:,:,islope))
475            end do
476        end if
477
478        ! Absorption in regolith
479        if (do_sorption) then
480            h2o_ads_reg = 0._dp
481            co2_ads_reg = 0._dp
482            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)
483        end if ! do_sorption
484    end if ! do_soil
485
486    ! Layering
487    if (do_layering) then
488        call print_msg('layerings_map is initialized with sub-surface strata.',LVL_NFO)
489        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)
490        do i = 1,ngrid
491            if (is_h2o_perice_PCM(i)) then
492                do islope = 1,nslope
493                    call ini_layering(layerings_map(i,islope))
494                    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)
495                end do
496            else
497                do islope = 1,nslope
498                    call ini_layering(layerings_map(i,islope))
499                    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)
500                end do
501            end if
502        end do
503    end if ! do_layering
504
505    return
506end if
507
508! If the file is present
509! ~~~~~~~~~~~~~~~~~~~~~~
510call print_msg('> Reading "'//startevo_name//'"',LVL_NFO)
511call open_nc(startevo_name,'read')
512
513! H2O ice
514h2o_ice(:,:) = 0._dp
515call get_var_nc('h2o_ice',h2o_ice(:,:))
516
517! CO2 ice
518co2_ice(:,:) = 0._dp
519call get_var_nc('co2_ice',co2_ice(:,:))
520
521if (do_soil) then
522    ! Check if the number of soil layers is compatible
523    call get_dim_nc('subsurface_layers',nsoil_startpem)
524    if (nsoil_startpem /= nsoil) then
525        call print_msg('nsoil (PEM) = '//int2str(nsoil)//' | nsoil ("'//startevo_name//'") = '//int2str(nsoil_startpem),LVL_ERR)
526        call stop_clean(__FILE__,__LINE__,'nsoil defined in the PEM is different from the one read in "'//startevo_name//'"!',1)
527    end if
528
529    do islope = 1,nslope
530        ! Soil temperature
531        call get_var_nc('tsoil',tsoil_startpem(:,:,islope))
532        ! Predictor-corrector: due to changes of surface temperature in the PCM, the tsoil_startpem is adapted firstly
533        !                      for PCM year 1 and then for PCM year 2 in order to build the evolution of the profile at depth
534        call compute_tsoil(ngrid,nsoil,.true.,TI(:,:,islope),dt,tsurf_avg_yr1(:,islope),tsoil_startpem(:,:,islope))
535        call compute_tsoil(ngrid,nsoil,.false.,TI(:,:,islope),dt,tsurf_avg_yr1(:,islope),tsoil_startpem(:,:,islope))
536        call compute_tsoil(ngrid,nsoil,.false.,TI(:,:,islope),dt,tsurf_avg_yr2(:,islope),tsoil_startpem(:,:,islope))
537    end do
538    tsoil_avg(:,nsoil_PCM + 1:nsoil,:) = tsoil_startpem(:,nsoil_PCM + 1:nsoil,:)
539    if (any(isnan(tsoil_avg(:,:,:)))) call stop_clean(__FILE__,__LINE__,"NaN detected in 'tsoil_avg'",1)
540
541    ! Thermal inertia
542    call get_var_nc('TI',TI_startpem(:,:,:))
543    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
544    call get_var_nc('inertiedat',inertiedat(:,:))
545
546    ! Ice table
547    call get_var_nc('icetable_depth',icetable_depth(:,:))
548    if (icetable_dynamic) call get_var_nc('ice_porefilling',ice_porefilling(:,:,:))
549    if (icetable_equilibrium) then
550        call get_var_nc('icetable_thickness',icetable_thickness(:,:))
551    else if (icetable_dynamic) then
552        call get_var_nc('ice_porefilling',ice_porefilling(:,:,:))
553    end if
554
555    ! Absorption in regolith
556    if (do_sorption) then
557        call get_var_nc('co2_ads_reg',co2_ads_reg(:,:,:))
558        call get_var_nc('h2o_ads_reg',h2o_ads_reg(:,:,:))
559        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)
560    end if ! do_sorption
561end if ! do_soil
562
563! Layering
564if (do_layering) then
565    call get_dim_nc('nb_str_max',nb_str_max)
566    allocate(layerings_array(ngrid,nslope,nb_str_max,6))
567    layerings_array = 0.
568    call get_var_nc('stratif_top_elevation',layerings_array(:,:,:,1))
569    call get_var_nc('stratif_h_co2ice',layerings_array(:,:,:,2))
570    call get_var_nc('stratif_h_h2oice',layerings_array(:,:,:,3))
571    call get_var_nc('stratif_h_dust',layerings_array(:,:,:,4))
572    call get_var_nc('stratif_h_pore',layerings_array(:,:,:,5))
573    call get_var_nc('stratif_poreice_volfrac',layerings_array(:,:,:,6))
574    call array2map(layerings_array,layerings_map)
575    deallocate(layerings_array)
576end if
577
578! Close
579call close_nc(startevo_name)
580
581END SUBROUTINE read_startpem
582!=======================================================================
583
584END MODULE clim_state_init
Note: See TracBrowser for help on using the repository browser.