Ignore:
Timestamp:
Dec 14, 2023, 6:56:40 PM (11 months ago)
Author:
jbclement
Message:

PEM:

  • A number of corrections related to r3149 for CO2 ice management:

    'co2_ice' was not transferred to 'perennial_co2ice' at the end of the PEM run;
    In the Mars PCM, 'perennial_co2ice' is now correctly handled regarding the frost in case of CO2 sublimation/condensation.

  • Addition of (CO2 and H2O) ice metamorphism: if the frost is above a given value, then the excess frost is transferred to the perennial ice.
  • Thresholds value for ice management can now be set in the "run_PEM.def".

JBC

Location:
trunk/LMDZ.COMMON/libf/evolution
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.COMMON/libf/evolution/changelog.txt

    r3152 r3159  
    172172- The PEM deftank folder is now in LMDZ.COMMON/libf/evolution/ (not anymore in the Mars PCM deftank).
    173173- Small corrections related to r3149.
     174
     175== 14/12/2023 == JBC
     176- A number of corrections related to r3149 for CO2 ice management:
     177      > 'co2_ice' was not transferred to 'perennial_co2ice' at the end of the PEM run;
     178      > In the Mars PCM, 'perennial_co2ice' is now correctly handled regarding the frost in case of CO2 sublimation/condensation.
     179- Addition of (CO2 and H2O) ice metamorphism: if the frost is above a given value, then the excess frost is transferred to the perennial ice.
     180- Thresholds value for ice management can now be set in the "run_PEM.def".
  • trunk/LMDZ.COMMON/libf/evolution/conf_pem.F90

    r3149 r3159  
    2323#endif
    2424
    25 use time_evol_mod,    only: year_bp_ini, dt_pem, water_ice_criterion, co2_ice_criterion, ps_criterion, Max_iter_pem, &
     25use time_evol_mod,         only: year_bp_ini, dt_pem, h2o_ice_crit, co2_ice_crit, ps_criterion, Max_iter_pem, &
    2626                          evol_orbit_pem, var_obl, var_ecc, var_lsp, convert_years
    27 use comsoil_h_pem,    only: soil_pem, fluxgeo, ini_h2o_bigreservoir, depth_breccia, depth_bedrock, reg_thprop_dependp
    28 use adsorption_mod,   only: adsorption_pem
    29 use glaciers_mod,     only: co2_ice_flow, h2o_ice_flow
    30 use ice_table_mod,    only: icetable_equilibrium, icetable_dynamic
    31 use time_phylmdz_mod, only: ecritphy
     27use comsoil_h_pem,         only: soil_pem, fluxgeo, ini_h2o_bigreservoir, depth_breccia, depth_bedrock, reg_thprop_dependp
     28use adsorption_mod,        only: adsorption_pem
     29use glaciers_mod,          only: co2_ice_flow, h2o_ice_flow
     30use ice_table_mod,         only: icetable_equilibrium, icetable_dynamic
     31use time_phylmdz_mod,      only: ecritphy
     32use constants_marspem_mod, only: inf_h2oice_threshold, metam_co2ice_threshold, metam_h2oice_threshold
    3233
    3334implicit none
     
    5253close(100)
    5354
    54 ! #---------- Output parameters
     55!#---------- Output parameters ----------#
    5556! Frequency of outputs for the PEM
    5657ecritphy = 1 ! Default value: every year
    5758call getin('ecritpem',ecritphy)
    5859
    59 ! #---------- Orbital parameters
     60!#---------- Orbital parameters ----------#
    6061evol_orbit_pem = .false.
    6162call getin('evol_orbit_pem',evol_orbit_pem)
     
    7778write(*,*) 'Does Ls peri vary ?',var_lsp
    7879
    79 ! #---------- Stopping criteria parameters
     80!#---------- Stopping criteria parameters ----------#
    8081Max_iter_pem = 100000000
    8182call getin('Max_iter_pem',Max_iter_pem)
    8283
    83 water_ice_criterion = 0.2
    84 call getin('water_ice_criterion',water_ice_criterion)
     84h2o_ice_crit = 0.2
     85call getin('h2o_ice_crit',h2o_ice_crit)
    8586
    86 co2_ice_criterion = 0.2
    87 call getin('co2_ice_criterion',co2_ice_criterion)
     87co2_ice_crit = 0.2
     88call getin('co2_ice_crit',co2_ice_crit)
    8889
    8990ps_criterion = 0.15
     
    9394call getin('dt_pem', dt_pem)
    9495
    95 ! #---------- Subsurface parameters
     96!#---------- Subsurface parameters ----------#
    9697soil_pem = .true.
    9798call getin('soil_pem',soil_pem)
     
    110111write(*,*)  'Thermal properties of the regolith vary with pressure ?', reg_thprop_dependp
    111112
    112 ! #---------- Layering parameters
     113!#---------- Layering parameters ----------#
    113114fluxgeo = 0.
    114115call getin('fluxgeo',fluxgeo)
     
    156157endif
    157158
     159!#---------- Ice management parameters ----------#
    158160ini_h2o_bigreservoir = 1.e4
    159161call getin('ini_h2o_bigreservoir',ini_h2o_bigreservoir)
     162
     163inf_h2oice_threshold = 2.e3
     164call getin('inf_h2oice_threshold',inf_h2oice_threshold)
     165
     166metam_h2oice_threshold = 5.e-2
     167call getin('metam_h2oice_threshold',metam_h2oice_threshold)
     168
     169metam_co2ice_threshold = 16.e3
     170call getin('metam_co2ice_threshold',metam_co2ice_threshold)
    160171
    161172END SUBROUTINE conf_pem
  • trunk/LMDZ.COMMON/libf/evolution/constants_marspem_mod.F90

    r3149 r3159  
    3737real, parameter :: Lco2 =  5.71e5 ! Pilorget and Forget 2016
    3838
    39 ! Threshold to consider the amount of H2O ice as an infinite reservoir
    40 real, parameter :: inf_h2oice_threshold = 2000.  !~ 1 m
     39! Thresholds for ice management
     40real, save :: inf_h2oice_threshold   ! To consider the amount of H2O ice as an infinite reservoir
     41real, save :: metam_h2oice_threshold ! To consider frost is becoming perennial H2O ice
     42real, save :: metam_co2ice_threshold ! To consider frost is becoming perennial CO2 ice
    4143
    4244END MODULE constants_marspem_mod
  • trunk/LMDZ.COMMON/libf/evolution/deftank/run_PEM.def

    r3149 r3159  
    2828#  Max_iter_pem=100000000
    2929
    30 # Acceptance rate of sublimating water ice surface change? Default = 0.2
    31 # water_ice_criterion=0.2
     30# Acceptance rate of sublimating H2o ice surface change? Default = 0.2
     31# h2o_ice_crit=0.2
    3232
    3333# Acceptance rate of sublimating CO2 ice surface change? Default = 0.2
    34 # co2_ice_criterion=0.2
     34# co2_ice_crit=0.2
    3535
    3636# Acceptance rate of pressure surface change? Default = 0.15
     
    6969# icetable_dynamic=.false.
    7070
    71 #---------- H2O reservoir parameters ----------#
    72 # Amount of h2o ice to initialize the big reservoir if the variable is not present in startfi_PEM.nc? Default = 1.e4
    73 # ini_h2o_bigreservoir=1e4
     71#---------- Ice management parameters ----------#
     72# Amount of h2o ice to initialize the big reservoir if the variable is not present in "startfi_PEM.nc"? Default = 1.e4
     73# ini_h2o_bigreservoir=1.e4
     74
     75# Threshold to consider the amount of H2O ice as an infinite reservoir? Default = 2.e3
     76# inf_h2oice_threshold=2.e3
     77
     78# Threshold to consider frost is becoming perennial H2O ice? Default = 5.e-2
     79# metam_h2oice_threshold=5.e-2
     80
     81# Threshold to consider frost is becoming perennial CO2 ice? Default = 16.e3
     82# metam_co2ice_threshold=16.e3
    7483
    7584# Some definitions for the physics, in file 'callphys.def'
  • trunk/LMDZ.COMMON/libf/evolution/pem.F90

    r3149 r3159  
    4242use stopping_crit_mod,           only: stopping_crit_h2o_ice, stopping_crit_co2
    4343use constants_marspem_mod,       only: alpha_clap_co2, beta_clap_co2, alpha_clap_h2o, beta_clap_h2o, m_co2, &
    44                                        m_noco2, inf_h2oice_threshold
     44                                       m_noco2, inf_h2oice_threshold, metam_co2ice_threshold, metam_h2oice_threshold
    4545use evol_ice_mod,                only: evol_co2_ice, evol_h2o_ice
    4646use comsoil_h_PEM,               only: soil_pem, ini_comsoil_h_PEM, end_comsoil_h_PEM, nsoilmx_PEM, &
     
    189189real, dimension(:,:,:), allocatable :: co2_ice_PCM        ! Physics x NSLOPE x Times field: co2 ice given by the PCM [kg/m^2]
    190190real, dimension(:,:),   allocatable :: co2_ice_ini_sublim ! physical point field: Logical array indicating sublimating point of co2 ice
    191 real, dimension(:,:),   allocatable :: initial_h2o_ice    ! physical point field: Logical array indicating if there is water ice at initial state
     191real, dimension(:,:),   allocatable :: initial_h2o_ice    ! physical point field: Logical array indicating if there is h2o ice at initial state
    192192real, dimension(:,:),   allocatable :: tend_co2_ice       ! physical point x slope field: Tendency of evolution of perennial co2 ice over a year
    193193real, dimension(:,:),   allocatable :: tend_co2_ice_ini   ! physical point x slope field x nslope: Tendency of evolution of perennial co2 ice over a year in the PCM
     
    550550!    I_g Save initial PCM situation
    551551!------------------------
    552 ! We save the places where water ice is sublimating
    553 ! We compute the surface of water ice sublimating
     552! We save the places where h2o ice is sublimating
     553! We compute the surface of h2o ice sublimating
    554554co2_surf_ini = 0.
    555555h2o_surf_ini = 0.
     
    848848! II_d.5 Update the mass of the regolith adsorbed
    849849        if (adsorption_pem) then
    850             call regolith_adsorption(ngrid,nslope,nsoilmx_PEM,timelen,tend_h2o_ice,tend_co2_ice,       &
     850            call regolith_adsorption(ngrid,nslope,nsoilmx_PEM,timelen,tend_h2o_ice,tend_co2_ice,                   &
    851851                                     h2o_ice,co2_ice,tsoil_PEM,TI_PEM,ps_timeseries,q_co2_PEM_phys,q_h2o_PEM_phys, &
    852852                                     h2o_adsorbded_phys,delta_h2o_adsorbded,co2_adsorbded_phys,delta_co2_adsorbded)
     
    858858                    do l = 1,nsoilmx_PEM - 1
    859859                        totmassco2_adsorbded = totmassco2_adsorbded + co2_adsorbded_phys(ig,l,islope)*(layer_PEM(l + 1) - layer_PEM(l))* &
    860                         subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.)*cell_area(ig)
     860                                               subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.)*cell_area(ig)
    861861                        totmassh2o_adsorbded = totmassh2o_adsorbded + h2o_adsorbded_phys(ig,l,islope)*(layer_PEM(l + 1) - layer_PEM(l))* &
    862                         subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.)*cell_area(ig)
     862                                               subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.)*cell_area(ig)
    863863                    enddo
    864864                enddo
     
    907907        select case (stopPEM)
    908908            case(1)
    909                 write(*,*) "STOPPING because surface of water ice sublimating is too low:", stopPEM, "See message above."
     909                write(*,*) "STOPPING because surface of h2o ice sublimating is too low:", stopPEM, "See message above."
    910910            case(2)
    911                 write(*,*) "STOPPING because tendencies on water ice = 0:", stopPEM, "See message above."
     911                write(*,*) "STOPPING because tendencies on h2o ice = 0:", stopPEM, "See message above."
    912912            case(3)
    913913                write(*,*) "STOPPING because surface of co2 ice sublimating is too low:", stopPEM, "See message above."
     
    940940! III_a.1 Ice update (for startfi)
    941941
    942 ! H2O ice
    943942watercap = 0.
     943perennial_co2ice = co2_ice
    944944do ig = 1,ngrid
     945    ! H2O ice metamorphism
     946    if (sum(qsurf(ig,igcm_h2o_ice,:)*subslope_dist(ig,:)/cos(pi*def_slope_mean(:)/180.)) > metam_h2oice_threshold) then
     947        h2o_ice(ig,:) = h2o_ice(ig,:) + qsurf(ig,igcm_h2o_ice,:) - metam_h2oice_threshold/subslope_dist(ig,:)*cos(pi*def_slope_mean(:)*180.)
     948        qsurf(ig,igcm_h2o_ice,:) = metam_h2oice_threshold/subslope_dist(ig,:)*cos(pi*def_slope_mean(:)*180.)
     949    endif
     950
     951    ! Is H2O ice still considered as an infinite reservoir for the PCM?
    945952    if (sum(h2o_ice(ig,:)*subslope_dist(ig,:)/cos(pi*def_slope_mean(:)/180.)) > inf_h2oice_threshold) then
    946     ! If there is enough ice to be considered as an infinite reservoir
     953        ! There is enough ice to be considered as an infinite reservoir
    947954        watercaptag(ig) = .true.
    948955    else
    949     ! If there too little ice to be considered as an infinite reservoir
    950     ! Ice is transferred to the frost
     956        ! There too little ice to be considered as an infinite reservoir so ice is transferred to the frost
    951957        watercaptag(ig) = .false.
    952958        qsurf(ig,igcm_h2o_ice,:) = qsurf(ig,igcm_h2o_ice,:) + h2o_ice(ig,:)
    953959        h2o_ice(ig,:) = 0.
     960    endif
     961
     962    ! CO2 ice metamorphism
     963    if (sum(qsurf(ig,igcm_co2,:)*subslope_dist(ig,:)/cos(pi*def_slope_mean(:)/180.)) > metam_co2ice_threshold) then
     964        perennial_co2ice(ig,:) = perennial_co2ice(ig,:) + qsurf(ig,igcm_co2,:) - metam_co2ice_threshold/subslope_dist(ig,:)*cos(pi*def_slope_mean(:)*180.)
     965        qsurf(ig,igcm_co2,:) = metam_co2ice_threshold/subslope_dist(ig,:)*cos(pi*def_slope_mean(:)*180.)
    954966    endif
    955967enddo
  • trunk/LMDZ.COMMON/libf/evolution/pemetat0.F90

    r3149 r3159  
    8282#ifdef CPP_STD
    8383    logical, dimension(ngrid) :: watercaptag
    84     watercaptag(:) = .false.
     84    watercaptag = .false.
    8585#endif
    8686
     
    152152                            TI_PEM(ig,iloop,islope) = TI_breccia
    153153                        enddo
    154                     else ! we keep the high ti values
     154                    else ! we keep the high TI values
    155155                        do iloop = index_breccia + 1,index_bedrock
    156156                            TI_PEM(ig,iloop,islope) = TI_PEM(ig,index_breccia,islope)
  • trunk/LMDZ.COMMON/libf/evolution/stopping_crit_mod.F90

    r3149 r3159  
    1616SUBROUTINE stopping_crit_h2o_ice(cell_area,surf_ini,h2o_ice,stopPEM,ngrid)
    1717
    18 use time_evol_mod, only: water_ice_criterion
     18use time_evol_mod, only: h2o_ice_crit
    1919use comslope_mod,  only: subslope_dist, nslope
    2020
     
    3232integer,                       intent(in) :: ngrid     ! # of physical grid points
    3333real, dimension(ngrid),        intent(in) :: cell_area ! Area of the cells
    34 real, dimension(ngrid,nslope), intent(in) :: h2o_ice   ! Actual density of water ice
     34real, dimension(ngrid,nslope), intent(in) :: h2o_ice   ! Actual density of h2o ice
    3535real,                          intent(in) :: surf_ini  ! Initial surface of h2o ice that was sublimating
    3636!   OUTPUT
     
    5151
    5252! Check of the criterion
    53 if (surf_now < surf_ini*(1. - water_ice_criterion)) then
     53if (surf_now < surf_ini*(1. - h2o_ice_crit)) then
    5454    stopPEM = 1
    55     write(*,*) "Reason of stopping: the surface of water ice sublimating reaches the threshold"
    56     write(*,*) "surf_now < surf_ini*(1. - water_ice_criterion)", surf_now < surf_ini*(1. - water_ice_criterion)
    57     write(*,*) "Current surface of water ice sublimating =", surf_now
    58     write(*,*) "Initial surface of water ice sublimating =", surf_ini
    59     write(*,*) "Percentage of change accepted =", water_ice_criterion*100
    60 else if (surf_now > surf_ini*(1. + water_ice_criterion)) then
     55    write(*,*) "Reason of stopping: the surface of h2o ice sublimating reaches the threshold"
     56    write(*,*) "surf_now < surf_ini*(1. - h2o_ice_crit)", surf_now < surf_ini*(1. - h2o_ice_crit)
     57    write(*,*) "Current surface of h2o ice sublimating =", surf_now
     58    write(*,*) "Initial surface of h2o ice sublimating =", surf_ini
     59    write(*,*) "Percentage of change accepted =", h2o_ice_crit*100
     60else if (surf_now > surf_ini*(1. + h2o_ice_crit)) then
    6161    stopPEM = 1
    62     write(*,*) "Reason of stopping: the surface of water ice sublimating reaches the threshold"
    63     write(*,*) "surf_now > surf_ini*(1. + water_ice_criterion)", surf_now > surf_ini*(1. + water_ice_criterion)
    64     write(*,*) "Current surface of water ice sublimating =", surf_now
    65     write(*,*) "Initial surface of water ice sublimating =", surf_ini
    66     write(*,*) "Percentage of change accepted =", water_ice_criterion*100
     62    write(*,*) "Reason of stopping: the surface of h2o ice sublimating reaches the threshold"
     63    write(*,*) "surf_now > surf_ini*(1. + h2o_ice_crit)", surf_now > surf_ini*(1. + h2o_ice_crit)
     64    write(*,*) "Current surface of h2o ice sublimating =", surf_now
     65    write(*,*) "Initial surface of h2o ice sublimating =", surf_ini
     66    write(*,*) "Percentage of change accepted =", h2o_ice_crit*100
    6767endif
    6868
     
    7575SUBROUTINE stopping_crit_co2(cell_area,surf_ini,co2_ice,stopPEM,ngrid,global_avg_press_PCM,global_avg_press_new,nslope)
    7676
    77 use time_evol_mod, only: co2_ice_criterion, ps_criterion
     77use time_evol_mod, only: co2_ice_crit, ps_criterion
    7878use comslope_mod,  only: subslope_dist
    7979
     
    9191integer,                       intent(in) :: ngrid, nslope        ! # of grid physical grid points
    9292real, dimension(ngrid),        intent(in) :: cell_area            ! Area of the cells
    93 real, dimension(ngrid,nslope), intent(in) :: co2_ice              ! Actual density of water ice
     93real, dimension(ngrid,nslope), intent(in) :: co2_ice              ! Actual density of h2o ice
    9494real,                          intent(in) :: surf_ini             ! Initial surface of co2 ice that was sublimating
    9595real,                          intent(in) :: global_avg_press_PCM ! Planet average pressure from the PCM start files
     
    113113
    114114! Check of the criterion
    115 if (surf_now < surf_ini*(1. - co2_ice_criterion)) then
     115if (surf_now < surf_ini*(1. - co2_ice_crit)) then
    116116    stopPEM = 3
    117117    write(*,*) "Reason of stopping: the surface of co2 ice sublimating reaches the threshold"
    118     write(*,*) "surf_now < surf_ini*(1. - co2_ice_criterion)", surf_now < surf_ini*(1. - co2_ice_criterion)
     118    write(*,*) "surf_now < surf_ini*(1. - co2_ice_crit)", surf_now < surf_ini*(1. - co2_ice_crit)
    119119    write(*,*) "Current surface of co2 ice sublimating =", surf_now
    120120    write(*,*) "Initial surface of co2 ice sublimating =", surf_ini
    121     write(*,*) "Percentage of change accepted =", co2_ice_criterion*100.
    122 else if (surf_now > surf_ini*(1. + co2_ice_criterion)) then
     121    write(*,*) "Percentage of change accepted =", co2_ice_crit*100.
     122else if (surf_now > surf_ini*(1. + co2_ice_crit)) then
    123123    stopPEM = 3
    124124    write(*,*) "Reason of stopping: the surface of co2 ice sublimating reaches the threshold"
    125     write(*,*) "surf_now > surf_ini*(1. + co2_ice_criterion)", surf_now > surf_ini*(1. + co2_ice_criterion)
     125    write(*,*) "surf_now > surf_ini*(1. + co2_ice_crit)", surf_now > surf_ini*(1. + co2_ice_crit)
    126126    write(*,*) "Current surface of co2 ice sublimating =", surf_now
    127127    write(*,*) "Initial surface of co2 ice sublimating =", surf_ini
    128     write(*,*) "Percentage of change accepted =", co2_ice_criterion*100.
     128    write(*,*) "Percentage of change accepted =", co2_ice_crit*100.
    129129endif
    130130
  • trunk/LMDZ.COMMON/libf/evolution/time_evol_mod.F90

    r3149 r3159  
    33implicit none
    44
    5 integer :: year_bp_ini         ! Initial year (in Planetary years) of the simulation of the PEM defined in run.def (in Earth years)
    6 integer :: dt_pem              ! Time step used by the PEM in Planetary years
    7 real    :: convert_years       ! Conversion ratio from Planetary years to Earth years
    8 real    :: water_ice_criterion ! Percentage of change of the surface of water ice sublimating before stopping the PEM
    9 real    :: co2_ice_criterion   ! Percentage of change of the surface of co2 ice sublimating before stopping the PEM
    10 real    :: ps_criterion        ! Percentage of change of averaged surface pressure before stopping the PEM
    11 integer :: Max_iter_pem        ! Maximal number of iteration when converging to a steady state, read in evol.def
    12 logical :: evol_orbit_pem      ! True if we want to follow the orbital parameters of obl_ecc_lsp.asc, read in evol.def
    13 logical :: var_obl             ! True if we want the PEM to follow obl_ecc_lsp.asc parameters for obliquity
    14 logical :: var_ecc             ! True if we want the PEM to follow obl_ecc_lsp.asc parameters for eccenticity
    15 logical :: var_lsp             ! True if we want the PEM to follow obl_ecc_lsp.asc parameters for ls perihelie
     5integer :: year_bp_ini    ! Initial year (in Planetary years) of the simulation of the PEM defined in run.def (in Earth years)
     6integer :: dt_pem         ! Time step used by the PEM in Planetary years
     7real    :: convert_years  ! Conversion ratio from Planetary years to Earth years
     8real    :: h2o_ice_crit   ! Percentage of change of the surface of h2o ice sublimating before stopping the PEM
     9real    :: co2_ice_crit   ! Percentage of change of the surface of co2 ice sublimating before stopping the PEM
     10real    :: ps_criterion   ! Percentage of change of averaged surface pressure before stopping the PEM
     11integer :: Max_iter_pem   ! Maximal number of iteration when converging to a steady state, read in evol.def
     12logical :: evol_orbit_pem ! True if we want to follow the orbital parameters of obl_ecc_lsp.asc, read in evol.def
     13logical :: var_obl        ! True if we want the PEM to follow obl_ecc_lsp.asc parameters for obliquity
     14logical :: var_ecc        ! True if we want the PEM to follow obl_ecc_lsp.asc parameters for eccenticity
     15logical :: var_lsp        ! True if we want the PEM to follow obl_ecc_lsp.asc parameters for ls perihelie
    1616
    1717END MODULE time_evol_mod
Note: See TracChangeset for help on using the changeset viewer.