| SURFEX v7.3
   
    General documentation of Surfex | 
00001 ! ######### 00002 SUBROUTINE SNOW3L(HSNOWRES, TPTIME, OGLACIER, HIMPLICIT_WIND, & 00003 PPEW_A_COEF, PPEW_B_COEF, & 00004 PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, & 00005 PSNOWSWE,PSNOWRHO,PSNOWHEAT,PSNOWALB, & 00006 PSNOWGRAN1,PSNOWGRAN2,PSNOWHIST,PSNOWAGE, & 00007 PTSTEP,PPS,PSR,PRR,PPSN3L, & 00008 PTA,PTG,PSW_RAD,PQA,PVMOD,PLW_RAD, PRHOA, & 00009 PUREF,PEXNS,PEXNA,PDIRCOSZW, & 00010 PZREF,PZ0,PZ0EFF,PZ0H,PALB, & 00011 PSOILCOND,PD_G, & 00012 PSNOWLIQ,PSNOWTEMP,PSNOWDZ, & 00013 PTHRUFAL,PGRNDFLUX,PEVAPCOR,PRNSNOW,PHSNOW,PGFLUXSNOW, & 00014 PHPSNOW,PLES3L,PLEL3L,PEVAP,PRI, & 00015 PEMISNOW,PCDSNOW,PUSTAR,PCHSNOW,PSNOWHMASS, & 00016 PPERMSNOWFRAC, PZENITH, PXLAT, PXLON ) 00017 ! ########################################################################## 00018 ! 00019 !!**** *SNOW3L* 00020 !! 00021 !! PURPOSE 00022 !! ------- 00023 ! 00024 ! 3-Layer snow scheme option (Boone and Etchevers 1999) 00025 ! For shallow snow cover, Default method of Douville et al. (1995) 00026 ! used with this option: Model "turns on" when snow sufficiently 00027 ! deep/above some preset critical snow depth. 00028 ! 00029 ! 00030 !!** METHOD 00031 !! ------ 00032 ! 00033 ! Direct calculation 00034 ! 00035 !! EXTERNAL 00036 !! -------- 00037 ! 00038 ! None 00039 !! 00040 !! IMPLICIT ARGUMENTS 00041 !! ------------------ 00042 !! 00043 !! 00044 !! 00045 !! REFERENCE 00046 !! --------- 00047 !! 00048 !! ISBA-ES: Boone and Etchevers (2001) 00049 !! ISBA: Belair (1995) 00050 !! ISBA: Noilhan and Planton (1989) 00051 !! ISBA: Noilhan and Mahfouf (1996) 00052 !! 00053 !! AUTHOR 00054 !! ------ 00055 !! A. Boone * Meteo-France * 00056 !! 00057 !! MODIFICATIONS 00058 !! ------------- 00059 !! Original 7/99 00060 !! Modified by A.Boone 05/02 (code, not physics) 00061 !! Modified by A.Boone 11/04 i) maximum density limit imposed (although 00062 !! rarely if ever reached), ii) check to 00063 !! see if upermost layer completely sublimates 00064 !! during a timestep (as snowpack becomes vanishly 00065 !! thin), iii) impose maximum grain size limit 00066 !! in radiation transmission computation. 00067 !! 00068 !! Modified by B. Decharme (03/2009): Consistency with Arpege permanent 00069 !! snow/ice treatment (LGLACIER for alb) 00070 !! Modified by A. Boone (04/2010): Implicit coupling and replace Qsat and DQsat 00071 !! by Qsati and DQsati, respectively. 00072 !! Modified by E. Brun (08/2012): Mass conservation in SNOW3LEVAPGONE 00073 !! Modified by B. Decharme (08/2012): Loop optimization 00074 !! Modified by B. Decharme (09/2012): New wind implicitation 00075 !! Modified by E. Brun (10/2012): Bug in vertical snow redistribution 00076 !! 00077 !------------------------------------------------------------------------------- 00078 ! 00079 !* 0. DECLARATIONS 00080 ! ------------ 00081 ! 00082 USE MODD_CSTS, ONLY : XTT, XRHOLW, XLMTT, XCL 00083 ! 00084 USE MODE_SNOW3L 00085 ! 00086 USE MODD_TYPE_DATE_SURF, ONLY: DATE_TIME 00087 ! 00088 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00089 USE PARKIND1 ,ONLY : JPRB 00090 ! 00091 IMPLICIT NONE 00092 ! 00093 ! 00094 !* 0.1 declarations of arguments 00095 ! 00096 REAL, INTENT(IN) :: PTSTEP 00097 ! PTSTEP = time step of the integration 00098 TYPE(DATE_TIME), INTENT(IN) :: TPTIME ! current date and time 00099 ! 00100 CHARACTER(LEN=*), INTENT(IN) :: HSNOWRES 00101 ! HSNOWRES = ISBA-SNOW3L turbulant exchange option 00102 ! 'DEF' = Default: Louis (ISBA: Noilhan and Mahfouf 1996) 00103 ! 'RIL' = Limit Richarson number under very stable 00104 ! conditions (currently testing) 00105 LOGICAL, INTENT(IN) :: OGLACIER ! True = Over permanent snow and ice, 00106 ! initialise WGI=WSAT, 00107 ! Hsnow>=10m and allow 0.8<SNOALB<0.85 00108 ! False = No specific treatment 00109 ! 00110 CHARACTER(LEN=*), INTENT(IN) :: HIMPLICIT_WIND ! wind implicitation option 00111 ! ! 'OLD' = direct 00112 ! ! 'NEW' = Taylor serie, order 1 00113 ! 00114 REAL, DIMENSION(:), INTENT(IN) :: PPS, PTA, PSW_RAD, PQA, 00115 PVMOD, PLW_RAD, PSR, PRR 00116 ! PSW_RAD = incoming solar radiation (W/m2) 00117 ! PLW_RAD = atmospheric infrared radiation (W/m2) 00118 ! PRR = rain rate [kg/(m2 s)] 00119 ! PSR = snow rate (SWE) [kg/(m2 s)] 00120 ! PTA = atmospheric temperature at level za (K) 00121 ! PVMOD = modulus of the wind parallel to the orography (m/s) 00122 ! PPS = surface pressure 00123 ! PQA = atmospheric specific humidity 00124 ! at level za 00125 ! 00126 REAL, DIMENSION(:), INTENT(IN) :: PTG, PSOILCOND, PD_G, PPSN3L 00127 ! PTG = Surface soil temperature (effective 00128 ! temperature the of layer lying below snow) 00129 ! PSOILCOND = soil thermal conductivity [W/(m K)] 00130 ! PD_G = Assumed first soil layer thickness (m) 00131 ! Used to calculate ground/snow heat flux 00132 ! PPSN3L = snow fraction 00133 ! 00134 REAL, DIMENSION(:), INTENT(IN) :: PZREF, PUREF, PEXNS, PEXNA, PDIRCOSZW, PRHOA, PZ0, PZ0EFF, 00135 PALB, PZ0H, PPERMSNOWFRAC 00136 ! PZ0EFF = roughness length for momentum 00137 ! PZ0 = grid box average roughness length 00138 ! PZ0H = grid box average roughness length for heat 00139 ! PZREF = reference height of the first 00140 ! atmospheric level 00141 ! PUREF = reference height of the wind 00142 ! PRHOA = air density 00143 ! PEXNS = Exner function at surface 00144 ! PEXNA = Exner function at lowest atmos level 00145 ! PDIRCOSZW = Cosinus of the angle between the 00146 ! normal to the surface and the vertical 00147 ! PALB = soil/vegetation albedo 00148 ! PPERMSNOWFRAC = fraction of permanet snow/ice 00149 ! 00150 REAL, DIMENSION(:), INTENT(IN) :: PPEW_A_COEF, PPEW_B_COEF, 00151 PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, 00152 PPEQ_B_COEF 00153 ! PPEW_A_COEF = wind coefficient (m2s/kg) 00154 ! PPEW_B_COEF = wind coefficient (m/s) 00155 ! PPET_A_COEF = A-air temperature coefficient 00156 ! PPET_B_COEF = B-air temperature coefficient 00157 ! PPEQ_A_COEF = A-air specific humidity coefficient 00158 ! PPEQ_B_COEF = B-air specific humidity coefficient 00159 ! 00160 REAL, DIMENSION(:), INTENT(INOUT) :: PSNOWALB 00161 ! PSNOWALB = Prognostic surface snow albedo 00162 ! (does not include anything but 00163 ! the actual snow cover) 00164 ! 00165 REAL, DIMENSION(:,:), INTENT(INOUT):: PSNOWHEAT, PSNOWRHO, PSNOWSWE 00166 ! PSNOWHEAT = Snow layer(s) heat content (J/m2) 00167 ! PSNOWRHO = Snow layer(s) averaged density (kg/m3) 00168 ! PSNOWSWE = Snow layer(s) liquid Water Equivalent (SWE:kg m-2) 00169 ! 00170 REAL, DIMENSION(:,:), INTENT(INOUT):: PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST 00171 ! PSNOWGRAN1 = Snow layers grain feature 1 00172 ! PSNOWGRAN2 = Snow layer grain feature 2 00173 ! PSNOWHIST = Snow layer grain historical 00174 ! parameter (only for non 00175 ! dendritic snow) 00176 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWAGE ! Snow grain age 00177 ! 00178 REAL, DIMENSION(:,:), INTENT(OUT) :: PSNOWLIQ, PSNOWTEMP, PSNOWDZ 00179 ! PSNOWLIQ = Snow layer(s) liquid water content (m) 00180 ! PSNOWTEMP = Snow layer(s) temperature (m) 00181 ! PSNOWDZ = Snow layer(s) thickness (m) 00182 ! 00183 REAL, DIMENSION(:), INTENT(OUT) :: PTHRUFAL, PGRNDFLUX, PEVAPCOR 00184 ! PTHRUFAL = rate that liquid water leaves snow pack: 00185 ! paritioned into soil infiltration/runoff 00186 ! by ISBA [kg/(m2 s)] 00187 ! PGRNDFLUX = soil/snow interface heat flux (W/m2) 00188 ! PEVAPCOR = evaporation/sublimation correction term: 00189 ! extract any evaporation exceeding the 00190 ! actual snow cover (as snow vanishes) 00191 ! and apply it as a surface soil water 00192 ! sink. [kg/(m2 s)] 00193 ! 00194 REAL, DIMENSION(:), INTENT(OUT) :: PRNSNOW, PHSNOW, PGFLUXSNOW, PLES3L, PLEL3L, 00195 PHPSNOW, PCDSNOW, PUSTAR, PEVAP 00196 ! PLES3L = evaporation heat flux from snow (W/m2) 00197 ! PLEL3L = sublimation (W/m2) 00198 ! PHPSNOW = heat release from rainfall (W/m2) 00199 ! PRNSNOW = net radiative flux from snow (W/m2) 00200 ! PHSNOW = sensible heat flux from snow (W/m2) 00201 ! PGFLUXSNOW = net heat flux from snow (W/m2) 00202 ! PCDSNOW = drag coefficient for momentum over snow 00203 ! PUSTAR = friction velocity over snow (m/s) 00204 ! PEVAP = total evaporative flux (kg/m2/s) 00205 ! 00206 REAL, DIMENSION(:), INTENT(OUT) :: PCHSNOW, PEMISNOW, PSNOWHMASS 00207 ! PEMISNOW = snow surface emissivity 00208 ! PCHSNOW = drag coefficient for heat over snow 00209 ! PSNOWHMASS = heat content change due to mass 00210 ! changes in snowpack (J/m2): for budget 00211 ! calculations only. 00212 ! 00213 REAL, DIMENSION(:), INTENT(OUT) :: PRI 00214 ! PRI = Ridcharson number 00215 ! 00216 REAL, DIMENSION(:), INTENT(IN) :: PZENITH ! solar zenith angle 00217 REAL, DIMENSION(:), INTENT(IN) :: PXLAT,PXLON ! LAT/LON after packing 00218 ! 00219 !* 0.2 declarations of local variables 00220 ! 00221 INTEGER :: JJ, JI ! Loop control 00222 ! 00223 INTEGER :: INI ! number of point 00224 INTEGER :: INLVLS ! number of snow layers 00225 ! 00226 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWTEMP, ZSCAP, ZSNOWDZN, ZSCOND, 00227 ZRADSINK 00228 ! ZSNOWTEMP = Snow layer(s) averaged temperature (K) 00229 ! ZSCAP = Snow layer(s) heat capacity [J/(K m3)] 00230 ! ZSNOWDZN = Updated snow layer thicknesses (m) 00231 ! ZSCOND = Snow layer(s) thermal conducivity [W/(m K)] 00232 ! ZRADSINK = Snow solar Radiation source terms (W/m2) 00233 ! 00234 REAL, DIMENSION(SIZE(PTA)) :: ZSNOW, ZSFCFRZ, ZTSTERM1, ZTSTERM2, 00235 ZCT, ZRA, ZSNOWFLUX, ZSNOWTEMPO1 00236 ! ZSNOW = Total snow depth (m) 00237 ! ZCT = inverse of the product of snow heat capacity 00238 ! and layer thickness [(m2 K)/J] 00239 ! ZRA = Surface aerodynamic resistance 00240 ! ZTSTERM1,ZTSTERM2 = Surface energy budget coefficients 00241 ! ZSNOWFLUX = heat flux between 1st and 2nd snow layers: 00242 ! used during surface melting (W/m2) 00243 ! ZSNOWTEMPO1= value of uppermost snow temperature 00244 ! before time integration (K) 00245 ! 00246 LOGICAL, DIMENSION(SIZE(PTA)) :: GSFCMELT 00247 ! GSFCMELT = FLAG if surface melt is occurring, used 00248 ! for surface albedo calculation. 00249 ! 00250 REAL, DIMENSION(SIZE(PTA)) :: ZRSRA, ZDQSAT, ZQSAT, ZRADXS, ZMELTXS, ZLIQHEATXS, 00251 ZLWUPSNOW, ZGRNDFLUXO 00252 ! ZRSRA = air density over aerodynamic resistance 00253 ! ZDQSAT = derrivative of saturation specific humidity 00254 ! ZQSAT = saturation specific humidity 00255 ! ZRADXS = shortwave radiation absorbed by soil surface 00256 ! (for thin snow sover) (W m-2) 00257 ! ZMELTXS = excess energy for snowmelt for vanishingly 00258 ! thin snowpacks: used to heat underlying surface 00259 ! in order to maintain energy conservation (W m-2) 00260 ! ZLIQHEATXS = excess snowpack heating for vanishingly thin 00261 ! snow cover: add energy to snow/ground heat 00262 ! flux (W m-2) 00263 ! ZLWUPSNOW = upwelling longwave raaditive flux (W m-2) 00264 ! ZGRNDFLUXO= snow-ground flux before correction (W m-2) 00265 ! This is used simply to test if snow 00266 ! completely melts during a timestep. 00267 ! 00268 REAL, DIMENSION(SIZE(PTA)) :: ZUSTAR2_IC, ZTA_IC, ZQA_IC, 00269 ZPET_A_COEF_T, ZPEQ_A_COEF_T, ZPET_B_COEF_T, ZPEQ_B_COEF_T 00270 ! ZUSTAR2_IC = implicit lowest atmospheric level friction (m2/s2) 00271 ! ZTA_IC = implicit lowest atmospheric level air temperature 00272 ! ZQA_IC = implicit lowest atmospheric level specific humidity 00273 ! ZPET_A_COEF_T = transformed A-air temperature coefficient 00274 ! ZPET_B_COEF_T = transformed B-air temperature coefficient 00275 ! ZPEQ_A_COEF_T = transformed A-air specific humidity coefficient 00276 ! ZPEQ_B_COEF_T = transformed B-air specific humidity coefficient 00277 ! 00278 REAL, PARAMETER :: ZSNOWDZMIN = 0.0001 ! (m) 00279 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00280 ! ZSNOWDZMIN = minimum snow layer thickness for 00281 ! thermal calculations. Used to prevent 00282 ! numerical problems as snow becomes 00283 ! vanishingly thin. 00284 ! - - --------------------------------------------------- 00285 ! 00286 ! 0. Initialization 00287 ! -------------- 00288 ! NOTE that snow layer thickness is used throughout this code: SWE 00289 ! is only used to diagnose the thickness at the beginning of this routine 00290 ! and it is updated at the end of this routine. 00291 ! 00292 IF (LHOOK) CALL DR_HOOK('SNOW3L',0,ZHOOK_HANDLE) 00293 PSNOWDZ(:,:) = PSNOWSWE(:,:)/PSNOWRHO(:,:) 00294 ! 00295 INI = SIZE(PSNOWSWE(:,:),1) 00296 INLVLS = SIZE(PSNOWSWE(:,:),2) ! total snow layers 00297 ! 00298 ZUSTAR2_IC = 0.0 00299 ZTA_IC = 0.0 00300 ZQA_IC = 0.0 00301 ! 00302 !* 1. Snow total depth 00303 ! ---------------- 00304 ! 00305 ZSNOW(:) = 0. 00306 DO JJ=1,SIZE(PSNOWDZ(:,:),2) 00307 DO JI=1,INI 00308 ZSNOW(JI) = ZSNOW(JI) + PSNOWDZ(JI,JJ) ! m 00309 ENDDO 00310 END DO 00311 ! 00312 ! 00313 !* 2. Snowfall 00314 ! -------- 00315 ! Caluclate uppermost density and thickness changes due to snowfall, 00316 ! and add heat content of falling snow 00317 ! 00318 CALL SNOW3LFALL(PTSTEP,OGLACIER,PSR,PTA,PVMOD,ZSNOW,PSNOWRHO,PSNOWDZ, & 00319 PSNOWHEAT,PSNOWHMASS,PSNOWALB,PPERMSNOWFRAC) 00320 ! 00321 ! 00322 !* 3. Update grid/discretization 00323 ! -------------------------- 00324 ! Reset grid to conform to model specifications: 00325 ! 00326 CALL SNOW3LGRID(ZSNOWDZN,ZSNOW) 00327 ! 00328 ! Mass/Heat redistribution: 00329 ! 00330 CALL SNOW3LTRANSF(ZSNOW,PSNOWDZ,ZSNOWDZN,PSNOWRHO,PSNOWHEAT) 00331 ! 00332 ! 00333 !* 4. Liquid water content and snow temperature 00334 ! ----------------------------------------- 00335 ! 00336 ! First diagnose snow temperatures and liquid 00337 ! water portion of the snow from snow heat content: 00338 ! 00339 ZSCAP(:,:) = SNOW3LSCAP(PSNOWRHO) 00340 ! 00341 ZSNOWTEMP(:,:) = XTT + ( ((PSNOWHEAT(:,:)/PSNOWDZ(:,:)) & 00342 + XLMTT*PSNOWRHO(:,:))/ZSCAP(:,:) ) 00343 ! 00344 PSNOWLIQ(:,:) = MAX(0.0,ZSNOWTEMP(:,:)-XTT)*ZSCAP(:,:)* & 00345 PSNOWDZ(:,:)/(XLMTT*XRHOLW) 00346 ! 00347 ZSNOWTEMP(:,:) = MIN(XTT,ZSNOWTEMP(:,:)) 00348 ! 00349 ! 00350 !* 5. Snow Compaction 00351 ! --------------- 00352 ! Calculate snow density: compaction/aging: density increases 00353 ! 00354 CALL SNOW3LCOMPACTN(PTSTEP,PSNOWRHO,PSNOWDZ,ZSNOWTEMP,ZSNOW) 00355 ! 00356 ! Update snow heat content (J/m2): 00357 ! 00358 ZSCAP(:,:) = SNOW3LSCAP(PSNOWRHO) 00359 PSNOWHEAT(:,:) = PSNOWDZ(:,:)*( ZSCAP(:,:)*(ZSNOWTEMP(:,:)-XTT) & 00360 - XLMTT*PSNOWRHO(:,:) ) + XLMTT*XRHOLW*PSNOWLIQ(:,:) 00361 ! 00362 ! 00363 !* 6. Solar radiation transmission 00364 ! ----------------------------- 00365 ! 00366 ! Heat source (-sink) term due to shortwave 00367 ! radiation transmission within the snowpack: 00368 ! 00369 CALL SNOW3LRAD(ZSNOWDZMIN,PSW_RAD,PSNOWALB,PSNOWDZ,PSNOWRHO, & 00370 PALB,ZRADSINK,ZRADXS) 00371 ! 00372 ! 00373 !* 7. Heat transfer and surface energy budget 00374 ! --------------------------------------- 00375 ! Snow thermal conductivity: 00376 ! 00377 CALL SNOW3LTHRM(PSNOWRHO,ZSCOND,ZSNOWTEMP,PPS) 00378 ! 00379 ! Precipitation heating term: 00380 ! Rainfall renders it's heat to the snow when it enters 00381 ! the snowpack: 00382 ! NOTE: for now set to zero because we'd need to remove this heat from 00383 ! the atmosphere to conserve energy. This can be done, but should 00384 ! be tested within an atmos model first probably... 00385 ! 00386 !PHPSNOW(:) = PRR(:)*XCL*(MAX(XTT,PTA(:))-XTT) ! (W/m2) 00387 PHPSNOW(:) = 0.0 00388 ! 00389 ! Surface Energy Budget calculations using ISBA linearized form 00390 ! and standard ISBA turbulent transfer formulation 00391 ! 00392 CALL SNOW3LEBUD(HSNOWRES, HIMPLICIT_WIND, & 00393 PPEW_A_COEF, PPEW_B_COEF, & 00394 PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, & 00395 ZSNOWDZMIN, & 00396 PZREF,ZSNOWTEMP(:,1),PSNOWRHO(:,1),PSNOWLIQ(:,1),ZSCAP(:,1), & 00397 ZSCOND(:,1),ZSCOND(:,2), & 00398 PUREF,PEXNS,PEXNA,PDIRCOSZW,PVMOD, & 00399 PLW_RAD,PSW_RAD,PTA,PQA,PPS,PTSTEP, & 00400 PSNOWDZ(:,1),PSNOWDZ(:,2),PSNOWALB,PZ0,PZ0EFF,PZ0H, & 00401 ZSFCFRZ,ZRADSINK(:,1),PHPSNOW, & 00402 ZCT,PEMISNOW,PRHOA,ZTSTERM1,ZTSTERM2,ZRA,PCDSNOW,PCHSNOW, & 00403 ZQSAT, ZDQSAT, ZRSRA, ZUSTAR2_IC, PRI, & 00404 ZPET_A_COEF_T,ZPEQ_A_COEF_T,ZPET_B_COEF_T,ZPEQ_B_COEF_T ) 00405 ! 00406 ! 00407 ! Heat transfer: simple diffusion along the thermal gradient 00408 ! 00409 ZSNOWTEMPO1(:) = ZSNOWTEMP(:,1) ! save surface snow temperature before update 00410 ! 00411 CALL SNOW3LSOLVT(PTSTEP,ZSNOWDZMIN,PSNOWDZ,ZSCOND,ZSCAP,PTG, & 00412 PSOILCOND,PD_G,ZRADSINK,ZCT,ZTSTERM1,ZTSTERM2, & 00413 ZPET_A_COEF_T,ZPEQ_A_COEF_T,ZPET_B_COEF_T,ZPEQ_B_COEF_T, & 00414 ZTA_IC,ZQA_IC,PGRNDFLUX,ZGRNDFLUXO,ZSNOWTEMP,ZSNOWFLUX ) 00415 ! 00416 ! 00417 !* 8. Surface fluxes 00418 ! -------------- 00419 ! 00420 CALL SNOW3LFLUX(ZSNOWTEMP(:,1),PSNOWDZ(:,1),PEXNS,PEXNA, & 00421 ZUSTAR2_IC, & 00422 PTSTEP,PSNOWALB,PSW_RAD,PEMISNOW,ZLWUPSNOW,PLW_RAD, & 00423 ZTA_IC,ZSFCFRZ,ZQA_IC,PHPSNOW, & 00424 ZSNOWTEMPO1,ZSNOWFLUX,ZCT,ZRADSINK(:,1), & 00425 ZQSAT,ZDQSAT,ZRSRA, & 00426 PRNSNOW,PHSNOW,PGFLUXSNOW,PLES3L,PLEL3L,PEVAP, & 00427 PUSTAR,GSFCMELT ) 00428 ! 00429 ! 00430 !* 9. Snow melt 00431 ! --------- 00432 ! 00433 ! First Test to see if snow pack vanishes during this time step: 00434 ! 00435 CALL SNOW3LGONE(PTSTEP,PPSN3L,PLEL3L,PLES3L,PSNOWRHO, & 00436 PSNOWHEAT,ZRADSINK(:,INLVLS),PEVAPCOR,PTHRUFAL,PGRNDFLUX, & 00437 PGFLUXSNOW,ZGRNDFLUXO,PSNOWDZ,PSNOWLIQ,ZSNOWTEMP,ZRADXS) 00438 ! 00439 ! Add radiation not absorbed by snow to soil/vegetation interface flux 00440 ! (for thin snowpacks): 00441 ! 00442 PGRNDFLUX(:) = PGRNDFLUX(:) + ZRADXS(:) 00443 ! 00444 ! For "normal" melt: transform excess heat content into snow liquid: 00445 ! 00446 CALL SNOW3LMELT(PTSTEP,ZSCAP,ZSNOWTEMP,PSNOWDZ,PSNOWRHO, & 00447 PSNOWLIQ,ZMELTXS) 00448 ! 00449 ! Add any excess heat for melting to underlying surface 00450 ! (for vanishingly thin snowpacks): 00451 ! 00452 PGRNDFLUX(:) = PGRNDFLUX(:) + ZMELTXS(:) 00453 ! 00454 ! 00455 !* 10. Snow water flow and refreezing 00456 ! ------------------------------ 00457 ! Liquid water vertical transfer and possible snowpack runoff 00458 ! And refreezing/freezing of meltwater/rainfall (ripening of the snow) 00459 ! 00460 CALL SNOW3LREFRZ(PTSTEP,PRR,PSNOWRHO,ZSNOWTEMP,PSNOWDZ,PSNOWLIQ,PTHRUFAL) 00461 ! 00462 ! 00463 !* 11. Snow Evaporation/Sublimation mass updates: 00464 ! ------------------------------------------ 00465 ! 00466 CALL SNOW3LEVAPN(PPSN3L,PLES3L,PLEL3L,PTSTEP,ZSNOWTEMP(:,1),PSNOWRHO(:,1), & 00467 PSNOWDZ(:,1),PSNOWLIQ(:,1),PEVAPCOR) 00468 ! 00469 ! If all snow in uppermost layer evaporates/sublimates, re-distribute 00470 ! grid (below could be evoked for vanishingly thin snowpacks): 00471 ! 00472 CALL SNOW3LEVAPGONE(PSNOWHEAT,PSNOWDZ,PSNOWRHO,ZSNOWTEMP,PSNOWLIQ) 00473 ! 00474 ! 00475 !* 12. Update surface albedo: 00476 ! ---------------------- 00477 ! Snow clear sky albedo: 00478 ! 00479 CALL SNOW3LALB(PSNOWALB,PTSTEP,PSNOWLIQ(:,1),PSNOWDZ(:,1),PSNOWRHO(:,1), & 00480 GSFCMELT,PSR,PPERMSNOWFRAC) 00481 ! 00482 ! 00483 !* 13. Update snow heat content: 00484 ! ------------------------- 00485 ! Update the heat content (variable stored each time step) 00486 ! using current snow temperature and liquid water content: 00487 ! 00488 ! First, make check to make sure heat content not too large 00489 ! (this can result due to signifigant heating of thin snowpacks): 00490 ! add any excess heat to ground flux: 00491 ! 00492 DO JJ=1,INLVLS 00493 DO JI=1,INI 00494 ZLIQHEATXS(JI) = MAX(0.0,PSNOWLIQ(JI,JJ)*XRHOLW-0.10*PSNOWDZ(JI,JJ)*PSNOWRHO(JI,JJ))*XLMTT/PTSTEP 00495 PSNOWLIQ(JI,JJ)= PSNOWLIQ(JI,JJ) - ZLIQHEATXS(JI)*PTSTEP/(XRHOLW*XLMTT) 00496 PSNOWLIQ(JI,JJ)= MAX(0.0, PSNOWLIQ(JI,JJ)) 00497 PGRNDFLUX(JI) = PGRNDFLUX(JI) + ZLIQHEATXS(JI) 00498 ENDDO 00499 ENDDO 00500 ! 00501 PSNOWTEMP(:,:) = ZSNOWTEMP(:,:) 00502 ! 00503 ZSCAP(:,:) = SNOW3LSCAP(PSNOWRHO) 00504 ! 00505 PSNOWHEAT(:,:) = PSNOWDZ(:,:)*( ZSCAP(:,:)*(PSNOWTEMP(:,:)-XTT) & 00506 - XLMTT*PSNOWRHO(:,:) ) + XLMTT*XRHOLW*PSNOWLIQ(:,:) 00507 ! 00508 PSNOWSWE(:,:) = PSNOWDZ(:,:)*PSNOWRHO(:,:) 00509 ! 00510 ! 00511 IF (LHOOK) CALL DR_HOOK('SNOW3L',1,ZHOOK_HANDLE) 00512 CONTAINS 00513 ! 00514 ! 00515 ! 00516 !#################################################################### 00517 !#################################################################### 00518 !#################################################################### 00519 SUBROUTINE SNOW3LFALL(PTSTEP,OGLACIER,PSR,PTA,PVMOD,PSNOW,PSNOWRHO,PSNOWDZ, & 00520 PSNOWHEAT,PSNOWHMASS,PSNOWALB,PPERMSNOWFRAC) 00521 ! 00522 !! PURPOSE 00523 !! ------- 00524 ! Calculate changes to snowpack resulting from snowfall. 00525 ! Update mass and heat content of uppermost layer. 00526 ! 00527 ! 00528 USE MODD_CSTS, ONLY : XLMTT, XTT, XCI 00529 USE MODD_SNOW_PAR, ONLY : XRHOSMIN_ES, XSNOWDMIN, XANSMAX, XAGLAMAX 00530 ! 00531 USE MODE_SNOW3L 00532 ! 00533 IMPLICIT NONE 00534 ! 00535 !* 0.1 declarations of arguments 00536 ! 00537 REAL, INTENT(IN) :: PTSTEP 00538 LOGICAL, INTENT(IN) :: OGLACIER ! True = Over permanent snow and ice, 00539 ! initialise WGI=WSAT, 00540 ! Hsnow>=10m and allow 0.8<SNOALB<0.85 00541 ! False = No specific treatment 00542 ! 00543 REAL, DIMENSION(:), INTENT(IN) :: PSR, PTA, PVMOD, PPERMSNOWFRAC 00544 ! 00545 REAL, DIMENSION(:), INTENT(INOUT) :: PSNOW, PSNOWALB 00546 ! 00547 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWRHO, PSNOWDZ, PSNOWHEAT 00548 ! 00549 REAL, DIMENSION(:), INTENT(OUT) :: PSNOWHMASS 00550 ! 00551 ! 00552 !* 0.2 declarations of local variables 00553 ! 00554 INTEGER :: JJ, JI 00555 ! 00556 INTEGER :: INI 00557 INTEGER :: INLVLS 00558 ! 00559 REAL, DIMENSION(SIZE(PTA)) :: ZSNOWFALL, ZRHOSNEW, 00560 ZSNOW, ZSNOWTEMP, 00561 ZSNOWFALL_DELTA, ZSCAP, ZANSMAX 00562 ! 00563 ! ISBA-ES CROCUS (Pahaut 1976): snowfall density coefficients: 00564 ! 00565 REAL, PARAMETER :: ZSNOWFALL_A_SN = 109.0 ! kg/m3 00566 REAL, PARAMETER :: ZSNOWFALL_B_SN = 6.0 ! kg/(m3 K) 00567 REAL, PARAMETER :: ZSNOWFALL_C_SN = 26.0 ! kg/(m7/2 s1/2) 00568 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00569 ! 00570 !------------------------------------------------------------------------------- 00571 ! 00572 ! 0. Initialize: 00573 ! ------------------ 00574 ! 00575 IF (LHOOK) CALL DR_HOOK('SNOW3LFALL',0,ZHOOK_HANDLE) 00576 ZRHOSNEW(:) = XRHOSMIN_ES 00577 ZSNOWFALL(:) = 0.0 00578 ZSCAP(:) = 0.0 00579 ZSNOW(:) = PSNOW(:) 00580 INI = SIZE(PSNOWDZ(:,:),1) 00581 INLVLS = SIZE(PSNOWDZ(:,:),2) 00582 ! 00583 PSNOWHMASS(:) = 0.0 00584 ! 00585 ! 00586 ! 1. Incorporate snowfall into snowpack: 00587 ! -------------------------------------- 00588 ! 00589 ! 00590 ! Heat content of newly fallen snow (J/m2): 00591 ! NOTE for now we assume the snowfall has 00592 ! the temperature of the snow surface upon reaching the snow. 00593 ! This is done as opposed to using the air temperature since 00594 ! this flux is quite small and has little to no impact 00595 ! on the time scales of interest. If we use the above assumption 00596 ! then, then the snowfall advective heat flux is zero. 00597 ! 00598 ZSNOWTEMP(:) = XTT 00599 ! 00600 WHERE (PSR(:) > 0.0 .AND. PSNOWDZ(:,1)>0.) 00601 ZSCAP(:) = SNOW3LSCAP(PSNOWRHO(:,1)) 00602 ZSNOWTEMP(:) = XTT + (PSNOWHEAT(:,1) + & 00603 XLMTT*PSNOWRHO(:,1)*PSNOWDZ(:,1))/ & 00604 (ZSCAP(:)*MAX(XSNOWDMIN/INLVLS,PSNOWDZ(:,1))) 00605 ZSNOWTEMP(:) = MIN(XTT, ZSNOWTEMP(:)) 00606 END WHERE 00607 ! 00608 WHERE (PSR(:) > 0.0) 00609 ! 00610 PSNOWHMASS(:) = PSR(:)*(XCI*(ZSNOWTEMP(:)-XTT)-XLMTT)*PTSTEP 00611 ! 00612 ! Snowfall density: Following CROCUS (Pahaut 1976) 00613 ! 00614 ZRHOSNEW(:) = MAX(XRHOSMIN_ES, ZSNOWFALL_A_SN + ZSNOWFALL_B_SN*(PTA(:)-XTT)+ & 00615 ZSNOWFALL_C_SN*SQRT(PVMOD(:))) 00616 ! 00617 ! 00618 ! Augment total pack depth: 00619 ! 00620 ZSNOWFALL(:) = PSR(:)*PTSTEP/ZRHOSNEW(:) ! snowfall thickness (m) 00621 ! 00622 PSNOW(:) = PSNOW(:) + ZSNOWFALL(:) 00623 ! 00624 ! Fresh snowfall changes the snowpack 00625 ! density, increases the total liquid water 00626 ! equivalent: in uppermost snow layer: 00627 ! 00628 PSNOWRHO(:,1) = (PSNOWDZ(:,1)*PSNOWRHO(:,1) + ZSNOWFALL(:)*ZRHOSNEW(:))/ & 00629 (PSNOWDZ(:,1)+ZSNOWFALL(:)) 00630 PSNOWDZ(:,1) = PSNOWDZ(:,1) + ZSNOWFALL(:) 00631 ! 00632 ! Add energy of snowfall to snowpack: 00633 ! Update heat content (J/m2) (therefore the snow temperature 00634 ! and liquid content): 00635 ! 00636 PSNOWHEAT(:,1) = PSNOWHEAT(:,1) + PSNOWHMASS(:) 00637 ! 00638 END WHERE 00639 ! 00640 ! 00641 ! 2. Case of new snowfall on a previously snow-free surface: 00642 ! ---------------------------------------------------------- 00643 ! 00644 ! When snow first falls on a surface devoid of snow, 00645 ! redistribute the snow mass throughout the 3 layers: 00646 ! (temperature already set in the calling routine 00647 ! for this case), also, intialize the albedo: 00648 ! 00649 IF(OGLACIER)THEN 00650 ZANSMAX(:) = XAGLAMAX * PPERMSNOWFRAC(:) + XANSMAX * (1.0-PPERMSNOWFRAC(:)) 00651 ELSE 00652 ZANSMAX(:) = XANSMAX 00653 ENDIF 00654 ! 00655 ZSNOWFALL_DELTA(:) = 0.0 00656 WHERE(ZSNOW(:) == 0.0 .AND. PSR(:) > 0.0) 00657 ZSNOWFALL_DELTA(:) = 1.0 00658 PSNOWALB(:) = ZANSMAX(:) 00659 END WHERE 00660 ! 00661 DO JJ=1,INLVLS 00662 DO JI=1,INI 00663 PSNOWDZ(JI,JJ) = ZSNOWFALL_DELTA(JI)*(ZSNOWFALL(JI) /INLVLS) + & 00664 (1.0-ZSNOWFALL_DELTA(JI))*PSNOWDZ(JI,JJ) 00665 ! 00666 PSNOWHEAT(JI,JJ) = ZSNOWFALL_DELTA(JI)*(PSNOWHMASS(JI)/INLVLS) + & 00667 (1.0-ZSNOWFALL_DELTA(JI))*PSNOWHEAT(JI,JJ) 00668 ! 00669 PSNOWRHO(JI,JJ) = ZSNOWFALL_DELTA(JI)*ZRHOSNEW(JI) + & 00670 (1.0-ZSNOWFALL_DELTA(JI))*PSNOWRHO(JI,JJ) 00671 ENDDO 00672 ENDDO 00673 ! 00674 IF (LHOOK) CALL DR_HOOK('SNOW3LFALL',1,ZHOOK_HANDLE) 00675 ! 00676 ! 00677 END SUBROUTINE SNOW3LFALL 00678 !#################################################################### 00679 !#################################################################### 00680 !#################################################################### 00681 SUBROUTINE SNOW3LCOMPACTN(PTSTEP,PSNOWRHO,PSNOWDZ, & 00682 PSNOWTEMP,PSNOW ) 00683 ! 00684 !! PURPOSE 00685 !! ------- 00686 ! Snow compaction due to overburden and settling. 00687 ! Mass is unchanged: layer thickness is reduced 00688 ! in proportion to density increases. Method 00689 ! of Anderson (1976): see Loth and Graf, 1993, 00690 ! J. of Geophys. Res., 98, 10,451-10,464. 00691 ! 00692 ! 00693 USE MODD_CSTS, ONLY : XTT, XG 00694 USE MODD_SNOW_PAR, ONLY : XRHOSMAX_ES 00695 ! 00696 IMPLICIT NONE 00697 ! 00698 !* 0.1 declarations of arguments 00699 ! 00700 REAL, INTENT(IN) :: PTSTEP 00701 ! 00702 REAL, DIMENSION(:,:), INTENT(IN) :: PSNOWTEMP 00703 ! 00704 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWRHO, PSNOWDZ 00705 ! 00706 REAL, DIMENSION(:), INTENT(OUT) :: PSNOW 00707 ! 00708 ! 00709 !* 0.2 declarations of local variables 00710 ! 00711 INTEGER :: JJ, JI 00712 ! 00713 INTEGER :: INI 00714 INTEGER :: INLVLS 00715 ! 00716 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWRHO2, ZSETTLE, 00717 ZVISCOCITY, ZSMASS, 00718 ZWSNOWDZ 00719 ! 00720 REAL, DIMENSION(SIZE(PSNOW)) :: ZSMASSC 00721 ! 00722 ! ISBA-ES Compaction/Settling Coefficients from Loth and Graf (1993) 00723 ! following Mellor (1964) and Anderson (1976): 00724 ! see Boone, Meteo-France/CNRM Note de Centre No. 70 (2002) 00725 ! 00726 REAL, PARAMETER :: ZSNOWCMPCT_RHOD = 150.0 ! (kg/m3) 00727 REAL, PARAMETER :: ZSNOWCMPCT_ACM = 2.8e-6 ! (1/s) 00728 REAL, PARAMETER :: ZSNOWCMPCT_BCM = 0.04 ! (1/K) 00729 REAL, PARAMETER :: ZSNOWCMPCT_CCM = 0.460 ! (m3/kg) 00730 REAL, PARAMETER :: ZSNOWCMPCT_V0 = 3.7e7 ! (Pa/s) 00731 REAL, PARAMETER :: ZSNOWCMPCT_VT = 0.081 ! (1/K) 00732 REAL, PARAMETER :: ZSNOWCMPCT_VR = 0.018 ! (m3/kg) 00733 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00734 ! 00735 !------------------------------------------------------------------------------- 00736 ! 00737 ! 0. Initialization: 00738 ! ------------------ 00739 ! 00740 IF (LHOOK) CALL DR_HOOK('SNOW3LCOMPACTN',0,ZHOOK_HANDLE) 00741 ZSNOWRHO2(:,:) = PSNOWRHO(:,:) 00742 ZSETTLE(:,:) = ZSNOWCMPCT_ACM 00743 ZVISCOCITY(:,:) = ZSNOWCMPCT_V0 00744 INI = SIZE(PSNOWDZ(:,:),1) 00745 INLVLS = SIZE(PSNOWDZ(:,:),2) 00746 ! 00747 ! 00748 ! 1. Cumulative snow mass (kg/m2): 00749 ! -------------------------------- 00750 ! 00751 ZWSNOWDZ(:,:) = PSNOWDZ(:,:)*PSNOWRHO(:,:) 00752 ZSMASSC(:) = 0.0 00753 DO JJ=1,INLVLS 00754 DO JI=1,INI 00755 ZSMASS(JI,JJ) = ZSMASSC(JI) + ZWSNOWDZ(JI,JJ) 00756 ZSMASSC(JI) = ZSMASSC(JI) + ZWSNOWDZ(JI,JJ) 00757 ENDDO 00758 ENDDO 00759 ! 00760 ! 2. Compaction/Settling 00761 ! ---------------------- 00762 ! Compaction/settling if density below upper limit 00763 ! (compaction is generally quite small above ~ 500 kg m-3): 00764 ! 00765 WHERE(PSNOWRHO(:,:) < XRHOSMAX_ES) 00766 ! 00767 ! First calculate settling due to freshly fallen snow: 00768 ! 00769 ZSETTLE(:,:) = ZSNOWCMPCT_ACM*EXP( & 00770 -ZSNOWCMPCT_BCM*(XTT-PSNOWTEMP(:,:)) & 00771 -ZSNOWCMPCT_CCM*MAX(0.0, & 00772 PSNOWRHO(:,:)-ZSNOWCMPCT_RHOD)) 00773 ! 00774 ! Snow viscocity: 00775 ! 00776 ZVISCOCITY(:,:) = ZSNOWCMPCT_V0*EXP( ZSNOWCMPCT_VT*(XTT-PSNOWTEMP(:,:)) + & 00777 ZSNOWCMPCT_VR*PSNOWRHO(:,:) ) 00778 ! 00779 ! 00780 ! Calculate snow density: compaction from weight/over-burden 00781 ! Anderson 1976 method: 00782 ! 00783 ! 00784 ZSNOWRHO2(:,:) = PSNOWRHO(:,:) + PSNOWRHO(:,:)*PTSTEP*( & 00785 (XG*ZSMASS(:,:)/ZVISCOCITY(:,:)) & 00786 + ZSETTLE(:,:) ) 00787 ! 00788 ! 00789 ! Conserve mass by decreasing grid thicknesses in response 00790 ! to density increases 00791 ! 00792 PSNOWDZ(:,:) = PSNOWDZ(:,:)*(PSNOWRHO(:,:)/ZSNOWRHO2(:,:)) 00793 ! 00794 ! 00795 END WHERE 00796 ! 00797 ! 3. Update total snow depth and density profile: 00798 ! ----------------------------------------------- 00799 ! 00800 ! Compaction/augmentation of total snowpack depth 00801 ! 00802 PSNOW(:) = 0. 00803 DO JJ=1,INLVLS 00804 DO JI=1,INI 00805 PSNOW(JI) = PSNOW(JI) + PSNOWDZ(JI,JJ) 00806 ENDDO 00807 ENDDO 00808 ! 00809 ! Update density (kg m-3): 00810 ! 00811 PSNOWRHO(:,:) = ZSNOWRHO2(:,:) 00812 IF (LHOOK) CALL DR_HOOK('SNOW3LCOMPACTN',1,ZHOOK_HANDLE) 00813 ! 00814 !------------------------------------------------------------------------------- 00815 ! 00816 END SUBROUTINE SNOW3LCOMPACTN 00817 !#################################################################### 00818 !#################################################################### 00819 !#################################################################### 00820 SUBROUTINE SNOW3LTRANSF(PSNOW,PSNOWDZ,PSNOWDZN, & 00821 PSNOWRHO,PSNOWHEAT ) 00822 ! 00823 !! PURPOSE 00824 !! ------- 00825 ! Snow mass,heat and characteristics redistibution in case of 00826 ! grid resizing. Total mass and heat content of the overall snowpack 00827 ! unchanged/conserved within this routine. 00828 ! Same method as in Crocus 00829 ! 00830 USE MODD_SNOW_PAR, ONLY : XSNOWCRITD 00831 ! 00832 IMPLICIT NONE 00833 ! 00834 ! 00835 !* 0.1 declarations of arguments 00836 ! 00837 REAL, DIMENSION(: ), INTENT(IN) :: PSNOW 00838 ! 00839 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWDZN 00840 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWHEAT 00841 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWRHO 00842 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWDZ 00843 ! 00844 !* 0.2 declarations of local variables 00845 ! 00846 INTEGER :: JI, JL, JLO 00847 ! 00848 INTEGER :: INI 00849 INTEGER :: INLVLS 00850 ! 00851 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWRHON 00852 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWHEATN 00853 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWZTOP_NEW 00854 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWZBOT_NEW 00855 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWRHOO 00856 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWHEATO 00857 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWDZO 00858 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWZTOP_OLD 00859 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWZBOT_OLD 00860 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWHEAN, ZSNOWHEAO 00861 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZMASTOTN, ZMASTOTO 00862 ! 00863 REAL, DIMENSION(SIZE(PSNOW)) :: ZPSNOW_OLD, ZPSNOW_NEW 00864 REAL, DIMENSION(SIZE(PSNOW)) :: ZSUMHEAT, ZSUMSWE, ZSNOWMIX_DELTA 00865 ! 00866 REAL :: ZPROPOR 00867 ! 00868 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00869 ! 00870 !------------------------------------------------------------------------------- 00871 ! 00872 ! 0. Initialization: 00873 ! ------------------ 00874 ! 00875 ! 00876 IF (LHOOK) CALL DR_HOOK('SNOW3LTRANSF',0,ZHOOK_HANDLE) 00877 ! 00878 INI = SIZE(PSNOWRHO,1) 00879 INLVLS = SIZE(PSNOWRHO,2) 00880 ! 00881 ZPSNOW_NEW(:) = 0.0 00882 ZPSNOW_OLD(:) = PSNOW(:) 00883 ! 00884 DO JL=1,INLVLS 00885 DO JI=1,INI 00886 ZPSNOW_NEW(JI)=ZPSNOW_NEW(JI)+PSNOWDZN(JI,JL) 00887 ENDDO 00888 ENDDO 00889 ! 00890 ! initialization of variables describing the initial snowpack 00891 ! 00892 ZSNOWDZO (:,:) = PSNOWDZ (:,:) 00893 ZSNOWRHOO (:,:) = PSNOWRHO (:,:) 00894 ZSNOWHEATO(:,:) = PSNOWHEAT(:,:) 00895 ! 00896 ! 1. Calculate vertical grid limits (m): 00897 ! -------------------------------------- 00898 ! 00899 ZSNOWZTOP_OLD(:,1) = ZPSNOW_OLD(:) 00900 ZSNOWZTOP_NEW(:,1) = ZPSNOW_NEW(:) 00901 ZSNOWZBOT_OLD(:,1) = ZSNOWZTOP_OLD(:,1)-ZSNOWDZO(:,1) 00902 ZSNOWZBOT_NEW(:,1) = ZSNOWZTOP_NEW(:,1)-PSNOWDZN(:,1) 00903 ! 00904 DO JL=2,INLVLS!-1 00905 DO JI=1,INI 00906 ZSNOWZTOP_OLD(JI,JL) = ZSNOWZBOT_OLD(JI,JL-1) 00907 ZSNOWZTOP_NEW(JI,JL) = ZSNOWZBOT_NEW(JI,JL-1) 00908 ZSNOWZBOT_OLD(JI,JL) = ZSNOWZTOP_OLD(JI,JL )-ZSNOWDZO(JI,JL) 00909 ZSNOWZBOT_NEW(JI,JL) = ZSNOWZTOP_NEW(JI,JL )-PSNOWDZN(JI,JL) 00910 ENDDO 00911 ENDDO 00912 !-------------------------------Ã supprimer------------------------------------------------ 00913 ! Check consistency 00914 DO JI=1,INI 00915 IF (ABS(ZSNOWZBOT_OLD(JI,INLVLS)) > 0.00001) write (*,*) 'Error bottom OLD, pt:',JI 00916 IF (ABS(ZSNOWZBOT_NEW(JI,INLVLS)) > 0.00001) write (*,*) 'Error bottom NEW, pt:',JI 00917 ENDDO 00918 !-------------------------------Ã supprimer------------------------------------------------ 00919 ZSNOWZBOT_OLD(:,INLVLS)=0.0 00920 ZSNOWZBOT_NEW(:,INLVLS)=0.0 00921 ! 00922 ! 3. Calculate mass, heat, charcateristics mixing due to vertical grid resizing: 00923 ! -------------------------------------------------------------------- 00924 ! 00925 ! loop over the new snow layers 00926 ! Summ or avergage of the constituting quantities of the old snow layers 00927 ! which are totally or partially inserted in the new snow layer 00928 ! 00929 ZSNOWHEAN(:,:)=0.0 00930 ZMASTOTN (:,:)=0.0 00931 ! 00932 DO JL=1,INLVLS 00933 DO JLO=1, INLVLS 00934 DO JI=1,INI 00935 IF((ZSNOWZTOP_OLD(JI,JLO)>ZSNOWZBOT_NEW(JI,JL)).AND.(ZSNOWZBOT_OLD(JI,JLO)<ZSNOWZTOP_NEW(JI,JL)))THEN 00936 ! 00937 ZPROPOR = (MIN(ZSNOWZTOP_OLD(JI,JLO), ZSNOWZTOP_NEW(JI,JL)) & 00938 - MAX(ZSNOWZBOT_OLD(JI,JLO), ZSNOWZBOT_NEW(JI,JL)))& 00939 / ZSNOWDZO(JI,JLO) 00940 ! 00941 ZMASTOTN (JI,JL)=ZMASTOTN (JI,JL)+ZPROPOR*ZSNOWRHOO (JI,JLO)*ZSNOWDZO(JI,JLO) 00942 ZSNOWHEAN(JI,JL)=ZSNOWHEAN(JI,JL)+ZPROPOR*ZSNOWHEATO(JI,JLO) 00943 ! 00944 ENDIF 00945 ENDDO 00946 ENDDO 00947 ENDDO 00948 ! 00949 ! the new layer inherits from the weighted average properties of the old ones 00950 ! heat and mass 00951 ! 00952 ZSNOWHEATN(:,:)= ZSNOWHEAN(:,:) 00953 ZSNOWRHON (:,:)= ZMASTOTN (:,:)/PSNOWDZN(:,:) 00954 ! 00955 ! 4. Vanishing or very thin snowpack check: 00956 ! ----------------------------------------- 00957 ! 00958 ! NOTE: ONLY for very shallow snowpacks, mix properties (homogeneous): 00959 ! this avoids problems related to heat and mass exchange for 00960 ! thin layers during heavy snowfall or signifigant melt: one 00961 ! new/old layer can exceed the thickness of several old/new layers. 00962 ! Therefore, mix (conservative): 00963 ! 00964 ZSUMHEAT(:) = 0.0 00965 ZSUMSWE(:) = 0.0 00966 ZSNOWMIX_DELTA(:) = 0.0 00967 ! 00968 DO JL=1,INLVLS 00969 DO JI=1,INI 00970 IF(PSNOW(JI) < XSNOWCRITD)THEN 00971 ZSUMHEAT (JI) = ZSUMHEAT(JI) + PSNOWHEAT(JI,JL) 00972 ZSUMSWE (JI) = ZSUMSWE (JI) + PSNOWRHO (JI,JL)*PSNOWDZ(JI,JL) 00973 ZSNOWMIX_DELTA(JI) = 1.0 00974 ENDIF 00975 ENDDO 00976 ENDDO 00977 ! 00978 ! Heat and mass are evenly distributed vertically: 00979 ! heat and mass (density and thickness) are constant 00980 ! in profile: 00981 ! 00982 DO JL=1,INLVLS 00983 DO JI=1,INI 00984 ZSNOWHEATN(JI,JL) = ZSNOWMIX_DELTA(JI)*(ZSUMHEAT(JI)/INLVLS) + & 00985 (1.0-ZSNOWMIX_DELTA(JI))*ZSNOWHEATN(JI,JL) 00986 ! 00987 PSNOWDZN(JI,JL) = ZSNOWMIX_DELTA(JI)*(PSNOW(JI)/INLVLS) + & 00988 (1.0-ZSNOWMIX_DELTA(JI))*PSNOWDZN(JI,JL) 00989 ! 00990 ZSNOWRHON(JI,JL) = ZSNOWMIX_DELTA(JI)*(ZSUMSWE(JI)/PSNOW(JI)) + & 00991 (1.0-ZSNOWMIX_DELTA(JI))*ZSNOWRHON(JI,JL) 00992 ENDDO 00993 ENDDO 00994 ! 00995 !-------------------------------Ã supprimer------------------------------------------------ 00996 ! check of consistency between new and old snowpacks 00997 ! 00998 ZSNOWHEAN(:,:)=0. 00999 ZSNOWHEAO(:,:)=0. 01000 ZMASTOTN (:,:)=0. 01001 ZMASTOTO (:,:)=0. 01002 ! 01003 ZPSNOW_NEW(:)=0. 01004 ZPSNOW_OLD(:)=0. 01005 01006 DO JL=1,INLVLS 01007 DO JI=1,INI 01008 ! 01009 ZSNOWHEAN (JI,1) = ZSNOWHEAN (JI,1) + ZSNOWHEATN(JI,JL) 01010 ZMASTOTN (JI,1) = ZMASTOTN (JI,1) + ZSNOWRHON (JI,JL)*PSNOWDZN(JI,JL) 01011 ZPSNOW_NEW(JI ) = ZPSNOW_NEW(JI ) + PSNOWDZN (JI,JL) 01012 ! 01013 ZSNOWHEAO (JI,1) =ZSNOWHEAO (JI,1) + ZSNOWHEATO(JI,JL) 01014 ZMASTOTO (JI,1) =ZMASTOTO (JI,1) + ZSNOWRHOO (JI,JL)*ZSNOWDZO(JI,JL) 01015 ZPSNOW_OLD(JI ) =ZPSNOW_OLD(JI ) + ZSNOWDZO (JI,JL) 01016 ! 01017 ENDDO 01018 ENDDO 01019 DO JI=1,INI 01020 if (abs(ZSNOWHEAN (JI,1)-ZSNOWHEAO (JI,1))>0.0001.OR. & 01021 ABS(ZMASTOTN (JI,1)-ZMASTOTO (JI,1))>0.0001.OR. & 01022 ABS(ZPSNOW_NEW(JI )-ZPSNOW_OLD(JI ))> 0.0001 )THEN 01023 write(*,*) 'pt:',JI,'Warning diff', ZSNOWHEAN(JI,1)-ZSNOWHEAO(JI,1),ZMASTOTN(JI,1)-ZMASTOTO(JI,1),ZPSNOW_NEW(JI)-ZPSNOW_OLD(JI) 01024 ENDIF 01025 ENDDO 01026 !-------------------------------Ã supprimer------------------------------------------------ 01027 ! 01028 ! 01029 ! 5. Update mass (density and thickness) and heat: 01030 ! ------------------------------------------------ 01031 ! 01032 PSNOWDZ (:,:) = PSNOWDZN (:,:) 01033 PSNOWRHO (:,:) = ZSNOWRHON (:,:) 01034 PSNOWHEAT(:,:) = ZSNOWHEATN(:,:) 01035 ! 01036 IF (LHOOK) CALL DR_HOOK('SNOW3LTRANSF',1,ZHOOK_HANDLE) 01037 ! 01038 ! 01039 !------------------------------------------------------------------------------- 01040 ! 01041 END SUBROUTINE SNOW3LTRANSF 01042 !#################################################################### 01043 !#################################################################### 01044 !#################################################################### 01045 SUBROUTINE SNOW3LALB(PALBEDOSC,PTSTEP,PSNOWLIQ,PSNOWDZ, & 01046 PSNOWRHO,OSFCMELT,PSR,PPERMSNOWFRAC) 01047 ! 01048 !! PURPOSE 01049 !! ------- 01050 ! Calculate the snow surface albedo. Use the method of 01051 ! Douville et al. 1995, Clim. Dyn., 12, 21-35. but instead 01052 ! of using whether or not there is snowmelt to determine 01053 ! albedo decrease rate, use a continuous formualtion in which 01054 ! weights are calculated as a function of the degree of saturation of the 01055 ! uppermost layer (with respect to liquid water content). 01056 ! 01057 ! 01058 USE MODD_CSTS, ONLY : XDAY 01059 USE MODD_SNOW_PAR, ONLY : XWCRN, XANSMAX, XANSMIN, XANS_TODRY, & 01060 XSNOWDMIN, XANS_T, XAGLAMIN, XAGLAMAX 01061 ! 01062 ! 01063 USE MODE_SNOW3L 01064 ! 01065 IMPLICIT NONE 01066 ! 01067 !* 0.1 declarations of arguments 01068 ! 01069 REAL, INTENT(IN) :: PTSTEP 01070 ! 01071 REAL, DIMENSION(:), INTENT(IN) :: PSNOWLIQ,PSNOWDZ,PSNOWRHO,PSR,PPERMSNOWFRAC 01072 ! 01073 LOGICAL, DIMENSION(:), INTENT(IN) :: OSFCMELT 01074 ! 01075 REAL, DIMENSION(:), INTENT(INOUT) :: PALBEDOSC 01076 ! 01077 !* 0.2 declarations of local variables 01078 ! 01079 REAL, DIMENSION(SIZE(PSNOWRHO)) :: ZPCPALB, ZALBDRY, ZANSMIN, ZANSMAX, 01080 ZALBWET, ZWHOLDMAX, ZFRACLIQ 01081 REAL(KIND=JPRB) :: ZHOOK_HANDLE 01082 ! 01083 !------------------------------------------------------------------------------- 01084 ! 01085 ! 0. Initialize: 01086 ! ------------------ 01087 ! 01088 IF (LHOOK) CALL DR_HOOK('SNOW3LALB',0,ZHOOK_HANDLE) 01089 ZFRACLIQ(:) = 0.0 01090 ZALBWET(:) = 0.0 01091 ZWHOLDMAX(:) = 0.0 01092 ! 01093 IF(OGLACIER)THEN 01094 ZANSMIN(:) = XAGLAMIN * PPERMSNOWFRAC(:) + XANSMIN * (1.0-PPERMSNOWFRAC(:)) 01095 ZANSMAX(:) = XAGLAMAX * PPERMSNOWFRAC(:) + XANSMAX * (1.0-PPERMSNOWFRAC(:)) 01096 ELSE 01097 ZANSMIN(:) = XANSMIN 01098 ZANSMAX(:) = XANSMAX 01099 ENDIF 01100 ! 01101 ! 01102 ! 1. Albedo change (increase) due to snowfall: 01103 ! -------------------------------------------- 01104 ! 01105 ZPCPALB(:) = (PSR(:)*PTSTEP/XWCRN)*(ZANSMAX(:) - ZANSMIN(:)) 01106 ! 01107 ! 2. dry snow albedo rate of change: 01108 ! ---------------------------------- 01109 ! 01110 ZALBDRY(:) = PALBEDOSC(:) - XANS_TODRY*(PTSTEP/XDAY) 01111 ! 01112 ! 01113 WHERE(OSFCMELT) 01114 ! 01115 ! 3. wet snow albedo rate of change: 01116 ! ---------------------------------- 01117 ! 01118 ZALBWET(:) = (PALBEDOSC(:) - ZANSMIN(:))*EXP(-XANS_T*PTSTEP/XDAY) & 01119 + ZANSMIN(:) 01120 ! 01121 ! Calculate albedo rate based on liquid water 01122 ! content of the first snow layer: During melt, if liquid 01123 ! content is at the maximum, then snow albedo 01124 ! decreases the fastest: 01125 ! 01126 ZWHOLDMAX(:) = SNOW3LHOLD(PSNOWRHO,PSNOWDZ) 01127 ! 01128 ZFRACLIQ(:) = MIN(1.0, PSNOWLIQ(:)/MAX(XSNOWDMIN,ZWHOLDMAX)) 01129 ! 01130 END WHERE 01131 ! 01132 ! 4. Updated Albedo: 01133 ! ------------------ 01134 ! 01135 PALBEDOSC(:) = ZFRACLIQ(:)*ZALBWET(:) + (1.-ZFRACLIQ(:))*ZALBDRY(:) & 01136 + ZPCPALB(:) 01137 ! 01138 PALBEDOSC(:) = MIN(ZANSMAX(:), MAX(ZANSMIN(:),PALBEDOSC(:))) 01139 IF (LHOOK) CALL DR_HOOK('SNOW3LALB',1,ZHOOK_HANDLE) 01140 ! 01141 !------------------------------------------------------------------------------- 01142 ! 01143 END SUBROUTINE SNOW3LALB 01144 !#################################################################### 01145 !#################################################################### 01146 !#################################################################### 01147 SUBROUTINE SNOW3LRAD(PSNOWDZMIN, PSW_RAD, PSNOWALB, PSNOWDZ, & 01148 PSNOWRHO, PALB, PRADSINK, PRADXS ) 01149 ! 01150 !! PURPOSE 01151 !! ------- 01152 ! Calculate the transmission of shortwave (solar) radiation 01153 ! through the snowpack (using a form of Beer's Law: exponential 01154 ! decay of radiation with increasing snow depth). 01155 ! 01156 IMPLICIT NONE 01157 ! 01158 !* 0.1 declarations of arguments 01159 ! 01160 REAL, INTENT(IN) :: PSNOWDZMIN 01161 ! 01162 REAL, DIMENSION(:), INTENT(IN) :: PSW_RAD, PSNOWALB, PALB 01163 ! 01164 REAL, DIMENSION(:,:), INTENT(IN) :: PSNOWRHO, PSNOWDZ 01165 ! 01166 REAL, DIMENSION(:), INTENT(OUT) :: PRADXS 01167 ! 01168 REAL, DIMENSION(:,:), INTENT(OUT) :: PRADSINK 01169 ! 01170 ! 01171 !* 0.2 declarations of local variables 01172 ! 01173 INTEGER :: JJ, JI 01174 ! 01175 INTEGER :: INI 01176 INTEGER :: INLVLS 01177 ! 01178 REAL, DIMENSION(SIZE(PSNOWRHO,1)) :: ZRADTOT 01179 ! 01180 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOW, 01181 ZDSGRAIN, ZSXNU, 01182 ZCOEF, ZSNOWDZ 01183 ! 01184 ! ISBA-ES Radiation extinction coefficients: (see Loth and Graf 1993): 01185 ! see Boone, Meteo-France/CNRM Note de Centre No. 70 (2002) 01186 ! 01187 REAL, PARAMETER :: ZSNOWRAD_CVEXT = 3.8e-3 ! [(m5/2)/kg] 01188 REAL, PARAMETER :: ZSNOWRAD_AGRAIN = 1.6e-4 ! (m) 01189 REAL, PARAMETER :: ZSNOWRAD_BGRAIN = 1.1e-13 ! (m13/kg4) 01190 REAL, PARAMETER :: ZDSGRAIN_MAX = 2.796e-3 ! m 01191 REAL(KIND=JPRB) :: ZHOOK_HANDLE 01192 !------------------------------------------------------------------------------- 01193 ! 01194 ! 0. Initialization: 01195 ! ------------------ 01196 ! 01197 IF (LHOOK) CALL DR_HOOK('SNOW3LRAD',0,ZHOOK_HANDLE) 01198 INI = SIZE(PSNOWDZ(:,:),1) 01199 INLVLS = SIZE(PSNOWDZ(:,:),2) 01200 ! 01201 ! 01202 ! 1. Vanishingly thin snowpack check: 01203 ! ----------------------------------- 01204 ! For vanishingly thin snowpacks, much of the radiation 01205 ! can pass through snowpack into underlying soil, making 01206 ! a large (albeit temporary) thermal gradient: by imposing 01207 ! a minimum thickness, this increases the radiation absorbtion 01208 ! for vanishingly thin snowpacks. 01209 ! 01210 ZSNOWDZ(:,:) = MAX(PSNOWDZMIN, PSNOWDZ(:,:)) 01211 ! 01212 ! 01213 ! 2. Extinction of net shortwave radiation 01214 ! ---------------------------------------- 01215 ! Fn of snow depth and density (Loth and Graf 1993: 01216 ! SNOWCVEXT => from Bohren and Barkstrom 1974 01217 ! SNOWAGRAIN and SNOWBGRAIN=> from Jordan 1976) 01218 ! 01219 ! Calculate grid levels: 01220 ! 01221 ZSNOW(:,1) = ZSNOWDZ(:,1) 01222 DO JJ=2,INLVLS 01223 DO JI=1,INI 01224 ZSNOW(JI,JJ) = ZSNOW(JI,JJ-1) + ZSNOWDZ(JI,JJ) 01225 ENDDO 01226 ENDDO 01227 ! 01228 ! Snow grain size: 01229 ! 01230 ZDSGRAIN(:,:) = MIN(ZDSGRAIN_MAX, ZSNOWRAD_AGRAIN + ZSNOWRAD_BGRAIN*(PSNOWRHO(:,:)**4)) 01231 ! 01232 ! NOTE: as this is a "sink" term for heat, it 01233 ! as assigned a negative value. 01234 ! 01235 ZSXNU(:,:) = ZSNOWRAD_CVEXT*PSNOWRHO(:,:)/SQRT(ZDSGRAIN(:,:)) 01236 ZCOEF(:,:) = EXP(-ZSXNU(:,:)*ZSNOW(:,:)) 01237 ! 01238 ! 3. Radiation at each level: (W/m2) 01239 ! ---------------------------------- 01240 ! 01241 DO JJ=1,INLVLS 01242 DO JI=1,INI 01243 PRADSINK(JI,JJ) = -PSW_RAD(JI)*(1.-PSNOWALB(JI))*ZCOEF(JI,JJ) 01244 ENDDO 01245 ENDDO 01246 ! 01247 ! For thin snow packs, radiation might reach base of 01248 ! snowpack...so we influence this amount with sfc albedo 01249 ! and (outside of this routine) add any excess heat 01250 ! to underlying soil: 01251 ! 01252 PRADSINK(:,INLVLS) = PRADSINK(:,INLVLS)*(1.0-PALB(:)) 01253 ! 01254 ! 4. Excess radiation not absorbed by snowpack (W/m2): 01255 ! ---------------------------------------------------- 01256 ! 01257 ZRADTOT(:) = PRADSINK(:,1)+(1.-PSNOWALB(:))*PSW_RAD(:) 01258 DO JJ=2,INLVLS 01259 DO JI=1,INI 01260 ZRADTOT(JI) = ZRADTOT(JI) + PRADSINK(JI,JJ)-PRADSINK(JI,JJ-1) 01261 ENDDO 01262 ENDDO 01263 ! 01264 PRADXS(:) = (1.-PSNOWALB(:))*PSW_RAD(:) - ZRADTOT(:) 01265 IF (LHOOK) CALL DR_HOOK('SNOW3LRAD',1,ZHOOK_HANDLE) 01266 ! 01267 !------------------------------------------------------------------------------- 01268 ! 01269 END SUBROUTINE SNOW3LRAD 01270 !#################################################################### 01271 !#################################################################### 01272 !#################################################################### 01273 SUBROUTINE SNOW3LTHRM(PSNOWRHO,PSCOND,PSNOWTEMP,PPS) 01274 ! 01275 !! PURPOSE 01276 !! ------- 01277 ! Calculate snow thermal conductivity from 01278 ! Sun et al. 1999, J. of Geophys. Res., 104, 19587-19579 01279 ! (vapor) and Anderson, 1976, NOAA Tech. Rep. NWS 19 (snow). 01280 ! 01281 ! 01282 USE MODD_CSTS,ONLY : XP00 01283 ! 01284 IMPLICIT NONE 01285 ! 01286 !* 0.1 declarations of arguments 01287 ! 01288 REAL, DIMENSION(:), INTENT(IN) :: PPS 01289 ! 01290 REAL, DIMENSION(:,:), INTENT(IN) :: PSNOWTEMP, PSNOWRHO 01291 ! 01292 REAL, DIMENSION(:,:), INTENT(OUT) :: PSCOND 01293 ! 01294 ! 01295 !* 0.2 declarations of local variables 01296 ! 01297 INTEGER :: JJ, JI 01298 ! 01299 INTEGER :: INI 01300 INTEGER :: INLVLS 01301 ! 01302 ! ISBA-ES Thermal conductivity coefficients from Anderson (1976): 01303 ! see Boone, Meteo-France/CNRM Note de Centre No. 70 (2002) 01304 ! 01305 REAL, PARAMETER :: ZSNOWTHRMCOND1 = 0.02 ! [W/(m K)] 01306 REAL, PARAMETER :: ZSNOWTHRMCOND2 = 2.5E-6 ! [W m5/(kg2 K)] 01307 ! 01308 ! ISBA-ES Thermal conductivity: Implicit vapor diffn effects 01309 ! (sig only for new snow OR high altitudes) 01310 ! from Sun et al. (1999): based on data from Jordan (1991) 01311 ! see Boone, Meteo-France/CNRM Note de Centre No. 70 (2002) 01312 ! 01313 REAL, PARAMETER :: ZSNOWTHRMCOND_AVAP = -0.06023 ! [W/(m K)] 01314 REAL, PARAMETER :: ZSNOWTHRMCOND_BVAP = -2.5425 ! (W/m) 01315 REAL, PARAMETER :: ZSNOWTHRMCOND_CVAP = -289.99 ! (K) 01316 REAL(KIND=JPRB) :: ZHOOK_HANDLE 01317 !------------------------------------------------------------------------------- 01318 ! 01319 INI = SIZE(PSNOWRHO(:,:),1) 01320 INLVLS = SIZE(PSNOWRHO(:,:),2) 01321 ! 01322 ! 1. Snow thermal conductivity 01323 ! ---------------------------- 01324 ! 01325 IF (LHOOK) CALL DR_HOOK('SNOW3LTHRM',0,ZHOOK_HANDLE) 01326 DO JJ=1,INLVLS 01327 DO JI=1,INI 01328 ! 01329 PSCOND(JI,JJ) = (ZSNOWTHRMCOND1 + ZSNOWTHRMCOND2*PSNOWRHO(JI,JJ)*PSNOWRHO(JI,JJ)) & 01330 + MAX(0.0,(ZSNOWTHRMCOND_AVAP+(ZSNOWTHRMCOND_BVAP/(PSNOWTEMP(JI,JJ) & 01331 + ZSNOWTHRMCOND_CVAP)))*(XP00/PPS(JI))) 01332 ! 01333 ENDDO 01334 ENDDO 01335 IF (LHOOK) CALL DR_HOOK('SNOW3LTHRM',1,ZHOOK_HANDLE) 01336 ! 01337 !------------------------------------------------------------------------------- 01338 ! 01339 END SUBROUTINE SNOW3LTHRM 01340 !#################################################################### 01341 !#################################################################### 01342 !#################################################################### 01343 SUBROUTINE SNOW3LEBUD(HSNOWRES, HIMPLICIT_WIND, & 01344 PPEW_A_COEF, PPEW_B_COEF, & 01345 PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, & 01346 PSNOWDZMIN, & 01347 PZREF,PTS,PSNOWRHO,PSNOWLIQ,PSCAP,PSCOND1,PSCOND2, & 01348 PUREF,PEXNS,PEXNA,PDIRCOSZW,PVMOD, & 01349 PLW_RAD,PSW_RAD,PTA,PQA,PPS,PTSTEP, & 01350 PSNOWDZ1,PSNOWDZ2,PALBT,PZ0,PZ0EFF,PZ0H, & 01351 PSFCFRZ,PRADSINK,PHPSNOW, & 01352 PCT,PEMIST,PRHOA,PTSTERM1,PTSTERM2,PRA,PCDSNOW,PCHSNOW, & 01353 PQSAT,PDQSAT,PRSRA,PUSTAR2_IC,PRI, & 01354 PPET_A_COEF_T,PPEQ_A_COEF_T,PPET_B_COEF_T,PPEQ_B_COEF_T ) 01355 ! 01356 !! PURPOSE 01357 !! ------- 01358 ! Calculate surface energy budget linearization (terms) and turbulent 01359 ! exchange coefficients/resistance between surface and atmosphere. 01360 ! (Noilhan and Planton 1989; Giordani 1993; Noilhan and Mahfouf 1996) 01361 ! 01362 USE MODD_SURF_PAR, ONLY : XUNDEF 01363 USE MODD_CSTS, ONLY : XCPD, XRHOLW, XSTEFAN, XLVTT, XLSTT 01364 USE MODD_SNOW_PAR, ONLY : X_RI_MAX, XEMISSN 01365 ! 01366 USE MODE_THERMOS 01367 ! 01368 USE MODI_SURFACE_RI 01369 USE MODI_SURFACE_AERO_COND 01370 USE MODI_SURFACE_CD 01371 ! 01372 ! 01373 IMPLICIT NONE 01374 ! 01375 !* 0.1 declarations of arguments 01376 ! 01377 REAL, INTENT(IN) :: PTSTEP, PSNOWDZMIN 01378 ! 01379 CHARACTER(LEN=*), INTENT(IN) :: HSNOWRES ! type of sfc resistance 01380 ! DEFAULT=Louis (1979), standard ISBA 01381 ! method. Option to limit Ri number 01382 ! for very srtable conditions 01383 ! 01384 CHARACTER(LEN=*), INTENT(IN) :: HIMPLICIT_WIND ! wind implicitation option 01385 ! ! 'OLD' = direct 01386 ! ! 'NEW' = Taylor serie, order 1 01387 ! 01388 REAL, DIMENSION(:), INTENT(IN) :: PPEW_A_COEF, PPEW_B_COEF, 01389 PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, 01390 PPEQ_B_COEF 01391 ! PPEW_A_COEF = wind coefficient (m2s/kg) 01392 ! PPEW_B_COEF = wind coefficient (m/s) 01393 ! PPET_A_COEF = A-air temperature coefficient 01394 ! PPET_B_COEF = B-air temperature coefficient 01395 ! PPEQ_A_COEF = A-air specific humidity coefficient 01396 ! PPEQ_B_COEF = B-air specific humidity coefficient 01397 ! 01398 REAL, DIMENSION(:), INTENT(IN) :: PZREF, PTS, PSNOWDZ1, PSNOWDZ2, 01399 PRADSINK, PSNOWRHO, PSNOWLIQ, PSCAP, 01400 PSCOND1, PSCOND2, 01401 PZ0, PHPSNOW, 01402 PALBT, PZ0EFF, PZ0H 01403 ! 01404 REAL, DIMENSION(:), INTENT(IN) :: PSW_RAD, PLW_RAD, PTA, PQA, PPS, PRHOA 01405 ! 01406 REAL, DIMENSION(:), INTENT(IN) :: PUREF, PEXNS, PEXNA, PDIRCOSZW, PVMOD 01407 ! 01408 REAL, DIMENSION(:), INTENT(OUT) :: PTSTERM1, PTSTERM2, PEMIST, PRA, 01409 PCT, PSFCFRZ, PCDSNOW, PCHSNOW, 01410 PQSAT, PDQSAT, PRSRA 01411 ! 01412 REAL, DIMENSION(:), INTENT(OUT) :: PUSTAR2_IC, 01413 PPET_A_COEF_T, PPEQ_A_COEF_T, 01414 PPET_B_COEF_T, PPEQ_B_COEF_T 01415 ! 01416 REAL, DIMENSION(:), INTENT(OUT) :: PRI 01417 ! 01418 !* 0.2 declarations of local variables 01419 ! 01420 REAL, DIMENSION(SIZE(PTS)) :: ZAC, ZRI, 01421 ZSCONDA, ZA, ZB, ZC, 01422 ZCDN, ZSNOWDZM1, ZSNOWDZM2, 01423 ZVMOD, ZUSTAR2, ZTS3, ZLVT, 01424 Z_CCOEF 01425 REAL(KIND=JPRB) :: ZHOOK_HANDLE 01426 ! 01427 !------------------------------------------------------------------------------- 01428 ! 01429 ! 1. New saturated specific humidity and derrivative: 01430 ! --------------------------------------------------- 01431 ! 01432 IF (LHOOK) CALL DR_HOOK('SNOW3LEBUD',0,ZHOOK_HANDLE) 01433 ! 01434 ZRI (:) = XUNDEF 01435 ! 01436 PQSAT (:) = QSATI(PTS(:),PPS(:)) 01437 PDQSAT(:) = DQSATI(PTS(:),PPS(:),PQSAT(:)) 01438 ! 01439 ! 01440 ! 2. Surface properties: 01441 ! ---------------------- 01442 ! It might be of interest to use snow-specific roughness 01443 ! or a temperature dependence on emissivity: 01444 ! but for now, use ISBA defaults. 01445 ! 01446 PEMIST(:) = XEMISSN 01447 ! 01448 ! 2. Computation of resistance and drag coefficient 01449 ! ------------------------------------------------- 01450 ! 01451 CALL SURFACE_RI(PTS, PQSAT, PEXNS, PEXNA, PTA, PQA, & 01452 PZREF, PUREF, PDIRCOSZW, PVMOD, ZRI ) 01453 ! 01454 ! Simple adaptation of method by Martin and Lejeune (1998) 01455 ! to apply a lower limit to turbulent transfer coef 01456 ! by defining a maximum Richarson number for stable 01457 ! conditions: 01458 ! 01459 IF(HSNOWRES=='RIL') ZRI(:) = MIN(X_RI_MAX, ZRI(:)) 01460 ! 01461 PRI(:)=ZRI(:) 01462 ! 01463 ! Surface aerodynamic resistance for heat transfers 01464 ! 01465 CALL SURFACE_AERO_COND(ZRI, PZREF, PUREF, PVMOD, PZ0, PZ0H, ZAC, PRA, PCHSNOW) 01466 ! 01467 ! For atmospheric model coupling: 01468 ! 01469 CALL SURFACE_CD(ZRI, PZREF, PUREF, PZ0EFF, PZ0H, PCDSNOW, ZCDN) 01470 ! 01471 PRSRA(:) = PRHOA(:) / PRA(:) 01472 ! 01473 ! 01474 ! Modify flux-form implicit coupling coefficients: 01475 ! - wind components: 01476 ! 01477 IF(HIMPLICIT_WIND=='OLD')THEN 01478 ! old implicitation 01479 ZUSTAR2(:) = ( PCDSNOW(:)*PVMOD(:)*PPEW_B_COEF(:)) / & 01480 (1.0-PRHOA(:)*PCDSNOW(:)*PVMOD(:)*PPEW_A_COEF(:)) 01481 ELSE 01482 ! new implicitation 01483 ZUSTAR2(:) = (PCDSNOW(:)*PVMOD(:)*(2.*PPEW_B_COEF(:)-PVMOD(:))) & 01484 / (1.0-2.0*PRHOA(:)*PCDSNOW(:)*PVMOD(:)*PPEW_A_COEF(:)) 01485 ENDIF 01486 ! 01487 ZVMOD(:) = PRHOA(:)*PPEW_A_COEF(:)*ZUSTAR2(:) + PPEW_B_COEF(:) 01488 ZVMOD(:) = MAX(ZVMOD(:),0.) 01489 ! 01490 WHERE(PPEW_A_COEF(:)/= 0.) 01491 ZUSTAR2(:) = MAX( ( ZVMOD(:) - PPEW_B_COEF(:) ) / (PRHOA(:)*PPEW_A_COEF(:)), 0.) 01492 ENDWHERE 01493 ! 01494 ! implicit wind friction 01495 ZUSTAR2(:) = MAX(ZUSTAR2(:),0.) 01496 ! 01497 PUSTAR2_IC(:) = ZUSTAR2(:) 01498 ! 01499 ! 3. Calculate linearized surface energy budget components: 01500 ! --------------------------------------------------------- 01501 ! To prevent numerical difficulties for very thin snow 01502 ! layers, limit the grid "thinness": this is important as 01503 ! layers become vanishing thin: 01504 ! 01505 ZSNOWDZM1(:) = MAX(PSNOWDZ1(:), PSNOWDZMIN) 01506 ZSNOWDZM2(:) = MAX(PSNOWDZ2(:), PSNOWDZMIN) 01507 ! 01508 ! Surface thermal inertia: 01509 ! 01510 PCT(:) = 1.0/(PSCAP(:)*ZSNOWDZM1(:)) 01511 ! 01512 ! Fraction of surface frozen (sublimation) with the remaining 01513 ! fraction being liquid (evaporation): 01514 ! 01515 PSFCFRZ(:) = 1.0 - PSNOWLIQ(:)*XRHOLW/(ZSNOWDZM1(:)*PSNOWRHO(:)) 01516 ! 01517 ! Thermal conductivity between uppermost and lower snow layers: 01518 ! 01519 ZSCONDA(:) = (ZSNOWDZM1(:)*PSCOND1(:) + ZSNOWDZM2(:)*PSCOND2(:))/ & 01520 (ZSNOWDZM1(:)+ZSNOWDZM2(:)) 01521 ! 01522 ! Transform implicit coupling coefficients: 01523 ! Note, surface humidity is 100% over snow. 01524 ! 01525 ! - specific humidity: 01526 ! 01527 Z_CCOEF(:) = 1.0 - PPEQ_A_COEF(:)*PRSRA(:) 01528 ! 01529 PPEQ_A_COEF_T(:) = - PPEQ_A_COEF(:)*PRSRA(:)*PDQSAT(:)/Z_CCOEF(:) 01530 ! 01531 PPEQ_B_COEF_T(:) = ( PPEQ_B_COEF(:) - PPEQ_A_COEF(:)*PRSRA(:)*(PQSAT(:) - & 01532 PDQSAT(:)*PTS(:)) )/Z_CCOEF(:) 01533 ! 01534 ! - air temperature: 01535 ! (assumes A and B correspond to potential T): 01536 ! 01537 Z_CCOEF(:) = (1.0 - PPET_A_COEF(:)*PRSRA(:))/PEXNA(:) 01538 ! 01539 PPET_A_COEF_T(:) = - PPET_A_COEF(:)*PRSRA(:)/(PEXNS(:)*Z_CCOEF(:)) 01540 ! 01541 PPET_B_COEF_T(:) = PPET_B_COEF(:)/Z_CCOEF(:) 01542 ! 01543 ! 01544 ! Energy budget solution terms: 01545 ! 01546 ZTS3(:) = PEMIST(:) * XSTEFAN * PTS(:)**3 01547 ZLVT(:) = (1.-PSFCFRZ(:))*XLVTT + PSFCFRZ(:)*XLSTT 01548 ! 01549 ZA(:) = 1. / PTSTEP + PCT(:) * (4. * ZTS3(:) + & 01550 PRSRA(:) * ZLVT(:) * (PDQSAT(:) - PPEQ_A_COEF_T(:)) & 01551 + PRSRA(:) * XCPD * ( (1./PEXNS(:))-(PPET_A_COEF_T(:)/PEXNA(:)) ) & 01552 + (2*ZSCONDA(:)/(ZSNOWDZM2(:)+ZSNOWDZM1(:))) ) 01553 ! 01554 ZB(:) = 1. / PTSTEP + PCT(:) * (3. * ZTS3(:) + & 01555 PRSRA(:) * PDQSAT(:) * ZLVT(:) ) 01556 ! 01557 ZC(:) = PCT(:) * (PRSRA(:) * XCPD * PPET_B_COEF_T(:)/PEXNA(:) + PSW_RAD(:) * & 01558 (1. - PALBT(:)) + PEMIST(:)*PLW_RAD(:) - PRSRA(:) * & 01559 ZLVT(:) * (PQSAT(:)-PPEQ_B_COEF_T(:)) & 01560 + PHPSNOW(:) + PRADSINK(:) ) 01561 ! 01562 ! 01563 ! Coefficients needed for implicit solution 01564 ! of linearized surface energy budget: 01565 ! 01566 PTSTERM2(:) = 2*ZSCONDA(:)*PCT(:)/(ZA(:)*(ZSNOWDZM2(:)+ZSNOWDZM1(:))) 01567 ! 01568 PTSTERM1(:) = (PTS(:)*ZB(:) + ZC(:))/ZA(:) 01569 IF (LHOOK) CALL DR_HOOK('SNOW3LEBUD',1,ZHOOK_HANDLE) 01570 ! 01571 !------------------------------------------------------------------------------- 01572 ! 01573 END SUBROUTINE SNOW3LEBUD 01574 !#################################################################### 01575 !#################################################################### 01576 !#################################################################### 01577 SUBROUTINE SNOW3LSOLVT(PTSTEP,PSNOWDZMIN, & 01578 PSNOWDZ,PSCOND,PSCAP,PTG, & 01579 PSOILCOND,PD_G, & 01580 PRADSINK,PCT,PTERM1,PTERM2, & 01581 PPET_A_COEF_T,PPEQ_A_COEF_T, & 01582 PPET_B_COEF_T,PPEQ_B_COEF_T, & 01583 PTA_IC, PQA_IC, & 01584 PGBAS,PGBASO,PSNOWTEMP,PSNOWFLUX ) 01585 ! 01586 !! PURPOSE 01587 !! ------- 01588 ! This subroutine solves the 1-d diffusion of 'ZSNOWTEMP' using a 01589 ! layer averaged set of equations which are time differenced 01590 ! using the backward-difference scheme (implicit). 01591 ! The eqs are solved rapidly by taking advantage of the 01592 ! fact that the matrix is tridiagonal. This is a very 01593 ! general routine and can be used for the 1-d diffusion of any 01594 ! quantity as long as the diffusity is not a function of the 01595 ! quantity being diffused. Aaron Boone 8-98. Soln to the eq: 01596 ! 01597 ! c dQ d k dQ dS 01598 ! -- = -- -- - -- 01599 ! dt dx dx dx 01600 ! 01601 ! where k = k(x) (thermal conductivity), c = c(x) (heat capacity) 01602 ! as an eg. for temperature/heat eq. S is a sink (-source) term. 01603 ! Diffusivity is k/c 01604 ! 01605 ! 01606 USE MODD_CSTS,ONLY : XTT 01607 ! 01608 USE MODI_TRIDIAG_GROUND 01609 ! 01610 IMPLICIT NONE 01611 ! 01612 !* 0.1 declarations of arguments 01613 ! 01614 REAL, INTENT(IN) :: PTSTEP, PSNOWDZMIN 01615 ! 01616 REAL, DIMENSION(:), INTENT(IN) :: PTG, PSOILCOND, PD_G, 01617 PCT, PTERM1, PTERM2 01618 01619 ! 01620 REAL, DIMENSION(:,:), INTENT(IN) :: PSNOWDZ, PSCOND, PSCAP, 01621 PRADSINK 01622 ! 01623 REAL, DIMENSION(:), INTENT(IN) :: PPET_A_COEF_T, PPEQ_A_COEF_T, 01624 PPET_B_COEF_T, PPEQ_B_COEF_T 01625 ! 01626 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWTEMP 01627 ! 01628 REAL, DIMENSION(:), INTENT(OUT) :: PGBAS, PGBASO, PSNOWFLUX, 01629 PTA_IC, PQA_IC 01630 ! 01631 ! 01632 !* 0.2 declarations of local variables 01633 ! 01634 ! 01635 INTEGER :: JJ, JI 01636 ! 01637 INTEGER :: INI 01638 INTEGER :: INLVLS 01639 ! 01640 REAL, DIMENSION(SIZE(PTG)) :: ZSNOWTEMP_DELTA 01641 ! 01642 REAL, DIMENSION(SIZE(PSNOWDZ,1),SIZE(PSNOWDZ,2)) :: ZSNOWTEMP, ZDTERM, ZCTERM, 01643 ZFRCV, ZAMTRX, ZBMTRX, 01644 ZCMTRX 01645 ! 01646 REAL, DIMENSION(SIZE(PSNOWDZ,1),SIZE(PSNOWDZ,2)) :: ZWORK1, ZWORK2, ZDZDIF, 01647 ZSNOWDZM 01648 ! 01649 REAL, DIMENSION(SIZE(PSNOWDZ,1),SIZE(PSNOWDZ,2)-1) :: ZSNOWTEMP_M, 01650 ZFRCV_M, ZAMTRX_M, 01651 ZBMTRX_M, ZCMTRX_M 01652 REAL(KIND=JPRB) :: ZHOOK_HANDLE 01653 !------------------------------------------------------------------------------- 01654 ! 01655 ! 0. Initialize: 01656 ! ------------------ 01657 ! 01658 IF (LHOOK) CALL DR_HOOK('SNOW3LSOLVT',0,ZHOOK_HANDLE) 01659 ZSNOWTEMP(:,:) = PSNOWTEMP(:,:) 01660 INI = SIZE(PSNOWDZ(:,:),1) 01661 INLVLS = SIZE(PSNOWDZ(:,:),2) 01662 ! 01663 ! 01664 ! 1. Calculate tri-diagnoal matrix coefficients: 01665 ! ---------------------------------------------- 01666 ! For heat transfer, assume a minimum grid 01667 ! thickness (to prevent numerical 01668 ! problems for very thin snow cover): 01669 ! 01670 ZSNOWDZM(:,:) = MAX(PSNOWDZ(:,:), PSNOWDZMIN) 01671 ! 01672 ZWORK1(:,:) = ZSNOWDZM(:,:)*PSCOND(:,:) 01673 DO JJ=1,INLVLS-1 01674 DO JI=1,INI 01675 ZDZDIF(JI,JJ) = ZSNOWDZM(JI,JJ) + ZSNOWDZM(JI,JJ+1) 01676 ZWORK2(JI,JJ) = ZSNOWDZM(JI,JJ+1)*PSCOND(JI,JJ+1) 01677 ENDDO 01678 ENDDO 01679 ZDZDIF(:,INLVLS) = ZSNOWDZM(:,INLVLS) + PD_G(:) 01680 ZWORK2(:,INLVLS) = PD_G(:)*PSOILCOND(:) 01681 ! 01682 ZDTERM(:,:) = 2.0*(ZWORK1(:,:)+ZWORK2(:,:))/(ZDZDIF(:,:)*ZDZDIF(:,:)) 01683 ! 01684 ZCTERM(:,:) = PSCAP(:,:)*ZSNOWDZM(:,:)/PTSTEP 01685 ! 01686 ! 2. Set up tri-diagonal matrix 01687 ! ----------------------------- 01688 ! 01689 ! Upper BC 01690 ! 01691 ZAMTRX(:,1) = 0.0 01692 ZBMTRX(:,1) = 1./(PCT(:)*PTSTEP) 01693 ZCMTRX(:,1) = -PTERM2(:)*ZBMTRX(:,1) 01694 ZFRCV(:,1) = PTERM1(:)*ZBMTRX(:,1) 01695 ! 01696 ! 01697 ! Interior Grid 01698 ! 01699 DO JJ=2,INLVLS-1 01700 DO JI=1,INI 01701 ZAMTRX(JI,JJ) = -ZDTERM(JI,JJ-1) 01702 ZBMTRX(JI,JJ) = ZCTERM(JI,JJ) + ZDTERM(JI,JJ-1) + ZDTERM(JI,JJ) 01703 ZCMTRX(JI,JJ) = -ZDTERM(JI,JJ) 01704 ZFRCV (JI,JJ) = ZCTERM(JI,JJ)*PSNOWTEMP(JI,JJ) - (PRADSINK(JI,JJ-1)-PRADSINK(JI,JJ)) 01705 ENDDO 01706 ENDDO 01707 ! 01708 !Lower BC 01709 ! 01710 ZAMTRX(:,INLVLS) = -ZDTERM(:,INLVLS-1) 01711 ZBMTRX(:,INLVLS) = ZCTERM(:,INLVLS) + ZDTERM(:,INLVLS-1) + & 01712 ZDTERM(:,INLVLS) 01713 ZCMTRX(:,INLVLS) = 0.0 01714 ZFRCV(:,INLVLS) = ZCTERM(:,INLVLS)*PSNOWTEMP(:,INLVLS) + & 01715 ZDTERM(:,INLVLS)*PTG(:) & 01716 - (PRADSINK(:,INLVLS-1)-PRADSINK(:,INLVLS)) 01717 ! 01718 ! - - ------------------------------------------------- 01719 ! 01720 ! 4. Compute solution vector 01721 ! -------------------------- 01722 ! 01723 CALL TRIDIAG_GROUND(ZAMTRX,ZBMTRX,ZCMTRX,ZFRCV,ZSNOWTEMP) 01724 ! 01725 ! Heat flux between surface and 2nd snow layers: (W/m2) 01726 ! 01727 PSNOWFLUX(:) = ZDTERM(:,1)*(ZSNOWTEMP(:,1) - ZSNOWTEMP(:,2)) 01728 ! 01729 ! 01730 ! 5. Snow melt case 01731 ! ----------------- 01732 ! If melting in uppermost layer, assume surface layer 01733 ! temperature at freezing point and re-evaluate lower 01734 ! snowpack temperatures. This is done as it is most likely 01735 ! most signigant melting will occur within a time step in surface layer. 01736 ! Surface energy budget (and fluxes) will 01737 ! be re-calculated (outside of this routine): 01738 ! 01739 ZAMTRX_M(:,1) = 0.0 01740 ZBMTRX_M(:,1) = ZCTERM(:,2) + ZDTERM(:,1) + ZDTERM(:,2) 01741 ZCMTRX_M(:,1) = -ZDTERM(:,2) 01742 ZFRCV_M(:,1) = ZCTERM(:,2)*PSNOWTEMP(:,2) + XTT*ZDTERM(:,1) - & 01743 (PRADSINK(:,1)-PRADSINK(:,2)) 01744 ! 01745 DO JJ=2,INLVLS-1 01746 DO JI=1,INI 01747 ZAMTRX_M (JI,JJ) = ZAMTRX (JI,JJ+1) 01748 ZBMTRX_M (JI,JJ) = ZBMTRX (JI,JJ+1) 01749 ZCMTRX_M (JI,JJ) = ZCMTRX (JI,JJ+1) 01750 ZFRCV_M (JI,JJ) = ZFRCV (JI,JJ+1) 01751 ZSNOWTEMP_M(JI,JJ) = PSNOWTEMP(JI,JJ+1) 01752 ENDDO 01753 ENDDO 01754 ! 01755 CALL TRIDIAG_GROUND(ZAMTRX_M,ZBMTRX_M,ZCMTRX_M,ZFRCV_M,ZSNOWTEMP_M) 01756 ! 01757 ! If melting for 2 consecuative time steps, then replace current T-profile 01758 ! with one assuming T=Tf in surface layer: 01759 ! 01760 ZSNOWTEMP_DELTA(:) = 0.0 01761 ! 01762 WHERE(ZSNOWTEMP(:,1) > XTT .AND. PSNOWTEMP(:,1) == XTT) 01763 PSNOWFLUX(:) = ZDTERM(:,1)*(XTT - ZSNOWTEMP_M(:,1)) 01764 ZSNOWTEMP_DELTA(:) = 1.0 01765 END WHERE 01766 ! 01767 DO JJ=2,INLVLS 01768 DO JI=1,INI 01769 ZSNOWTEMP(JI,JJ) = ZSNOWTEMP_DELTA(JI)*ZSNOWTEMP_M(JI,JJ-1) & 01770 + (1.0-ZSNOWTEMP_DELTA(JI))*ZSNOWTEMP(JI,JJ) 01771 ENDDO 01772 ENDDO 01773 ! 01774 ! 01775 ! 6. Lower boundary flux: 01776 ! ----------------------- 01777 ! NOTE: evaluate this term assuming the snow layer 01778 ! can't exceed the freezing point as this adjustment 01779 ! is made in melting routine. Then must adjust temperature 01780 ! to conserve energy: 01781 ! 01782 PGBASO(:) = ZDTERM(:,INLVLS)*(ZSNOWTEMP(:,INLVLS) -PTG(:)) 01783 PGBAS(:) = ZDTERM(:,INLVLS)*(MIN(XTT,ZSNOWTEMP(:,INLVLS))-PTG(:)) 01784 ! 01785 ZSNOWTEMP(:,INLVLS) = ZSNOWTEMP(:,INLVLS) + (PGBASO(:)-PGBAS(:))/ZCTERM(:,INLVLS) 01786 ! 01787 ! 7. Update temperatute profile in time: 01788 ! -------------------------------------- 01789 ! 01790 PSNOWTEMP(:,:) = ZSNOWTEMP(:,:) 01791 ! 01792 ! 01793 ! 8. Compute new (implicit) air T and specific humidity 01794 ! ----------------------------------------------------- 01795 ! 01796 PTA_IC(:) = PPET_B_COEF_T(:) + PPET_A_COEF_T(:)* PSNOWTEMP(:,1) 01797 ! 01798 PQA_IC(:) = PPEQ_B_COEF_T(:) + PPEQ_A_COEF_T(:)* PSNOWTEMP(:,1) 01799 IF (LHOOK) CALL DR_HOOK('SNOW3LSOLVT',1,ZHOOK_HANDLE) 01800 ! 01801 ! 01802 END SUBROUTINE SNOW3LSOLVT 01803 !#################################################################### 01804 !#################################################################### 01805 !#################################################################### 01806 SUBROUTINE SNOW3LMELT(PTSTEP,PSCAP,PSNOWTEMP,PSNOWDZ, & 01807 PSNOWRHO,PSNOWLIQ,PMELTXS ) 01808 ! 01809 ! 01810 !! PURPOSE 01811 !! ------- 01812 ! Calculate snow melt (resulting from surface fluxes, ground fluxes, 01813 ! or internal shortwave radiation absorbtion). It is used to 01814 ! augment liquid water content, maintain temperatures 01815 ! at or below freezing, and possibly reduce the mass 01816 ! or compact the layer(s). 01817 ! 01818 ! 01819 USE MODD_CSTS,ONLY : XTT, XLMTT, XRHOLW, XRHOLI 01820 ! 01821 USE MODE_SNOW3L 01822 ! 01823 IMPLICIT NONE 01824 ! 01825 !* 0.1 declarations of arguments 01826 ! 01827 REAL, INTENT(IN) :: PTSTEP 01828 ! 01829 REAL, DIMENSION(:,:), INTENT(IN) :: PSCAP 01830 ! 01831 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWDZ, PSNOWTEMP, PSNOWRHO, 01832 PSNOWLIQ 01833 ! 01834 REAL, DIMENSION(:), INTENT(OUT) :: PMELTXS 01835 ! 01836 ! 01837 !* 0.2 declarations of local variables 01838 ! 01839 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZPHASE, ZCMPRSFACT, 01840 ZSNOWLWE, ZWHOLDMAX, 01841 ZSNOWMELT, ZSNOWTEMP, 01842 ZMELTXS 01843 ! 01844 INTEGER :: JWRK, JI ! loop counter 01845 REAL(KIND=JPRB) :: ZHOOK_HANDLE 01846 !------------------------------------------------------------------------------- 01847 ! 01848 ! 0. Initialize: 01849 ! --------------------------- 01850 ! 01851 IF (LHOOK) CALL DR_HOOK('SNOW3LMELT',0,ZHOOK_HANDLE) 01852 ZPHASE(:,:) = 0.0 01853 ZCMPRSFACT(:,:) = 0.0 01854 ZSNOWLWE(:,:) = 0.0 01855 ZWHOLDMAX(:,:) = 0.0 01856 ZSNOWMELT(:,:) = 0.0 01857 ZSNOWTEMP(:,:) = 0.0 01858 ZMELTXS(:,:) = 0.0 01859 ! 01860 ! 1. Determine amount of melt in each layer: 01861 ! ------------------------------------------ 01862 ! 01863 WHERE(PSNOWDZ > 0.0) 01864 ! 01865 ! Total Liquid equivalent water content of snow (m): 01866 ! 01867 ZSNOWLWE(:,:) = PSNOWRHO(:,:)*PSNOWDZ(:,:)/XRHOLW 01868 ! 01869 ! Melt snow if excess energy and snow available: 01870 ! Phase change (J/m2) 01871 ! 01872 ZPHASE(:,:) = MIN(PSCAP(:,:)*MAX(0.0, PSNOWTEMP(:,:) - XTT)* & 01873 PSNOWDZ(:,:), & 01874 MAX(0.0,ZSNOWLWE(:,:)-PSNOWLIQ(:,:))*XLMTT*XRHOLW) 01875 ! 01876 ! 01877 ! Update snow liq water content and temperature if melting: 01878 ! liquid water available for next layer from melting of snow 01879 ! which is assumed to be leaving the current layer (m): 01880 ! 01881 ZSNOWMELT(:,:) = ZPHASE(:,:)/(XLMTT*XRHOLW) 01882 ! 01883 ! Cool off snow layer temperature due to melt: 01884 ! 01885 ZSNOWTEMP(:,:) = PSNOWTEMP(:,:) - ZPHASE(:,:)/(PSCAP(:,:)*PSNOWDZ(:,:)) 01886 ! 01887 PSNOWTEMP(:,:) = MIN(XTT, ZSNOWTEMP(:,:)) 01888 ! 01889 ZMELTXS(:,:) = (ZSNOWTEMP(:,:)-PSNOWTEMP(:,:))*PSCAP(:,:)*PSNOWDZ(:,:) 01890 ! 01891 ! Loss of snowpack depth: (m) and liquid equiv (m): 01892 ! Compression factor for melt loss: this decreases 01893 ! layer thickness and increases density thereby leaving 01894 ! total SWE constant. NOTE: All melt water 01895 ! in excess of the holding capacity is NOT used 01896 ! for compression, rather it decreases the layer 01897 ! thickness ONLY, causing a loss of SWE (outside 01898 ! of this routine). 01899 ! 01900 ZWHOLDMAX(:,:) = SNOW3LHOLD(PSNOWRHO,PSNOWDZ) 01901 ! 01902 ZCMPRSFACT(:,:) = (ZSNOWLWE(:,:)-MIN(PSNOWLIQ(:,:)+ZSNOWMELT(:,:), & 01903 ZWHOLDMAX(:,:)))/ & 01904 (ZSNOWLWE(:,:)-MIN(PSNOWLIQ(:,:),ZWHOLDMAX(:,:))) 01905 ! 01906 PSNOWDZ(:,:) = PSNOWDZ(:,:)*ZCMPRSFACT(:,:) 01907 PSNOWRHO(:,:) = ZSNOWLWE(:,:)*XRHOLW/PSNOWDZ(:,:) 01908 ! 01909 ! Make sure maximum density is not surpassed! If it is, lower the density 01910 ! and increase the snow thickness accordingly: 01911 01912 ZCMPRSFACT(:,:) = MAX(XRHOLI, PSNOWRHO(:,:))/XRHOLI 01913 PSNOWDZ(:,:) = PSNOWDZ(:,:)*ZCMPRSFACT(:,:) 01914 PSNOWRHO(:,:) = ZSNOWLWE(:,:)*XRHOLW/PSNOWDZ(:,:) 01915 ! 01916 ! 01917 ! 2. Add snow melt to current snow liquid water content: 01918 ! ------------------------------------------------------ 01919 ! 01920 PSNOWLIQ(:,:) = PSNOWLIQ(:,:) + ZSNOWMELT(:,:) 01921 ! 01922 END WHERE 01923 ! 01924 ! 3. Excess heat from melting 01925 ! --------------------------- 01926 ! use it to warm underlying ground/vegetation layer to conserve energy 01927 ! 01928 PMELTXS(:) = 0. 01929 DO JWRK = 1, SIZE(ZMELTXS,2) 01930 DO JI = 1, SIZE(ZMELTXS,1) 01931 PMELTXS(JI) = PMELTXS(JI) + ZMELTXS(JI,JWRK) 01932 ENDDO 01933 ENDDO 01934 PMELTXS(:) = PMELTXS(:) / PTSTEP ! (W/m2) 01935 IF (LHOOK) CALL DR_HOOK('SNOW3LMELT',1,ZHOOK_HANDLE) 01936 ! 01937 ! 01938 ! 01939 END SUBROUTINE SNOW3LMELT 01940 !#################################################################### 01941 !#################################################################### 01942 !#################################################################### 01943 SUBROUTINE SNOW3LREFRZ(PTSTEP,PRR, & 01944 PSNOWRHO,PSNOWTEMP,PSNOWDZ,PSNOWLIQ, & 01945 PTHRUFAL ) 01946 ! 01947 ! 01948 !! PURPOSE 01949 !! ------- 01950 ! Calculate any freezing/refreezing of liquid water in the snowpack. 01951 ! Also, calculate liquid water transmission and snow runoff. 01952 ! Water flow causes layer thickness reduction and can cause 01953 ! rapid densification of a layer. 01954 ! 01955 ! 01956 USE MODD_CSTS, ONLY : XTT, XLMTT, XRHOLW 01957 USE MODD_SNOW_PAR, ONLY : XSNOWDMIN 01958 ! 01959 USE MODE_SNOW3L 01960 ! 01961 IMPLICIT NONE 01962 ! 01963 !* 0.1 declarations of arguments 01964 ! 01965 REAL, INTENT(IN) :: PTSTEP 01966 ! 01967 REAL, DIMENSION(:), INTENT(IN) :: PRR 01968 ! 01969 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWDZ, PSNOWTEMP, PSNOWLIQ, PSNOWRHO 01970 ! 01971 REAL, DIMENSION(:), INTENT(INOUT) :: PTHRUFAL 01972 ! 01973 ! 01974 ! 01975 !* 0.2 declarations of local variables 01976 ! 01977 INTEGER :: JJ, JI 01978 ! 01979 INTEGER :: INI 01980 INTEGER :: INLVLS 01981 ! 01982 REAL, DIMENSION(SIZE(PRR)) :: ZPCPXS, ZTOTWCAP, ZRAINFALL 01983 ! 01984 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZPHASE, ZFLOWLIQ, 01985 ZSNOWLIQ, ZSNOWRHO, 01986 ZWHOLDMAX, ZSNOWDZ, 01987 ZSNOWTEMP, ZSCAP 01988 ! 01989 REAL, DIMENSION(SIZE(PSNOWRHO,1),0:SIZE(PSNOWRHO,2)) :: ZFLOWLIQT 01990 REAL(KIND=JPRB) :: ZHOOK_HANDLE 01991 ! 01992 !------------------------------------------------------------------------------- 01993 ! 01994 ! 0. Initialize: 01995 ! -------------- 01996 ! 01997 IF (LHOOK) CALL DR_HOOK('SNOW3LREFRZ',0,ZHOOK_HANDLE) 01998 ZSNOWRHO(:,:) = PSNOWRHO(:,:) 01999 ZSNOWLIQ(:,:) = PSNOWLIQ(:,:) 02000 ZSNOWTEMP(:,:) = PSNOWTEMP(:,:) 02001 INI = SIZE(PSNOWDZ(:,:),1) 02002 INLVLS = SIZE(PSNOWDZ(:,:),2) 02003 ! 02004 ! 02005 ! 1. Refreeze due to heat transfer 02006 ! ----------------------------- 02007 ! Freeze liquid water in any layers which cooled due 02008 ! to heat transfer. 02009 ! 02010 ZSCAP(:,:) = SNOW3LSCAP(ZSNOWRHO) 02011 ZPHASE(:,:) = MIN(ZSCAP(:,:)* & 02012 MAX(0.0, XTT - ZSNOWTEMP(:,:))*PSNOWDZ(:,:), & 02013 ZSNOWLIQ(:,:)*XLMTT*XRHOLW) 02014 ! 02015 ! 02016 ! Warm layer and reduce liquid if freezing occurs: 02017 ! 02018 ZSNOWDZ(:,:) = MAX(XSNOWDMIN/INLVLS, PSNOWDZ(:,:)) 02019 ! 02020 PSNOWTEMP(:,:) = ZSNOWTEMP(:,:) + ZPHASE(:,:)/(ZSCAP(:,:)*ZSNOWDZ(:,:)) 02021 ! 02022 ! Reduce liquid portion if freezing occurs: 02023 ! 02024 ZSNOWLIQ(:,:) = ZSNOWLIQ(:,:) - ( (PSNOWTEMP(:,:)-ZSNOWTEMP(:,:))* & 02025 ZSCAP(:,:)*ZSNOWDZ(:,:)/(XLMTT*XRHOLW) ) 02026 ! 02027 ! 02028 ! 2. Reduce thickness due to snowmelt in excess of holding capacity 02029 ! -------------------------------------------------------------- 02030 ! Any water in excess of the 02031 ! Maximum holding space for liquid water 02032 ! amount is drained into next layer down. 02033 ! Loss of water due to snowmelt causes a reduction 02034 ! in snow layer mass by a reduction in thickness. 02035 ! 02036 ZWHOLDMAX(:,:) = SNOW3LHOLD(PSNOWRHO,PSNOWDZ) 02037 ! 02038 ZFLOWLIQ(:,:) = MAX(0.,ZSNOWLIQ(:,:)-ZWHOLDMAX(:,:)) 02039 ! 02040 ZSNOWLIQ(:,:) = ZSNOWLIQ(:,:) - ZFLOWLIQ(:,:) 02041 ! 02042 ZSNOWDZ(:,:) = PSNOWDZ(:,:) - ZFLOWLIQ(:,:)*XRHOLW/ZSNOWRHO(:,:) 02043 ! 02044 ZSNOWDZ(:,:) = MAX(0.0, ZSNOWDZ(:,:)) ! to prevent possible very small 02045 ! negative values (machine prescision 02046 ! as snow vanishes 02047 ! 02048 ! 02049 ! 3. Liquid water flow: liquid precipitation and meltwater 02050 ! ----------------------------------------------------- 02051 ! 02052 ! Rainfall flowing into uppermost snow layer: 02053 ! If rainfall is excessive enough (or layers thin enough) 02054 ! it is simply routed directly to runoff: First calculate 02055 ! the total snow pack available liquid water holding capacity: 02056 ! 02057 ZTOTWCAP(:) = 0. 02058 DO JJ=1,INLVLS 02059 DO JI=1,INI 02060 ZTOTWCAP(JI) = ZTOTWCAP(JI) + ZWHOLDMAX(JI,JJ) 02061 ENDDO 02062 ENDDO 02063 ! 02064 ! Rain entering snow (m): 02065 ! 02066 ZRAINFALL(:) = PRR(:)*PTSTEP/XRHOLW ! rainfall (m) 02067 ! 02068 ZFLOWLIQT(:,0)= MIN(ZRAINFALL(:),ZTOTWCAP(:)) 02069 ! 02070 ! Rain assumed to directly pass through the pack to runoff (m): 02071 ! 02072 ZPCPXS(:) = ZRAINFALL(:) - ZFLOWLIQT(:,0) 02073 ! 02074 DO JJ=1,INLVLS 02075 DO JI=1,INI 02076 ZFLOWLIQT(JI,JJ) = ZFLOWLIQ(JI,JJ) 02077 ENDDO 02078 ENDDO 02079 ! 02080 ! 02081 ! Thickness is maintained during water through-flow, 02082 ! so that mass transfer is represented by 02083 ! density changes: NOTE a maximum density 02084 ! is assumed (XRHOSMAX_ES) so that all flow 02085 ! which would result in densities exceeding 02086 ! this limit are routed to next layer down. 02087 ! First test for saturation, then 02088 ! rout excess water down to next layer down 02089 ! and repeat calculation. Net gain in liquid (mass) is 02090 ! translated into a density increase: 02091 ! 02092 ZFLOWLIQ(:,:) = 0.0 ! clear this array for work 02093 PSNOWLIQ(:,:) = ZSNOWLIQ(:,:) ! reset liquid water content 02094 ! 02095 DO JJ=1,INLVLS 02096 DO JI=1,INI 02097 ZSNOWLIQ(JI,JJ) = ZSNOWLIQ(JI,JJ) + ZFLOWLIQT(JI,JJ-1) 02098 ZFLOWLIQ(JI,JJ) = MAX(0.0, ZSNOWLIQ(JI,JJ)-ZWHOLDMAX(JI,JJ)) 02099 ZSNOWLIQ(JI,JJ) = ZSNOWLIQ(JI,JJ) - ZFLOWLIQ(JI,JJ) 02100 ZSNOWRHO(JI,JJ) = ZSNOWRHO(JI,JJ) + (ZSNOWLIQ(JI,JJ) - PSNOWLIQ(JI,JJ))* & 02101 XRHOLW/MAX(XSNOWDMIN/INLVLS,ZSNOWDZ(JI,JJ)) 02102 ZFLOWLIQT(JI,JJ) = ZFLOWLIQT(JI,JJ) + ZFLOWLIQ(JI,JJ) 02103 ENDDO 02104 ENDDO 02105 ! 02106 ! 02107 ! Any remaining throughflow after freezing is available to 02108 ! the soil for infiltration or surface runoff (m). 02109 ! I.E. This is the amount of water leaving the snowpack: 02110 ! Rate water leaves the snowpack [kg/(m2 s)]: 02111 ! 02112 PTHRUFAL(:) = PTHRUFAL(:) + ZFLOWLIQT(:,INLVLS) 02113 ! 02114 ! Add excess rain (rain which flowed directly through the snow 02115 ! due to saturation): 02116 ! 02117 PTHRUFAL(:) = (PTHRUFAL(:) + ZPCPXS(:))*XRHOLW/PTSTEP 02118 ! 02119 ! 02120 ! 4. Update thickness and density and any freezing: 02121 ! ---------------------------------------------- 02122 ! 02123 PSNOWDZ(:,:) = ZSNOWDZ(:,:) 02124 PSNOWRHO(:,:) = ZSNOWRHO(:,:) 02125 PSNOWLIQ(:,:) = ZSNOWLIQ(:,:) 02126 IF (LHOOK) CALL DR_HOOK('SNOW3LREFRZ',1,ZHOOK_HANDLE) 02127 ! 02128 !------------------------------------------------------------------------------- 02129 ! 02130 END SUBROUTINE SNOW3LREFRZ 02131 !#################################################################### 02132 !#################################################################### 02133 !#################################################################### 02134 SUBROUTINE SNOW3LFLUX(PSNOWTEMP,PSNOWDZ,PEXNS,PEXNA, & 02135 PUSTAR2_IC, & 02136 PTSTEP,PALBT,PSW_RAD,PEMIST,PLWUPSNOW, & 02137 PLW_RAD,PTA,PSFCFRZ,PQA,PHPSNOW, & 02138 PSNOWTEMPO1,PSNOWFLUX,PCT,PRADSINK, & 02139 PQSAT,PDQSAT,PRSRA, & 02140 PRN,PH,PGFLUX,PLES3L,PLEL3L,PEVAP, & 02141 PUSTAR,OSFCMELT ) 02142 ! 02143 ! 02144 !! PURPOSE 02145 !! ------- 02146 ! Calculate the surface fluxes (atmospheric/surface). 02147 ! (Noilhan and Planton 1989; Noilhan and Mahfouf 1996) 02148 ! 02149 ! 02150 USE MODD_CSTS,ONLY : XSTEFAN, XCPD, XLSTT, XLVTT, XTT 02151 ! 02152 USE MODE_THERMOS 02153 ! 02154 IMPLICIT NONE 02155 ! 02156 !* 0.1 declarations of arguments 02157 ! 02158 REAL, INTENT(IN) :: PTSTEP 02159 ! 02160 REAL, DIMENSION(:), INTENT(IN) :: PSNOWDZ, PSNOWTEMPO1, PSNOWFLUX, PCT, 02161 PRADSINK, PEXNS, PEXNA 02162 ! 02163 REAL, DIMENSION(:), INTENT(IN) :: PALBT, PSW_RAD, PEMIST, PLW_RAD, 02164 PTA, PSFCFRZ, PQA, 02165 PHPSNOW, PQSAT, PDQSAT, PRSRA, 02166 PUSTAR2_IC 02167 ! 02168 REAL, DIMENSION(:), INTENT(INOUT) :: PSNOWTEMP 02169 ! 02170 REAL, DIMENSION(:), INTENT(OUT) :: PRN, PH, PGFLUX, PLES3L, PLEL3L, 02171 PEVAP, PLWUPSNOW, PUSTAR 02172 ! 02173 LOGICAL, DIMENSION(:), INTENT(OUT) :: OSFCMELT 02174 ! 02175 ! 02176 !* 0.2 declarations of local variables 02177 ! 02178 REAL, DIMENSION(SIZE(PSNOWDZ)) :: ZEVAPC, ZLE, ZSNOWTEMP, ZSMSNOW, ZGFLUX, 02179 ZDELTAT, ZSNOWTO3 02180 REAL(KIND=JPRB) :: ZHOOK_HANDLE 02181 ! 02182 !------------------------------------------------------------------------------- 02183 ! 02184 ! 0. Initialize: 02185 ! -------------- 02186 ! 02187 IF (LHOOK) CALL DR_HOOK('SNOW3LFLUX',0,ZHOOK_HANDLE) 02188 ZSNOWTEMP(:) = PSNOWTEMP(:) 02189 ZLE(:) = 0.0 02190 ZSMSNOW(:) = 0.0 02191 ZGFLUX(:) = 0.0 02192 ! 02193 OSFCMELT(:) = .FALSE. 02194 ! 02195 ZSNOWTO3(:) = PSNOWTEMPO1(:) ** 3 ! to save some CPU time, store this 02196 ! 02197 ! 1. Flux calculations when melt not occuring at surface (W/m2): 02198 ! -------------------------------------------------------------- 02199 ! 02200 ! 02201 ZDELTAT(:) = PSNOWTEMP(:) - PSNOWTEMPO1(:) ! surface T time change: 02202 ! 02203 PLWUPSNOW(:) = PEMIST(:) * XSTEFAN * ZSNOWTO3(:)*( PSNOWTEMPO1(:) + 4.* ZDELTAT(:) ) 02204 ! 02205 PRN(:) = (1. - PALBT(:)) * PSW_RAD(:) + PEMIST(:) * PLW_RAD(:) - PLWUPSNOW(:) 02206 ! 02207 PH(:) = PRSRA(:) * XCPD * (PSNOWTEMP(:)/PEXNS(:) - PTA(:)/PEXNA(:)) 02208 ! 02209 ZEVAPC(:) = PRSRA(:) * ( (PQSAT(:) - PQA(:)) + PDQSAT(:)*ZDELTAT(:) ) 02210 ! 02211 PLES3L(:) = PSFCFRZ(:) * XLSTT * ZEVAPC(:) 02212 ! 02213 PLEL3L(:) = (1.-PSFCFRZ(:))* XLVTT * ZEVAPC(:) 02214 ! 02215 ZLE(:) = PLES3L(:) + PLEL3L(:) 02216 ! 02217 PGFLUX(:) = PRN(:) - PH(:) - ZLE(:) + PHPSNOW(:) 02218 ! 02219 ! 02220 ! 2. Initial melt adjustment 02221 ! -------------------------- 02222 ! If energy avalabile to melt snow, then recalculate fluxes 02223 ! at the freezing point and add residual heat to layer 02224 ! average heat. 02225 ! 02226 ! A) If temperature change is > 0 and passes freezing point this timestep, 02227 ! then recalculate fluxes at freezing point and excess energy 02228 ! will be used outside of this routine to change snow heat content: 02229 ! 02230 WHERE (PSNOWTEMP > XTT .AND. PSNOWTEMPO1 < XTT) 02231 ! 02232 OSFCMELT(:)= .TRUE. 02233 ! 02234 ZDELTAT(:) = XTT - PSNOWTEMPO1(:) 02235 ! 02236 PLWUPSNOW(:) = PEMIST(:) * XSTEFAN * ZSNOWTO3(:)*( PSNOWTEMPO1(:) + 4.* ZDELTAT(:) ) 02237 ! 02238 PRN(:) = (1. - PALBT(:)) * PSW_RAD(:) + PEMIST(:) * PLW_RAD(:) - PLWUPSNOW(:) 02239 ! 02240 PH(:) = PRSRA(:) * XCPD * (XTT/PEXNS(:) - PTA(:)/PEXNA(:)) 02241 ! 02242 ZEVAPC(:) = PRSRA(:) * ( (PQSAT(:) - PQA(:)) + PDQSAT(:)*ZDELTAT(:) ) 02243 ! 02244 PLES3L(:) = PSFCFRZ(:) * XLSTT * ZEVAPC(:) 02245 ! 02246 PLEL3L(:) = (1.-PSFCFRZ(:))* XLVTT * ZEVAPC(:) 02247 ! 02248 ZLE(:) = PLES3L(:) + PLEL3L(:) 02249 ! 02250 ZGFLUX(:) = PRN(:) - PH(:) - ZLE(:) + PHPSNOW(:) 02251 ! 02252 ZSMSNOW(:) = PGFLUX(:) - ZGFLUX(:) 02253 ! 02254 PGFLUX(:) = ZGFLUX(:) 02255 ! 02256 ! This will be used to change heat content of snow: 02257 ! 02258 ZSNOWTEMP(:) = PSNOWTEMP(:) - ZSMSNOW(:)*PTSTEP*PCT(:) 02259 ! 02260 END WHERE 02261 ! 02262 ! 3. Ongoing melt adjustment: explicit solution 02263 ! --------------------------------------------- 02264 ! If temperature change is 0 and at freezing point this timestep, 02265 ! then recalculate fluxes and surface temperature *explicitly* 02266 ! as this is *exact* for snow at freezing point (Brun, Martin) 02267 ! 02268 WHERE(PSNOWTEMP(:) > XTT .AND. PSNOWTEMPO1(:) >= XTT) 02269 ! 02270 OSFCMELT(:) = .TRUE. 02271 ! 02272 PLWUPSNOW(:) = PEMIST(:) * XSTEFAN * (XTT ** 4) 02273 ! 02274 PRN(:) = (1. - PALBT(:)) * PSW_RAD(:) + PEMIST(:) * PLW_RAD(:) - PLWUPSNOW(:) 02275 ! 02276 PH(:) = PRSRA(:) * XCPD * (XTT/PEXNS(:) - PTA(:)/PEXNA(:)) 02277 ! 02278 ZEVAPC(:) = PRSRA(:) * (PQSAT(:) - PQA(:)) 02279 ! 02280 PLES3L(:) = PSFCFRZ(:) * XLSTT * ZEVAPC(:) 02281 ! 02282 PLEL3L(:) = (1.-PSFCFRZ(:))* XLVTT * ZEVAPC(:) 02283 ! 02284 ZLE(:) = PLES3L(:) + PLEL3L(:) 02285 ! 02286 PGFLUX(:) = PRN(:) - PH(:) - ZLE(:) + PHPSNOW(:) 02287 ! 02288 ZSNOWTEMP(:) = XTT + PTSTEP*PCT(:)*(PGFLUX(:) + PRADSINK(:) - PSNOWFLUX(:)) 02289 ! 02290 END WHERE 02291 ! 02292 ! 4. Update surface temperature: 02293 ! ------------------------------ 02294 ! 02295 PSNOWTEMP(:) = ZSNOWTEMP(:) 02296 ! 02297 ! 5. Final evaporative flux (kg/m2/s) 02298 ! 02299 PEVAP(:) = ZEVAPC(:) 02300 ! 02301 ! 6. Friction velocity 02302 ! -------------------- 02303 ! 02304 PUSTAR(:) = SQRT(PUSTAR2_IC(:)) 02305 ! 02306 IF (LHOOK) CALL DR_HOOK('SNOW3LFLUX',1,ZHOOK_HANDLE) 02307 ! 02308 !------------------------------------------------------------------------------- 02309 ! 02310 END SUBROUTINE SNOW3LFLUX 02311 !#################################################################### 02312 !#################################################################### 02313 !#################################################################### 02314 SUBROUTINE SNOW3LEVAPN(PPSN3L,PLES3L,PLEL3L,PTSTEP,PSNOWTEMP, & 02315 PSNOWRHO,PSNOWDZ,PSNOWLIQ,PEVAPCOR) 02316 ! 02317 ! 02318 !! PURPOSE 02319 !! ------- 02320 ! Remove mass from uppermost snow layer in response to 02321 ! evaporation (liquid) and sublimation. 02322 ! 02323 ! 02324 USE MODD_CSTS, ONLY : XLVTT, XRHOLW, XLSTT, XLMTT, XCI, XTT 02325 USE MODD_SNOW_PAR, ONLY : XRHOSMIN_ES, XSNOWDMIN 02326 ! 02327 IMPLICIT NONE 02328 ! 02329 !* 0.1 declarations of arguments 02330 ! 02331 REAL, INTENT(IN) :: PTSTEP 02332 ! 02333 REAL, DIMENSION(:), INTENT(IN) :: PPSN3L 02334 ! 02335 REAL, DIMENSION(:), INTENT(IN) :: PLES3L, PLEL3L ! (W/m2) 02336 ! 02337 REAL, DIMENSION(:), INTENT(INOUT) :: PSNOWRHO, PSNOWDZ, PSNOWLIQ, 02338 PEVAPCOR, PSNOWTEMP 02339 ! 02340 !* 0.2 declarations of local variables 02341 ! 02342 REAL, DIMENSION(SIZE(PLES3L)) :: ZSNOWEVAPS, ZSNOWEVAP, ZSNOWEVAPX, 02343 ZSNOWDZ, ZEVAPCOR, ZSNOWHEAT, ZSCAP 02344 REAL(KIND=JPRB) :: ZHOOK_HANDLE 02345 ! ZEVAPCOR = for vanishingy thin snow cover, 02346 ! allow any excess evaporation 02347 ! to be extracted from the soil 02348 ! to maintain an accurate water 02349 ! balance [kg/(m2 s)] 02350 ! 02351 ! 02352 !------------------------------------------------------------------------------- 02353 ! 02354 ! 0. Initialize: 02355 ! -------------- 02356 ! 02357 IF (LHOOK) CALL DR_HOOK('SNOW3LEVAPN',0,ZHOOK_HANDLE) 02358 ZEVAPCOR(:) = 0.0 02359 ZSNOWEVAPS(:) = 0.0 02360 ZSNOWEVAP(:) = 0.0 02361 ZSNOWEVAPX(:) = 0.0 02362 ZSNOWDZ(:) = 0.0 02363 ZSCAP(:) = 0.0 02364 ZSNOWHEAT(:) = 0.0 02365 ! 02366 ! 02367 ! 02368 WHERE(PSNOWDZ > 0.0) 02369 ! 02370 ! 1. Evaporation of snow liquid water 02371 ! ----------------------------------- 02372 ! Evaporation reduces liq water equivalent content 02373 ! of snow pack either by reducing the snow density 02374 ! (evaporation) or the layer thickness (sublimation). 02375 ! Condensation does the reverse. 02376 ! 02377 ! Multiply evaporation components by snow fraction 02378 ! to be consistent with fluxes from the snow covered 02379 ! fraction of grid box 02380 ! 02381 ! Evaporation: 02382 ! Reduce density and liquid water content: 02383 ! 02384 ZSNOWEVAP(:) = PPSN3L(:)*PLEL3L(:)*PTSTEP/(XLVTT*XRHOLW) 02385 ZSNOWEVAPX(:) = MIN(ZSNOWEVAP(:),PSNOWLIQ(:)) 02386 ! 02387 ! 02388 PSNOWRHO(:) = PSNOWRHO(:) - ZSNOWEVAPX(:)*XRHOLW/PSNOWDZ(:) 02389 PSNOWLIQ(:) = PSNOWLIQ(:) - ZSNOWEVAPX(:) 02390 ! 02391 ! 02392 ! Budget check: If density drops below minimum, then extract the 02393 ! corresponding water mass from soil (for vanishingly thin snow covers): 02394 ! 02395 ZEVAPCOR(:) = MAX(0.0,XRHOSMIN_ES-PSNOWRHO(:))*PSNOWDZ(:)/PTSTEP 02396 PSNOWRHO(:) = MAX(XRHOSMIN_ES,PSNOWRHO(:)) 02397 ! 02398 ! 02399 ! Budget check: as last traces of liquid in snow evaporates, it is possible 02400 ! evaporation could exceed liquid present in snow. If this is the case, 02401 ! remove residual mass from solid snow in order to maintain high 02402 ! accuracy water balance: 02403 ! 02404 ZSNOWEVAPX(:) = MAX(0.0, ZSNOWEVAP(:) - ZSNOWEVAPX(:)) 02405 ZSNOWDZ(:) = PSNOWDZ(:) - ZSNOWEVAPX(:)*XRHOLW/PSNOWRHO(:) 02406 PSNOWDZ(:) = MAX(0.0, ZSNOWDZ(:)) 02407 ZEVAPCOR(:) = ZEVAPCOR(:) + MAX(0.0,-ZSNOWDZ(:))*PSNOWRHO(:)/PTSTEP 02408 ! 02409 !! 2. Sublimation of snow ice 02410 ! --------------------------- 02411 ! Reduce layer thickness and total snow depth 02412 ! if sublimation: add to correction term if potential 02413 ! sublimation exceeds available snow cover. 02414 ! 02415 ZSNOWEVAPS(:) = PPSN3L(:)*PLES3L(:)*PTSTEP/(XLSTT*PSNOWRHO(:)) 02416 ZSNOWDZ(:) = PSNOWDZ(:) - ZSNOWEVAPS(:) 02417 PSNOWDZ(:) = MAX(0.0, ZSNOWDZ(:)) 02418 ZEVAPCOR(:) = ZEVAPCOR(:) + MAX(0.0,-ZSNOWDZ(:))*PSNOWRHO(:)/PTSTEP 02419 ! 02420 ! Adjust heat content considering mass loss...NOTE, temperature does not 02421 ! change unless *possibly* if liquid present in the snowpack 02422 ! 02423 ZSCAP(:) = SNOW3LSCAP(PSNOWRHO) 02424 ZSNOWHEAT(:) = PSNOWDZ(:)*( ZSCAP(:)*(PSNOWTEMP(:)-XTT) & 02425 - XLMTT*PSNOWRHO(:) ) + XLMTT*XRHOLW*PSNOWLIQ(:) 02426 ! 02427 PSNOWTEMP(:) = XTT + ( ((ZSNOWHEAT(:)/MAX(XSNOWDMIN,PSNOWDZ(:))) & 02428 + XLMTT*PSNOWRHO(:))/ZSCAP(:) ) 02429 ! 02430 PSNOWLIQ(:) = MAX(0.0,PSNOWTEMP(:)-XTT)*ZSCAP(:)* & 02431 PSNOWDZ(:)/(XLMTT*XRHOLW) 02432 ! 02433 PSNOWTEMP(:) = MIN(XTT,PSNOWTEMP(:)) 02434 ! 02435 END WHERE 02436 ! 02437 ! 3. Update evaporation correction term: 02438 ! -------------------------------------- 02439 ! 02440 PEVAPCOR(:) = PEVAPCOR(:) + ZEVAPCOR(:) 02441 IF (LHOOK) CALL DR_HOOK('SNOW3LEVAPN',1,ZHOOK_HANDLE) 02442 ! 02443 !------------------------------------------------------------------------------- 02444 ! 02445 END SUBROUTINE SNOW3LEVAPN 02446 !#################################################################### 02447 !#################################################################### 02448 !#################################################################### 02449 SUBROUTINE SNOW3LGONE(PTSTEP,PPSN3L,PLEL3L,PLES3L,PSNOWRHO, & 02450 PSNOWHEAT,PRADSINK,PEVAPCOR,PTHRUFAL,PGRNDFLUX, & 02451 PGFLUXSNOW,PGRNDFLUXO,PSNOWDZ,PSNOWLIQ,PSNOWTEMP, & 02452 PRADXS) 02453 ! 02454 ! 02455 ! 02456 !! PURPOSE 02457 !! ------- 02458 ! Account for the case when the last trace of snow melts 02459 ! during a time step: ensure mass and heat balance of 02460 ! snow AND underlying surface. 02461 ! 02462 ! 02463 USE MODD_CSTS,ONLY : XTT, XLSTT, XLVTT 02464 ! 02465 IMPLICIT NONE 02466 ! 02467 !* 0.1 declarations of arguments 02468 ! 02469 REAL, INTENT(IN) :: PTSTEP 02470 ! 02471 REAL, DIMENSION(:), INTENT(IN) :: PPSN3L, PLEL3L, PLES3L, PGFLUXSNOW, 02472 PRADSINK, PGRNDFLUXO 02473 ! 02474 REAL, DIMENSION(:,:), INTENT(IN) :: PSNOWRHO, PSNOWHEAT 02475 ! 02476 REAL, DIMENSION(:), INTENT(INOUT) :: PGRNDFLUX, PRADXS 02477 ! 02478 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWDZ, PSNOWLIQ, PSNOWTEMP 02479 ! 02480 REAL, DIMENSION(:), INTENT(OUT) :: PTHRUFAL ! melt water [kg/(m2 s)] 02481 ! 02482 REAL, DIMENSION(:), INTENT(OUT) :: PEVAPCOR ! [kg/(m2 s)] 02483 ! PEVAPCOR = for vanishingy thin snow cover, 02484 ! allow any excess evaporation 02485 ! to be extracted from the soil 02486 ! to maintain an accurate water 02487 ! balance. 02488 ! 02489 !* 0.2 declarations of local variables 02490 ! 02491 INTEGER :: JJ, JI 02492 ! 02493 INTEGER :: INI 02494 INTEGER :: INLVLS 02495 ! 02496 REAL, DIMENSION(SIZE(PLES3L)) :: ZSNOWHEATC, ZSNOWGONE_DELTA 02497 REAL(KIND=JPRB) :: ZHOOK_HANDLE 02498 ! 02499 !------------------------------------------------------------------------------- 02500 ! 02501 ! 0. Initialize: 02502 ! -------------- 02503 ! 02504 IF (LHOOK) CALL DR_HOOK('SNOW3LGONE',0,ZHOOK_HANDLE) 02505 PEVAPCOR(:) = 0.0 02506 PTHRUFAL(:) = 0.0 02507 INI = SIZE(PSNOWDZ(:,:),1) 02508 INLVLS = SIZE(PSNOWDZ(:,:),2) 02509 ZSNOWHEATC(:) = 0. 02510 DO JJ=1,INLVLS 02511 DO JI=1,INI 02512 ZSNOWHEATC(JI) = ZSNOWHEATC(JI) + PSNOWHEAT(JI,JJ) ! total heat content (J m-2) 02513 ENDDO 02514 ENDDO 02515 ZSNOWGONE_DELTA(:) = 1.0 02516 ! 02517 ! 1. Simple test to see if snow vanishes: 02518 ! --------------------------------------- 02519 ! If so, set thicknesses (and therefore mass and heat) and liquid content 02520 ! to zero, and adjust fluxes of water, evaporation and heat into underlying 02521 ! surface. Note, test with flux computed *before* correction since this represents 02522 ! actual inflow of heat from below (as heat content correction owing to a corrected 02523 ! flux has not yet been done: here we compare to pre-corrected heat content). 02524 ! 02525 WHERE(PGFLUXSNOW(:) - PGRNDFLUXO(:) + PRADSINK(:) >= (-ZSNOWHEATC(:)/PTSTEP) ) 02526 PGRNDFLUX(:) = PGFLUXSNOW(:) + (ZSNOWHEATC(:)/PTSTEP) 02527 PEVAPCOR(:) = PPSN3L(:)*((PLEL3L(:)/XLVTT) + (PLES3L(:)/(XLSTT*PSNOWRHO(:,1)))) 02528 PRADXS(:) = 0.0 02529 ZSNOWGONE_DELTA(:) = 0.0 ! FLAG...if=0 then snow vanishes, else=1 02530 END WHERE 02531 ! 02532 PTHRUFAL(:) = 0. 02533 DO JJ=1,INLVLS 02534 DO JI=1,INI 02535 PTHRUFAL(JI) = PTHRUFAL(JI) + (1.0-ZSNOWGONE_DELTA(JI))*PSNOWRHO(JI,JJ)*PSNOWDZ(JI,JJ)/PTSTEP 02536 ENDDO 02537 END DO 02538 ! 02539 ! 2. Final update of snow state 02540 ! ----------------------------- 02541 ! (either still present or not): 02542 ! 02543 DO JJ=1,INLVLS 02544 DO JI=1,INI 02545 PSNOWDZ (JI,JJ) = PSNOWDZ (JI,JJ)*ZSNOWGONE_DELTA(JI) 02546 PSNOWLIQ (JI,JJ) = PSNOWLIQ (JI,JJ)*ZSNOWGONE_DELTA(JI) 02547 PSNOWTEMP(JI,JJ) = (1.0-ZSNOWGONE_DELTA(JI))*XTT + PSNOWTEMP(JI,JJ)*ZSNOWGONE_DELTA(JI) 02548 ENDDO 02549 ENDDO 02550 IF (LHOOK) CALL DR_HOOK('SNOW3LGONE',1,ZHOOK_HANDLE) 02551 ! 02552 ! 02553 END SUBROUTINE SNOW3LGONE 02554 !#################################################################### 02555 !#################################################################### 02556 !#################################################################### 02557 SUBROUTINE SNOW3LEVAPGONE(PSNOWHEAT,PSNOWDZ,PSNOWRHO,PSNOWTEMP,PSNOWLIQ) 02558 ! 02559 !! PURPOSE 02560 !! ------- 02561 ! 02562 ! If all snow in uppermost layer evaporates/sublimates, re-distribute 02563 ! grid (below assumes very thin snowpacks so layer-thicknesses are 02564 ! constant). 02565 ! 02566 ! 02567 USE MODD_CSTS, ONLY : XTT, XRHOLW, XLMTT 02568 USE MODD_SNOW_PAR, ONLY : XRHOSMIN_ES, XSNOWDMIN, XRHOSMAX_ES 02569 ! 02570 IMPLICIT NONE 02571 ! 02572 !* 0.1 declarations of arguments 02573 ! 02574 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWRHO ! snow density profile (kg/m3) 02575 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWDZ ! snow layer thickness profile (m) 02576 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWHEAT ! snow heat content/enthalpy (J/m2) 02577 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWTEMP ! snow temperature profile (K) 02578 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWLIQ ! snow liquid water profile (m) 02579 ! 02580 !* 0.2 declarations of local variables 02581 ! 02582 INTEGER :: JJ, JI 02583 ! 02584 INTEGER :: INI 02585 INTEGER :: INLVLS 02586 ! 02587 REAL, DIMENSION(SIZE(PSNOWDZ,1)) :: ZSNOWHEAT_1D ! total heat content (J/m2) 02588 REAL, DIMENSION(SIZE(PSNOWDZ,1)) :: ZSNOW ! total snow depth (m) 02589 REAL, DIMENSION(SIZE(PSNOWDZ,1)) :: ZMASS ! total mass 02590 ! 02591 REAL, DIMENSION(SIZE(PSNOWDZ,1),SIZE(PSNOWDZ,2)) :: ZSCAP ! Snow layer heat capacity (J/K/m3) 02592 ! 02593 REAL(KIND=JPRB) :: ZHOOK_HANDLE 02594 ! 02595 !------------------------------------------------------------------------------- 02596 ! 02597 ! Initialize: 02598 ! 02599 IF (LHOOK) CALL DR_HOOK('SNOW3LEVAPGONE',0,ZHOOK_HANDLE) 02600 INI = SIZE(PSNOWDZ,1) 02601 INLVLS = SIZE(PSNOWDZ,2) 02602 ! 02603 ! First, determine where uppermost snow layer has completely 02604 ! evaporated/sublimated (as it becomes thin): 02605 ! 02606 ZSNOWHEAT_1D(:) = 0. 02607 ZSNOW(:) = 0. 02608 ZMASS(:) = 0. 02609 ! 02610 ZSCAP(:,:) = SNOW3LSCAP(PSNOWRHO(:,:)) 02611 ! 02612 DO JJ=2,INLVLS 02613 DO JI=1,INI 02614 IF(PSNOWDZ(JI,1) == 0.0)THEN 02615 ZSNOWHEAT_1D(JI) = ZSNOWHEAT_1D(JI) + XLMTT*XRHOLW*PSNOWLIQ(JI,JJ) & 02616 + PSNOWDZ(JI,JJ)*(ZSCAP(JI,JJ)*(PSNOWTEMP(JI,JJ)-XTT) & 02617 - XLMTT*PSNOWRHO(JI,JJ) ) 02618 ZSNOW (JI) = ZSNOW(JI) + PSNOWDZ(JI,JJ) 02619 ZMASS (JI) = ZMASS(JI) + PSNOWDZ(JI,JJ)*PSNOWRHO(JI,JJ) 02620 ENDIF 02621 ENDDO 02622 ENDDO 02623 ! 02624 ! Where uppermost snow layer has vanished, redistribute vertical 02625 ! snow mass and heat profiles (and associated quantities): 02626 ! 02627 DO JJ=1,INLVLS 02628 DO JI=1,INI 02629 IF(ZSNOW(JI)/= 0.0)THEN 02630 ZSNOW (JI) = MAX(0.5*XSNOWDMIN,ZSNOW(JI)) 02631 PSNOWDZ (JI,JJ) = ZSNOW(JI)/REAL(INLVLS) 02632 PSNOWHEAT(JI,JJ) = ZSNOWHEAT_1D(JI)/REAL(INLVLS) 02633 PSNOWRHO (JI,JJ) = ZMASS (JI)/ZSNOW(JI) 02634 ENDIF 02635 ENDDO 02636 ENDDO 02637 ! 02638 ZSCAP(:,:) = SNOW3LSCAP(PSNOWRHO(:,:)) 02639 ! 02640 DO JJ=1,INLVLS 02641 DO JI=1,INI 02642 IF(ZSNOW(JI)/= 0.0)THEN 02643 PSNOWTEMP(JI,JJ) = XTT + ( ((PSNOWHEAT(JI,JJ)/PSNOWDZ(JI,JJ)) & 02644 + XLMTT*PSNOWRHO(JI,JJ))/ZSCAP(JI,JJ) ) 02645 PSNOWLIQ (JI,JJ) = MAX(0.0,PSNOWTEMP(JI,JJ)-XTT)*ZSCAP(JI,JJ)* & 02646 PSNOWDZ(JI,JJ)/(XLMTT*XRHOLW) 02647 PSNOWTEMP(JI,JJ) = MIN(XTT,PSNOWTEMP(JI,JJ)) 02648 ENDIF 02649 ENDDO 02650 ENDDO 02651 IF (LHOOK) CALL DR_HOOK('SNOW3LEVAPGONE',1,ZHOOK_HANDLE) 02652 ! 02653 END SUBROUTINE SNOW3LEVAPGONE 02654 ! 02655 ! 02656 ! 02657 END SUBROUTINE SNOW3L
 1.8.0
 1.8.0