Changeset 4073 for trunk/LMDZ.PLUTO/libf/muphypluto
- Timestamp:
- Feb 16, 2026, 3:47:40 PM (13 days ago)
- Location:
- trunk/LMDZ.PLUTO/libf/muphypluto
- Files:
-
- 2 edited
-
mp2m_clouds.F90 (modified) (27 diffs)
-
mp2m_globals.F90 (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.PLUTO/libf/muphypluto/mp2m_clouds.F90
r4027 r4073 21 21 ! - mm_cloud_microphysics | Evolution of moments tracers through clouds microphysics processes. 22 22 ! - mm_cloud_nucond | Get moments tendencies through nucleation/condensation/evaporation. 23 ! - nc_esp| Get moments tendencies through nucleation/condensation/evaporation of a given condensible species.24 ! - hetnucl_rate_aer| Get heterogeneous nucleation rate on aerosols.25 ! - growth_rate| Get growth rate through condensation/evaporation process.23 ! * nc_esp | Get moments tendencies through nucleation/condensation/evaporation of a given condensible species. 24 ! * hetnucl_rate_aer | Get heterogeneous nucleation rate on aerosols. 25 ! * growth_rate | Get growth rate through condensation/evaporation process. 26 26 ! - mm_cloud_sedimentation | Compute the tendency of clouds related moments through sedimentation process. 27 ! - exchange | Compute the exchange matrix. 28 ! - getnzs | Compute displacement of a cell under sedimentation process. 29 ! - wsettle | Compute the settling velocity of a spherical particle. 30 ! - get_mass_flux | Get the mass flux of clouds related moment through sedimention. 27 ! * exchange | Compute the exchange matrix. 28 ! * getnzs | Compute displacement of a cell under sedimentation process. 29 ! * wsettle | Compute the settling velocity of a spherical particle. 30 ! * get_mass_flux | Get the mass flux of clouds related moment through sedimention. 31 ! - mm_cloud_coagulation | Compute the tendency of clouds related moments through coagulation process. 31 32 ! 32 33 ! Authors … … 86 87 !~~~~~~~~~~~~~~~~ 87 88 INTEGER :: i 89 ! Updated tracers with haze and cloud related processes tendencies 90 REAL(kind=mm_wp), DIMENSION(:), ALLOCATABLE :: m0as,m3as 91 REAL(kind=mm_wp), DIMENSION(:), ALLOCATABLE :: m0af,m3af 92 REAL(kind=mm_wp), DIMENSION(:), ALLOCATABLE :: m0ccn,m3ccn 93 REAL(kind=mm_wp), DIMENSION(:,:), ALLOCATABLE :: m3ice,mugas 94 ! Temporary tendencies through nucleation/condensation/sublimation 95 REAL(kind=mm_wp), DIMENSION(:), ALLOCATABLE :: nCdm0as,nCdm3as 96 REAL(kind=mm_wp), DIMENSION(:), ALLOCATABLE :: nCdm0af,nCdm3af 97 REAL(kind=mm_wp), DIMENSION(:), ALLOCATABLE :: nCdm0ccn,nCdm3ccn 98 REAL(kind=mm_wp), DIMENSION(:,:), ALLOCATABLE :: nCdm3ice,nCdmugas 99 ! Temporary tendencies through coagulation 100 REAL(kind=mm_wp), DIMENSION(:), ALLOCATABLE :: cCdm0ccn,cCdm3ccn 88 101 ! Temporary tendencies through sedimentation (usefull for diagnostics) 89 102 REAL(kind=mm_wp), DIMENSION(:), ALLOCATABLE :: zCdm0ccn,zCdm3ccn … … 92 105 ! Initialization: 93 106 !~~~~~~~~~~~~~~~~ 107 ALLOCATE(m0as(mm_nla),m3as(mm_nla),m0af(mm_nla),m3af(mm_nla)) 108 ALLOCATE(m0ccn(mm_nla),m3ccn(mm_nla),m3ice(mm_nla,mm_nesp),mugas(mm_nla,mm_nesp)) 109 ALLOCATE(nCdm0as(mm_nla),nCdm3as(mm_nla),nCdm0af(mm_nla),nCdm3af(mm_nla)) 110 ALLOCATE(nCdm0ccn(mm_nla),nCdm3ccn(mm_nla),nCdm3ice(mm_nla,mm_nesp),nCdmugas(mm_nla,mm_nesp)) 111 ALLOCATE(cCdm0ccn(mm_nla),cCdm3ccn(mm_nla)) 94 112 ALLOCATE(zCdm0ccn(mm_nla),zCdm3ccn(mm_nla),zCdm3ice(mm_nla,mm_nesp)) 113 114 m0as(:) = mm_m0aer_s + Hdm0as ; m3as(:) = mm_m3aer_s + Hdm3as 115 m0af(:) = mm_m0aer_f + Hdm0af ; m3af(:) = mm_m3aer_f + Hdm3af 116 m0ccn(:) = mm_m0ccn ; m3ccn(:) = mm_m3ccn 117 m3ice(:,:) = mm_m3ice ; mugas(:,:) = mm_gas 95 118 96 119 Cdm0as(:) = 0._mm_wp ; Cdm3as(:) = 0._mm_wp … … 99 122 Cdm3ice(:,:) = 0._mm_wp ; Cdmugas(:,:) = 0._mm_wp 100 123 101 zCdm0ccn(:) = 0._mm_wp ; zCdm3ccn(:) = 0._mm_wp 124 nCdm0as(:) = 0._mm_wp ; nCdm3as(:) = 0._mm_wp 125 nCdm0af(:) = 0._mm_wp ; nCdm3af(:) = 0._mm_wp 126 nCdm0ccn(:) = 0._mm_wp ; nCdm3ccn(:) = 0._mm_wp 127 nCdm3ice(:,:) = 0._mm_wp ; nCdmugas(:,:) = 0._mm_wp 128 cCdm0ccn(:) = 0._mm_wp ; cCdm3ccn(:) = 0._mm_wp 129 zCdm0ccn(:) = 0._mm_wp ; zCdm3ccn(:) = 0._mm_wp 102 130 zCdm3ice(:,:) = 0._mm_wp 103 131 … … 105 133 ! And update saturation ratio, nucleation rate and growth rate diagnostic. 106 134 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 107 call mm_cloud_nucond(Hdm0as,Hdm3as,Hdm0af,Hdm3af,Cdm0as,Cdm3as,Cdm0af,Cdm3af,& 108 Cdm0ccn,Cdm3ccn,Cdm3ice,Cdmugas,mm_gas_sat,mm_nrate,mm_grate) 109 135 call mm_cloud_nucond(m0as,m3as,m0af,m3af,m0ccn,m3ccn,m3ice,mugas,& 136 nCdm0as,nCdm3as,nCdm0af,nCdm3af,& 137 nCdm0ccn,nCdm3ccn,nCdm3ice,nCdmugas,mm_gas_sat,mm_nrate,mm_grate) 138 139 ! Update tracers 140 m0as = m0as + nCdm0as ; m3as = m3as + nCdm3as 141 m0af = m0af + nCdm0af ; m3af = m3af + nCdm3af 142 m0ccn = m0ccn + nCdm0ccn ; m3ccn = m3ccn + nCdm3ccn 143 m3ice = m3ice + nCdm3ice ; mugas = mugas + nCdmugas 144 145 where(m3as > 0._mm_wp .AND. m0as > 0._mm_wp) 146 mm_rcs = mm_get_rcs(m0as,m3as) 147 elsewhere 148 mm_rcs = 0._mm_wp 149 endwhere 150 where(m3af > 0._mm_wp .AND. m0af > 0._mm_wp) 151 mm_rcf = mm_get_rcf(m0af,m3af) 152 elsewhere 153 mm_rcf = 0._mm_wp 154 endwhere 155 call mm_cloud_properties(m0ccn,m3ccn,m3ice,mm_drad,mm_drho) 156 157 ! Calls coagulation: 158 !~~~~~~~~~~~~~~~~~~~ 159 call mm_cloud_coagulation(m0ccn,m3ccn,m3ice,cCdm0ccn,cCdm3ccn) 160 161 ! Update tracers 162 m0ccn = m0ccn + cCdm0ccn ; m3ccn = m3ccn + cCdm3ccn 163 call mm_cloud_properties(m0ccn,m3ccn,m3ice,mm_drad,mm_drho) 164 110 165 ! Calls sedimentation: 111 166 !~~~~~~~~~~~~~~~~~~~~~ 112 call mm_cloud_sedimentation(zCdm0ccn,zCdm3ccn,zCdm3ice) 113 167 call mm_cloud_sedimentation(m0ccn,m3ccn,m3ice,zCdm0ccn,zCdm3ccn,zCdm3ice) 168 169 ! Update tracers 170 m0ccn = m0ccn + zCdm0ccn ; m3ccn = m3ccn + zCdm3ccn 171 m3ice = m3ice + zCdm3ice 172 call mm_cloud_properties(m0ccn,m3ccn,m3ice,mm_drad,mm_drho) 173 114 174 ! Computes diagnostics: 115 175 !~~~~~~~~~~~~~~~~~~~~~~ … … 118 178 119 179 ! Flux [kg.m-2.s-1] and precipitation [kg.m-2] of ccn 120 mm_ccn_flux(:) = get_mass_flux(mm_rhoaer,m m_m3ccn(:))180 mm_ccn_flux(:) = get_mass_flux(mm_rhoaer,m3ccn(:)) 121 181 mm_ccn_prec = SUM(zCdm3ccn(:)*mm_dzlev*mm_rhoaer) 122 182 123 183 ! Flux [kg.m-2.s-1] and precipitation [kg.m-2] of ices 124 184 DO i = 1, mm_nesp 125 mm_ice_fluxes(:,i) = get_mass_flux(mm_xESPS(i)%rho_s,m m_m3ice(:,i))185 mm_ice_fluxes(:,i) = get_mass_flux(mm_xESPS(i)%rho_s,m3ice(:,i)) 126 186 mm_ice_prec(i) = SUM(zCdm3ice(:,i)*mm_dzlev*mm_xESPS(i)%rho_s) 127 187 ENDDO … … 129 189 ! Updates tendencies: 130 190 !~~~~~~~~~~~~~~~~~~~~ 131 Cdm0ccn = Cdm0ccn + zCdm0ccn 132 Cdm3ccn = Cdm3ccn + zCdm3ccn 133 Cdm3ice = Cdm3ice + zCdm3ice 191 Cdm0as = nCdm0as ; Cdm3as = nCdm3as 192 Cdm0af = nCdm0af ; Cdm3af = nCdm3af 193 Cdm0ccn = nCdm0ccn + cCdm0ccn + zCdm0ccn ; Cdm3ccn = nCdm3ccn + cCdm3ccn + zCdm3ccn 194 Cdm3ice = nCdm3ice + zCdm3ice ; Cdmugas = nCdmugas 195 134 196 END SUBROUTINE mm_cloud_microphysics 135 197 … … 138 200 !============================================================================ 139 201 140 SUBROUTINE mm_cloud_nucond(Hdm0as,Hdm3as,Hdm0af,Hdm3af,Cdm0as,Cdm3as,Cdm0af,Cdm3af,& 141 Cdm0ccn,Cdm3ccn,Cdm3ice,Cdmugas,gassat,nrate,grate) 202 SUBROUTINE mm_cloud_nucond(m0as,m3as,m0af,m3af,m0ccn,m3ccn,m3ice,mugas,& 203 dm0s,dm3s,dm0f,dm3f,dm0n,dm3n,dm3i,dmugas,& 204 gassat,nrate,grate) 142 205 !! Get moments tendencies through nucleation and condensation/evaporation. 143 206 !! … … 159 222 !! the total volume of CH4 ice and gazs(i) its vapor mole fraction. 160 223 !! 161 ! Tendency of the 0th and 3rd order moment of the aerosols (spherical mode) through haze microphysics processes. 162 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: Hdm0as ! (m-3) 163 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: Hdm3as ! (m3.m-3) 164 ! Tendency of the 0th and 3rd order moment of the aerosols (fractal mode) through haze microphysics processes. 165 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: Hdm0af ! (m-3) 166 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: Hdm3af ! (m3.m-3) 224 ! 0th and 3rd order moment of the aerosols (spherical mode) component. 225 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: m0as ! (m-3) 226 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: m3as ! (m3.m-3) 227 ! 0th and 3rd order moment of the aerosols (fractal mode) component. 228 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: m0af ! (m-3) 229 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: m3af ! (m3.m-3) 230 ! 0th and 3rd order moment of the cloud condensation nuclei component. 231 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: m0ccn ! (m-3) 232 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: m3ccn ! (m3.m-3) 233 ! 3rd order moment of ices and gases component. 234 REAL(kind=mm_wp), DIMENSION(:,:), INTENT(in) :: m3ice ! (m-3) 235 REAL(kind=mm_wp), DIMENSION(:,:), INTENT(in) :: mugas ! (m3.m-3) 167 236 ! Tendency of the 0th and 3rd order moment of the aerosols (spherical mode) through cloud microphysics processes. 168 REAL(kind=mm_wp), DIMENSION(:), INTENT(out) :: Cdm0as! (m-3)169 REAL(kind=mm_wp), DIMENSION(:), INTENT(out) :: Cdm3as! (m3.m-3)237 REAL(kind=mm_wp), DIMENSION(:), INTENT(out) :: dm0s ! (m-3) 238 REAL(kind=mm_wp), DIMENSION(:), INTENT(out) :: dm3s ! (m3.m-3) 170 239 ! Tendency of the 0th and 3rd order moment of the aerosols (fractal mode) through cloud microphysics processes. 171 REAL(kind=mm_wp), DIMENSION(:), INTENT(out) :: Cdm0af! (m-3)172 REAL(kind=mm_wp), DIMENSION(:), INTENT(out) :: Cdm3af! (m3.m-3)240 REAL(kind=mm_wp), DIMENSION(:), INTENT(out) :: dm0f ! (m-3) 241 REAL(kind=mm_wp), DIMENSION(:), INTENT(out) :: dm3f ! (m3.m-3) 173 242 ! Tendency of the 0th and 3rd order moment of the ccn distribution through cloud microphysics processes. 174 REAL(kind=mm_wp), DIMENSION(:), INTENT(out) :: Cdm0ccn! (m-3)175 REAL(kind=mm_wp), DIMENSION(:), INTENT(out) :: Cdm3ccn! (m3.m-3)243 REAL(kind=mm_wp), DIMENSION(:), INTENT(out) :: dm0n ! (m-3) 244 REAL(kind=mm_wp), DIMENSION(:), INTENT(out) :: dm3n ! (m3.m-3) 176 245 ! Tendencies of the 3rd order moments of each ice components through cloud microphysics processes. 177 REAL(kind=mm_wp), DIMENSION(:,:), INTENT(out) :: Cdm3ice! (m3.m-3)246 REAL(kind=mm_wp), DIMENSION(:,:), INTENT(out) :: dm3i ! (m3.m-3) 178 247 ! Tendencies of each condensible gaz species through cloud microphysics processes. 179 REAL(kind=mm_wp), DIMENSION(:,:), INTENT(out) :: Cdmugas ! (mol.mol-1)248 REAL(kind=mm_wp), DIMENSION(:,:), INTENT(out) :: dmugas ! (mol.mol-1) 180 249 ! Saturation ratio of each condensible species. 181 250 REAL(kind=mm_wp), DIMENSION(:,:), INTENT(out) :: gassat … … 188 257 !~~~~~~~~~~~~~~~~~ 189 258 INTEGER :: i,idx 190 REAL(kind=mm_wp), DIMENSION(:,:), ALLOCATABLE :: z Cdm0as,zCdm3as191 REAL(kind=mm_wp), DIMENSION(:,:), ALLOCATABLE :: z Cdm0af,zCdm3af192 REAL(kind=mm_wp), DIMENSION(:,:), ALLOCATABLE :: z Cdm0ccn,zCdm3ccn259 REAL(kind=mm_wp), DIMENSION(:,:), ALLOCATABLE :: zdm0s,zdm3s 260 REAL(kind=mm_wp), DIMENSION(:,:), ALLOCATABLE :: zdm0f,zdm3f 261 REAL(kind=mm_wp), DIMENSION(:,:), ALLOCATABLE :: zdm0n,zdm3n 193 262 194 263 ! Initialization: 195 264 !~~~~~~~~~~~~~~~~ 196 ALLOCATE(zCdm0as(mm_nla,mm_nesp),zCdm3as(mm_nla,mm_nesp)) 197 ALLOCATE(zCdm0af(mm_nla,mm_nesp),zCdm3af(mm_nla,mm_nesp)) 198 ALLOCATE(zCdm0ccn(mm_nla,mm_nesp),zCdm3ccn(mm_nla,mm_nesp)) 199 200 zCdm0as(:,:) = 0._mm_wp ; zCdm3as(:,:) = 0._mm_wp 201 zCdm0af(:,:) = 0._mm_wp ; zCdm3af(:,:) = 0._mm_wp 202 zCdm0ccn(:,:) = 0._mm_wp ; zCdm3ccn(:,:) = 0._mm_wp 265 ALLOCATE(zdm0s(mm_nla,mm_nesp),zdm3s(mm_nla,mm_nesp)) 266 ALLOCATE(zdm0f(mm_nla,mm_nesp),zdm3f(mm_nla,mm_nesp)) 267 ALLOCATE(zdm0n(mm_nla,mm_nesp),zdm3n(mm_nla,mm_nesp)) 268 269 zdm0s(:,:) = 0._mm_wp ; zdm3s(:,:) = 0._mm_wp 270 zdm0f(:,:) = 0._mm_wp ; zdm3f(:,:) = 0._mm_wp 271 zdm0n(:,:) = 0._mm_wp ; zdm3n(:,:) = 0._mm_wp 272 273 dm0s(:) = 0._mm_wp ; dm3s(:) = 0._mm_wp 274 dm0f(:) = 0._mm_wp ; dm3f(:) = 0._mm_wp 275 dm0n(:) = 0._mm_wp ; dm3n(:) = 0._mm_wp 276 dm3i(:,:) = 0._mm_wp ; dmugas(:,:) = 0._mm_wp 203 277 204 278 ! Calls nucleation/condensation for each species: 205 279 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 206 280 DO i = 1, mm_nesp 207 CALL nc_esp(mm_xESPS(i),m m_gas(:,i),mm_m3ice(:,i),&208 Hdm0as(:),Hdm3as(:),Hdm0af(:),Hdm3af(:),&209 z Cdm0as(:,i),zCdm3as(:,i),zCdm0af(:,i),zCdm3af(:,i),&210 z Cdm0ccn(:,i),zCdm3ccn(:,i),Cdm3ice(:,i),Cdmugas(:,i),&281 CALL nc_esp(mm_xESPS(i),mugas(:,i),m3ice(:,i), & 282 m0as(:),m3as(:),m0af(:),m3af(:),m0ccn(:),m3ccn(:),& 283 zdm0s(:,i),zdm3s(:,i),zdm0f(:,i),zdm3f(:,i), & 284 zdm0n(:,i),zdm3n(:,i),dm3i(:,i),dmugas(:,i), & 211 285 gassat(:,i),nrate(:,i),grate(:,i)) 212 286 ENDDO … … 215 289 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 290 DO i = 1, mm_nla 217 idx = MAXLOC(z Cdm0ccn(i,:),DIM=1,MASK=(Cdm3ice(i,:) /= 0._mm_wp .OR. mm_m3ice(i,:)+Cdm3ice(i,:) >= 0._mm_wp))291 idx = MAXLOC(zdm0n(i,:),DIM=1,MASK=(dm3i(i,:) /= 0._mm_wp .OR. m3ice(i,:)+dm3i(i,:) >= 0._mm_wp)) 218 292 219 293 IF (idx == 0) THEN 220 Cdm0as(i)= 0._mm_wp221 Cdm3as(i)= 0._mm_wp222 Cdm0af(i)= 0._mm_wp223 Cdm3af(i)= 0._mm_wp224 Cdm0ccn(i) = 0._mm_wp225 Cdm3ccn(i) = 0._mm_wp294 dm0s(i) = 0._mm_wp 295 dm3s(i) = 0._mm_wp 296 dm0f(i) = 0._mm_wp 297 dm3f(i) = 0._mm_wp 298 dm0n(i) = 0._mm_wp 299 dm3n(i) = 0._mm_wp 226 300 227 301 ELSE … … 230 304 " mbar: Max aer/ccn exchange variation due to species: "//TRIM(mm_xESPS(idx)%name) 231 305 ENDIF 232 Cdm0as(i) = zCdm0as(i,idx)233 Cdm3as(i) = zCdm3as(i,idx)234 Cdm0af(i) = zCdm0af(i,idx)235 Cdm3af(i) = zCdm3af(i,idx)236 Cdm0ccn(i) = zCdm0ccn(i,idx)237 Cdm3ccn(i) = zCdm3ccn(i,idx)306 dm0s(i) = zdm0s(i,idx) 307 dm3s(i) = zdm3s(i,idx) 308 dm0f(i) = zdm0f(i,idx) 309 dm3f(i) = zdm3f(i,idx) 310 dm0n(i) = zdm0n(i,idx) 311 dm3n(i) = zdm3n(i,idx) 238 312 ENDIF 239 313 ENDDO … … 241 315 242 316 243 SUBROUTINE nc_esp(xESP,Xvap,Xm3ice, Hdm0as,Hdm3as,Hdm0af,Hdm3af,&317 SUBROUTINE nc_esp(xESP,Xvap,Xm3ice,m0as,m3as,m0af,m3af,m0ccn,m3ccn,& 244 318 dm0as,dm3as,dm0af,dm3af,dm0ccn,dm3ccn,Xdm3ice,Xdvap,Xsat,Xnrate,Xgrate) 245 319 !! Get moments tendencies through nucleation/condensation/evaporation of a given condensible species. … … 270 344 ! 3rd order moment of the ice component. 271 345 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: Xm3ice ! (m3.m-3) 272 ! Tendency of the 0th and 3rd order moment of the aerosols (spherical mode) through haze microphysics processes. 273 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: Hdm0as ! (m-3) 274 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: Hdm3as ! (m3.m-3) 275 ! Tendency of the 0th and 3rd order moment of the aerosols (fractal mode) through haze microphysics processes. 276 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: Hdm0af ! (m-3) 277 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: Hdm3af ! (m3.m-3) 346 ! 0th and 3rd order moment of the aerosols (spherical mode) component. 347 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: m0as ! (m-3) 348 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: m3as ! (m3.m-3) 349 ! 0th and 3rd order moment of the aerosols (fractal mode) component. 350 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: m0af ! (m-3) 351 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: m3af ! (m3.m-3) 352 ! 0th and 3rd order moment of the cloud condensation nuclei component. 353 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: m0ccn ! (m-3) 354 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: m3ccn ! (m3.m-3) 278 355 ! Tendency of the 0th and 3rd order moment of the aerosols (spherical mode) through cloud microphysics processes. 279 356 REAL(kind=mm_wp), DIMENSION(:), INTENT(inout) :: dm0as ! (m-3) … … 298 375 ! Local variables: 299 376 !~~~~~~~~~~~~~~~~~ 300 INTEGER :: i 377 INTEGER :: i, nucl_k 301 378 REAL(kind=mm_wp) :: bef,aft 302 379 REAL(kind=mm_wp), DIMENSION(SIZE(Xvap)) :: s_m0as,s_m3as,s_m0af,s_m3af,s_m0ccn,s_m3ccn,s_Xm3ice,s_Xvap … … 313 390 ! Initialization: 314 391 !~~~~~~~~~~~~~~~~ 392 ! Types of Nucleation 393 ! Default value (0 = Jaerf, 1 = Jaers, else = Jaers + Jaerf) 394 nucl_k = 2 395 315 396 ! Copy input argument and convert units X.m-3 to X.kg-1 or X.mol-1 to X.kg-1. 316 397 ! @warning: we must update the aerosol tracers through haze microphysics processes. 317 398 318 399 ! s_XXX is the initial converted value saved: 319 !s_m0as = mm_m0aer_s/mm_rhoair ; s_m3as = mm_m3aer_s/mm_rhoair 320 !s_m0af = mm_m0aer_f/mm_rhoair ; s_m3af = mm_m3aer_f/mm_rhoair 321 s_m0as = (mm_m0aer_s+Hdm0as) / mm_rhoair ; s_m3as = (mm_m3aer_s+Hdm3as) / mm_rhoair 322 s_m0af = (mm_m0aer_f+Hdm0af) / mm_rhoair ; s_m3af = (mm_m3aer_f+Hdm3af) / mm_rhoair 323 s_m0ccn = mm_m0ccn / mm_rhoair 324 s_m3ccn = mm_m3ccn / mm_rhoair 400 s_m0as = m0as / mm_rhoair ; s_m3as = m3as / mm_rhoair 401 s_m0af = m0af / mm_rhoair ; s_m3af = m3af / mm_rhoair 402 s_m0ccn = m0ccn / mm_rhoair 403 s_m3ccn = m3ccn / mm_rhoair 325 404 s_Xm3ice = Xm3ice / mm_rhoair 326 405 s_Xvap = Xvap * xESP%fmol2fmas … … 360 439 ! Saturation ratio: 361 440 !~~~~~~~~~~~~~~~~~~ 362 where ( (z_Xvap / qsat) > 1e8)363 Xsat = 1e8441 where (qsat > 0._mm_wp) 442 Xsat = z_Xvap / qsat 364 443 elsewhere 365 Xsat = z_Xvap / qsat444 Xsat = 0._mm_wp 366 445 endwhere 367 446 … … 370 449 !~~~~~~~~~~~~~~~~~~~~~ 371 450 372 ! Gets heterogeneous nucleation rate on spherical aerosols: 373 ! Not used yet... 374 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 !call hetnucl_rate_aer(mm_rcs,mm_temp,xESP,pX,Xsat,Jhet_aers) 376 377 ! Gets heterogeneous nucleation rate on fractal aerosols (ccn radius is the monomer): 378 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 379 call hetnucl_rate_aer((/(mm_rm, i=1,mm_nla)/),mm_temp,xESP,pX,Xsat,Jhet_aerf) 451 ! Gets heterogeneous nucleation rate: 452 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 if (nucl_k == 1) then 454 ! Spherical aerosols: 455 !~~~~~~~~~~~~~~~~~~~~ 456 call hetnucl_rate_aer(mm_rcs,mm_temp,xESP,pX,Xsat,Jhet_aers) 457 458 ! We set the drop radius to the spherical radius. 459 ! Doing so will prevent a nasty bug to occur later when ice volume is updated! 460 where (drad <= mm_drad_min .AND. Jhet_aers > 0._mm_wp) 461 drad = mm_rcs 462 endwhere 463 464 else if (nucl_k == 0) then 465 ! Fractal aerosols (ccn radius is the monomer): 466 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 467 call hetnucl_rate_aer((/(mm_rm, i=1,mm_nla)/),mm_temp,xESP,pX,Xsat,Jhet_aerf) 468 469 ! ==> We set the drop radius to the fractal radius. 470 ! Doing so will prevent a nasty bug to occur later when ice volume is updated! 471 where (drad <= mm_drad_min .AND. Jhet_aerf > 0._mm_wp) 472 drad = mm_rm 473 endwhere 474 475 else 476 ! Spherical aerosols + Fractal aerosols: 477 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 call hetnucl_rate_aer(mm_rcs,mm_temp,xESP,pX,Xsat,Jhet_aers) 479 call hetnucl_rate_aer((/(mm_rm, i=1,mm_nla)/),mm_temp,xESP,pX,Xsat,Jhet_aerf) 480 481 ! ==> We set the drop radius to the minimum radius. 482 ! Doing so will prevent a nasty bug to occur later when ice volume is updated! 483 where (drad <= mm_drad_min .AND. (Jhet_aers > 0._mm_wp .OR. Jhet_aerf > 0._mm_wp)) 484 drad = MIN(mm_rcs,mm_rm) 485 endwhere 486 487 endif 380 488 381 489 ! Diagnostics … … 392 500 ! variation for CCN is due to the most active species exchange. 393 501 394 ! Spherical aerosols: 395 ! Not used yet... 396 !~~~~~~~~~~~~~~~~~~~~ 397 !cst_m0aers = (4._mm_wp*mm_pi*Jhet_aers) / mm_rm * (mm_alpha_s(3._mm_wp)/mm_alpha_s(0._mm_wp)*mm_rcs**3) * mm_dt 398 !cst_m3aers = (4._mm_wp*mm_pi*Jhet_aers) / mm_rm * (mm_alpha_s(6._mm_wp)/mm_alpha_s(3._mm_wp)*mm_rcs**3) * mm_dt 399 400 !z_m0as = (1._mm_wp/(1._mm_wp+cst_m0aers)) * z_m0as 401 !z_m3as = (1._mm_wp/(1._mm_wp+cst_m3aers)) * z_m3as 402 403 !where (z_m0as <= 0._mm_wp .OR. z_m3as <= 0._mm_wp) 404 ! z_m0as = 0._mm_wp 405 ! z_m3as = 0._mm_wp 406 ! z_m0ccn = z_m0ccn + s_m0as 407 ! z_m3ccn = z_m3ccn + s_m3as 408 !elsewhere 409 ! z_m0ccn = z_m0ccn + cst_m0aers*z_m0as 410 ! z_m3ccn = z_m3ccn + cst_m3aers*z_m3as 411 !endwhere 412 413 ! Fractal aerosols 414 !~~~~~~~~~~~~~~~~~ 415 cst_m0aerf = (4._mm_wp*mm_pi*Jhet_aerf) / mm_rm * (mm_alpha_f(3._mm_wp)/mm_alpha_f(0._mm_wp)*mm_rcf**3) * mm_dt 416 cst_m3aerf = (4._mm_wp*mm_pi*Jhet_aerf) / mm_rm * (mm_alpha_f(6._mm_wp)/mm_alpha_f(3._mm_wp)*mm_rcf**3) * mm_dt 417 418 z_m0af = (1._mm_wp/(1._mm_wp+cst_m0aerf)) * z_m0af 419 z_m3af = (1._mm_wp/(1._mm_wp+cst_m3aerf)) * z_m3af 420 421 where (z_m0af <= 0._mm_wp .OR. z_m3af <= 0._mm_wp) 422 z_m0af = 0._mm_wp 423 z_m3af = 0._mm_wp 424 z_m0ccn = z_m0ccn + s_m0af 425 z_m3ccn = z_m3ccn + s_m3af 426 elsewhere 427 z_m0ccn = z_m0ccn + cst_m0aerf*z_m0af 428 z_m3ccn = z_m3ccn + cst_m3aerf*z_m3af 429 endwhere 430 431 ! Update the drop radius: 432 !~~~~~~~~~~~~~~~~~~~~~~~~ 433 ! Heterogeneous nucleation rate on fractal aerosols ==> we set the drop radius to the monomer radius. 434 ! Doing so will prevent a nasty bug to occur later when ice volume is updated ! 435 where (drad <= mm_drad_min .AND. Jhet_aerf > 0._mm_wp) 436 drad = mm_rm 437 endwhere 502 if (nucl_k == 1) then 503 ! Spherical aerosols: 504 !~~~~~~~~~~~~~~~~~~~~ 505 cst_m0aers = (4._mm_wp*mm_pi*Jhet_aers) / mm_rm * (mm_alpha_s(3._mm_wp)/mm_alpha_s(0._mm_wp)*mm_rcs**3) * mm_dt 506 cst_m3aers = (4._mm_wp*mm_pi*Jhet_aers) / mm_rm * (mm_alpha_s(6._mm_wp)/mm_alpha_s(3._mm_wp)*mm_rcs**3) * mm_dt 507 508 z_m0as = (1._mm_wp/(1._mm_wp+cst_m0aers)) * z_m0as 509 z_m3as = (1._mm_wp/(1._mm_wp+cst_m3aers)) * z_m3as 510 511 where (z_m0as <= 0._mm_wp .OR. z_m3as <= 0._mm_wp) 512 z_m0as = 0._mm_wp 513 z_m3as = 0._mm_wp 514 z_m0ccn = z_m0ccn + s_m0as 515 z_m3ccn = z_m3ccn + s_m3as 516 elsewhere 517 z_m0ccn = z_m0ccn + cst_m0aers*z_m0as 518 z_m3ccn = z_m3ccn + cst_m3aers*z_m3as 519 endwhere 520 521 else if (nucl_k == 0) then 522 ! Fractal aerosols 523 !~~~~~~~~~~~~~~~~~ 524 cst_m0aerf = (4._mm_wp*mm_pi*Jhet_aerf) / mm_rm * (mm_alpha_f(3._mm_wp)/mm_alpha_f(0._mm_wp)*mm_rcf**3) * mm_dt 525 cst_m3aerf = (4._mm_wp*mm_pi*Jhet_aerf) / mm_rm * (mm_alpha_f(6._mm_wp)/mm_alpha_f(3._mm_wp)*mm_rcf**3) * mm_dt 526 527 z_m0af = (1._mm_wp/(1._mm_wp+cst_m0aerf)) * z_m0af 528 z_m3af = (1._mm_wp/(1._mm_wp+cst_m3aerf)) * z_m3af 529 530 where (z_m0af <= 0._mm_wp .OR. z_m3af <= 0._mm_wp) 531 z_m0af = 0._mm_wp 532 z_m3af = 0._mm_wp 533 z_m0ccn = z_m0ccn + s_m0af 534 z_m3ccn = z_m3ccn + s_m3af 535 elsewhere 536 z_m0ccn = z_m0ccn + cst_m0aerf*z_m0af 537 z_m3ccn = z_m3ccn + cst_m3aerf*z_m3af 538 endwhere 539 540 else 541 ! Spherical aerosols + Fractal aerosols: 542 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 543 cst_m0aers = (4._mm_wp*mm_pi*Jhet_aers) / mm_rm * (mm_alpha_s(3._mm_wp)/mm_alpha_s(0._mm_wp)*mm_rcs**3) * mm_dt 544 cst_m3aers = (4._mm_wp*mm_pi*Jhet_aers) / mm_rm * (mm_alpha_s(6._mm_wp)/mm_alpha_s(3._mm_wp)*mm_rcs**3) * mm_dt 545 546 z_m0as = (1._mm_wp/(1._mm_wp+cst_m0aers)) * z_m0as 547 z_m3as = (1._mm_wp/(1._mm_wp+cst_m3aers)) * z_m3as 548 549 where (z_m0as <= 0._mm_wp .OR. z_m3as <= 0._mm_wp) 550 z_m0as = 0._mm_wp 551 z_m3as = 0._mm_wp 552 z_m0ccn = z_m0ccn + s_m0as 553 z_m3ccn = z_m3ccn + s_m3as 554 elsewhere 555 z_m0ccn = z_m0ccn + cst_m0aers*z_m0as 556 z_m3ccn = z_m3ccn + cst_m3aers*z_m3as 557 endwhere 558 559 cst_m0aerf = (4._mm_wp*mm_pi*Jhet_aerf) / mm_rm * (mm_alpha_f(3._mm_wp)/mm_alpha_f(0._mm_wp)*mm_rcf**3) * mm_dt 560 cst_m3aerf = (4._mm_wp*mm_pi*Jhet_aerf) / mm_rm * (mm_alpha_f(6._mm_wp)/mm_alpha_f(3._mm_wp)*mm_rcf**3) * mm_dt 561 562 z_m0af = (1._mm_wp/(1._mm_wp+cst_m0aerf)) * z_m0af 563 z_m3af = (1._mm_wp/(1._mm_wp+cst_m3aerf)) * z_m3af 564 565 where (z_m0af <= 0._mm_wp .OR. z_m3af <= 0._mm_wp) 566 z_m0af = 0._mm_wp 567 z_m3af = 0._mm_wp 568 z_m0ccn = z_m0ccn + s_m0af 569 z_m3ccn = z_m3ccn + s_m3af 570 elsewhere 571 z_m0ccn = z_m0ccn + cst_m0aerf*z_m0af 572 z_m3ccn = z_m3ccn + cst_m3aerf*z_m3af 573 endwhere 574 575 endif 438 576 439 577 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 463 601 464 602 ! Diagnostics 465 Xgrate = g_rate 603 where(z_Xm3ice <= 0._mm_wp .AND. g_rate <= 0._mm_wp) 604 Xgrate = 0._mm_wp 605 elsewhere 606 Xgrate = g_rate 607 endwhere 466 608 467 609 ! Update ice volume through condensation/evaporation: … … 471 613 IF (z_Xm3ice(i) <= 0._mm_wp .AND. g_rate(i) <= 0._mm_wp) THEN 472 614 z_Xm3ice(i) = 0._mm_wp 473 615 474 616 ELSE 475 617 z_Xm3ice(i) = z_Xm3ice(i) + (4._mm_wp * mm_pi * drad(i) * g_rate(i) * z_m0ccn(i) * mm_dt) 476 618 477 619 ! Check if there is ice left in the ccn. 478 ! @note: only fractal aerosols for now...620 ! @note: 0.8/0.2 for now... need to be improve! 479 621 IF (z_Xm3ice(i) <= 0._mm_wp) THEN 480 z_m0af(i) = z_m0af(i) + z_m0ccn(i) 481 z_m3af(i) = z_m3af(i) + z_m3ccn(i) 622 IF (nucl_k == 1) THEN 623 z_m0as(i) = z_m0as(i) + z_m0ccn(i) 624 z_m3as(i) = z_m3as(i) + z_m3ccn(i) 625 ELSE IF (nucl_k == 0) THEN 626 z_m0af(i) = z_m0af(i) + z_m0ccn(i) 627 z_m3af(i) = z_m3af(i) + z_m3ccn(i) 628 ELSE 629 z_m0as(i) = z_m0as(i) + 0.8_mm_wp * z_m0ccn(i) 630 z_m3as(i) = z_m3as(i) + 0.8_mm_wp * z_m3ccn(i) 631 z_m0af(i) = z_m0af(i) + 0.2_mm_wp * z_m0ccn(i) 632 z_m3af(i) = z_m3af(i) + 0.2_mm_wp * z_m3ccn(i) 633 ENDIF 482 634 z_m0ccn(i) = 0._mm_wp 483 635 z_m3ccn(i) = 0._mm_wp … … 644 796 645 797 END SUBROUTINE growth_rate 798 799 !============================================================================ 800 ! COAGULATION PROCESS RELATED METHODS 801 !============================================================================ 802 803 SUBROUTINE mm_cloud_coagulation(m0ccn,m3ccn,m3ice,dm0n,dm3n) 804 !! Get the evolution of the cloud droplets moments vertical column due to coagulation process. 805 !! 806 ! 0th and 3rd order moment of the cloud condensation nuclei component. 807 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: m0ccn ! (m-3) 808 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: m3ccn ! (m3.m-3) 809 ! 3rd order moment of ices and gases component. 810 REAL(kind=mm_wp), DIMENSION(:,:), INTENT(in) :: m3ice ! (m-3) 811 ! Tendency of the 0th order moment of the droplets size-distribution over a time step (m-3). 812 REAL(kind=mm_wp), INTENT(out), DIMENSION(:) :: dm0n 813 ! Tendency of the 3rd order moment of the droplets size-distribution (m3.m-3). 814 REAL(kind=mm_wp), INTENT(out), DIMENSION(:) :: dm3n 815 816 ! Local variables: 817 !~~~~~~~~~~~~~~~~~ 818 INTEGER :: i 819 REAL(kind=mm_wp), DIMENSION(SIZE(dm0n)) :: Gij 820 821 ! 0. Initialization: 822 !~~~~~~~~~~~~~~~~~~~ 823 dm0n(:) = 0._mm_wp ; dm3n(:) = 0._mm_wp 824 825 Gij(:) = 0._mm_wp 826 827 ! 1. Molecular's case: 828 !~~~~~~~~~~~~~~~~~~~~~ 829 ! Types of Coagulation 830 where (mm_drad > 0._mm_wp .and. mm_drho > 0._mm_wp) 831 ! Pre-factor: 832 Gij = sqrt((12._mm_wp * mm_kboltz * mm_btemp) / (mm_pi**2 * mm_drad**3 * mm_drho)) 833 834 ! Tendencies of the moments: 835 dm0n = - mm_pi * Gij * m0ccn**2 * mm_drad**2 * (mm_alpha_ccn(1._mm_wp)**2 + mm_alpha_ccn(2._mm_wp)) * mm_dt 836 dm3n = 0._mm_wp 837 endwhere 838 839 ! 2. Transitory's case: 840 !~~~~~~~~~~~~~~~~~~~~~~ 841 !where (mm_drad > 0._mm_wp .and. mm_drho > 0._mm_wp) 842 ! ! Pre-factor: 843 ! Gij(:) = sqrt((6._mm_wp * mm_kboltz * mm_btemp(:)) / mm_drho(:)) 844 ! 845 ! ! Tendencies of the moments: 846 ! dm0n = - mm_get_btk(3,0) * Gij * m0ccn**2 * mm_drad**(1._mm_wp/2._mm_wp) * & 847 ! (mm_alpha_ccn(1._mm_wp/2._mm_wp) + & 848 ! mm_alpha_ccn(-3._mm_wp/2._mm_wp)*mm_alpha_ccn(2._mm_wp) + & 849 ! 2._mm_wp*mm_alpha_ccn(-1._mm_wp/2._mm_wp)*mm_alpha_ccn(1._mm_wp)) 850 ! dm3n = 0._mm_wp 851 !endwhere 852 853 RETURN 854 END SUBROUTINE mm_cloud_coagulation 646 855 647 856 !============================================================================ … … 649 858 !============================================================================ 650 859 651 SUBROUTINE mm_cloud_sedimentation( dm0n,dm3n,dm3i)860 SUBROUTINE mm_cloud_sedimentation(m0ccn,m3ccn,m3ice,dm0n,dm3n,dm3i) 652 861 !! Compute the tendency of clouds related moments through sedimentation process. 653 862 !! … … 660 869 !! product with input moments values to get final tendencies. 661 870 !! 871 ! 0th and 3rd order moment of the cloud condensation nuclei component. 872 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: m0ccn ! (m-3) 873 REAL(kind=mm_wp), DIMENSION(:), INTENT(in) :: m3ccn ! (m3.m-3) 874 ! 3rd order moment of ices and gases component. 875 REAL(kind=mm_wp), DIMENSION(:,:), INTENT(in) :: m3ice ! (m-3) 662 876 ! Tendency of the 0th order moment of the ccn distribution (m-3). 663 877 REAL(kind=mm_wp), INTENT(out), DIMENSION(:) :: dm0n … … 673 887 674 888 ! Initialization: 675 !~~~~~~~~~~~~~~~~ 889 !~~~~~~~~~~~~~~~~ 890 dm0n(:) = 0._mm_wp ; dm3n(:) = 0._mm_wp ; dm3i(:,:) = 0._mm_wp 891 676 892 nm = 2 + mm_nesp 677 893 ALLOCATE(moms_i(mm_nla,nm),moms_f(mm_nla,nm),chg_matrix(mm_nla,mm_nla)) 678 894 679 moms_i(:,1) = m m_m0ccn * mm_dzlev680 moms_i(:,2) = m m_m3ccn * mm_dzlev895 moms_i(:,1) = m0ccn * mm_dzlev 896 moms_i(:,2) = m3ccn * mm_dzlev 681 897 DO i = 1, mm_nesp 682 moms_i(:,2+i) = m m_m3ice(:,i) * mm_dzlev898 moms_i(:,2+i) = m3ice(:,i) * mm_dzlev 683 899 ENDDO 684 900 … … 976 1192 977 1193 ! Computes settling velocity 978 w = mrcoef * mm_effg(z) * (mm_rhoaer/rhoair) * rad / thermal_w 1194 ! Types of Sedimentation 1195 w = mrcoef * mm_effg(z) * (rho/rhoair) * rad / thermal_w 1196 !w = mrcoef * mm_effg(z) * (mm_rhoaer/rhoair) * mm_rm / thermal_w 979 1197 980 1198 ! Hydrodynamical's case … … 995 1213 ! Velocity limit: drop deformation (Lorenz 1993) 996 1214 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 997 w = 1._mm_wp / ((1._mm_wp / w) + (1._mm_wp / wmax))1215 !w = 1._mm_wp / ((1._mm_wp / w) + (1._mm_wp / wmax)) 998 1216 999 1217 RETURN -
trunk/LMDZ.PLUTO/libf/muphypluto/mp2m_globals.F90
r4032 r4073 93 93 ! Moments parameters (mm_clouds_init) 94 94 PROTECTED :: mm_m0ccn, mm_m3ccn, mm_m3ice 95 ! Moments parameters (derived, are updated with moments parameters)96 PROTECTED :: mm_drad, mm_drho97 95 ! Thresholds parameters 98 96 PROTECTED :: mm_m0ccn_min, mm_m3ccn_min, mm_m3cld_min, mm_drad_min, mm_drad_max … … 1291 1289 1292 1290 IF (Ntot <= mm_m0ccn_min .OR. Vtot <= mm_m3cld_min) THEN 1293 drad = mm_drad_min1294 IF (PRESENT(drho)) drho = mm_rhoaer1291 drad = 0._mm_wp 1292 IF (PRESENT(drho)) drho = 0._mm_wp 1295 1293 ELSE 1296 1294 drad = (Vtot / Ntot)**athird
Note: See TracChangeset
for help on using the changeset viewer.
