Changeset 3961 for trunk/LMDZ.COMMON/libf/evolution/adsorption_mod.F90
- Timestamp:
- Nov 14, 2025, 5:26:48 PM (4 weeks ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.COMMON/libf/evolution/adsorption_mod.F90
r3571 r3961 71 71 tsoil_PEM,TI_PEM,m_co2_completesoil,delta_mco2reg) 72 72 73 END SUBROUTINE 73 END SUBROUTINE regolith_adsorption 74 74 75 75 !======================================================================= … … 89 89 use vertical_layers_mod, only: ap, bp 90 90 use constants_marspem_mod, only: alpha_clap_h2o, beta_clap_h2o, m_h2o, m_co2,m_noco2, rho_regolith 91 92 #ifndef CPP_STD 93 use comcstfi_h, only: pi 94 #else 95 use comcstfi_mod, only: pi 96 #endif 91 use comcstfi_h, only: pi 97 92 98 93 implicit none … … 147 142 ispermanent_co2glaciers = .false. 148 143 149 #ifndef CPP_STD 150 ! 0.1 Look at perennial ice 144 ! 0.1 Look at perennial ice 145 do ig = 1,ngrid 146 do islope = 1,nslope 147 if (abs(d_h2oglaciers(ig,islope)) > 1.e-5 .and. abs(waterice(ig,islope)) > 0.) ispermanent_h2oglaciers(ig,islope) = .true. 148 if (abs(d_co2glaciers(ig,islope)) > 1.e-5 .and. abs(co2ice(ig,islope)) > 0.) ispermanent_co2glaciers(ig,islope) = .true. 149 enddo 150 enddo 151 152 ! 0.2 Compute the partial pressure of vapor 153 ! a. the molecular mass into the column 154 do ig = 1,ngrid 155 mass_mean(ig,:) = 1/(A*q_co2(ig,:) + B) 156 enddo 157 158 ! b. pressure level 159 do it = 1,timelen 151 160 do ig = 1,ngrid 152 do islope = 1,nslope 153 if (abs(d_h2oglaciers(ig,islope)) > 1.e-5 .and. abs(waterice(ig,islope)) > 0.) ispermanent_h2oglaciers(ig,islope) = .true. 154 if (abs(d_co2glaciers(ig,islope)) > 1.e-5 .and. abs(co2ice(ig,islope)) > 0.) ispermanent_co2glaciers(ig,islope) = .true. 161 zplev_mean(ig,it) = ap(1) + bp(1)*ps(ig,it) 162 enddo 163 enddo 164 165 ! c. Vapor pressure 166 pvapor = mass_mean/m_h2o*q_h2o*zplev_mean 167 pvapor_avg = sum(pvapor,2)/timelen 168 deallocate(pvapor,zplev_mean,mass_mean) 169 170 ! 1. we compute the mass of H2O adsorded in each layer of the meshes 171 do ig = 1,ngrid 172 do islope = 1,nslope 173 do iloop = 1,index_breccia 174 K = Ko*exp(e/tsoil_PEM(ig,iloop,islope)) 175 if (TI_PEM(ig,iloop,islope) < inertie_thresold) then 176 theta_h2o_adsorbed(ig,iloop,islope) = (K*pvapor_avg(ig)/(1. + K*pvapor_avg(ig)))**mu 177 else 178 p_sat = exp(beta_clap_h2o/tsoil_PEM(ig,iloop,islope) + alpha_clap_h2o) ! we assume fixed temperature in the ice ... not really good but ... 179 theta_h2o_adsorbed(ig,iloop,islope) = (K*p_sat/(1. + K*p_sat))**mu 180 endif 181 dm_h2o_regolith_slope(ig,iloop,islope) = as*theta_h2o_adsorbed(ig,iloop,islope)*m_theta*rho_regolith 155 182 enddo 156 183 enddo 157 158 ! 0.2 Compute the partial pressure of vapor 159 ! a. the molecular mass into the column 160 do ig = 1,ngrid 161 mass_mean(ig,:) = 1/(A*q_co2(ig,:) + B) 162 enddo 163 164 ! b. pressure level 165 do it = 1,timelen 166 do ig = 1,ngrid 167 zplev_mean(ig,it) = ap(1) + bp(1)*ps(ig,it) 184 enddo 185 186 ! 2. Check the exchange between the atmosphere and the regolith 187 do ig = 1,ngrid 188 delta_mreg(ig) = 0. 189 do islope = 1,nslope 190 deltam_reg_slope(ig,islope) = 0. 191 do iloop = 1,index_breccia 192 if (TI_PEM(ig,iloop,islope) < inertie_thresold .and. .not. ispermanent_h2oglaciers(ig,islope) .and. .not. ispermanent_co2glaciers(ig,islope)) then 193 if (iloop == 1) then 194 deltam_reg_complete(ig,iloop,islope) = (dm_h2o_regolith_slope(ig,iloop,islope) - m_h2o_completesoil(ig,iloop,islope))*(layer_PEM(iloop)) 195 else 196 deltam_reg_complete(ig,iloop,islope) = (dm_h2o_regolith_slope(ig,iloop,islope) - m_h2o_completesoil(ig,iloop,islope))*(layer_PEM(iloop) - layer_PEM(iloop - 1)) 197 endif 198 else ! NO EXCHANGE AS ICE BLOCK THE DYNAMIC! 199 deltam_reg_complete(ig,iloop,islope) = 0. 200 endif 201 deltam_reg_slope(ig,islope) = deltam_reg_slope(ig,islope) + deltam_reg_complete(ig,iloop,islope) 168 202 enddo 169 enddo 170 171 ! c. Vapor pressure 172 pvapor = mass_mean/m_h2o*q_h2o*zplev_mean 173 pvapor_avg = sum(pvapor,2)/timelen 174 #endif 175 deallocate(pvapor,zplev_mean,mass_mean) 176 177 #ifndef CPP_STD 178 ! 1. we compute the mass of H2O adsorded in each layer of the meshes 179 do ig = 1,ngrid 180 do islope = 1,nslope 181 do iloop = 1,index_breccia 182 K = Ko*exp(e/tsoil_PEM(ig,iloop,islope)) 183 if (TI_PEM(ig,iloop,islope) < inertie_thresold) then 184 theta_h2o_adsorbed(ig,iloop,islope) = (K*pvapor_avg(ig)/(1. + K*pvapor_avg(ig)))**mu 185 else 186 p_sat = exp(beta_clap_h2o/tsoil_PEM(ig,iloop,islope) + alpha_clap_h2o) ! we assume fixed temperature in the ice ... not really good but ... 187 theta_h2o_adsorbed(ig,iloop,islope) = (K*p_sat/(1. + K*p_sat))**mu 188 endif 189 dm_h2o_regolith_slope(ig,iloop,islope) = as*theta_h2o_adsorbed(ig,iloop,islope)*m_theta*rho_regolith 190 enddo 191 enddo 192 enddo 193 194 ! 2. Check the exchange between the atmosphere and the regolith 195 do ig = 1,ngrid 196 delta_mreg(ig) = 0. 197 do islope = 1,nslope 198 deltam_reg_slope(ig,islope) = 0. 199 do iloop = 1,index_breccia 200 if (TI_PEM(ig,iloop,islope) < inertie_thresold .and. .not. ispermanent_h2oglaciers(ig,islope) .and. .not. ispermanent_co2glaciers(ig,islope)) then 201 if (iloop == 1) then 202 deltam_reg_complete(ig,iloop,islope) = (dm_h2o_regolith_slope(ig,iloop,islope) - m_h2o_completesoil(ig,iloop,islope))*(layer_PEM(iloop)) 203 else 204 deltam_reg_complete(ig,iloop,islope) = (dm_h2o_regolith_slope(ig,iloop,islope) - m_h2o_completesoil(ig,iloop,islope))*(layer_PEM(iloop) - layer_PEM(iloop - 1)) 205 endif 206 else ! NO EXCHANGE AS ICE BLOCK THE DYNAMIC! 207 deltam_reg_complete(ig,iloop,islope) = 0. 208 endif 209 deltam_reg_slope(ig,islope) = deltam_reg_slope(ig,islope) + deltam_reg_complete(ig,iloop,islope) 210 enddo 211 delta_mreg(ig) = delta_mreg(ig) + deltam_reg_slope(ig,islope)*subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.) 212 enddo 213 enddo 214 m_h2o_completesoil = dm_h2o_regolith_slope 215 #endif 216 END SUBROUTINE 203 delta_mreg(ig) = delta_mreg(ig) + deltam_reg_slope(ig,islope)*subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.) 204 enddo 205 enddo 206 m_h2o_completesoil = dm_h2o_regolith_slope 207 208 END SUBROUTINE regolith_h2oadsorption 217 209 218 210 !======================================================================= … … 230 222 use vertical_layers_mod, only: ap, bp 231 223 use constants_marspem_mod, only: m_co2, m_noco2, rho_regolith 232 233 #ifndef CPP_STD 234 use comcstfi_h, only: pi 235 #else 236 use comcstfi_mod, only: pi 237 #endif 224 use comcstfi_h, only: pi 238 225 239 226 implicit none … … 288 275 ispermanent_co2glaciers = .false. 289 276 290 #ifndef CPP_STD 291 ! 0.1 Look at perennial ice 277 ! 0.1 Look at perennial ice 278 do ig = 1,ngrid 279 do islope = 1,nslope 280 if (abs(d_h2oglaciers(ig,islope)) > 1.e-5 .and. abs(waterice(ig,islope)) > 0.) ispermanent_h2oglaciers(ig,islope) = .true. 281 if (abs(d_co2glaciers(ig,islope)) > 1.e-5 .and. abs(co2ice(ig,islope)) > 0.) ispermanent_co2glaciers(ig,islope) = .true. 282 enddo 283 enddo 284 285 ! 0.2 Compute the partial pressure of CO2 286 ! a. the molecular mass into the column 287 do ig = 1,ngrid 288 mass_mean(ig,:) = 1./(A*q_co2(ig,:) + B) 289 enddo 290 291 ! b. pressure level 292 do it = 1,timelen 292 293 do ig = 1,ngrid 293 do islope = 1,nslope 294 if (abs(d_h2oglaciers(ig,islope)) > 1.e-5 .and. abs(waterice(ig,islope)) > 0.) ispermanent_h2oglaciers(ig,islope) = .true. 295 if (abs(d_co2glaciers(ig,islope)) > 1.e-5 .and. abs(co2ice(ig,islope)) > 0.) ispermanent_co2glaciers(ig,islope) = .true. 294 zplev_mean(ig,it) = ap(1) + bp(1)*ps(ig,it) 295 enddo 296 enddo 297 298 ! c. Vapor pressure 299 pco2 = mass_mean/m_co2*q_co2*zplev_mean 300 pco2_avg(:) = sum(pco2(:,:),2)/timelen 301 302 deallocate(zplev_mean,mass_mean,pco2) 303 304 ! 1. Compute the fraction of the pores occupied by H2O 305 call regolith_h2oadsorption(ngrid,nslope,nsoil_PEM,timelen,d_h2oglaciers,d_co2glaciers,waterice,co2ice,ps,q_co2,q_h2o,tsoil_PEM,TI_PEM, & 306 theta_h2o_adsorbed, m_h2o_adsorbed,delta_mh2o) 307 308 ! 2. we compute the mass of co2 adsorded in each layer of the meshes 309 do ig = 1,ngrid 310 do islope = 1,nslope 311 do iloop = 1,index_breccia 312 if (TI_PEM(ig,iloop,islope) < inertie_thresold .and. .not. ispermanent_h2oglaciers(ig,islope) .and. .not. ispermanent_co2glaciers(ig,islope)) then 313 dm_co2_regolith_slope(ig,iloop,islope) = as*rho_regolith*m_theta*(1. - theta_h2o_adsorbed(ig,iloop,islope))*alpha*pco2_avg(ig)/ & 314 (alpha*pco2_avg(ig) + sqrt(tsoil_PEM(ig,iloop,islope))*exp(beta/tsoil_PEM(ig,iloop,islope))) 315 else 316 if (abs(m_co2_completesoil(ig,iloop,islope)) < 1.e-10) then !!! we are at first call 317 dm_co2_regolith_slope(ig,iloop,islope) = as*rho_regolith*m_theta*(1. - theta_h2o_adsorbed(ig,iloop,islope))*alpha*pco2_avg(ig) & 318 /(alpha*pco2_avg(ig)+sqrt(tsoil_PEM(ig,iloop,islope))*exp(beta/tsoil_PEM(ig,iloop,islope))) 319 else ! no change: permanent ice stick the atoms of CO2 320 dm_co2_regolith_slope(ig,iloop,islope) = m_co2_completesoil(ig,iloop,islope) 321 endif 322 endif 296 323 enddo 297 324 enddo 298 299 ! 0.2 Compute the partial pressure of CO2 300 ! a. the molecular mass into the column 301 do ig = 1,ngrid 302 mass_mean(ig,:) = 1./(A*q_co2(ig,:) + B) 303 enddo 304 305 ! b. pressure level 306 do it = 1,timelen 307 do ig = 1,ngrid 308 zplev_mean(ig,it) = ap(1) + bp(1)*ps(ig,it) 325 enddo 326 327 ! 3. Check the exchange between the atmosphere and the regolith 328 do ig = 1,ngrid 329 delta_mreg(ig) = 0. 330 do islope = 1,nslope 331 deltam_reg_slope(ig,islope) = 0. 332 do iloop = 1,index_breccia 333 if (TI_PEM(ig,iloop,islope) < inertie_thresold .and. .not. ispermanent_h2oglaciers(ig,islope) .and. .not. ispermanent_co2glaciers(ig,islope)) then 334 if (iloop == 1) then 335 deltam_reg_complete(ig,iloop,islope) = (dm_co2_regolith_slope(ig,iloop,islope) - m_co2_completesoil(ig,iloop,islope))*(layer_PEM(iloop)) 336 else 337 deltam_reg_complete(ig,iloop,islope) = (dm_co2_regolith_slope(ig,iloop,islope) - m_co2_completesoil(ig,iloop,islope))*(layer_PEM(iloop) - layer_PEM(iloop - 1)) 338 endif 339 else ! NO EXCHANGE AS ICE BLOCK THE DYNAMIC! 340 deltam_reg_complete(ig,iloop,islope) = 0. 341 endif 342 deltam_reg_slope(ig,islope) = deltam_reg_slope(ig,islope) + deltam_reg_complete(ig,iloop,islope) 309 343 enddo 310 enddo 311 312 ! c. Vapor pressure 313 pco2 = mass_mean/m_co2*q_co2*zplev_mean 314 pco2_avg(:) = sum(pco2(:,:),2)/timelen 315 316 deallocate(zplev_mean,mass_mean,pco2) 317 318 ! 1. Compute the fraction of the pores occupied by H2O 319 call regolith_h2oadsorption(ngrid,nslope,nsoil_PEM,timelen,d_h2oglaciers,d_co2glaciers,waterice,co2ice,ps,q_co2,q_h2o,tsoil_PEM,TI_PEM, & 320 theta_h2o_adsorbed, m_h2o_adsorbed,delta_mh2o) 321 322 ! 2. we compute the mass of co2 adsorded in each layer of the meshes 323 do ig = 1,ngrid 324 do islope = 1,nslope 325 do iloop = 1,index_breccia 326 if (TI_PEM(ig,iloop,islope) < inertie_thresold .and. .not. ispermanent_h2oglaciers(ig,islope) .and. .not. ispermanent_co2glaciers(ig,islope)) then 327 dm_co2_regolith_slope(ig,iloop,islope) = as*rho_regolith*m_theta*(1. - theta_h2o_adsorbed(ig,iloop,islope))*alpha*pco2_avg(ig)/ & 328 (alpha*pco2_avg(ig) + sqrt(tsoil_PEM(ig,iloop,islope))*exp(beta/tsoil_PEM(ig,iloop,islope))) 329 else 330 if (abs(m_co2_completesoil(ig,iloop,islope)) < 1.e-10) then !!! we are at first call 331 dm_co2_regolith_slope(ig,iloop,islope) = as*rho_regolith*m_theta*(1. - theta_h2o_adsorbed(ig,iloop,islope))*alpha*pco2_avg(ig) & 332 /(alpha*pco2_avg(ig)+sqrt(tsoil_PEM(ig,iloop,islope))*exp(beta/tsoil_PEM(ig,iloop,islope))) 333 else ! no change: permanent ice stick the atoms of CO2 334 dm_co2_regolith_slope(ig,iloop,islope) = m_co2_completesoil(ig,iloop,islope) 335 endif 336 endif 337 enddo 338 enddo 339 enddo 340 341 ! 3. Check the exchange between the atmosphere and the regolith 342 do ig = 1,ngrid 343 delta_mreg(ig) = 0. 344 do islope = 1,nslope 345 deltam_reg_slope(ig,islope) = 0. 346 do iloop = 1,index_breccia 347 if (TI_PEM(ig,iloop,islope) < inertie_thresold .and. .not. ispermanent_h2oglaciers(ig,islope) .and. .not. ispermanent_co2glaciers(ig,islope)) then 348 if (iloop == 1) then 349 deltam_reg_complete(ig,iloop,islope) = (dm_co2_regolith_slope(ig,iloop,islope) - m_co2_completesoil(ig,iloop,islope))*(layer_PEM(iloop)) 350 else 351 deltam_reg_complete(ig,iloop,islope) = (dm_co2_regolith_slope(ig,iloop,islope) - m_co2_completesoil(ig,iloop,islope))*(layer_PEM(iloop) - layer_PEM(iloop - 1)) 352 endif 353 else ! NO EXCHANGE AS ICE BLOCK THE DYNAMIC! 354 deltam_reg_complete(ig,iloop,islope) = 0. 355 endif 356 deltam_reg_slope(ig,islope) = deltam_reg_slope(ig,islope) + deltam_reg_complete(ig,iloop,islope) 357 enddo 358 delta_mreg(ig) = delta_mreg(ig) + deltam_reg_slope(ig,islope)*subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.) 359 enddo 360 enddo 361 m_co2_completesoil = dm_co2_regolith_slope 362 #endif 344 delta_mreg(ig) = delta_mreg(ig) + deltam_reg_slope(ig,islope)*subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.) 345 enddo 346 enddo 347 m_co2_completesoil = dm_co2_regolith_slope 363 348 364 349 END SUBROUTINE regolith_co2adsorption
Note: See TracChangeset
for help on using the changeset viewer.
