Changeset 4065 for trunk/LMDZ.COMMON/libf/evolution/glaciers.F90
- Timestamp:
- Feb 12, 2026, 9:09:12 AM (2 weeks ago)
- File:
-
- 1 edited
-
trunk/LMDZ.COMMON/libf/evolution/glaciers.F90 (modified) (15 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.COMMON/libf/evolution/glaciers.F90
r3991 r4065 16 16 !----------------------------------------------------------------------- 17 17 18 ! DEPENDENCIES 19 ! ------------ 20 use numerics, only: dp, di, k4 21 18 22 ! DECLARATION 19 23 ! ----------- … … 22 26 ! PARAMETERS 23 27 ! ---------- 24 logical :: h2oice_flow ! True by default, flag to compute H2O ice flow25 logical :: co2ice_flow ! True by default, flag to compute CO2 ice flow28 logical(k4), protected :: h2oice_flow ! Flag to compute H2O ice flow 29 logical(k4), protected :: co2ice_flow ! Flag to compute CO2 ice flow 26 30 27 31 contains 28 !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 29 30 !======================================================================= 31 SUBROUTINE flow_co2glaciers(timelen,ngrid,nslope,iflat,subslope_dist,def_slope_mean,vmr_co2_PEM,ps_PCM,ps_avg_global_ini,ps_avg_global,co2ice,flag_co2flow) 32 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 33 34 !======================================================================= 35 SUBROUTINE set_glaciers_config(h2oice_flow_in,co2ice_flow_in) 36 !----------------------------------------------------------------------- 37 ! NAME 38 ! set_glaciers_config 39 ! 40 ! DESCRIPTION 41 ! Setter for 'glaciers' configuration parameters. 42 ! 43 ! AUTHORS & DATE 44 ! JB Clement, 02/2026 45 ! 46 ! NOTES 47 ! 48 !----------------------------------------------------------------------- 49 50 ! DEPENDENCIES 51 ! ------------ 52 use utility, only: bool2str 53 use geometry, only: nslope 54 use display, only: print_msg 55 56 ! DECLARATION 57 ! ----------- 58 implicit none 59 60 ! ARGUMENTS 61 ! --------- 62 logical(k4), intent(in) :: h2oice_flow_in, co2ice_flow_in 63 64 ! CODE 65 ! ---- 66 h2oice_flow = h2oice_flow_in 67 co2ice_flow = co2ice_flow_in 68 if (h2oice_flow .and. nslope == 1) then 69 call print_msg('Warning: h2oice_flow = .true. but nslope = 1. So there will be no flow!') 70 h2oice_flow = .false. 71 end if 72 if (co2ice_flow .and. nslope == 1) then 73 call print_msg('Warning: co2ice_flow = .true. but nslope = 1. So there will be no flow!') 74 co2ice_flow = .false. 75 end if 76 call print_msg('h2oice_flow = '//bool2str(h2oice_flow)) 77 call print_msg('co2ice_flow = '//bool2str(co2ice_flow)) 78 79 END SUBROUTINE set_glaciers_config 80 !======================================================================= 81 82 !======================================================================= 83 SUBROUTINE flow_co2glaciers(vmr_co2_PEM,ps_PCM,ps_avg_glob_ini,ps_avg_global,co2ice,is_co2ice_flow) 32 84 !----------------------------------------------------------------------- 33 85 ! NAME … … 45 97 !----------------------------------------------------------------------- 46 98 47 ! DECLARATION 48 ! ----------- 49 implicit none 50 51 ! ARGUMENTS 52 ! --------- 53 integer, intent(in) :: timelen, ngrid, nslope, iflat ! number of time sample, physical points, subslopes, index of the flat subslope 54 real, dimension(ngrid,nslope), intent(in) :: subslope_dist ! Grid points x Slopes: Distribution of the subgrid slopes 55 real, dimension(ngrid), intent(in) :: def_slope_mean ! Grid points: values of the sub grid slope angles 56 real, dimension(ngrid,timelen), intent(in) :: vmr_co2_PEM ! Grid points x Time field : VMR of CO2 in the first layer [mol/mol] 57 real, dimension(ngrid,timelen), intent(in) :: ps_PCM ! Grid points x Time field: surface pressure given by the PCM [Pa] 58 real, intent(in) :: ps_avg_global_ini ! Global averaged surface pressure at the beginning [Pa] 59 real, intent(in) :: ps_avg_global ! Global averaged surface pressure during the PEM iteration [Pa] 60 real, dimension(ngrid,nslope), intent(inout) :: co2ice ! Grid points x Slope field: CO2 ice on the subgrid slopes [kg/m^2] 61 integer(kind=1), dimension(ngrid,nslope), intent(out) :: flag_co2flow ! Flag to see if there is flow on the subgrid slopes 62 63 ! LOCAL VARIABLES 64 ! --------------- 65 real, dimension(ngrid,nslope) :: Tcond ! CO2 condensation temperature [K] 66 real, dimension(ngrid,nslope) :: hmax ! Maximum thickness before flow 67 68 ! CODE 69 ! ---- 70 write(*,*) "> Flow of CO2 glaciers" 71 call computeTcondCO2(timelen,ngrid,nslope,vmr_co2_PEM,ps_PCM,ps_avg_global_ini,ps_avg_global,Tcond) 72 call compute_hmaxglaciers(ngrid,nslope,iflat,def_slope_mean,Tcond,"co2",hmax) 73 call transfer_ice_duringflow(ngrid,nslope,iflat,subslope_dist,def_slope_mean,hmax,Tcond,co2ice,flag_co2flow) 99 ! DEPENDENCIES 100 ! ------------ 101 use geometry, only: ngrid, nslope 102 use display, only: print_msg 103 104 ! DECLARATION 105 ! ----------- 106 implicit none 107 108 ! ARGUMENTS 109 ! --------- 110 real(dp), dimension(:,:), intent(in) :: vmr_co2_PEM ! Grid points x Time field : VMR of CO2 in the first layer [mol/mol] 111 real(dp), dimension(:,:), intent(in) :: ps_PCM ! Grid points x Time field: surface pressure given by the PCM [Pa] 112 real(dp), intent(in) :: ps_avg_glob_ini ! Global averaged surface pressure at the beginning [Pa] 113 real(dp), intent(in) :: ps_avg_global ! Global averaged surface pressure during the PEM iteration [Pa] 114 real(dp), dimension(:,:), intent(inout) :: co2ice ! Grid points x Slope field: CO2 ice on the subgrid slopes [kg/m^2] 115 logical(k4), dimension(:,:), intent(out) :: is_co2ice_flow ! Flag to see if there is flow on the subgrid slopes 116 117 ! LOCAL VARIABLES 118 ! --------------- 119 real(dp), dimension(ngrid,nslope) :: Tcond ! CO2 condensation temperature [K] 120 real(dp), dimension(ngrid,nslope) :: hmax ! Maximum thickness before flow 121 122 ! CODE 123 ! ---- 124 call print_msg("> Flow of CO2 glaciers") 125 call computeTcondCO2(vmr_co2_PEM,ps_PCM,ps_avg_glob_ini,ps_avg_global,Tcond) 126 call compute_hmaxglaciers(Tcond,"co2",hmax) 127 call transfer_ice_duringflow(hmax,Tcond,co2ice,is_co2ice_flow) 74 128 75 129 END SUBROUTINE flow_co2glaciers … … 77 131 78 132 !======================================================================= 79 SUBROUTINE flow_h2oglaciers( ngrid,nslope,iflat,subslope_dist,def_slope_mean,Tice,h2oice,flag_h2oflow)133 SUBROUTINE flow_h2oglaciers(Tice,h2oice,is_h2oice_flow) 80 134 !----------------------------------------------------------------------- 81 135 ! NAME … … 93 147 !----------------------------------------------------------------------- 94 148 95 ! DECLARATION 96 ! ----------- 97 implicit none 98 99 ! ARGUMENTS 100 ! --------- 101 integer, intent(in) :: ngrid, nslope, iflat ! number of time sample, physical points, subslopes, index of the flat subslope 102 real, dimension(ngrid,nslope), intent(in) :: subslope_dist ! Distribution of the subgrid slopes 103 real, dimension(ngrid), intent(in) :: def_slope_mean ! Values of the sub grid slope angles 104 real, dimension(ngrid,nslope), intent(in) :: Tice ! Ice Temperature [K] 105 real, dimension(ngrid,nslope), intent(inout) :: h2oice ! H2O ice on the subgrid slopes [kg/m^2] 106 integer(kind=1), dimension(ngrid,nslope), intent(out) :: flag_h2oflow ! Flow flag on subgrid slopes 107 108 ! LOCAL VARIABLES 109 ! --------------- 110 real, dimension(ngrid,nslope) :: hmax ! Maximum thickness before flow 111 112 ! CODE 113 ! ---- 114 write(*,*) "> Flow of H2O glaciers" 115 call compute_hmaxglaciers(ngrid,nslope,iflat,def_slope_mean,Tice,"h2o",hmax) 116 call transfer_ice_duringflow(ngrid,nslope,iflat,subslope_dist,def_slope_mean,hmax,Tice,h2oice,flag_h2oflow) 149 ! DEPENDENCIES 150 ! ------------ 151 use geometry, only: ngrid, nslope 152 use display, only: print_msg 153 154 ! DECLARATION 155 ! ----------- 156 implicit none 157 158 ! ARGUMENTS 159 ! --------- 160 real(dp), dimension(:,:), intent(in) :: Tice ! Ice Temperature [K] 161 real(dp), dimension(:,:), intent(inout) :: h2oice ! H2O ice on the subgrid slopes [kg/m^2] 162 logical(k4), dimension(:,:), intent(out) :: is_h2oice_flow ! Flow flag on subgrid slopes 163 164 ! LOCAL VARIABLES 165 ! --------------- 166 real(dp), dimension(ngrid,nslope) :: hmax ! Maximum thickness before flow 167 168 ! CODE 169 ! ---- 170 call print_msg("> Flow of H2O glaciers") 171 call compute_hmaxglaciers(Tice,"h2o",hmax) 172 call transfer_ice_duringflow(hmax,Tice,h2oice,is_h2oice_flow) 117 173 118 174 END SUBROUTINE flow_h2oglaciers … … 120 176 121 177 !======================================================================= 122 SUBROUTINE compute_hmaxglaciers( ngrid,nslope,iflat,def_slope_mean,Tice,name_ice,hmax)178 SUBROUTINE compute_hmaxglaciers(Tice,name_ice,hmax) 123 179 !----------------------------------------------------------------------- 124 180 ! NAME … … 140 196 ! DEPENDENCIES 141 197 ! ------------ 142 use ice_table, only: rho_ice143 use s top_pem, only: stop_clean144 use phys_constants, only: pi, g145 146 ! DECLARATION 147 ! ----------- 148 implicit none 149 150 ! ARGUMENTS151 ! --------- 152 integer, intent(in) :: ngrid, nslope ! # of grid points and subslopes 153 integer, intent(in) :: iflat ! index of the flat subslope 154 real, dimension(nslope), intent(in) :: def_slope_mean ! Values of the subgrid slope angles [deg] 155 real , dimension(ngrid,nslope), intent(in) :: Tice! Ice temperature [K]156 character(3), intent(in) :: name_ice! Nature of ice157 real , dimension(ngrid,nslope), intent(out) :: hmax! Maximum thickness before flow [m]158 159 ! LOCAL VARIABLES 160 ! --------------- 161 real :: tau_d ! characteristic basal drag, understood as the stress that an ice mass flowing under its weight balanced by viscosity. Value obtained from I.Smith162 integer :: ig, islope163 real :: slo_angle198 use geometry, only: ngrid, nslope 199 use slopes, only: iflat, def_slope_mean 200 use ice_table, only: rho_ice 201 use stoppage, only: stop_clean 202 use maths, only: pi 203 use physics, only: g 204 205 ! DECLARATION 206 ! ----------- 207 implicit none 208 209 ! ARGUMENTS 210 ! --------- 211 real(dp), dimension(:,:), intent(in) :: Tice ! Ice temperature [K] 212 character(3), intent(in) :: name_ice ! Nature of ice 213 real(dp), dimension(:,:), intent(out) :: hmax ! Maximum thickness before flow [m] 214 215 ! LOCAL VARIABLES 216 ! --------------- 217 real(dp) :: tau_d ! characteristic basal drag, understood as the stress that an ice mass flowing under its weight balanced by viscosity. Value obtained from I.Smith 218 integer(di) :: ig, islope 219 real(dp) :: slo_angle 164 220 165 221 ! CODE … … 167 223 select case (trim(adjustl(name_ice))) 168 224 case('h2o') 169 tau_d = 1.e5 225 tau_d = 1.e5_dp 170 226 case('co2') 171 tau_d = 5.e3 227 tau_d = 5.e3_dp 172 228 case default 173 call stop_clean( "compute_hmaxglaciers","Type of ice notknown!",1)229 call stop_clean(__FILE__,__LINE__,"type of ice unknown!",1) 174 230 end select 175 231 … … 177 233 do islope = 1,nslope 178 234 if (islope == iflat) then 179 hmax(ig,islope) = 1.e8 235 hmax(ig,islope) = 1.e8_dp 180 236 else 181 slo_angle = abs(def_slope_mean(islope)*pi/180. )237 slo_angle = abs(def_slope_mean(islope)*pi/180._dp) 182 238 hmax(ig,islope) = tau_d/(rho_ice(Tice(ig,islope),name_ice)*g*slo_angle) 183 end if184 end do185 end do239 end if 240 end do 241 end do 186 242 187 243 END SUBROUTINE compute_hmaxglaciers … … 189 245 190 246 !======================================================================= 191 SUBROUTINE transfer_ice_duringflow( ngrid,nslope,iflat,subslope_dist,def_slope_mean,hmax,Tice,qice,flag_flow)247 SUBROUTINE transfer_ice_duringflow(hmax,Tice,qice,flag_flow) 192 248 !----------------------------------------------------------------------- 193 249 ! NAME … … 208 264 ! DEPENDENCIES 209 265 ! ------------ 210 use ice_table, only: rho_ice 211 use stop_pem, only: stop_clean 212 use phys_constants, only: pi 213 214 ! DECLARATION 215 ! ----------- 216 implicit none 217 218 ! ARGUMENTS 219 ! --------- 220 integer, intent(in) :: ngrid, nslope ! # of physical points and subslope 221 integer, intent(in) :: iflat ! Index of the flat subslope 222 real, dimension(ngrid,nslope), intent(in) :: subslope_dist ! Distribution of the subgrid slopes 223 real, dimension(nslope), intent(in) :: def_slope_mean ! Values of the subgrid slopes 224 real, dimension(ngrid,nslope), intent(in) :: hmax ! Maximum height before initiating flow [m] 225 real, dimension(ngrid,nslope), intent(in) :: Tice ! Ice temperature [K] 226 real, dimension(ngrid,nslope), intent(inout) :: qice ! Ice in the subslope [kg/m^2] 227 integer(kind=1), dimension(ngrid,nslope), intent(out) :: flag_flow ! Flow flag on subgrid slopes 228 229 ! LOCAL VARIABLES 230 ! --------------- 231 integer :: ig, islope 232 integer :: iaval ! index where ice is transferred 233 234 ! CODE 235 ! ---- 236 flag_flow = 0 266 use geometry, only: ngrid, nslope 267 use slopes, only: iflat, subslope_dist, def_slope_mean 268 use ice_table, only: rho_ice 269 use stoppage, only: stop_clean 270 use maths, only: pi 271 272 ! DECLARATION 273 ! ----------- 274 implicit none 275 276 ! ARGUMENTS 277 ! --------- 278 real(dp), dimension(:,:), intent(in) :: hmax ! Maximum height before initiating flow [m] 279 real(dp), dimension(:,:), intent(in) :: Tice ! Ice temperature [K] 280 real(dp), dimension(:,:), intent(inout) :: qice ! Ice in the subslope [kg/m^2] 281 logical(k4), dimension(:,:), intent(out) :: flag_flow ! Flow flag on subgrid slopes 282 283 ! LOCAL VARIABLES 284 ! --------------- 285 integer(di) :: ig, islope 286 integer(di) :: iaval ! Index where ice is transferred 287 288 ! CODE 289 ! ---- 290 flag_flow = .false. 237 291 238 292 do ig = 1,ngrid … … 240 294 if (islope /= iflat) then ! ice can be infinite on flat ground 241 295 ! First: check that CO2 ice must flow (excess of ice on the slope), ice can accumulate infinitely on flat ground 242 if (qice(ig,islope) >= rho_ice(Tice(ig,islope),'h2o')*hmax(ig,islope)*cos(pi*def_slope_mean(islope)/180. )) then296 if (qice(ig,islope) >= rho_ice(Tice(ig,islope),'h2o')*hmax(ig,islope)*cos(pi*def_slope_mean(islope)/180._dp)) then 243 297 ! Second: determine the flatest slopes possible: 244 298 if (islope > iflat) then … … 246 300 else 247 301 iaval = islope + 1 248 end if302 end if 249 303 do while (iaval /= iflat .and. subslope_dist(ig,iaval) == 0) 250 304 if (iaval > iflat) then … … 252 306 else 253 307 iaval = iaval + 1 254 end if255 end do256 qice(ig,iaval) = qice(ig,iaval) + (qice(ig,islope) - rho_ice(Tice(ig,islope),'h2o')*hmax(ig,islope)*cos(pi*def_slope_mean(islope)/180. )) &257 *subslope_dist(ig,islope)/subslope_dist(ig,iaval)*cos(pi*def_slope_mean(iaval)/180. )/cos(pi*def_slope_mean(islope)/180.)258 259 qice(ig,islope) = rho_ice(Tice(ig,islope),'h2o')*hmax(ig,islope)*cos(pi*def_slope_mean(islope)/180. )260 flag_flow(ig,islope) = 1261 end if ! co2ice > hmax262 end if ! iflat263 end do !islope264 end do !ig308 end if 309 end do 310 qice(ig,iaval) = qice(ig,iaval) + (qice(ig,islope) - rho_ice(Tice(ig,islope),'h2o')*hmax(ig,islope)*cos(pi*def_slope_mean(islope)/180._dp)) & 311 *subslope_dist(ig,islope)/subslope_dist(ig,iaval)*cos(pi*def_slope_mean(iaval)/180._dp)/cos(pi*def_slope_mean(islope)/180._dp) 312 313 qice(ig,islope) = rho_ice(Tice(ig,islope),'h2o')*hmax(ig,islope)*cos(pi*def_slope_mean(islope)/180._dp) 314 flag_flow(ig,islope) = .true. 315 end if ! co2ice > hmax 316 end if ! iflat 317 end do !islope 318 end do !ig 265 319 266 320 END SUBROUTINE 267 321 268 322 !======================================================================= 269 SUBROUTINE computeTcondCO2( timelen,ngrid,nslope,vmr_co2_PEM,ps_PCM,ps_avg_global_ini,ps_avg_global,Tcond)323 SUBROUTINE computeTcondCO2(vmr_co2_PEM,ps_PCM,ps_avg_glob_ini,ps_avg_global,Tcond) 270 324 !----------------------------------------------------------------------- 271 325 ! NAME … … 285 339 ! DEPENDENCIES 286 340 ! ------------ 287 use constants_marspem_mod, only: alpha_clap_co2, beta_clap_co2288 289 ! DECLARATION 290 ! -----------291 implicit none 292 293 ! ARGUMENTS 294 ! ---------295 integer, intent(in) :: timelen, ngrid, nslope 296 real , dimension(ngrid,timelen), intent(in) :: vmr_co2_PEM ! VMR of CO2 in the first layer [mol/mol]297 real , dimension(ngrid,timelen), intent(in) :: ps_PCM ! Surface pressure in the PCM [Pa]298 real , intent(in) :: ps_avg_global_ini ! Global averaged surfacepressure in the PCM [Pa]299 real ,intent(in) :: ps_avg_global ! Global averaged surface pressure computed during the PEM iteration300 real , dimension(ngrid,nslope),intent(out) :: Tcond ! Condensation temperature of CO2, yearly averaged301 302 ! LOCAL VARIABLES 303 ! --------------- 304 integer :: ig, it341 use geometry, only: ngrid, nday 342 use planet, only: alpha_clap_co2, beta_clap_co2 343 344 ! DECLARATION 345 ! ----------- 346 implicit none 347 348 ! ARGUMENTS 349 ! --------- 350 real(dp), dimension(:,:), intent(in) :: vmr_co2_PEM ! VMR of CO2 in the first layer [mol/mol] 351 real(dp), dimension(:,:), intent(in) :: ps_PCM ! Surface pressure in the PCM [Pa] 352 real(dp), intent(in) :: ps_avg_glob_ini ! Global averaged surfacepressure in the PCM [Pa] 353 real(dp), intent(in) :: ps_avg_global ! Global averaged surface pressure computed during the PEM iteration 354 real(dp), dimension(:,:), intent(out) :: Tcond ! Condensation temperature of CO2, yearly averaged 355 356 ! LOCAL VARIABLES 357 ! --------------- 358 integer(di) :: ig, it 305 359 306 360 ! CODE 307 361 ! ---- 308 362 do ig = 1,ngrid 309 Tcond(ig,:) = 0 310 do it = 1, timelen311 Tcond(ig,:) = Tcond(ig,:) + beta_clap_co2/(alpha_clap_co2 - log(vmr_co2_PEM(ig,it)*ps_PCM(ig,it)*ps_avg_glob al_ini/ps_avg_global/100))312 end do313 Tcond(ig,:) = Tcond(ig,:)/ timelen314 end do363 Tcond(ig,:) = 0._dp 364 do it = 1,nday 365 Tcond(ig,:) = Tcond(ig,:) + beta_clap_co2/(alpha_clap_co2 - log(vmr_co2_PEM(ig,it)*ps_PCM(ig,it)*ps_avg_glob_ini/ps_avg_global/100._dp)) 366 end do 367 Tcond(ig,:) = Tcond(ig,:)/nday 368 end do 315 369 316 370 END SUBROUTINE computeTcondCO2
Note: See TracChangeset
for help on using the changeset viewer.
