Changeset 4065 for trunk/LMDZ.COMMON/libf/evolution/soil_therm_inertia.F90
- Timestamp:
- Feb 12, 2026, 9:09:12 AM (2 weeks ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.COMMON/libf/evolution/soil_therm_inertia.F90
r4064 r4065 1 MODULE soil_therm al_inertia1 MODULE soil_therm_inertia 2 2 !----------------------------------------------------------------------- 3 3 ! NAME 4 ! soil_therm al_inertia4 ! soil_therm_inertia 5 5 ! 6 6 ! DESCRIPTION … … 16 16 !----------------------------------------------------------------------- 17 17 18 ! DEPENDENCIES 19 ! ------------ 20 use numerics, only: dp, di, k4, minieps 21 18 22 ! DECLARATION 19 23 ! ----------- 20 24 implicit none 21 25 22 ! MODULE PARAMETERS 23 ! ----------------- 24 real, parameter :: reg_inertie_thresold = 370. ! Above this thermal inertia, the regolith has too much cementation to be dependant on the pressure [J/m^2/K/s^1/2] 25 real, parameter :: reg_inertie_minvalue = 50. ! Minimum value of the Thermal Inertia at low pressure (Piqueux & Christensen 2009) [J/m^2/K/s^1/2] 26 real, parameter :: reg_inertie_maxvalue = 370. ! Maximum value of the Thermal Inertia at low pressure (Piqueux & Christensen 2009) [J/m^2/K/s^1/2] 27 real, parameter :: P610 = 610.0 ! current average pressure on Mars [Pa] 28 real, parameter :: C = 0.0015 ! Constant to derive TI as a function of P, from Presley and Christensen 1997 [unitless] 29 real, parameter :: K = 8.1*1e4 ! Constant to derive TI as a function of P, from Presley and Christensen 1997 [Torr, or 133.3Pa] 30 real, parameter :: Pa2Torr = 1./133.3 ! Conversion from Pa to tor [Pa/Torr] 26 ! PARAMETERS 27 ! ---------- 28 real(dp), parameter :: reg_inertie_thresold = 370._dp ! Above this thermal inertia, the regolith has too much cementation to be dependant on the pressure [J/m^2/K/s^1/2] 29 real(dp), parameter :: reg_inertie_minvalue = 50._dp ! Minimum value of the Thermal Inertia at low pressure (Piqueux & Christensen 2009) [J/m^2/K/s^1/2] 30 real(dp), parameter :: reg_inertie_maxvalue = 370._dp ! Maximum value of the Thermal Inertia at low pressure (Piqueux & Christensen 2009) [J/m^2/K/s^1/2] 31 real(dp), parameter :: C = 0.0015_dp ! Constant to derive TI as a function of P, from Presley and Christensen 1997 [unitless] 32 real(dp), parameter :: K = 8.1*1e4_dp ! Constant to derive TI as a function of P, from Presley and Christensen 1997 [Torr, or 133.3Pa] 33 real(dp), parameter :: Pa2Torr = 1./133.3_dp ! Conversion from Pa to tor [Pa/Torr] 31 34 32 35 contains … … 53 56 ! DEPENDENCIES 54 57 ! ------------ 55 use constants_marspem_mod, only: porosity58 use planet, only: porosity 56 59 57 60 ! DECLARATION … … 61 64 ! ARGUMENTS 62 65 ! --------- 63 logical , intent(in) :: ispureice ! Boolean to check if ice is massive or just pore filling64 real , intent(in) :: pore_filling ! ice pore filling in each layer (1)65 real , intent(in) :: surf_thermalinertia ! surface thermal inertia (J/m^2/K/s^1/2)66 real , intent(out) :: ice_thermalinertia ! Thermal inertia of ice when present in the pore (J/m^2/K/s^1/2)66 logical(k4), intent(in) :: ispureice ! Boolean to check if ice is massive or just pore filling 67 real(dp), intent(in) :: pore_filling ! ice pore filling in each layer (1) 68 real(dp), intent(in) :: surf_thermalinertia ! surface thermal inertia (J/m^2/K/s^1/2) 69 real(dp), intent(out) :: ice_thermalinertia ! Thermal inertia of ice when present in the pore (J/m^2/K/s^1/2) 67 70 68 71 ! LOCAL VARIABLES 69 72 ! --------------- 70 real :: inertie_purewaterice = 2100! 2050 is better according to my computations with the formula from Siegler et al., 2012, but let's follow Mellon et al. (2004)73 real(dp) :: inertie_purewaterice = 2100._dp ! 2050 is better according to my computations with the formula from Siegler et al., 2012, but let's follow Mellon et al. (2004) 71 74 72 75 ! CODE … … 76 79 else 77 80 ice_thermalinertia = sqrt(surf_thermalinertia**2 + porosity*pore_filling*inertie_purewaterice**2) ! Siegler et al., 2012 78 end if81 end if 79 82 80 83 END SUBROUTINE get_ice_TI … … 82 85 83 86 !======================================================================= 84 SUBROUTINE update_soil_TI( ngrid,nslope,nsoil,tendencies_waterice,waterice,p_avg_new,icetable_depth,icetable_thickness,ice_porefilling,icetable_equilibrium,icetable_dynamic,TI_PEM)87 SUBROUTINE update_soil_TI(tendencies_waterice,waterice,p_avg_new,icetable_depth,icetable_thickness,ice_porefilling,icetable_equilibrium,icetable_dynamic,TI) 85 88 !----------------------------------------------------------------------- 86 89 ! NAME … … 101 104 ! DEPENDENCIES 102 105 ! ------------ 103 use comsoil_h, only: volcapa 104 use soil, only: layer_PEM, inertiedat_PEM, depth_breccia, depth_bedrock, index_breccia, index_bedrock, reg_thprop_dependp 105 use constants_marspem_mod, only: TI_breccia, TI_bedrock, TI_regolith_avg 106 use geometry, only: ngrid, nslope, nsoil 107 use soil, only: volcapa, layer, inertiedat, depth_breccia, depth_bedrock, index_breccia, index_bedrock, reg_thprop_dependp 108 use planet, only: TI_breccia, TI_bedrock, TI_regolith_avg, P610 109 use display, only: print_msg 106 110 107 111 ! DECLARATION … … 111 115 ! ARGUMENTS 112 116 ! --------- 113 integer, intent(in) :: ngrid, nslope, nsoil ! Shape of the arrays: physical grid, number of sub-grid slopes, number of layer in the soil 114 real, intent(in) :: p_avg_new ! Global average surface pressure [Pa] 115 real, dimension(ngrid,nslope), intent(in) :: tendencies_waterice ! Tendencies on the water ice [kg/m^2/year] 116 real, dimension(ngrid,nslope), intent(in) :: waterice ! Surface Water ice [kg/m^2] 117 real, dimension(ngrid,nslope), intent(in) :: icetable_depth ! Ice table depth [m] 118 real, dimension(ngrid,nslope), intent(in) :: icetable_thickness ! Ice table thickness [m] 119 real, dimension(ngrid,nsoil,nslope), intent(in) :: ice_porefilling ! Ice porefilling [m^3/m^3] 120 logical, intent(in) :: icetable_equilibrium, icetable_dynamic ! Computing method for ice table 121 real, dimension(ngrid,nsoil,nslope), intent(inout) :: TI_PEM ! Soil Thermal Inertia [J/m^2/K/s^1/2] 117 real(dp), intent(in) :: p_avg_new ! Global average surface pressure [Pa] 118 real(dp), dimension(:,:), intent(in) :: tendencies_waterice ! Tendencies on the water ice [kg/m^2/year] 119 real(dp), dimension(:,:), intent(in) :: waterice ! Surface Water ice [kg/m^2] 120 real(dp), dimension(:,:), intent(in) :: icetable_depth ! Ice table depth [m] 121 real(dp), dimension(:,:), intent(in) :: icetable_thickness ! Ice table thickness [m] 122 real(dp), dimension(:,:,:), intent(in) :: ice_porefilling ! Ice porefilling [m^3/m^3] 123 logical(k4), intent(in) :: icetable_equilibrium, icetable_dynamic ! Computing method for ice table 124 real(dp), dimension(:,:,:), intent(inout) :: TI ! Soil Thermal Inertia [J/m^2/K/s^1/2] 122 125 123 126 ! LOCAL VARIABLES 124 127 ! --------------- 125 integer :: ig, islope, isoil, iref, iend ! Loop variables126 real , dimension(ngrid,nslope) :: regolith_inertia ! Thermal inertia of the regolith (first layer in the GCM) [J/m^2/K/s^1/2]127 real :: delta ! Difference of depth to compute the thermal inertia in a mixed layer [m]128 real :: ice_bottom_depth ! Bottom depth of the subsurface ice [m]129 real :: d_part ! Regolith particle size [micrometer]130 real :: ice_inertia ! Inertia of water ice [SI]128 integer(di) :: ig, islope, isoil, iref, iend ! Loop variables 129 real(dp), dimension(ngrid,nslope) :: regolith_inertia ! Thermal inertia of the regolith (first layer in the GCM) [J/m^2/K/s^1/2] 130 real(dp) :: delta ! Difference of depth to compute the thermal inertia in a mixed layer [m] 131 real(dp) :: ice_bottom_depth ! Bottom depth of the subsurface ice [m] 132 real(dp) :: d_part ! Regolith particle size [micrometer] 133 real(dp) :: ice_inertia ! Inertia of water ice [SI] 131 134 132 135 ! CODE 133 136 ! ---- 134 write(*,*) "> Updating soil properties" 137 call print_msg("> Updating soil properties") 135 138 136 139 ! 1. Modification of the regolith thermal inertia. 137 140 do islope = 1,nslope 138 regolith_inertia(:,islope) = inertiedat _PEM(:,1)141 regolith_inertia(:,islope) = inertiedat(:,1) 139 142 do ig = 1,ngrid 140 if (tendencies_waterice(ig,islope) < -1.e-5 .and. waterice(ig,islope) == 0) regolith_inertia(ig,islope) = TI_regolith_avg143 if (tendencies_waterice(ig,islope) < -1.e-5_dp .and. abs(waterice(ig,islope)) < minieps) regolith_inertia(ig,islope) = TI_regolith_avg 141 144 if (reg_thprop_dependp) then 142 if (TI _PEM(ig,1,islope) < reg_inertie_thresold) then143 d_part = (regolith_inertia(ig,islope)**2/(volcapa*C*(P610*Pa2Torr)** (0.6)))**(-1./(0.11*log10(P610*Pa2Torr/K))) ! compute particle size, in micrometer144 regolith_inertia(ig,islope) = sqrt(volcapa*C*(p_avg_new*Pa2Torr)** (0.6)*d_part**(-0.11*log10(p_avg_new*Pa2Torr/K)))145 if (TI(ig,1,islope) < reg_inertie_thresold) then 146 d_part = (regolith_inertia(ig,islope)**2/(volcapa*C*(P610*Pa2Torr)**0.6))**(-1./(0.11_dp*log10(P610*Pa2Torr/K))) ! compute particle size, in micrometer 147 regolith_inertia(ig,islope) = sqrt(volcapa*C*(p_avg_new*Pa2Torr)**0.6*d_part**(-0.11_dp*log10(p_avg_new*Pa2Torr/K))) 145 148 if (regolith_inertia(ig,islope) > reg_inertie_maxvalue) regolith_inertia(ig,islope) = reg_inertie_maxvalue 146 149 if (regolith_inertia(ig,islope) < reg_inertie_minvalue) regolith_inertia(ig,islope) = reg_inertie_minvalue 147 end if148 end if149 end do150 end do150 end if 151 end if 152 end do 153 end do 151 154 152 155 ! 2. Build new Thermal Inertia … … 154 157 do ig = 1,ngrid 155 158 do isoil = 1,index_breccia 156 TI _PEM(ig,isoil,islope) = regolith_inertia(ig,islope)157 end do159 TI(ig,isoil,islope) = regolith_inertia(ig,islope) 160 end do 158 161 if (regolith_inertia(ig,islope) < TI_breccia) then 159 162 !!! transition 160 163 delta = depth_breccia 161 TI _PEM(ig,index_breccia + 1,islope) = sqrt((layer_PEM(index_breccia + 1) - layer_PEM(index_breccia))/&162 (((delta - layer _PEM(index_breccia))/(TI_PEM(ig,index_breccia,islope)**2)) + &163 ((layer _PEM(index_breccia + 1) - delta)/(TI_breccia**2))))164 TI(ig,index_breccia + 1,islope) = sqrt((layer(index_breccia + 1) - layer(index_breccia))/ & 165 (((delta - layer(index_breccia))/(TI(ig,index_breccia,islope)**2)) + & 166 ((layer(index_breccia + 1) - delta)/(TI_breccia**2)))) 164 167 do isoil = index_breccia + 2,index_bedrock 165 TI _PEM(ig,isoil,islope) = TI_breccia166 end do168 TI(ig,isoil,islope) = TI_breccia 169 end do 167 170 else ! we keep the high ti values 168 171 do isoil = index_breccia + 1,index_bedrock 169 TI _PEM(ig,isoil,islope) = TI_PEM(ig,index_breccia,islope)170 end do171 end if ! TI PEM and breccia comparison172 TI(ig,isoil,islope) = TI(ig,index_breccia,islope) 173 end do 174 end if ! TI PEM and breccia comparison 172 175 !!! transition 173 176 delta = depth_bedrock 174 TI _PEM(ig,index_bedrock + 1,islope) = sqrt((layer_PEM(index_bedrock + 1) - layer_PEM(index_bedrock))/&175 (((delta - layer _PEM(index_bedrock))/(TI_PEM(ig,index_bedrock,islope)**2)) + &176 ((layer _PEM(index_bedrock + 1) - delta)/(TI_bedrock**2))))177 TI(ig,index_bedrock + 1,islope) = sqrt((layer(index_bedrock + 1) - layer(index_bedrock))/ & 178 (((delta - layer(index_bedrock))/(TI(ig,index_bedrock,islope)**2)) + & 179 ((layer(index_bedrock + 1) - delta)/(TI_bedrock**2)))) 177 180 do isoil = index_bedrock + 2,nsoil 178 TI _PEM(ig,isoil,islope) = TI_bedrock179 end do180 end do ! ig181 end do ! islope181 TI(ig,isoil,islope) = TI_bedrock 182 end do 183 end do ! ig 184 end do ! islope 182 185 183 186 ! 3. Build new TI in case of ice table 184 187 do ig = 1,ngrid 185 188 do islope = 1,nslope 186 if (icetable_depth(ig,islope) > -1.e-6 ) then189 if (icetable_depth(ig,islope) > -1.e-6_dp) then 187 190 ! 3.0 Case where it is perennial ice 188 if (icetable_depth(ig,islope) < 1.e-10) then189 call get_ice_TI(.true.,1. ,0.,ice_inertia)191 if (icetable_depth(ig,islope) < minieps) then 192 call get_ice_TI(.true.,1._dp,0._dp,ice_inertia) 190 193 do isoil = 1,nsoil 191 TI _PEM(ig,isoil,islope) = ice_inertia192 end do194 TI(ig,isoil,islope) = ice_inertia 195 end do 193 196 else 194 197 if (icetable_equilibrium) then 195 call get_ice_TI(.false.,1. ,regolith_inertia(ig,islope),ice_inertia)198 call get_ice_TI(.false.,1._dp,regolith_inertia(ig,islope),ice_inertia) 196 199 ! 3.1.1 find the index of the mixed layer 197 200 iref = 0 ! initialize iref 198 201 do isoil = 1,nsoil ! loop on layers to find the beginning of the ice table 199 if (icetable_depth(ig,islope) >= layer _PEM(isoil)) then202 if (icetable_depth(ig,islope) >= layer(isoil)) then 200 203 iref = isoil ! pure regolith layer up to here 201 204 else 202 205 exit ! correct iref was obtained in previous cycle 203 end if204 end do206 end if 207 end do 205 208 ! 3.1.2 find the index of the end of the ice table 206 209 iend = 0 ! initialize iend 207 210 ice_bottom_depth = icetable_depth(ig,islope) + icetable_thickness(ig,islope) 208 211 do isoil = 1,nsoil ! loop on layers to find the end of the ice table 209 if (ice_bottom_depth >= layer _PEM(isoil)) then212 if (ice_bottom_depth >= layer(isoil)) then 210 213 iend = isoil ! pure regolith layer up to here 211 214 else 212 215 exit ! correct iref was obtained in previous cycle 213 end if214 end do216 end if 217 end do 215 218 ! 3.2 Build the new ti 216 219 if (iref < nsoil) then … … 218 221 ! Ice table begins and end in the same mixture with three components 219 222 if (iref /= 0) then ! mixed layer 220 TI _PEM(ig,iref + 1,islope) = sqrt((layer_PEM(iref + 1) - layer_PEM(iref))/&221 (((icetable_depth(ig,islope) - layer _PEM(iref))/(TI_PEM(ig,iref,islope)**2)) + &222 ((ice_bottom_depth - icetable_depth(ig,islope))/(ice_inertia**2)) + &223 ((layer _PEM(iref + 1) - ice_bottom_depth)/(TI_PEM(ig,iref + 1,islope)**2))))223 TI(ig,iref + 1,islope) = sqrt((layer(iref + 1) - layer(iref))/ & 224 (((icetable_depth(ig,islope) - layer(iref))/(TI(ig,iref,islope)**2)) + & 225 ((ice_bottom_depth - icetable_depth(ig,islope))/(ice_inertia**2)) + & 226 ((layer(iref + 1) - ice_bottom_depth)/(TI(ig,iref + 1,islope)**2)))) 224 227 else ! first layer is already a mixed layer 225 228 ! (ie: take layer(iref=0)=0) 226 TI _PEM(ig,1,islope) = sqrt((layer_PEM(1))/&227 (((icetable_depth(ig,islope))/(TI _PEM(ig,1,islope)**2)) +&229 TI(ig,1,islope) = sqrt((layer(1))/ & 230 (((icetable_depth(ig,islope))/(TI(ig,1,islope)**2)) + & 228 231 ((ice_bottom_depth - icetable_depth(ig,islope))/(ice_inertia**2)) + & 229 ((layer _PEM(2) - ice_bottom_depth)/(TI_PEM(ig,2,islope)**2))))230 end if ! of if (iref /= 0)232 ((layer(2) - ice_bottom_depth)/(TI(ig,2,islope)**2)))) 233 end if ! of if (iref /= 0) 231 234 else 232 235 if (iref /= 0) then ! mixed layer 233 TI _PEM(ig,iref + 1,islope) = sqrt((layer_PEM(iref + 1) - layer_PEM(iref))/&234 (((icetable_depth(ig,islope) - layer _PEM(iref))/(TI_PEM(ig,iref,islope)**2)) + &235 ((layer _PEM(iref + 1) - icetable_depth(ig,islope))/(ice_inertia**2))))236 TI(ig,iref + 1,islope) = sqrt((layer(iref + 1) - layer(iref))/ & 237 (((icetable_depth(ig,islope) - layer(iref))/(TI(ig,iref,islope)**2)) + & 238 ((layer(iref + 1) - icetable_depth(ig,islope))/(ice_inertia**2)))) 236 239 else ! first layer is already a mixed layer 237 240 ! (ie: take layer(iref=0)=0) 238 TI _PEM(ig,1,islope) = sqrt((layer_PEM(1))/&239 (((icetable_depth(ig,islope))/(TI _PEM(ig,1,islope)**2)) + &240 ((layer _PEM(1) - icetable_depth(ig,islope))/(ice_inertia**2))))241 end if ! of if (iref /= 0)242 end if ! iref == iend243 244 TI _PEM(ig,iref + 2:iend,islope) = ice_inertia241 TI(ig,1,islope) = sqrt((layer(1))/ & 242 (((icetable_depth(ig,islope))/(TI(ig,1,islope)**2)) + & 243 ((layer(1) - icetable_depth(ig,islope))/(ice_inertia**2)))) 244 end if ! of if (iref /= 0) 245 end if ! iref == iend 246 247 TI(ig,iref + 2:iend,islope) = ice_inertia 245 248 if (iend < nsoil) then 246 TI _PEM(ig,iend + 1,islope) = sqrt((layer_PEM(iend + 1) - layer_PEM(iend))/&247 (((ice_bottom_depth - layer _PEM(iend))/(TI_PEM(ig,iend,islope)**2)) + &248 ((layer _PEM(iend + 1) - ice_bottom_depth)/(ice_inertia**2))))249 end if250 end if ! of if (iref < nsoilmx)249 TI(ig,iend + 1,islope) = sqrt((layer(iend + 1) - layer(iend))/ & 250 (((ice_bottom_depth - layer(iend))/(TI(ig,iend,islope)**2)) + & 251 ((layer(iend + 1) - ice_bottom_depth)/(ice_inertia**2)))) 252 end if 253 end if ! of if (iref < nsoil) 251 254 else if (icetable_dynamic) then 252 255 do isoil = 1,nsoil 253 call get_ice_TI(.false.,ice_porefilling(ig,isoil,islope),regolith_inertia(ig,islope),TI _PEM(ig,isoil,islope))254 end do255 end if ! of if icetable_equilibrium256 end if ! permanent glaciers257 end if ! icetable_depth(ig,islope) > 0.258 end do !islope259 end do !ig256 call get_ice_TI(.false.,ice_porefilling(ig,isoil,islope),regolith_inertia(ig,islope),TI(ig,isoil,islope)) 257 end do 258 end if ! of if icetable_equilibrium 259 end if ! permanent glaciers 260 end if ! icetable_depth(ig,islope) > 0. 261 end do !islope 262 end do !ig 260 263 261 264 END SUBROUTINE update_soil_TI 262 265 !======================================================================= 263 266 264 END MODULE soil_therm al_inertia267 END MODULE soil_therm_inertia
Note: See TracChangeset
for help on using the changeset viewer.
