SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/snowcro.F90
Go to the documentation of this file.
00001 !     ##########################################################################
00002       SUBROUTINE SNOWCRO(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 !!****  *SNOWCRO*
00020 !!
00021 !!    PURPOSE
00022 !!    -------
00023 !
00024 !     Detailed snowpack scheme Crocus, computationnally based on the
00025 !     3-Layer snow scheme option (Boone and Etchevers 1999)
00026 !     For shallow snow cover, Default method of Douville et al. (1995)
00027 !     used with this option: Model "turns on" when snow sufficiently
00028 !     deep/above some preset critical snow depth.
00029 !
00030 !
00031 !
00032 !
00033 !!**  METHOD
00034 !!    ------
00035 !
00036 !     Direct calculation
00037 !
00038 !!    EXTERNAL
00039 !!    --------
00040 !
00041 !     None
00042 !!
00043 !!    IMPLICIT ARGUMENTS
00044 !!    ------------------
00045 !!
00046 !!
00047 !!
00048 !!    REFERENCE
00049 !!    ---------
00050 !!
00051 !!    ISBA: Belair (1995)
00052 !!    ISBA: Noilhan and Planton (1989)
00053 !!    ISBA: Noilhan and Mahfouf (1996)
00054 !!    ISBA-ES: Boone and Etchevers (2001)
00055 !!    Crocus : Brun et al., 1989 (J. Glaciol.)
00056 !!    Crocus : Brun et al., 1992 (J. Glaciol.)
00057 !!    Crocus : Vionnet et al., in prep (Geosci. Mod. Devel. Discuss.)
00058 !!
00059 !!
00060 !!    AUTHOR
00061 !!    ------
00062 !!      A. Boone           * Meteo-France *
00063 !!      V. Vionnet         * Meteo-France *
00064 !!      E. Brun            * Meteo-France *
00065 !!
00066 !!    MODIFICATIONS
00067 !!    -------------
00068 !!      Original    7/99
00069 !!      Modified by A.Boone 05/02 (code, not physics)
00070 !!      Modified by A.Boone 11/04 i) maximum density limit imposed (although
00071 !!                                rarely if ever reached), ii) check to
00072 !!                                see if upermost layer completely sublimates
00073 !!                                during a timestep (as snowpack becomes vanishly
00074 !!                                thin), iii) impose maximum grain size limit
00075 !!                                in radiation transmission computation.
00076 !!
00077 !!      Modified by B. Decharme  (03/2009): Consistency with Arpege permanent
00078 !!                                          snow/ice treatment (LGLACIER for alb)
00079 !!      Modified by A. Boone     (04/2010): Implicit coupling and replace Qsat and DQsat
00080 !!                                          by Qsati and DQsati, respectively.
00081 !!      Modified by E. Brun, V. Vionnet, S. Morin (05/2011): 
00082 !!                                          Addition of Crocus processes and 
00083 !!                                          parametrizations to 
00084 !!                                          the SNOW-3L code. This includes the dynamic handling
00085 !!                                          of snow layers and the inclusion of snow metamorphism
00086 !!                                          rules similar to the original Crocus implementation.
00087 !!      Modified by B. Decharme  (09/2012): New wind implicitation
00088 !!
00089 !!      Modified by M. Lafaysse (07/2012) : 
00090 !!                                          * Albedo and roughness parametrizations
00091 !!                                            for surface ice over glaciers
00092 !!                                                     MODIF 2012-10-03 : don't modify roughness if implicit coupling
00093 !!                                                                 (test PPEW_A_COEF == 0. )
00094 !!                                          * SNOWCROALB is now called by SNOWCRORAD to remove duplicated code
00095 !!                                          * Parameters for albedo are moved to modd_snow_par
00096 !!                                          * PSNOWAGE is stored as an age
00097 !!                                            (days since snowfall) and not as a date
00098 !!                                            to allow spinup simulations
00099 !!                                          * New rules for optimal discretization of very thick snowpacks
00100 !!                                          * Optional outputs for debugging
00101 !!
00102 !!       Modified by E. Brun and M. Lafaysse (07/2012) :
00103 !!                                          * Implement sublimation in SNOWDRIFT
00104 !!                                          * Flag in namelist to activate SNOWDRIFT and SNOWDRIFT_SUBLIM
00105 !!       Modified by E. Brun and M. Lafaysse (08/2012) :
00106 !!                                          * UEPSI replaced by 0 in the if statement of case 1.3.3.2 (SNOWCROMETAMO)
00107 !!                                          * If SNOWDRIFT is activated the wind do not modify grain types during snowfall
00108 !!                                            (redundant with snowdrift)
00109 !!       Modified by E. Brun (24/09/2012) :
00110 !!                                          * Correction coupling coefficient for specific humidity in SNOWCROEBUD
00111 !!                                          * PSFCFRZ(:)  = 1.0 for systematic solid/vapor latent fluxes in SNOWCROEBUD
00112 
00113 
00114 
00115 !-------------------------------------------------------------------------------
00116 !
00117 !*       0.     DECLARATIONS
00118 !               ------------
00119 USE MODD_CSTS,     ONLY : XTT, XRHOLW, XLMTT,XLSTT,XLVTT, XCL, XCI, XPI
00120 !
00121 USE MODE_SNOW3L
00122 !
00123 USE MODD_SNOW_PAR, ONLY : XZ0ICEZ0SNOW, XRHOTHRESHOLD_ICE, LSNOWDRIFT
00124 !
00125 USE MODD_SNOW_METAMO
00126 !
00127 USE MODD_TYPE_DATE_SURF, ONLY: DATE_TIME
00128 !
00129 USE MODI_ABOR1_SFX
00130 !
00131 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00132 USE PARKIND1  ,ONLY : JPRB
00133 !
00134 ! this module is not used anymore
00135 ! USE MODI_GREGODSTRATI
00136 
00137 USE MODE_CRODEBUG
00138 
00139 IMPLICIT NONE
00140 !
00141 !
00142 !*      0.1    declarations of arguments
00143 !
00144 REAL, INTENT(IN)                    :: PTSTEP
00145 !                                      PTSTEP    = time step of the integration
00146 TYPE(DATE_TIME), INTENT(IN)         :: TPTIME      ! current date and time
00147 !
00148  CHARACTER(LEN=*),     INTENT(IN)    :: HSNOWRES
00149 !                                      HSNOWRES  = ISBA-SNOW3L turbulant exchange option
00150 !                                      'DEF' = Default: Louis (ISBA: Noilhan and Mahfouf 1996)
00151 !                                      'RIL' = Limit Richarson number under very stable
00152 !                                              conditions (currently testing)
00153 LOGICAL, INTENT(IN)                 :: OGLACIER   ! True = Over permanent snow and ice, 
00154 !                                                     initialise WGI=WSAT,
00155 !                                                     Hsnow>=10m and allow 0.8<SNOALB<0.85
00156                                                   ! False = No specific treatment
00157 !
00158  CHARACTER(LEN=*),     INTENT(IN)  :: HIMPLICIT_WIND   ! wind implicitation option
00159 !                                                     ! 'OLD' = direct
00160 !                                                     ! 'NEW' = Taylor serie, order 1
00161 !
00162 REAL, DIMENSION(:), INTENT(IN)    :: PPS, PTA, PSW_RAD, PQA,                       
00163                                         PVMOD, PLW_RAD, PSR, PRR 
00164 !                                      PSW_RAD = incoming solar radiation (W/m2)
00165 !                                      PLW_RAD = atmospheric infrared radiation (W/m2)
00166 !                                      PRR     = rain rate [kg/(m2 s)]
00167 !                                      PSR     = snow rate (SWE) [kg/(m2 s)]
00168 !                                      PTA     = atmospheric temperature at level za (K)
00169 !                                      PVMOD   = modulus of the wind parallel to the orography (m/s)
00170 !                                      PPS     = surface pressure
00171 !                                      PQA     = atmospheric specific humidity
00172 !                                                at level za
00173 !
00174 REAL, DIMENSION(:), INTENT(IN)    :: PTG, PSOILCOND, PD_G, PPSN3L
00175 !                                      PTG       = Surface soil temperature (effective
00176 !                                                  temperature the of layer lying below snow)
00177 !                                      PSOILCOND = soil thermal conductivity [W/(m K)]
00178 !                                      PD_G      = Assumed first soil layer thickness (m)
00179 !                                                  Used to calculate ground/snow heat flux
00180 !                                      PPSN3L    = snow fraction
00181 !
00182 REAL, DIMENSION(:), INTENT(IN)    :: PZREF, PUREF, PEXNS, PEXNA, PDIRCOSZW, PRHOA, PZ0, PZ0EFF, 
00183                                       PALB, PZ0H, PPERMSNOWFRAC 
00184 !                                      PZ0EFF    = roughness length for momentum
00185 !                                      PZ0       = grid box average roughness length
00186 !                                      PZ0H      = grid box average roughness length for heat
00187 !                                      PZREF     = reference height of the first
00188 !                                                  atmospheric level
00189 !                                      PUREF     = reference height of the wind
00190 !                                      PRHOA     = air density
00191 !                                      PEXNS     = Exner function at surface
00192 !                                      PEXNA     = Exner function at lowest atmos level
00193 !                                      PDIRCOSZW = Cosinus of the angle between the
00194 !                                                  normal to the surface and the vertical
00195 !                                      PALB      = soil/vegetation albedo
00196 !                                      PPERMSNOWFRAC  = fraction of permanet snow/ice
00197 !
00198 REAL, DIMENSION(:), INTENT(IN)      :: PPEW_A_COEF, PPEW_B_COEF,                   
00199                                         PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF,      
00200                                         PPEQ_B_COEF  
00201 !                                      PPEW_A_COEF = wind coefficient (m2s/kg)
00202 !                                      PPEW_B_COEF = wind coefficient (m/s)
00203 !                                      PPET_A_COEF = A-air temperature coefficient
00204 !                                      PPET_B_COEF = B-air temperature coefficient
00205 !                                      PPEQ_A_COEF = A-air specific humidity coefficient
00206 !                                      PPEQ_B_COEF = B-air specific humidity coefficient
00207 !
00208 REAL, DIMENSION(:), INTENT(INOUT) :: PSNOWALB
00209 !                                      PSNOWALB = Prognostic surface snow albedo
00210 !                                                 (does not include anything but
00211 !                                                 the actual snow cover)
00212 !
00213 REAL, DIMENSION(:,:), INTENT(INOUT):: PSNOWHEAT, PSNOWRHO, PSNOWSWE
00214 !                                      PSNOWHEAT = Snow layer(s) heat content (J/m2)
00215 !                                      PSNOWRHO  = Snow layer(s) averaged density (kg/m3)
00216 !                                      PSNOWSWE  = Snow layer(s) liquid Water Equivalent (SWE:kg m-2)
00217 !
00218 REAL, DIMENSION(:,:), INTENT(INOUT):: PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST
00219 !                                      PSNOWGRAN1 = Snow layers grain feature 1
00220 !                                      PSNOWGRAN2 = Snow layer grain feature 2
00221 !                                      PSNOWHIST  = Snow layer grain historical
00222 !                                                   parameter (only for non
00223 !                                                   dendritic snow)
00224 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWAGE  ! Snow grain age
00225 !
00226 REAL, DIMENSION(:,:), INTENT(OUT) :: PSNOWLIQ, PSNOWTEMP, PSNOWDZ
00227 !                                      PSNOWLIQ  = Snow layer(s) liquid water content (m)
00228 !                                      PSNOWTEMP = Snow layer(s) temperature (m)
00229 !                                      PSNOWDZ   = Snow layer(s) thickness (m)
00230 !
00231 REAL, DIMENSION(:), INTENT(OUT)   :: PTHRUFAL, PGRNDFLUX, PEVAPCOR
00232 !                                      PTHRUFAL  = rate that liquid water leaves snow pack:
00233 !                                                  paritioned into soil infiltration/runoff
00234 !                                                  by ISBA [kg/(m2 s)]
00235 !                                      PGRNDFLUX = soil/snow interface heat flux (W/m2)
00236 !                                      PEVAPCOR  = evaporation/sublimation correction term:
00237 !                                                  extract any evaporation exceeding the
00238 !                                                  actual snow cover (as snow vanishes)
00239 !                                                  and apply it as a surface soil water
00240 !                                                  sink. [kg/(m2 s)]
00241 !
00242 REAL, DIMENSION(:), INTENT(OUT)   :: PRNSNOW, PHSNOW, PGFLUXSNOW, PLES3L, PLEL3L, 
00243                                         PHPSNOW, PCDSNOW, PUSTAR, PEVAP 
00244 !                                      PLES3L      = evaporation heat flux from snow (W/m2)
00245 !                                      PLEL3L      = sublimation (W/m2)
00246 !                                      PHPSNOW     = heat release from rainfall (W/m2)
00247 !                                      PRNSNOW     = net radiative flux from snow (W/m2)
00248 !                                      PHSNOW      = sensible heat flux from snow (W/m2)
00249 !                                      PGFLUXSNOW  = net heat flux from snow (W/m2)
00250 !                                      PCDSNOW     = drag coefficient for momentum over snow
00251 !                                      PUSTAR      = friction velocity over snow (m/s)
00252 !                                      PEVAP       = total evaporative flux (kg/m2/s)
00253 !
00254 REAL, DIMENSION(:), INTENT(OUT)   :: PCHSNOW, PEMISNOW, PSNOWHMASS
00255 !                                      PEMISNOW    = snow surface emissivity
00256 !                                      PCHSNOW     = drag coefficient for heat over snow
00257 !                                      PSNOWHMASS  = heat content change due to mass
00258 !                                                    changes in snowpack (J/m2): for budget
00259 !                                                    calculations only.
00260 !
00261 REAL, DIMENSION(:), INTENT(OUT)   :: PRI
00262 !                                      PRI = Ridcharson number
00263 !
00264 REAL, DIMENSION(:), INTENT(IN)    :: PZENITH ! solar zenith angle
00265 REAL, DIMENSION(:), INTENT(IN)    :: PXLAT,PXLON ! LAT/LON after packing
00266 !
00267 !
00268 !*      0.2    declarations of local variables
00269 !
00270 !
00271 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWTEMP, ZSCAP, ZSNOWDZN, ZSCOND,    
00272                                                        ZRADSINK 
00273 !                                      ZSNOWTEMP  = Snow layer(s) averaged temperature (K)
00274 !                                      ZSCAP      = Snow layer(s) heat capacity [J/(K m3)]
00275 !                                      ZSNOWDZN   = Updated snow layer thicknesses (m)
00276 !                                      ZSCOND     = Snow layer(s) thermal conducivity [W/(m K)]
00277 !                                      ZRADSINK   = Snow solar Radiation source terms (W/m2)
00278 !
00279 !  
00280 REAL, DIMENSION(SIZE(PTA))          :: ZSNOWBIS
00281 !                                     ZSNOWBIS      = Total snow depth after snowfall  
00282 !
00283 REAL, DIMENSION(SIZE(PTA))          :: ZSNOW, ZSFCFRZ, ZTSTERM1, ZTSTERM2,                   
00284                                         ZCT, ZRA, ZSNOWFLUX, ZSNOWTEMPO1 
00285 !                                      ZSNOW      = Total snow depth (m)
00286 !                                      ZCT        = inverse of the product of snow heat capacity
00287 !                                                   and layer thickness [(m2 K)/J]
00288 !                                      ZRA        = Surface aerodynamic resistance
00289 !                                      ZTSTERM1,ZTSTERM2 = Surface energy budget coefficients
00290 !                                      ZSNOWFLUX  = heat flux between 1st and 2nd snow layers:
00291 !                                                   used during surface melting (W/m2)
00292 !                                      ZSNOWTEMPO1= value of uppermost snow temperature
00293 !                                                   before time integration (K)
00294 !
00295 LOGICAL, DIMENSION(SIZE(PTA))       :: GSNOWFALL,GMODIF_MAILLAGE
00296 !                                      GSNOWFALL  = FLAG if snowfall exceed PSNOW/10, used for 
00297 !                                                   grid updating. 
00298 !
00299 REAL, DIMENSION(SIZE(PTA))          :: ZRSRA, ZDQSAT, ZQSAT, ZRADXS, ZLIQHEATXS, 
00300                                         ZLWUPSNOW 
00301 !                                      ZRSRA    = air density over aerodynamic resistance
00302 !                                      ZDQSAT   = derrivative of saturation specific humidity
00303 !                                      ZQSAT    = saturation specific humidity
00304 !                                      ZRADXS   = shortwave radiation absorbed by soil surface
00305 !                                                 (for thin snow sover) (W m-2)
00306 !                                      ZLIQHEATXS = excess snowpack heating for vanishingly thin
00307 !                                                 snow cover: add energy to snow/ground heat
00308 !                                                 flux (W m-2)
00309 !                                      ZLWUPSNOW = upwelling longwave raaditive flux (W m-2)
00310 !
00311 REAL, DIMENSION(SIZE(PTA))          :: ZUSTAR2_IC, ZTA_IC, ZQA_IC,                                   
00312                                         ZPET_A_COEF_T, ZPEQ_A_COEF_T, ZPET_B_COEF_T, ZPEQ_B_COEF_T  
00313 !                                      ZUSTAR2_IC    = implicit lowest atmospheric level friction (m2/s2)
00314 !                                      ZTA_IC        = implicit lowest atmospheric level air temperature
00315 !                                      ZQA_IC        = implicit lowest atmospheric level specific humidity
00316 !                                      ZPET_A_COEF_T = transformed A-air temperature coefficient
00317 !                                      ZPET_B_COEF_T = transformed B-air temperature coefficient
00318 !                                      ZPEQ_A_COEF_T = transformed A-air specific humidity coefficient
00319 !                                      ZPEQ_B_COEF_T = transformed B-air specific humidity coefficient
00320 !
00321 REAL, PARAMETER                     :: ZSNOWDZMIN = 0.0001 ! (m)
00322 !                                      ZSNOWDZMIN = minimum snow layer thickness for
00323 !                                                   thermal calculations. Used to prevent
00324 !                                                   numerical problems as snow becomes
00325 !                                                   vanishingly thin.
00326 !
00327 INTEGER                             :: JJ,JST   ! looping indexes
00328 !
00329 LOGICAL                             :: OCOND_GRAIN, OCOND_YEN
00330 REAL, DIMENSION(SIZE(PTA))          :: ZSNOWRHOF, ZSNOWDZF,ZSNOWGRAN1F,
00331                                         ZSNOWGRAN2F, ZSNOWHISTF 
00332 REAL, DIMENSION(SIZE(PTA))          :: ZSNOWAGEF
00333 
00334 ! New roughness lengths in case of glaciers without snow.
00335 REAL, DIMENSION(SIZE(PTA))::ZZ0_SNOWICE,ZZ0H_SNOWICE,ZZ0EFF_SNOWICE
00336 
00337 !spectral albedo (3 bands for now) :: ready to output if necessary
00338 REAL, DIMENSION(SIZE(PSNOWRHO,1),3):: ZSPECTRALALBEDO
00339 
00340 INTEGER, DIMENSION(SIZE(PTA)) :: INLVLS_USE ! varying number of effective layers 
00341 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2))  :: ZWHOLDMAX 
00342 INTEGER                         :: IPRINT  ! gridpoint number to be printed
00343 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00344 
00345 REAL :: ZTSTEPDAYS ! time step in days
00346 
00347 LOGICAL::GCROINFOPRINT ! print daily informations
00348 LOGICAL::GCRODEBUGPRINT,GCRODEBUGDETAILSPRINT,GCRODEBUGPRINTATM ! print diagnostics for debugging
00349 LOGICAL::GCRODEBUGPRINTBALANCE
00350 INTEGER::IDEBUG
00351 
00352 ! To stop simulation if mass/energy balances not closed
00353 LOGICAL,PARAMETER::LPSTOPBALANCE=.FALSE.
00354 
00355 !To control and print eneregy balance
00356 REAL , DIMENSION(SIZE(PTA)) :: ZSUMMASS_INI,ZSUMHEAT_INI,ZSUMMASS_FIN,ZSUMHEAT_FIN
00357 !
00358 IF (LHOOK) CALL DR_HOOK('SNOWCRO',0,ZHOOK_HANDLE)
00359 !
00360 ! Look if we have to print snow profiles for debugging
00361 GCROINFOPRINT = LCRODAILYINFO .AND. (TPTIME%TIME ==0.0)
00362 !
00363 IF (LCRODEBUG) THEN
00364   GCRODEBUGPRINT = (TPTIME%TDATE%YEAR*10000+TPTIME%TDATE%MONTH*100+TPTIME%TDATE%DAY  &
00365                     >= NTIMECRODEBUG) .AND. (TPTIME%TIME/3600.>=NHOURCRODEBUG) .AND. &
00366                     (TPTIME%TDATE%YEAR*10000+TPTIME%TDATE%MONTH*100+TPTIME%TDATE%DAY &
00367                     < NENDCRODEBUG)
00368   GCRODEBUGDETAILSPRINT = LCRODEBUGDETAILS.AND.GCRODEBUGPRINT 
00369   GCRODEBUGPRINTATM = LCRODEBUGATM.AND.GCRODEBUGPRINT
00370 ELSE
00371   GCRODEBUGPRINT = .FALSE.
00372   GCRODEBUGDETAILSPRINT = .FALSE.
00373   GCRODEBUGPRINTATM = .FALSE.
00374 END IF
00375 !
00376 ! Look if we have to compute and print energy balance control
00377 GCRODEBUGPRINTBALANCE = LCONTROLBALANCE .AND. &
00378                         (TPTIME%TDATE%YEAR*10000+TPTIME%TDATE%MONTH*100+TPTIME%TDATE%DAY &
00379                         >= NTIMECRODEBUG) .AND. (TPTIME%TIME/3600.>=NHOURCRODEBUG) .AND. &
00380                         (TPTIME%TDATE%YEAR*10000+TPTIME%TDATE%MONTH*100+TPTIME%TDATE%DAY &
00381                         < NENDCRODEBUG)
00382 !
00383 IF (LCRODEBUG .OR. GCROINFOPRINT .OR. GCRODEBUGPRINTBALANCE) THEN
00384   IF (XLATCRODEBUG >= -90 .AND. XLONCRODEBUG >= -180.) THEN
00385     CALL GETPOINT_CRODEBUG(PXLAT,PXLON,IDEBUG)
00386   ELSE
00387     IDEBUG=NPOINTCRODEBUG
00388   END IF
00389 END IF
00390 !
00391 ZUSTAR2_IC = 0.0
00392 ZTA_IC     = 0.0
00393 ZQA_IC     = 0.0
00394 !
00395 OCOND_GRAIN=.TRUE.
00396 OCOND_YEN=.TRUE.!FALSE. !(if TRUE : use of the Yen (1981) thermal conductivity paramztrization ; 
00397 !                   otherwise, use the default ISBA-ES thermal conductivity parametrization)
00398 !
00399 PGRNDFLUX=0.
00400 PSNOWHMASS=0.
00401 PHSNOW=0.
00402 PRNSNOW=0.
00403 PLES3L=0.
00404 PLEL3L=0.
00405 PHPSNOW=0.
00406 PEVAPCOR=0.
00407 PTHRUFAL=0.
00408 !
00409 ! pour imprimer des diagnostics sur un des points
00410 IPRINT=1 
00411 !
00412 ! - - ---------------------------------------------------
00413 !
00414 !       0.     Initialization
00415 !               --------------
00416 ! NOTE that snow layer thickness is used throughout this code: SWE
00417 ! is only used to diagnose the thickness at the beginning of this routine
00418 ! and it is updated at the end of this routine.
00419 !
00420 ! Initialization of the actual number of snow layers, total snow depth 
00421 !  and layer thicknesses
00422 !
00423 GSNOWFALL(:)    = .FALSE.
00424 INLVLS_USE(:)=0
00425 DO JJ=1, SIZE(ZSNOW)
00426   DO JST=1,SIZE(PSNOWSWE(:,:),2) 
00427      IF (PSNOWSWE(JJ,JST)>0.) THEN 
00428         PSNOWDZ(JJ,JST) = PSNOWSWE(JJ,JST)/PSNOWRHO(JJ,JST)
00429         INLVLS_USE(JJ)= JST
00430      ELSE
00431         PSNOWDZ(JJ,JST) = 0.
00432      ENDIF
00433   ENDDO  !  end loop snow layers
00434 ENDDO    ! end loop grid points
00435 
00436 ! Incrementation of snow layers age
00437 ZTSTEPDAYS=PTSTEP/86400. ! time step in days
00438 WHERE (PSNOWSWE >0)
00439   PSNOWAGE=PSNOWAGE+ZTSTEPDAYS
00440 ENDWHERE
00441 !
00442 !Compute total SWE and heat for energy control 
00443 IF (GCRODEBUGPRINTBALANCE) THEN
00444   DO JJ=1, SIZE(ZSNOW)
00445     ZSUMMASS_INI(JJ) = SUM(PSNOWSWE (JJ,1:INLVLS_USE(JJ)))
00446     ZSUMHEAT_INI(JJ) = SUM(PSNOWHEAT(JJ,1:INLVLS_USE(JJ)))
00447   ENDDO    ! end loop grid points
00448 ENDIF
00449 !
00450 !  Print of some simulation characteristics
00451 !
00452 IF(GCROINFOPRINT) THEN
00453   CALL SNOWCROPRINTDATE()
00454   WRITE(*,FMT="(A12,I3,A12,I4)")          &
00455       'nlayer:',INLVLS_USE(IDEBUG), ' nbpoints:', SIZE(ZSNOW) 
00456 !   WRITE(*,*) 'PZ0H: ', PZ0H(IDEBUG)
00457   write(*,*) 'Snow fraction =',PPSN3L(IDEBUG)                   
00458 ENDIF
00459 !
00460 IF (GCRODEBUGPRINT) THEN
00461   CALL SNOWCROPRINTDATE()
00462   CALL SNOWCROPRINTPROFILE("crocus initialization",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00463         PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),PSNOWTEMP(IDEBUG,:),&
00464         PSNOWLIQ(IDEBUG,:),PSNOWHEAT(IDEBUG,:),PSNOWGRAN1(IDEBUG,:),&
00465         PSNOWGRAN2(IDEBUG,:),PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))
00466 END IF
00467 
00468 IF (GCRODEBUGPRINTATM) THEN
00469   CALL SNOWCROPRINTATM("forcing data :",PTA(IDEBUG),PQA(IDEBUG),PVMOD(IDEBUG),&
00470         PRR(IDEBUG),PSR(IDEBUG),PSW_RAD(IDEBUG),PLW_RAD(IDEBUG),&
00471         PTG(IDEBUG),PSOILCOND(IDEBUG),PD_G(IDEBUG),PPSN3L(IDEBUG))
00472 END IF
00473 !
00474 !*       1.     Snow total depth
00475 !               ----------------
00476 !
00477 ZSNOW(:) = 0.
00478 DO JJ=1, SIZE(ZSNOW)
00479    ZSNOW(JJ)=SUM(PSNOWDZ(JJ,1:INLVLS_USE(JJ)))
00480 ENDDO
00481 !
00482 ZSNOWBIS(:)        = ZSNOW(:)
00483 !
00484 !
00485 !*       2.     Snowfall
00486 !               --------
00487 ! Calculate uppermost density and thickness changes due to snowfall,
00488 ! and add heat content of falling snow
00489 !
00490 !
00491   CALL SNOWNLFALL_UPGRID(TPTIME, OGLACIER,  &
00492                   PTSTEP,PSR,PTA,PVMOD,ZSNOWBIS,PSNOWRHO,PSNOWDZ, &
00493                   PSNOWHEAT,PSNOWHMASS,PSNOWALB,PPERMSNOWFRAC, &
00494                   PSNOWGRAN1,PSNOWGRAN2,GSNOWFALL, ZSNOWDZN,&
00495                   ZSNOWRHOF, ZSNOWDZF,ZSNOWGRAN1F, ZSNOWGRAN2F, ZSNOWHISTF,    &
00496                   ZSNOWAGEF, GMODIF_MAILLAGE,INLVLS_USE,LSNOWDRIFT) 
00497 !
00498 IF (GCRODEBUGDETAILSPRINT) CALL SNOWCROPRINTPROFILE("after SNOWFALL_UPGRID",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00499   PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),PSNOWTEMP(IDEBUG,:),PSNOWLIQ(IDEBUG,:),PSNOWHEAT(IDEBUG,:),&
00500   PSNOWGRAN1(IDEBUG,:),PSNOWGRAN2(IDEBUG,:),PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))
00501 !
00502   ZSNOW(:)      = ZSNOWBIS(:)
00503 !
00504 !*       3.     Update grid/discretization
00505 !               --------------------------
00506 ! Reset grid to conform to model specifications:
00507 !
00508   DO JJ=1, SIZE(ZSNOW)
00509     IF(GMODIF_MAILLAGE(JJ)) THEN
00510 !        
00511     CALL  SNOWNLGRIDFRESH_1D(ZSNOW(JJ),PSNOWDZ(JJ,:),ZSNOWDZN(JJ,:),   &
00512            PSNOWRHO(JJ,:),PSNOWHEAT(JJ,:),PSNOWGRAN1(JJ,:),PSNOWGRAN2(JJ,:), &
00513            PSNOWHIST(JJ,:),PSNOWAGE(JJ,:),GSNOWFALL(JJ), &
00514            ZSNOWRHOF(JJ),ZSNOWDZF(JJ),PSNOWHMASS(JJ),ZSNOWGRAN1F(JJ),&
00515            ZSNOWGRAN2F(JJ), ZSNOWHISTF(JJ),ZSNOWAGEF(JJ),   &
00516            INLVLS_USE(JJ))                                
00517     ENDIF
00518   ENDDO                                       
00519 !
00520 IF (GCRODEBUGDETAILSPRINT) CALL SNOWCROPRINTPROFILE("after SNOWNLGRIDFRESH_1D",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00521   PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),PSNOWTEMP(IDEBUG,:),PSNOWLIQ(IDEBUG,:),PSNOWHEAT(IDEBUG,:),&
00522  PSNOWGRAN1(IDEBUG,:),PSNOWGRAN2(IDEBUG,:),PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))  
00523 !
00524 !*       4.     Liquid water content and snow temperature
00525 !               -----------------------------------------
00526 !
00527 ! First diagnose snow temperatures and liquid
00528 ! water portion of the snow from snow heat content:
00529 ! update some snow layers parameters after new discretization 
00530 !
00531 DO JJ=1, SIZE(ZSNOW)
00532 ! active layers
00533   DO JST=1,INLVLS_USE(JJ)
00534       PSNOWSWE(JJ,JST)     = PSNOWDZ(JJ,JST)*PSNOWRHO(JJ,JST)
00535 !
00536       ZSCAP(JJ,JST)     = SNOW3LSCAP(PSNOWRHO(JJ,JST))
00537 !
00538       ZSNOWTEMP(JJ,JST) = XTT + ( ((PSNOWHEAT(JJ,JST)/PSNOWDZ(JJ,JST))   &
00539                 + XLMTT*PSNOWRHO(JJ,JST))/ZSCAP(JJ,JST) ) 
00540 !
00541       PSNOWLIQ(JJ,JST)  = MAX(0.0,ZSNOWTEMP(JJ,JST)-XTT)*ZSCAP(JJ,JST)*  &
00542                   PSNOWDZ(JJ,JST)/(XLMTT*XRHOLW) 
00543 !
00544       ZSNOWTEMP(JJ,JST) = MIN(XTT,ZSNOWTEMP(JJ,JST))
00545   ENDDO  !  end loop active snow layers
00546 ! unactive layers  
00547   DO JST=INLVLS_USE(JJ)+1,SIZE(PSNOWSWE,2)
00548       PSNOWSWE(JJ,JST)=0.0
00549       PSNOWRHO(JJ,JST)=999.
00550       PSNOWDZ(JJ,JST)=0.
00551       PSNOWGRAN1(JJ,JST)=0.
00552       PSNOWGRAN2(JJ,JST)=0.
00553       PSNOWHIST(JJ,JST)=0.
00554       PSNOWAGE(JJ,JST)=0.
00555       PSNOWHEAT(JJ,JST)=0.
00556       ZSNOWTEMP(JJ,JST)=XTT
00557       PSNOWLIQ(JJ,JST)=0.
00558   ENDDO  !  end loop unactive snow layers
00559 ENDDO    ! end loop grid points
00560 !
00561 IF (GCRODEBUGDETAILSPRINT) CALL SNOWCROPRINTPROFILE(
00562 "after liquid water/&  &temperature diagnostic",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00563   PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),ZSNOWTEMP(IDEBUG,:),PSNOWLIQ(IDEBUG,:),PSNOWHEAT(IDEBUG,:),&
00564  PSNOWGRAN1(IDEBUG,:),PSNOWGRAN2(IDEBUG,:),PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))
00565 !
00566 !        4.BIS   Snow metamorphism
00567 !                ----------------- 
00568 !        
00569  CALL SNOWCROMETAMO(PSNOWDZ,PSNOWGRAN1,PSNOWGRAN2,PSNOWHIST,ZSNOWTEMP,         &
00570                        PSNOWLIQ,PTSTEP,PSNOWSWE,INLVLS_USE) 
00571 !
00572 IF (GCRODEBUGDETAILSPRINT) CALL SNOWCROPRINTPROFILE("after SNOWCROMETAMO",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00573   PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),ZSNOWTEMP(IDEBUG,:),PSNOWLIQ(IDEBUG,:),PSNOWHEAT(IDEBUG,:),&
00574  PSNOWGRAN1(IDEBUG,:),PSNOWGRAN2(IDEBUG,:),PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))
00575 
00576 !*       5.     Snow Compaction
00577 !               ---------------
00578 ! Calculate snow density: compaction/aging: density increases
00579 !
00580  CALL SNOWCROCOMPACTN(PTSTEP,PSNOWRHO,PSNOWDZ,ZSNOWTEMP,ZSNOW,     &
00581             PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST, PSNOWLIQ,INLVLS_USE,&
00582              PDIRCOSZW)
00583 
00584 IF (GCRODEBUGDETAILSPRINT) CALL SNOWCROPRINTPROFILE("after SNOWCROCOMPACTN",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00585   PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),ZSNOWTEMP(IDEBUG,:),PSNOWLIQ(IDEBUG,:),PSNOWHEAT(IDEBUG,:),&
00586  PSNOWGRAN1(IDEBUG,:),PSNOWGRAN2(IDEBUG,:),PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))
00587 
00588 !       
00589 !*       5.1    Snow Compaction and Metamorphism due to snow drift
00590 !               ---------------
00591 ! PRINT*,LSNOWDRIFT
00592 IF (LSNOWDRIFT) THEN
00593   CALL SNOWDRIFT(PTSTEP, PVMOD, PSNOWRHO,PSNOWDZ, ZSNOW, &
00594                  PSNOWGRAN1,PSNOWGRAN2,PSNOWHIST,INLVLS_USE,PTA,PQA,PPS,PRHOA)
00595 
00596 ! old call before EB modifications for sublimation (to remove)
00597 !       CALL SNOWDRIFT(PTSTEP, PVMOD, PSNOWRHO,PSNOWDZ, ZSNOW, &
00598 !                    PSNOWGRAN1,PSNOWGRAN2,PSNOWHIST,INLVLS_USE) 
00599 
00600   IF (GCRODEBUGDETAILSPRINT) CALL SNOWCROPRINTPROFILE("after SNOWDRIFT",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00601     PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),ZSNOWTEMP(IDEBUG,:),PSNOWLIQ(IDEBUG,:),PSNOWHEAT(IDEBUG,:),&
00602     PSNOWGRAN1(IDEBUG,:),PSNOWGRAN2(IDEBUG,:),PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))
00603 END IF
00604 !
00605 ! Update snow heat content (J/m2) using dry density instead of total density:
00606 !
00607 DO JJ=1, SIZE(ZSNOW)
00608   DO JST=1,INLVLS_USE(JJ)
00609   ZSCAP(JJ,JST)     = SNOW3LSCAP(PSNOWRHO(JJ,JST)-PSNOWLIQ(JJ,JST)* &
00610                          XRHOLW/MAX(PSNOWDZ(JJ,JST),ZSNOWDZMIN)) 
00611   PSNOWHEAT(JJ,JST) = PSNOWDZ(JJ,JST)*( ZSCAP(JJ,JST)*(ZSNOWTEMP(JJ,JST)-XTT)- &
00612                          XLMTT*PSNOWRHO(JJ,JST) ) + XLMTT*XRHOLW*PSNOWLIQ(JJ,JST) 
00613   ENDDO  !  end loop snow layers
00614 ENDDO    ! end loop grid points
00615 !
00616 IF (GCRODEBUGDETAILSPRINT) CALL SNOWCROPRINTPROFILE("after update snow heat content",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00617   PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),ZSNOWTEMP(IDEBUG,:),PSNOWLIQ(IDEBUG,:),PSNOWHEAT(IDEBUG,:),&
00618  PSNOWGRAN1(IDEBUG,:),PSNOWGRAN2(IDEBUG,:),PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))
00619 !
00620 !*       6.     Solar radiation transmission
00621 !               -----------------------------
00622 !
00623 ! Heat source (-sink) term due to shortwave
00624 ! radiation transmission within the snowpack:
00625 !
00626  CALL SNOWCRORAD(TPTIME,OGLACIER,&
00627                 PSW_RAD,PSNOWALB,PSNOWDZ,PSNOWRHO,  &
00628                 PALB,ZRADSINK,ZRADXS,                          &
00629                 PSNOWGRAN1, PSNOWGRAN2, PSNOWAGE,PPS,          &
00630                 PZENITH, PPERMSNOWFRAC,INLVLS_USE              ) 
00631 !
00632 IF (GCRODEBUGDETAILSPRINT) CALL SNOWCROPRINTPROFILE("after SNOWCRORAD",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00633   PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),ZSNOWTEMP(IDEBUG,:),PSNOWLIQ(IDEBUG,:),PSNOWHEAT(IDEBUG,:),&
00634  PSNOWGRAN1(IDEBUG,:),PSNOWGRAN2(IDEBUG,:),PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))
00635 !
00636 !*       7.     Heat transfer and surface energy budget
00637 !               ---------------------------------------
00638 ! Snow thermal conductivity:
00639 !
00640  CALL SNOWCROTHRM(PSNOWRHO,ZSCOND,ZSNOWTEMP,PPS,PSNOWLIQ,OCOND_GRAIN,OCOND_YEN)
00641 !
00642 IF (GCRODEBUGDETAILSPRINT) CALL SNOWCROPRINTPROFILE("after SNOWCROTHRM",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00643   PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),ZSNOWTEMP(IDEBUG,:),PSNOWLIQ(IDEBUG,:),PSNOWHEAT(IDEBUG,:),&
00644  PSNOWGRAN1(IDEBUG,:),PSNOWGRAN2(IDEBUG,:),PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))
00645 !
00646 ! Precipitation heating term:
00647 ! Rainfall renders it's heat to the snow when it enters
00648 ! the snowpack:
00649 !
00650 PHPSNOW(:)     = PRR(:)*XCL*(MAX(XTT,PTA(:))-XTT)    ! (W/m2)
00651 !
00652 ! Surface Energy Budget calculations using ISBA linearized form
00653 ! and standard ISBA turbulent transfer formulation
00654 !
00655 
00656 IF (ALL(PPEW_A_COEF==0.)) THEN
00657   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
00658   ! Modif Matthieu Lafaysse for glaciers
00659   ! For surface ice, modify roughness lengths
00660   ! Only if not implicit coupling
00661   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
00662   WHERE(PSNOWRHO(:,1)>XRHOTHRESHOLD_ICE)
00663     ZZ0_SNOWICE    = PZ0*XZ0ICEZ0SNOW
00664     ZZ0H_SNOWICE   = PZ0H*XZ0ICEZ0SNOW
00665     ZZ0EFF_SNOWICE = PZ0EFF*XZ0ICEZ0SNOW
00666   ELSEWHERE
00667     ZZ0_SNOWICE    = PZ0
00668     ZZ0H_SNOWICE   = PZ0H
00669     ZZ0EFF_SNOWICE = PZ0EFF
00670   ENDWHERE
00671 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
00672 ELSE
00673   ZZ0_SNOWICE    = PZ0
00674   ZZ0H_SNOWICE   = PZ0H
00675   ZZ0EFF_SNOWICE = PZ0EFF
00676 END IF
00677 
00678  CALL SNOWCROEBUD(HSNOWRES, HIMPLICIT_WIND,                                    &
00679                  PPEW_A_COEF, PPEW_B_COEF,                                    &
00680                  PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF,          &
00681                  ZSNOWDZMIN,                                                  &
00682                  PZREF,ZSNOWTEMP(:,1),PSNOWRHO(:,1),PSNOWLIQ(:,1),ZSCAP(:,1), &
00683                  ZSCOND(:,1),ZSCOND(:,2),                                     &
00684                  PUREF,PEXNS,PEXNA,PDIRCOSZW,PVMOD,                           &
00685                  PLW_RAD,PSW_RAD,PTA,PQA,PPS,PTSTEP,                          &
00686                  PSNOWDZ(:,1),PSNOWDZ(:,2),PSNOWALB,ZZ0_SNOWICE,              &
00687                  ZZ0EFF_SNOWICE,ZZ0H_SNOWICE,                                 &
00688                  ZSFCFRZ,ZRADSINK(:,1),PHPSNOW,                               &
00689                  ZCT,PEMISNOW,PRHOA,ZTSTERM1,ZTSTERM2,ZRA,PCDSNOW,PCHSNOW,    &
00690                  ZQSAT, ZDQSAT, ZRSRA, ZUSTAR2_IC, PRI,                         &
00691                  ZPET_A_COEF_T,ZPEQ_A_COEF_T,ZPET_B_COEF_T,ZPEQ_B_COEF_T      ) 
00692 !
00693 IF (GCRODEBUGDETAILSPRINT) CALL SNOWCROPRINTPROFILE("after SNOWCROEBUD",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00694   PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),ZSNOWTEMP(IDEBUG,:),PSNOWLIQ(IDEBUG,:),PSNOWHEAT(IDEBUG,:),&
00695  PSNOWGRAN1(IDEBUG,:),PSNOWGRAN2(IDEBUG,:),PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))
00696 !
00697 ! Heat transfer: simple diffusion along the thermal gradient
00698 !
00699 ZSNOWTEMPO1(:) = ZSNOWTEMP(:,1) ! save surface snow temperature before update
00700 !
00701  CALL SNOWCROSOLVT(PTSTEP,ZSNOWDZMIN,PSNOWDZ,ZSCOND,ZSCAP,PTG,                &
00702                   PSOILCOND,PD_G,ZRADSINK,ZCT,ZTSTERM1,ZTSTERM2,              &
00703                   ZPET_A_COEF_T,ZPEQ_A_COEF_T,ZPET_B_COEF_T,ZPEQ_B_COEF_T,    &
00704                   ZTA_IC,ZQA_IC,PGRNDFLUX, ZSNOWTEMP ,ZSNOWFLUX,              &
00705                   INLVLS_USE                                                  ) 
00706 !
00707 IF (GCRODEBUGDETAILSPRINT) CALL SNOWCROPRINTPROFILE("after SNOWCROSOLVT",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00708   PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),ZSNOWTEMP(IDEBUG,:),PSNOWLIQ(IDEBUG,:),PSNOWHEAT(IDEBUG,:),&
00709  PSNOWGRAN1(IDEBUG,:),PSNOWGRAN2(IDEBUG,:),PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))
00710 !
00711 !*       8.     Surface fluxes
00712 !               --------------
00713 !
00714  CALL SNOWCROFLUX(ZSNOWTEMP(:,1),PSNOWDZ(:,1),PEXNS,PEXNA,            &
00715                  ZUSTAR2_IC,                                           &
00716                  PTSTEP,PSNOWALB,PSW_RAD,PEMISNOW,ZLWUPSNOW,PLW_RAD, &
00717                  ZTA_IC,ZSFCFRZ,ZQA_IC,PHPSNOW,                      &
00718                  ZSNOWTEMPO1,ZSNOWFLUX,ZCT,ZRADSINK(:,1),            &
00719                  ZQSAT,ZDQSAT,ZRSRA,                                 &
00720                  PRNSNOW,PHSNOW,PGFLUXSNOW,PLES3L,PLEL3L,PEVAP,      &
00721                  PUSTAR                                     ) 
00722 !
00723 IF (GCRODEBUGDETAILSPRINT) CALL SNOWCROPRINTPROFILE("after SNOWCROFLUX",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00724   PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),ZSNOWTEMP(IDEBUG,:),PSNOWLIQ(IDEBUG,:),PSNOWHEAT(IDEBUG,:),&
00725  PSNOWGRAN1(IDEBUG,:),PSNOWGRAN2(IDEBUG,:),PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))
00726 !*       9.     Snow melt
00727 !               ---------
00728 !
00729 ! First Test to see if snow pack vanishes during this time step:
00730 !
00731  CALL SNOWCROGONE(PTSTEP,PLEL3L,PLES3L,PSNOWRHO,                     &
00732                  PSNOWHEAT,ZRADSINK,PEVAPCOR,PTHRUFAL,PGRNDFLUX, &
00733                  PGFLUXSNOW,PSNOWDZ,PSNOWLIQ,ZSNOWTEMP,ZRADXS,    &
00734                  PRR,INLVLS_USE) 
00735 !
00736 IF (GCRODEBUGDETAILSPRINT) CALL SNOWCROPRINTPROFILE("after SNOWCROGONE",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00737   PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),ZSNOWTEMP(IDEBUG,:),PSNOWLIQ(IDEBUG,:),PSNOWHEAT(IDEBUG,:),&
00738  PSNOWGRAN1(IDEBUG,:),PSNOWGRAN2(IDEBUG,:),PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))
00739 !
00740 ! Add radiation not absorbed by snow to soil/vegetation interface flux
00741 ! (for thin snowpacks):
00742 !
00743 PGRNDFLUX(:) = PGRNDFLUX(:) + ZRADXS(:)
00744 !
00745 ! Second Test to see if one or several snow layers vanishe during this time
00746 ! step. In such a case, the concerned snow layers are agregated to neighbours
00747 
00748  CALL SNOWCROLAYER_GONE(PTSTEP,ZSCAP,ZSNOWTEMP,PSNOWDZ,         &
00749                          PSNOWRHO,PSNOWLIQ,PSNOWGRAN1,PSNOWGRAN2,   &
00750                          PSNOWHIST,PSNOWAGE,PLES3L, INLVLS_USE) 
00751 !
00752 IF (GCRODEBUGDETAILSPRINT) CALL SNOWCROPRINTPROFILE("after SNOWCROLAYER_GONE",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00753   PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),ZSNOWTEMP(IDEBUG,:),PSNOWLIQ(IDEBUG,:),PSNOWHEAT(IDEBUG,:),&
00754  PSNOWGRAN1(IDEBUG,:),PSNOWGRAN2(IDEBUG,:),PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))
00755 !
00756 !
00757 ! For partial melt: transform excess heat content into snow liquid:
00758 !
00759  CALL SNOWCROMELT(ZSCAP,ZSNOWTEMP,PSNOWDZ,PSNOWRHO,PSNOWLIQ,INLVLS_USE)
00760 !                
00761 IF (GCRODEBUGDETAILSPRINT) CALL SNOWCROPRINTPROFILE("after SNOWCROMELT",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00762   PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),ZSNOWTEMP(IDEBUG,:),PSNOWLIQ(IDEBUG,:),PSNOWHEAT(IDEBUG,:),&
00763  PSNOWGRAN1(IDEBUG,:),PSNOWGRAN2(IDEBUG,:),PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))!                
00764 !
00765 !*      10.     Snow water flow and refreezing
00766 !               ------------------------------
00767 ! Liquid water vertical transfer and possible snowpack runoff
00768 ! And refreezing/freezing of meltwater/rainfall (ripening of the snow)
00769 !
00770  CALL SNOWCROREFRZ(PTSTEP,PRR,PSNOWRHO,ZSNOWTEMP,PSNOWDZ,PSNOWLIQ,PTHRUFAL, &
00771                   ZSCAP,PLEL3L,INLVLS_USE) 
00772 !
00773 IF (GCRODEBUGDETAILSPRINT) CALL SNOWCROPRINTPROFILE("after SNOWCROREFRZ",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00774   PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),ZSNOWTEMP(IDEBUG,:),PSNOWLIQ(IDEBUG,:),PSNOWHEAT(IDEBUG,:),&
00775  PSNOWGRAN1(IDEBUG,:),PSNOWGRAN2(IDEBUG,:),PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))
00776 !
00777 !*      11.     Snow Evaporation/Sublimation mass updates:
00778 !               ------------------------------------------
00779 !
00780  CALL SNOWCROEVAPN(PLES3L,PTSTEP,ZSNOWTEMP(:,1),PSNOWRHO(:,1),  &
00781                   PSNOWDZ(:,1),PEVAPCOR,PSNOWHMASS) 
00782 !
00783 IF (GCRODEBUGDETAILSPRINT) CALL SNOWCROPRINTPROFILE("after SNOWCROEVAPN",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00784   PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),ZSNOWTEMP(IDEBUG,:),PSNOWLIQ(IDEBUG,:),PSNOWHEAT(IDEBUG,:),&
00785  PSNOWGRAN1(IDEBUG,:),PSNOWGRAN2(IDEBUG,:),PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))
00786 !
00787 ! If all snow in uppermost layer evaporates/sublimates, re-distribute
00788 ! grid (below could be evoked for vanishingly thin snowpacks):
00789 !
00790  CALL SNOWCROEVAPGONE(PSNOWHEAT,PSNOWDZ,PSNOWRHO,ZSNOWTEMP,PSNOWLIQ,PSNOWGRAN1,&
00791                      PSNOWGRAN2,PSNOWHIST,PSNOWAGE,INLVLS_USE) 
00792 !
00793 IF (GCRODEBUGDETAILSPRINT) CALL SNOWCROPRINTPROFILE("after SNOWCROEVAPGONE",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00794   PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),ZSNOWTEMP(IDEBUG,:),PSNOWLIQ(IDEBUG,:),PSNOWHEAT(IDEBUG,:),&
00795  PSNOWGRAN1(IDEBUG,:),PSNOWGRAN2(IDEBUG,:),PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))
00796 !
00797 !*      12.     Update surface albedo:
00798 !               ----------------------
00799 ! Snow clear sky albedo:
00800 !
00801  CALL SNOWCROALB(TPTIME,OGLACIER,&
00802                 PSNOWALB,ZSPECTRALALBEDO,PSNOWDZ(:,1),PSNOWRHO(:,1:2),   &
00803                 PPERMSNOWFRAC,PSNOWGRAN1(:,1),PSNOWGRAN2(:,1), &
00804                 PSNOWAGE(:,1),PSNOWGRAN1(:,2),PSNOWGRAN2(:,2),PSNOWAGE(:,2),&
00805                 PPS, PZENITH, INLVLS_USE) 
00806 !
00807 !*      13.     Update snow heat content:
00808 !               -------------------------
00809 ! Update the heat content (variable stored each time step)
00810 ! using current snow temperature and liquid water content:
00811 !
00812 ! First, make check to make sure heat content not too large
00813 ! (this can result due to signifigant heating of thin snowpacks):
00814 ! add any excess heat to ground flux:
00815 !
00816 DO JJ=1, SIZE(ZSNOW)
00817 ! active layers
00818   DO JST=1,INLVLS_USE(JJ)
00819     ZWHOLDMAX(JJ,JST) = SNOWCROHOLD(PSNOWRHO(JJ,JST),PSNOWLIQ(JJ,JST),PSNOWDZ(JJ,JST))
00820     ZLIQHEATXS(JJ)    = MAX(0.0, PSNOWLIQ(JJ,JST)*XRHOLW - &
00821                             ZWHOLDMAX(JJ,JST)*XRHOLW) *XLMTT/PTSTEP 
00822     PSNOWLIQ(JJ,JST)  = PSNOWLIQ(JJ,JST) -ZLIQHEATXS(JJ)*PTSTEP/(XRHOLW*XLMTT)
00823     PSNOWLIQ(JJ,JST)  = MAX(0.0, PSNOWLIQ(JJ,JST))
00824     PGRNDFLUX(JJ)     = PGRNDFLUX(JJ)   + ZLIQHEATXS(JJ)
00825     PSNOWTEMP(JJ,JST) = ZSNOWTEMP(JJ,JST)
00826 !   Heat content using total density
00827     ZSCAP(JJ,JST)     = SNOW3LSCAP(PSNOWRHO(JJ,JST))
00828     PSNOWHEAT(JJ,JST) = PSNOWDZ(JJ,JST)*( ZSCAP(JJ,JST)*(PSNOWTEMP(JJ,JST)-XTT)&
00829                          - XLMTT*PSNOWRHO(JJ,JST)) +XLMTT*XRHOLW*PSNOWLIQ(JJ,JST) 
00830 !
00831     PSNOWSWE(JJ,JST)  = PSNOWDZ(JJ,JST)*PSNOWRHO(JJ,JST)
00832   ENDDO  !  end loop active snow layers
00833 !  
00834 ! unactive layers
00835   DO JST=INLVLS_USE(JJ)+1,SIZE(PSNOWSWE,2)
00836     PSNOWSWE(JJ,JST)=0.
00837     PSNOWHEAT(JJ,JST) =0.
00838     PSNOWRHO(JJ,JST)=999.
00839     PSNOWTEMP(JJ,JST)=0.
00840     PSNOWDZ(JJ,JST)=0.
00841   ENDDO  !  end loop unactive snow layers
00842 !  
00843 ENDDO    ! end loop grid points
00844 !
00845 ! print some final diagnostics
00846 ! ! ! IF (INLVLS_USE(I)>0) THEN
00847 ! ! !  write(*,FMT="(I4,2I4,F4.0,A7,F5.2,A10,F7.1,A11,F6.2,A13,F6.2)")  &
00848 ! ! !      TPTIME%TDATE%YEAR,TPTIME%TDATE%MONTH,TPTIME%TDATE%DAY,TPTIME%TIME/3600.,&
00849 ! ! !           'HTN= ',SUM(PSNOWDZ(I,1:INLVLS_USE(I))), 'FLUX Sol=', PGRNDFLUX(I),&
00850 ! ! !   'Tsurf_sol=',PTG(I)-273.16, 'Tbase_neige=',PSNOWTEMP(I,INLVLS_USE(I))-273.16 
00851 ! ! ! ENDIF
00852 
00853 IF (GCRODEBUGPRINT) THEN
00854   CALL SNOWCROPRINTDATE()
00855   CALL SNOWCROPRINTPROFILE("CROCUS : end of time step",INLVLS_USE(IDEBUG),LPRINTGRAN,&
00856         PSNOWDZ(IDEBUG,:),PSNOWRHO(IDEBUG,:),PSNOWTEMP(IDEBUG,:),PSNOWLIQ(IDEBUG,:),&
00857         PSNOWHEAT(IDEBUG,:),PSNOWGRAN1(IDEBUG,:),PSNOWGRAN2(IDEBUG,:),&
00858         PSNOWHIST(IDEBUG,:),PSNOWAGE(IDEBUG,:))
00859 END IF
00860 
00861 ! check suspect low temperature
00862 DO JJ=1,SIZE(ZSNOW)
00863 !IF(INLVLS_USE(JJ)>0) write(*,*) 'SOL:',JJ,INLVLS_USE(JJ),PGRNDFLUX(JJ),PTG(JJ),&
00864 ! PSNOWTEMP(jj,INLVLS_USE(JJ)),PSNOWTEMP(jj,1),PZENITH(JJ)           
00865        DO JST=1,INLVLS_USE(JJ)        
00866          IF (PSNOWTEMP(JJ,JST) < 100.) THEN
00867            write(*,*) 'pb tempe snow :',PSNOWTEMP(JJ,JST)
00868            write(*,FMT='("DATE:",2(I2.2,"/"),I4.4,F3.0)')          &
00869      TPTIME%TDATE%DAY,TPTIME%TDATE%MONTH,TPTIME%TDATE%YEAR,TPTIME%TIME/3600.
00870            write(*,*) 'point',JJ,"/",SIZE(ZSNOW)
00871            write(*,*) 'layer',JST
00872            write(*,*) 'pressure',PPS(JJ)
00873            write(*,*) 'slope',ACOS(PDIRCOSZW(JJ))*(180./XPI),"°"
00874            write(*,*) 'XLAT=',PXLAT(JJ),'XLON=',PXLON(JJ)
00875            write(*,*) 'solar radiation=',PSW_RAD(JJ)
00876            write(*,*) 'INLVLS_USE(JJ):',INLVLS_USE(JJ)
00877            write(*,*) PSNOWDZ(JJ,1:INLVLS_USE(JJ))
00878            write(*,*) PSNOWRHO(JJ,1:INLVLS_USE(JJ))
00879            write(*,*) PSNOWTEMP(JJ,1:INLVLS_USE(JJ))
00880            CALL ABOR1_SFX('SNOWCRO: erreur tempe snow')
00881           ENDIF
00882         ENDDO
00883 ENDDO!
00884 
00885 
00886 !Control and print energy balance
00887 IF (GCRODEBUGPRINTBALANCE) THEN
00888 
00889   ZSUMMASS_FIN(IDEBUG)=SUM(PSNOWSWE(IDEBUG,1:INLVLS_USE(JJ)))
00890   ZSUMHEAT_FIN(IDEBUG)=SUM(PSNOWHEAT(IDEBUG,1:INLVLS_USE(JJ)))
00891 
00892   CALL SNOWCROPRINTBALANCE(ZSUMMASS_INI(IDEBUG),ZSUMHEAT_INI(IDEBUG),ZSUMMASS_FIN(IDEBUG),&
00893         ZSUMHEAT_FIN(IDEBUG),PSR(IDEBUG),PRR(IDEBUG),PTHRUFAL(IDEBUG),PEVAP(IDEBUG),&
00894         PEVAPCOR(IDEBUG),PGRNDFLUX(IDEBUG),PHSNOW(IDEBUG),PRNSNOW(IDEBUG),PLEL3L(IDEBUG),&
00895         PLES3L(IDEBUG),PHPSNOW(IDEBUG),PSNOWHMASS(IDEBUG),PSNOWDZ(IDEBUG,1),PTSTEP)
00896 
00897 ENDIF
00898 
00899 IF (LPSTOPBALANCE) THEN
00900 
00901   ! bilan pour tous points pour test eventuel sur depassement seuil des residus
00902   DO JJ=1, SIZE(ZSNOW)
00903     ZSUMMASS_FIN(JJ)=SUM(PSNOWSWE(JJ,1:INLVLS_USE(JJ)))
00904     ZSUMHEAT_FIN(JJ)=SUM(PSNOWHEAT(JJ,1:INLVLS_USE(JJ)))
00905   ENDDO    ! end loop grid points
00906 
00907   CALL SNOWCROSTOPBALANCE(ZSUMMASS_INI(:),ZSUMHEAT_INI(:),ZSUMMASS_FIN(:),&
00908         ZSUMHEAT_FIN(:),PSR(:),PRR(:),PTHRUFAL(:),PEVAP(:),&
00909         PEVAPCOR(:),PGRNDFLUX(:),PHSNOW(:),PRNSNOW(:),PLEL3L(:),&
00910         PLES3L(:),PHPSNOW(:),PSNOWHMASS(:),PSNOWDZ(:,1),PTSTEP)
00911 END IF
00912 
00913 !
00914 IF (LHOOK) CALL DR_HOOK('SNOWCRO',1,ZHOOK_HANDLE)
00915 CONTAINS
00916 !
00917 !
00918 !
00919 !####################################################################
00920 !####################################################################
00921 !####################################################################
00922         SUBROUTINE SNOWCROCOMPACTN(PTSTEP,PSNOWRHO,PSNOWDZ,          &
00923                     PSNOWTEMP,PSNOW,PSNOWGRAN1,PSNOWGRAN2,PSNOWHIST, &
00924                     PSNOWLIQ,INLVLS_USE,PDIRCOSZW) 
00925 !
00926 !!    PURPOSE
00927 !!    -------
00928 !     Snow compaction due to overburden and settling.
00929 !     Mass is unchanged: layer thickness is reduced
00930 !     in proportion to density increases. Method
00931 !     directly inherited from Crocus v2.4 and
00932 !     coarsely described in Brun et al., J. Glac 1989 and 1992
00933 !
00934 !     de/e = -sigma/eta * dt
00935 !
00936 !     where e is layer thickness, sigma is the vertical stress, dt is the
00937 !     time step and eta is the snow viscosity
00938 !     * sigma is currently calculated taking into account only the overburden
00939 !     (a term representing "metamorphism stress" in fresh snow may be added
00940 !      in the future)
00941 !     * eta is computed as a function of snowtype, density and temperature
00942 !
00943 !     The local slope is taken into account, through the variable PDIRCOSZW
00944 !     which is directly the cosine of the local slope
00945 !
00946 !
00947 !     HISTORY:
00948 !     Basic structure from ISBA-ES model (Boone and Etchevers, 2001)
00949 !     Implementation of Crocus laws : E. Brun, S. Morin, J.-M. Willemet July 2010.
00950 !     Implementation of slope effect on settling : V. Vionnet, S. Morin May 2011
00951 !
00952 !
00953 USE MODD_CSTS,     ONLY : XTT, XG
00954 USE MODD_SNOW_PAR, ONLY : XRHOSMAX_ES
00955 USE MODD_SNOW_METAMO
00956 !
00957 IMPLICIT NONE
00958 !
00959 !*      0.1    declarations of arguments
00960 !
00961 REAL, INTENT(IN)                    :: PTSTEP       ! Time step UNIT : s
00962 REAL, DIMENSION(:), INTENT(IN)      :: PDIRCOSZW    ! cosine of local slope
00963 !
00964 REAL, DIMENSION(:,:), INTENT(IN)    :: PSNOWTEMP    ! Snow temperature UNIT : K
00965 !
00966 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWRHO, PSNOWDZ   ! Density UNIT : kg m-3, Layer thickness UNIT : m
00967 !
00968 REAL, DIMENSION(:), INTENT(OUT)     :: PSNOW        ! Snowheight UNIT : m
00969 !
00970 REAL, DIMENSION(:,:), INTENT(IN)    :: PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST,     !Snowtype variables
00971                                         PSNOWLIQ     ! Snow liquid water content UNIT ??? 
00972 INTEGER, DIMENSION(:), INTENT(IN)   :: INLVLS_USE   ! Number of snow layers used
00973 
00974 !
00975 !*      0.2    declarations of local variables
00976 !
00977 INTEGER                             :: JJ,JST   ! looping indexes
00978 !
00979 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWRHO2,    ! work snow density UNIT : kg m-3
00980                                                        ZVISCOSITY,   ! Snow viscosity UNIT : N m-2 s (= Pa s)
00981                                                        ZSMASS !, &           ! overburden mass for a given layer UNIT : kg m-2 
00982 !                                                      ZWSNOWDZ       ! mass of each snow layer UNIT : kg m-2
00983 !
00984 ! Compaction/Settling Coefficients from Crocus v2.4
00985 !
00986 REAL, PARAMETER                      ::  VVISC1=7.62237E6   ! pre-exponential viscosity factor (UNIT : N m-2 s)
00987 REAL, PARAMETER                      ::  VVISC3=0.023       ! density adjustement in the exponential correction for viscosity (UNIT : m3 kg-1)
00988 REAL, PARAMETER                      ::  VVISC4=.1          ! temperature adjustement in the exponential correction for viscosity (UNIT : K-1)
00989 REAL, PARAMETER                      ::  VVISC5=1.          ! factor for viscosity adjustement to grain type - to be checked
00990 REAL, PARAMETER                      ::  VVISC6=60.         ! factor for viscosity adjustement to grain type - to be checked 
00991 !                                                             (especially this one ; inconsistency with Crocus v2.4)
00992 REAL, PARAMETER                      ::  VVISC7=10.         ! factor for viscosity adjustement to grain type - to be checked
00993 REAL, PARAMETER                      ::  VRO11=250.  ! normalization term for density dependence of the viscosity calculation (UNIT : kg m-3)
00994 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00995 !
00996 !-------------------------------------------------------------------------------
00997 !
00998 ! 1. Cumulative snow mass (kg/m2):
00999 ! --------------------------------
01000 !
01001 
01002 IF (LHOOK) CALL DR_HOOK('SNOWCROCOMPACTN',0,ZHOOK_HANDLE)
01003 DO JJ=1,SIZE(PSNOW) 
01004      ZSMASS(JJ,1) = 0.0
01005      DO JST=2,INLVLS_USE(JJ)
01006         ZSMASS(JJ,JST) = ZSMASS(JJ,JST-1) + PSNOWDZ(JJ,JST-1) * PSNOWRHO(JJ,JST-1)
01007      ENDDO
01008      ZSMASS(JJ,1) = 0.5* PSNOWDZ(JJ,1) * PSNOWRHO(JJ,1)  ! overburden of half the mass of the uppermost layer applied to itself 
01009 ENDDO
01010 
01011 !
01012 ! 2. Compaction/Settling
01013 ! ----------------------
01014 
01015 DO JJ=1, SIZE(PSNOW)
01016   DO JST=1, INLVLS_USE(JJ)
01017 !
01018 ! Snow viscosity basic equation (depend on temperature and density only):
01019 !
01020      ZVISCOSITY(JJ,JST)=VVISC1 *EXP(VVISC3*PSNOWRHO(JJ,JST)+       &
01021             VVISC4*ABS(XTT-PSNOWTEMP(JJ,JST)))*PSNOWRHO(JJ,JST)/VRO11 
01022 
01023 ! Equations below apply changes to the basic viscosity value, based on snow microstructure properties
01024 
01025      IF (PSNOWLIQ(JJ,JST)>0.0) THEN
01026         ZVISCOSITY(JJ,JST)=ZVISCOSITY(JJ,JST)/        &
01027              (VVISC5+VVISC6*PSNOWLIQ(JJ,JST)/PSNOWDZ(JJ,JST)) 
01028      ENDIF
01029 
01030      IF(PSNOWLIQ(JJ,JST)/PSNOWDZ(JJ,JST) <= 0.01       &
01031             .AND.PSNOWHIST(JJ,JST)  >= NVHIS2) THEN   
01032          ZVISCOSITY(JJ,JST)=ZVISCOSITY(JJ,JST)*VVISC7
01033      ENDIF
01034 
01035      IF ((PSNOWGRAN1(JJ,JST)>=0..AND.PSNOWGRAN1(JJ,JST) < VGRAN6)  &
01036          .AND. PSNOWHIST(JJ,JST) == NVHIS1) THEN    
01037          ZVISCOSITY(JJ,JST)=ZVISCOSITY(JJ,JST)*   &
01038                MIN(4.,EXP(MIN(VDIAM1,PSNOWGRAN2(JJ,JST)-VDIAM4)/VDIAM6)) 
01039      ENDIF
01040 
01041 ! 
01042 ! Calculate new snow snow density: compaction from weight/over-burden
01043 !
01044      ZSNOWRHO2(JJ,JST) = PSNOWRHO(JJ,JST) + PSNOWRHO(JJ,JST)*PTSTEP* &
01045                          ((XG*PDIRCOSZW(JJ)*ZSMASS(JJ,JST)/ZVISCOSITY(JJ,JST)))                  
01046 !     
01047 ! Calculate new grid thickness in response to density change
01048 !
01049      PSNOWDZ(JJ,JST)   = PSNOWDZ(JJ,JST)*(PSNOWRHO(JJ,JST)/ZSNOWRHO2(JJ,JST))
01050 !
01051 !  Update density (kg m-3):
01052 !
01053      PSNOWRHO(JJ,JST)  = ZSNOWRHO2(JJ,JST)
01054 !
01055 !
01056   ENDDO    ! end loop snow layers
01057 ENDDO      ! end loop grid points
01058 !
01059 !
01060 ! 3. Update total snow depth:
01061 ! -----------------------------------------------
01062 !
01063 DO JJ=1, SIZE(PSNOWDZ,1)
01064    PSNOW(JJ)=SUM(PSNOWDZ(JJ,1:INLVLS_USE(JJ)))
01065 ENDDO
01066 IF (LHOOK) CALL DR_HOOK('SNOWCROCOMPACTN',1,ZHOOK_HANDLE)
01067 
01068 !
01069 !-------------------------------------------------------------------------------
01070 !
01071 END SUBROUTINE SNOWCROCOMPACTN
01072 
01073 
01074 !####################################################################
01075 !####################################################################
01076 !####################################################################
01077 SUBROUTINE SNOWCROMETAMO(PSNOWDZ,PSNOWGRAN1, PSNOWGRAN2, &
01078                                PSNOWHIST, PSNOWTEMP, PSNOWLIQ, PTSTEP, &
01079                                 PSNOWSWE,INLVLS_USE)  
01080 !                               
01081 
01082 !**** *METAMO* - METAMORPHOSE DES GRAINS
01083 !              - SNOW METAMORPHISM
01084 !     OBJET.
01085 !     ------
01086 !     METAMORPHOSE DU MANTEAU NEIGEUX.
01087 !     EVOLUTION DU TYPE DE GRAINS 
01088 !     MISE A JOUR DES VARIABLES HISTORIQUES.
01089 !     METAMORPHISM OF THE SNOW GRAINS,
01090 !     HISTORICAL VARIABLES
01091 
01092 !**   INTERFACE.
01093 !     ----------
01094 !     FORMALISME ADOPTE POUR LA REPRESENTATION DES GRAINS :
01095 !     FORMALISM FOR THE REPRESENTATION OF GRAINS
01096 !     -----------------------------------------------------
01097 
01098 
01099 !                    1       - -1                 NEIGE FRAICHE
01100 !                   / \      |                    -------------
01101 !                  /   \     |  DENDRICITE        DECRITE EN TERME
01102 !                 /     \    |  DENDRICITY        DE DENDRICITE ET
01103 !                /       \   |                    SPHERICITE
01104 !               2---------3  -  0                 DESCRIBED WITH
01105 !                                                 SPHERICITY AND
01106 !               |---------|                       DENDRICITY
01107 !               0         1
01108 !               SPHERICITE
01109 !               SPHERICITY
01110 
01111 !               4---------5  -
01112 !               |         |  |
01113 !               |         |  | DIAMETRE  (OU TAILLE)
01114 !               |         |  | DIAMETER  (OR SIZE  )
01115 !               |         |  |                 
01116 !               |         |  |                   NEIGE NON DENDRITIQUE
01117 !               6---------7  -                   ---------------------
01118 
01119 !                                                SPHERICITE ET TAILLE
01120 !                                                SPHERICITY AND SIZE 
01121 
01122 !              LES VARIABLES DU MODELE : 
01123 !              -------------------------
01124 !              CAS DENDRITIQUE             CAS NON DENDRITIQUE
01125 !  
01126 !            SGRAN1(JST) : DENDRICITE      SGRAN1(JST) : SPHERICITE
01127 !            SGRAN2(JST) : SPHERICITE      SGRAN2(JST) : TAILLE (EN METRE)
01128 !                                                        SIZE
01129 
01130 ! 
01131 !    CAS DENDRITIQUE/ DENDRITIC CASE
01132 !    -------------------------------
01133 !    SGRAN1(JST) VARIE DE -VGRAN1 (-99 PAR DEFAUT) (ETOILE) A 0
01134 !  (DENDRICITY)  >D OU LA DIVISION PAR -VGRAN1 POUR OBTENIR DES VALEURS
01135 !                 ENTRE 1 ET 0
01136 !                 VARIES FROM -VGRAN1 (DEFAULT -99) (FRESH SNOW) TO 0
01137 !                 DIVISION BY -VGRAN1 TO OBTAIN VALUES BETWEEN 0 AND 1
01138 
01139 !    SGRAN2(JST) VARIE DE 0 (CAS COMPLETEMENT ANGULEUX) A VGRAN1
01140 !  (SPHERICITY)  (99 PAR DEFAUT)
01141 !                >D OU LA DIVISION PAR VGRAN1 POUR OBTENIR DES VALEURS
01142 !                 ENTRE 0 ET 1
01143 !                 VARIES FROM 0 (SPHERICITY=0) TO VGRAN1
01144 
01145 
01146 !    CAS NON DENDRITIQUE / NON DENDRITIC CASE
01147 !    ---------------------------------------
01148 
01149 !    SGRAN1(JST) VARIE DE 0 (CAS COMPLETEMENT ANGULEUX) A VGRAN1
01150 !  (SPHERICITY)  (99 PAR DEFAUT) (CAS SPHERIQUE)
01151 !                >D OU LA DIVISION PAR VGRAN1 POUR OBTENIR DES VALEURS
01152 !                 ENTRE 0 ET 1
01153 !                 VARIES FROM 0 TO 99
01154 
01155 !    SGRAN2(JST) EST SUPERIEUR A VDIAM1-SPHERICITE (3.E-4 M) ET NE FAIT QUE CROITRE
01156 !     (SIZE)     IS GREATER THAN VDIAM1-SPHERICITE (3.E-4 M) ALWAYS INCREASE
01157 
01158 
01159 !    EXEMPLES : POINTS CARACTERISTIQUES DE LA FIGURE
01160 !    --------
01161 
01162 !                 SGRAN1     SGRAN2    DENDRICITE  SPHERICITE  TAILLE
01163 !                                      DENDRICITY  SPHERICITY  SIZE
01164 !      --------------------------------------------------------------
01165 !                                                               (M)
01166 !        1        -VGRAN1    VNSPH3        1           0.5
01167 !        2           0         0           0            0
01168 !        3           0       VGRAN1        0            1
01169 !        4           0       VDIAM1                     0        4.E-4 
01170 !        5         VGRAN1    VDIAM1-VSPHE1              1        3.E-4
01171 !        6           0         --                       0        --
01172 !        7         VGRAN1      --                       1        --
01173 
01174 !     PAR DEFAUT : VGRAN1 =99   VNSPH3=50 VSPHE1=1. VDIAM1=4.E-4
01175 
01176 
01177 !     METHODE.
01178 !     --------
01179 !     EVOLUTION DES TYPES DE GRAINS : SELON LES LOIS DECRITES 
01180 !     DANS BRUN ET AL (1992)
01181 !     PLUSIEURS CAS SONT A DISTINGUER
01182 !      1.2 NEIGE HUMIDE
01183 !      1.3 METAMORPHOSE NEIGE SECHE
01184 !        1.3.1 FAIBLE GRADIENT
01185 !        1.3.2 GRADIENT MOYEN
01186 !        1.3.3 FORT GRADIENT
01187 !     DANS CHAQUE CAS ON SEPARE NEIGE DENDRITIQUE ET NON DENDRITIQUE
01188 !     LE PASSAGE DENDRITIQUE => NON DENDRITIQUE SE FAIT LORSQUE 
01189 !     SGRAN1 DEVIENT > 0
01190          
01191 !     TASSEMENT : LOIS DE VISCOSITE ADAPTEE SELON LE TYPE DE GRAINS
01192 
01193 !     VARIABLES HISTORIQUES (CAS NON DENDRITIQUE SEULEMENT)
01194 
01195 !     MSHIST DEFAUT
01196 !        0           CAS NORMAL
01197 !     NVHIS1   1     GRAINS ANGULEUX
01198 !     NVHIS2   2     GRAINS AYANT ETE EN PRESENCE D EAU LIQUIDE 
01199 !                    MAIS N'AYANT PAS EU DE CARATERE ANGULEUX 
01200 !     NVHIS3   3     GRAINS AYANT ETE EN PRESENCE D EAU LIQUIDE
01201 !                    AYANT EU AUPARAVANT UN CARACTERE ANGULEUX 
01202 
01203 !     GRAIN METAMORPHISM ACCORDING TO BRUN ET AL (1992)
01204 !     THE DIFFERENT CASES ARE :
01205 !     1.2 WET SNOW
01206 !     1.3 DRY SNOW
01207 !       1.3.1. LOW      TEMPERATURE GRADIENT
01208 !       1.3.2. MODERATE TEMPERATURE GRADIENT
01209 !       1.3.3. HIGH     TEMPERATURE GRADIENT
01210 !     THE CASE OF DENTRITIC OR NON DENDRITIC SNOW IS TREATED SEPARATELY
01211 !     THE LIMIT DENTRITIC ==> NON DENDRITIC IS REACHED WHEN SGRAN1>0
01212 
01213 !     SNOW SETTLING : VISCOSITY DEPENDS ON THE GRAIN TYPES
01214 
01215 !     HISTORICAL VARIABLES (NON DENDRITIC CASE)
01216 !     MSHIST DEFAUT
01217 !        0           CAS NORMAL
01218 !     NVHIS1   1     FACETED CRISTAL
01219 !     NVHIS2   2     LIQUID WATER AND NO FACETED CRISTALS BEFORE
01220 !     NVHIS3   3     LIQUID WATER AND FACETED CRISTALS BEFORE
01221 
01222 !     EXTERNES.
01223 !     ---------
01224 
01225 !     REFERENCES.
01226 !     -----------
01227 
01228 !     AUTEURS.
01229 !     --------
01230 !        ERIC BRUN ET AL. - JOURNAL OF GLACIOLOGY 1989/1992.
01231 
01232 !     MODIFICATIONS.
01233 !     --------------
01234 !        08/95: YANNICK DANIELOU - CODAGE A LA NORME DOCTOR.
01235 !        09/96: ERIC MARTIN      - CORRECTION COMMENTAIRES
01236 !        03/06: JM Willemet      - F90 and SI units
01237 !        08/06: JM Willemet      - new formulation for TEL (Mwat/(Mice+Mwat) instead of Mwat/Mice.
01238 !                                  Threshold on the diameter increasing of the wet grains.
01239 !        01/07 : JM Willemet     - CORRECTION DES COUCHES SATUREES SUBISSANT DU TASSEMENT
01240 !                                  CORRECTION ON THE SATURATED LAYERS WHICH ARE SETTLED
01241    
01242 USE MODD_SNOW_METAMO
01243 USE MODD_CSTS, ONLY : XTT, XPI,XRHOLW
01244 USE MODE_SNOW3L
01245 !
01246       IMPLICIT NONE 
01247 !
01248 !     0.1 declarations of arguments  
01249 !      
01250       REAL, DIMENSION(:,:), INTENT(IN)    :: PSNOWDZ, PSNOWTEMP, 
01251                                               PSNOWLIQ, PSNOWSWE 
01252 !
01253       REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWGRAN1, PSNOWGRAN2, 
01254                                               PSNOWHIST              
01255 !   
01256       REAL, INTENT(IN)                    :: PTSTEP    
01257 ! 
01258 INTEGER, DIMENSION(:), INTENT(IN)      :: INLVLS_USE      
01259 !      
01260 !     0.2 declaration of local variables      
01261 !     
01262        REAL                              ::  ZGRADT,ZTELM, ZVDENT,      
01263                                                ZDENT, ZSPHE,ZVAP, 
01264                                                ZDANGL 
01265        REAL :: diam                                       
01266       INTEGER                           :: INLVLS
01267       INTEGER JST,JJ                                !Loop controls 
01268       REAL(KIND=JPRB) :: ZHOOK_HANDLE
01269 
01270 !     INITIALISATION
01271 !     --------------
01272 
01273 IF (LHOOK) CALL DR_HOOK('SNOWCROMETAMO',0,ZHOOK_HANDLE)
01274 INLVLS=SIZE(PSNOWGRAN1(:,:),2)  ! total snow layers
01275 
01276 !*    1. METAMORPHOSES DANS LES STRATES.
01277 !        METAMORPHISM
01278 !        -------------------------------
01279 DO JJ=1,SIZE(PSNOWRHO,1)
01280 DO JST=1,INLVLS_USE(JJ)
01281 
01282 !     1.1 INITIALISATION: GRADIENT DE TEMPERATURE / TEMPERATURE GRADIENT
01283 
01284   IF(JST == INLVLS_USE(JJ))THEN
01285     ZGRADT=ABS(PSNOWTEMP(JJ,INLVLS_USE(JJ))-PSNOWTEMP(JJ,INLVLS_USE(JJ)-1))*2. &
01286               /(PSNOWDZ(JJ,INLVLS_USE(JJ))+PSNOWDZ(JJ,INLVLS_USE(JJ)-1)) 
01287   ELSEIF( JST == 1)THEN
01288     ZGRADT=ABS(PSNOWTEMP(JJ,2)-PSNOWTEMP(JJ,1))*2./(PSNOWDZ(JJ,1)+PSNOWDZ(JJ,2))
01289   ELSE
01290     ZGRADT=ABS(PSNOWTEMP(JJ,JST+1)-PSNOWTEMP(JJ,JST-1))   &
01291            /(PSNOWDZ(JJ,JST-1)*.5+PSNOWDZ(JJ,JST)+PSNOWDZ(JJ,JST+1)*.5) 
01292   ENDIF
01293 
01294   IF(PSNOWLIQ(JJ,JST) > UEPSI)THEN
01295 
01296 
01297 !     1.2 METAMORPHOSE HUMIDE.
01298 !         WET SNOW METAMORPHISM
01299 
01300     ! TENEUR EN EAU LIQUIDE / LIQUID WATER CONTENT
01301 
01302     ZTELM=UPOURC*PSNOWLIQ(JJ,JST)*XRHOLW/PSNOWSWE(JJ,JST)
01303 
01304 !   VITESSE DE DIMINUTION DE LA DENDRICITE.
01305 !   RATE OF THE DENDRICITY DECREASE
01306     ZVDENT=MAX(VDENT2*ZTELM**NVDENT1,VDENT1*EXP(VVAP1/XTT))  
01307 
01308     IF(PSNOWGRAN1(JJ,JST) < -UEPSI)THEN
01309 
01310 !     1.2.1 CAS DENDRITIQUE/DENDRITIC CASE.
01311 
01312 
01313 !     VARIABLES DESCRIPTIVES DE LA DENDRICITE ET LA SPHERICITE.
01314       ZDENT=-PSNOWGRAN1(JJ,JST)/VGRAN1
01315       ZSPHE=PSNOWGRAN2(JJ,JST)/VGRAN1
01316 !     CALCUL NOUVELLE DENDRICITE ET SPHERICITE.
01317       ZDENT=ZDENT-ZVDENT*PTSTEP
01318       ZSPHE=ZSPHE+ZVDENT*PTSTEP
01319       IF(ZDENT <= UEPSI)THEN
01320 !       EVOLUTION DE SGRAN1 ET SGRAN2 ET TEST PASSAGE
01321 !       DENDRITIQUE > NON DENDRITIQUE.
01322         PSNOWGRAN1(JJ,JST)=MIN(VGRAN1,ZSPHE*VGRAN1)
01323         PSNOWGRAN2(JJ,JST)=VDIAM1-VDIAM5*MIN(ZSPHE,VSPHE1)
01324       ELSE
01325         PSNOWGRAN1(JJ,JST)=-ZDENT*VGRAN1
01326         PSNOWGRAN2(JJ,JST)=MIN(VGRAN1,ZSPHE*VGRAN1)
01327       ENDIF
01328  
01329     ELSEIF(PSNOWGRAN1(JJ,JST) < VGRAN1-UEPSI)THEN
01330 
01331 !     1.2.2 CAS NON DENDRITIQUE NON COMPLETEMENT SPHERIQUE.
01332 !           EVOLUTION DE LA SPHERICITE SEULEMENT.
01333 !           NON DENDRITIC AND NOT COMPLETELY SPHERIC CASE
01334 !           EVOLUTION OF SPHERICITY ONLY (NOT SIZE)
01335 
01336             ZSPHE=PSNOWGRAN1(JJ,JST)/VGRAN1
01337             ZSPHE=ZSPHE+ZVDENT*PTSTEP
01338             PSNOWGRAN1(JJ,JST)=MIN(VGRAN1,ZSPHE*VGRAN1)
01339     ELSE
01340 
01341 !     1.2.3 CAS NON DENDRITIQUE ET SPHERIQUE/NON DENDRITIC AND SPHERIC.
01342 !           EVOLUTION DE LA TAILLE SEULEMENT/EVOLUTION OF SIZE ONLY
01343 
01344       diam=PSNOWGRAN2(JJ,JST)
01345       PSNOWGRAN2(JJ,JST)=2.                                               &
01346                     *(3./(4.*XPI)*(4.*XPI/3.*(PSNOWGRAN2(JJ,JST)/2.)**3   &
01347                     +(VTAIL1+VTAIL2*ZTELM**NVDENT1)*PTSTEP))**(1./3.) 
01348 
01349     ENDIF
01350 
01351   ELSE
01352 
01353 !  1.3 METAMORPHOSES SECHES/DRY METAMORPHISM.
01354 
01355     IF(ZGRADT < VGRAT1)THEN
01356 
01357 !     1.3.1 CALCUL METAMORPHOSE  FAIBLE/LOW GRADIENT (0-5 DEG/M).
01358 
01359 
01360       ZVAP=EXP(VVAP1/PSNOWTEMP(JJ,JST))
01361       IF(PSNOWGRAN1(JJ,JST) < -UEPSI)THEN
01362 
01363 !       1.3.1.1 CAS DENDRITIQUE / DENDRITIC CASE.
01364 
01365         ZDENT=-PSNOWGRAN1(JJ,JST)/VGRAN1
01366         ZSPHE=PSNOWGRAN2(JJ,JST)/VGRAN1
01367         ZDENT=ZDENT-VDENT1*ZVAP*PTSTEP
01368         ZSPHE=ZSPHE+VSPHE2*ZVAP*PTSTEP
01369         IF(ZDENT < UEPSI)THEN
01370 !         EVOLUTION DE SGRAN1 ET SGRAN2 ET TEST PASSAGE
01371 !         DENDRITIQUE > NON DENDRITIQUE.
01372           PSNOWGRAN1(JJ,JST)=MIN(VGRAN1,ZSPHE*VGRAN1)
01373           PSNOWGRAN2(JJ,JST)=VDIAM1-VDIAM5*MIN(VSPHE1,ZSPHE)
01374         ELSE
01375           PSNOWGRAN1(JJ,JST)=-ZDENT*VGRAN1
01376           PSNOWGRAN2(JJ,JST)=MIN(VGRAN1,ZSPHE*VGRAN1)
01377         ENDIF
01378       ELSE
01379 
01380 !       1.3.1.2 CAS NON DENDRITIQUE / NON DENDRITIC CASE.
01381 
01382         ZSPHE=PSNOWGRAN1(JJ,JST)/VGRAN1
01383 
01384         IF(PSNOWHIST(JJ,JST) /= NVHIS1 .OR. PSNOWGRAN2(JJ,JST) < VDIAM2)THEN
01385           ZSPHE=ZSPHE+VSPHE2*ZVAP*PTSTEP
01386         ELSE
01387 
01388 !         CAS HISTORIQUE=2 OU 3 ET GROS GRAINS
01389 !         SPHERICITE LIMITEE
01390 !         CASE HISTORY=2 OR 3 AND BIG GRAINS
01391 !         LIMITED SPHERICITY 
01392 
01393           ZSPHE=ZSPHE+     &
01394          VSPHE2*ZVAP*PTSTEP*EXP(MIN(0.,VDIAM3-PSNOWGRAN2(JJ,JST))/VDIAM6) 
01395           ZSPHE=MIN(VSPHE3,ZSPHE)
01396         ENDIF
01397         PSNOWGRAN1(JJ,JST)=MIN(VGRAN1,ZSPHE*VGRAN1)
01398       ENDIF
01399     ELSEIF (ZGRADT < VGRAT2)THEN
01400 
01401 !     1.3.2 CALCUL METAMORPHOSE GRADIENT MOYEN/MODERATE (5-15).
01402 
01403 
01404       ZVAP=VDENT1*EXP(VVAP1/PSNOWTEMP(JJ,JST))*(ZGRADT)**VVAP2
01405       IF(PSNOWGRAN1(JJ,JST) < -UEPSI)THEN
01406 
01407 !       1.3.2.1 CAS DENDRITIQUE / DENDRITIC CASE.
01408 
01409         ZDENT=-PSNOWGRAN1(JJ,JST)/VGRAN1
01410         ZSPHE=PSNOWGRAN2(JJ,JST)/VGRAN1
01411         ZDENT=ZDENT-ZVAP*PTSTEP
01412         ZSPHE=ZSPHE-ZVAP*PTSTEP
01413         IF(ZDENT < UEPSI)THEN
01414 !         EVOLUTION DE ZSGRAN1 ET ZSGRAN2 ET TEST PASSAGE
01415 !         DENDRITIQUE > NON DENDRITIQUE.
01416           PSNOWGRAN1(JJ,JST)=MAX(0.,ZSPHE*VGRAN1)
01417           PSNOWGRAN2(JJ,JST)=VDIAM1-VDIAM5*MAX(ZSPHE,0.)
01418         ELSE
01419           PSNOWGRAN1(JJ,JST)=-ZDENT*VGRAN1
01420           PSNOWGRAN2(JJ,JST)=MAX(0.,ZSPHE*VGRAN1)
01421         ENDIF
01422       ELSE
01423 
01424 !       1.3.2.2 CAS NON DENDRITIQUE / NON DENDRITIC.
01425 
01426         ZSPHE=PSNOWGRAN1(JJ,JST)/VGRAN1
01427         ZSPHE=ZSPHE-ZVAP*PTSTEP
01428         PSNOWGRAN1(JJ,JST)=MAX(0.,ZSPHE*VGRAN1)
01429       ENDIF
01430     ELSE
01431 
01432 !     1.3.3 CALCUL METAMORPHOSE FORT /HIGH GRADIENT
01433 
01434 
01435       ZVAP=VDENT1*EXP(VVAP1/PSNOWTEMP(JJ,JST))*(ZGRADT)**VVAP2
01436       IF(PSNOWGRAN1(JJ,JST) < -UEPSI)THEN
01437 
01438 !       1.3.3.1 CAS DENDRITIQUE / DENDRITIC CASE.
01439 
01440         ZDENT=-PSNOWGRAN1(JJ,JST)/VGRAN1
01441         ZSPHE=PSNOWGRAN2(JJ,JST)/VGRAN1
01442         ZDENT=ZDENT-ZVAP*PTSTEP
01443 !       CAS NON DENDRITIQUE ET ANGULEUX.
01444         ZSPHE=ZSPHE-ZVAP*PTSTEP
01445         IF(ZDENT < UEPSI)THEN
01446 !         EVOLUTION DE SGRAN1 ET SGRAN2 ET TEST PASSAGE
01447 !         DENDRITIQUE > NON DENDRITIQUE.
01448           PSNOWGRAN1(JJ,JST)=MAX(0.,ZSPHE*VGRAN1)
01449           PSNOWGRAN2(JJ,JST)=VDIAM1-VDIAM5*MAX(ZSPHE,0.)
01450         ELSE
01451           PSNOWGRAN1(JJ,JST)=-ZDENT*VGRAN1
01452           PSNOWGRAN2(JJ,JST)=MAX(0.,ZSPHE*VGRAN1)
01453         ENDIF
01454       ELSEIF(PSNOWGRAN1(JJ,JST) > 0)THEN
01455 
01456 !       1.3.3.2 CAS NON DENDRITIQUE NON COMPLETEMENT ANGULEUX.
01457 !           NON DENDRITIC AND SPERICITY GT. 0
01458 
01459         ZSPHE=PSNOWGRAN1(JJ,JST)/VGRAN1
01460         ZSPHE=ZSPHE-ZVAP*PTSTEP
01461         diam=PSNOWGRAN1(JJ,JST)
01462         PSNOWGRAN1(JJ,JST)=MAX(0.,ZSPHE*VGRAN1)
01463       ELSE
01464 
01465 !       1.3.3.3 CAS NON DENDRITIQUE ET ANGULEUX/DENDRITIC AND SPERICITY=0.
01466         ZDANGL = SNOW3L_MARBOUTY(PSNOWRHO(JJ,JST),PSNOWTEMP(JJ,JST),ZGRADT) 
01467         diam=PSNOWGRAN2(JJ,JST)
01468         PSNOWGRAN2(JJ,JST) = PSNOWGRAN2(JJ,JST) + ZDANGL*VFI*PTSTEP
01469       ENDIF
01470     ENDIF
01471   ENDIF
01472 ENDDO
01473 ENDDO      
01474 
01475 !*    2. MISE A JOUR VARIABLES HISTORIQUES (CAS NON DENDRITIQUE).
01476 !        UPDATE OF THE HISTORICAL VARIABLES
01477 !        --------------------------------------------------------
01478 DO JJ=1,SIZE(PSNOWRHO,1)
01479 DO JST=1,INLVLS_USE(JJ)
01480   IF(PSNOWGRAN1(JJ,JST) >= 0.)THEN
01481     IF(PSNOWGRAN1(JJ,JST) < VSPHE4 .AND. PSNOWHIST(JJ,JST) == 0)THEN
01482       PSNOWHIST(JJ,JST)=NVHIS1
01483     ELSEIF(VGRAN1-PSNOWGRAN1(JJ,JST) < VSPHE4 .AND.        &
01484            PSNOWLIQ(JJ,JST)/(PSNOWDZ(JJ,JST)) > VTELV1)THEN 
01485       IF(PSNOWHIST(JJ,JST) == 0) PSNOWHIST(JJ,JST)=NVHIS2
01486       IF(PSNOWHIST(JJ,JST) == NVHIS1) PSNOWHIST(JJ,JST)=NVHIS3
01487     ELSEIF(PSNOWTEMP(JJ,JST) < XTT)THEN
01488       IF(PSNOWHIST(JJ,JST) == NVHIS2) PSNOWHIST(JJ,JST)=NVHIS4
01489       IF(PSNOWHIST(JJ,JST) == NVHIS3) PSNOWHIST(JJ,JST)=NVHIS5
01490     ENDIF
01491   ENDIF
01492 ENDDO
01493 ENDDO
01494 IF (LHOOK) CALL DR_HOOK('SNOWCROMETAMO',1,ZHOOK_HANDLE)
01495 
01496 END SUBROUTINE SNOWCROMETAMO  
01497 
01498 !####################################################################
01499 !####################################################################
01500 !####################################################################
01501 !  
01502 !####################################################################
01503 !####################################################################
01504 !####################################################################
01505 !
01506         SUBROUTINE SNOWCROALB(TPTIME,OGLACIER,&
01507                               PALBEDOSC,PSPECTRALALBEDO,PSNOWDZ,&
01508                               PSNOWRHO,PPERMSNOWFRAC,   &
01509                               PSNOWGRAN1_TOP,PSNOWGRAN2_TOP,PSNOWAGE_TOP, &
01510                               PSNOWGRAN1_BOT,PSNOWGRAN2_BOT,PSNOWAGE_BOT, &
01511                               PPS, PZENITH, INLVLS_USE) 
01512 !
01513 !!    PURPOSE
01514 !!    -------
01515 !     Calculate the snow surface albedo. Use the method of original
01516 !     Crocus which considers a specified spectral distribution of solar 
01517 !     solar radiation (to be replaced by an input forcing when available)
01518 !     In addition to original crocus, the top 2 surface snow layers are
01519 !     considered in the calculation, using an arbitrary weighting, in order
01520 !     to avoid time discontinuities due to layers agregation
01521 !     Ageing depends on the presence of permanent snow cover 
01522 !
01523 USE MODD_CSTS,     ONLY : XDAY
01524 USE MODD_SNOW_PAR, ONLY : XWCRN, XANSMAX, XANSMIN, XANS_TODRY, &
01525                            XSNOWDMIN, XANS_T, XAGLAMIN, XAGLAMAX, &
01526                            XALBICE1,XALBICE2,XALBICE3,&
01527                            XRHOTHRESHOLD_ICE,XZ0ICEZ0SNOW,&
01528                            XD1,XD2,XD3,XX,XVALB2,XVALB3,&
01529                            XVALB4,XVALB5,XVALB6,XVALB7,XVALB8,&  
01530                            XVALB9,XVALB10,XVALB11,XVDIOP1, &
01531                            XVRPRE1,XVRPRE2,XVAGING_NOGLACIER,&
01532                            XVAGING_GLACIER,XVPRES1,&
01533                            XVSPEC1,XVSPEC2,XVSPEC3,&
01534                            XVW1,XVW2,XVD1,XVD2
01535  
01536 USE MODD_TYPE_DATE_SURF, ONLY : DATE_TIME                                                    
01537 !
01538 !
01539 USE MODE_SNOW3L
01540 !
01541 IMPLICIT NONE
01542 !
01543 !*      0.1    declarations of arguments
01544 !
01545 TYPE(DATE_TIME), INTENT(IN)       :: TPTIME      ! current date and time
01546 LOGICAL, INTENT(IN)               :: OGLACIER   ! True = Over permanent snow and ice, 
01547 !                                                   initialise WGI=WSAT,
01548 !                                                   Hsnow>=10m and allow 0.8<SNOALB<0.85
01549                                                 ! False = No specific treatment
01550 REAL, DIMENSION(:), INTENT(IN)    :: PSNOWDZ,PPERMSNOWFRAC
01551 !
01552 REAL,DIMENSION(:,:),INTENT(IN)      :: PSNOWRHO ! For now only the 2 first layers are required
01553 !
01554 REAL, DIMENSION(:), INTENT(INOUT) :: PALBEDOSC
01555 !  
01556 REAL, DIMENSION(:,:), INTENT(OUT) :: PSPECTRALALBEDO   ! Albedo in the different spectral bands
01557 !
01558 REAL, DIMENSION(:), INTENT(IN)  :: PSNOWGRAN1_TOP,PSNOWGRAN2_TOP,PSNOWAGE_TOP, 
01559                                 PSNOWGRAN1_BOT,PSNOWGRAN2_BOT,PSNOWAGE_BOT, PPS 
01560 INTEGER, DIMENSION(:), INTENT(IN)    :: INLVLS_USE                
01561 ! 
01562 REAL, DIMENSION(:), INTENT(IN)    :: PZENITH ! solar zenith angle for future use
01563 !
01564 !*      0.2    declarations of local variables
01565 !
01566 INTEGER                             :: JJ   ! looping indexes
01567 !
01568 REAL, DIMENSION(SIZE(PSNOWRHO))   ::  ZANSMIN,ZANSMAX  
01569 !
01570 REAL, DIMENSION(SIZE(PSNOWRHO))   :: ZDIAM_TOP,ZDIAM_BOT
01571 REAL, DIMENSION(SIZE(PSNOWRHO),3)   :: ZALB,ZALB_TOP,ZALB_BOT
01572 !
01573 REAL, DIMENSION(SIZE(PALBEDOSC))         :: NVAGE1                   
01574 REAL            :: ZAGE_NOW
01575 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01576 
01577 !-------------------------------------------------------------------------------
01578 !
01579 ! 0. Initialize:
01580 ! ------------------
01581 !
01582 
01583 
01584 ! PRINT*,XVAGING_NOGLACIER,XVAGING_GLACIER
01585 
01586 
01587 IF (LHOOK) CALL DR_HOOK('SNOWCROALB',0,ZHOOK_HANDLE)
01588 IF(OGLACIER)THEN
01589    ZANSMIN(:) = XAGLAMIN * PPERMSNOWFRAC(:) + XANSMIN * (1.0-PPERMSNOWFRAC(:))
01590    ZANSMAX(:) = XAGLAMAX * PPERMSNOWFRAC(:) + XANSMAX * (1.0-PPERMSNOWFRAC(:))  
01591    NVAGE1(:)  = XVAGING_GLACIER * PPERMSNOWFRAC(:) &
01592                   + XVAGING_NOGLACIER * (1.0-PPERMSNOWFRAC(:)) 
01593 ELSE
01594    ZANSMIN(:) = XANSMIN
01595    ZANSMAX(:) = XANSMAX   
01596    NVAGE1(:)  = XVAGING_NOGLACIER
01597 ENDIF
01598 
01599 ! ! ! ! ! !  date computation for ageing effects
01600 ! ! ! ! !   CALL GREGODSTRATI(TPTIME%TDATE%YEAR,TPTIME%TDATE%MONTH,TPTIME%TDATE%DAY,   &
01601 ! ! ! ! !                       TPTIME%TIME,ZAGE_NOW) 
01602 
01603 ! coherence control
01604 ! to remove when initialization routines will be updated
01605 IF (MINVAL(PSNOWAGE_BOT)<0) THEN
01606   CALL ABOR1_SFX('FATAL ERROR in SNOWCRO: Snow layer age inconsistent : check initialization routine. !')
01607 END IF
01608 
01609 ! ! ! ! ! ! should be moved with other time controls to not compute MAXVAL(PSNOWAGE_TOP) at each time step
01610 ! ! ! ! ! IF ((ZAGE_NOW - MAXVAL(PSNOWAGE_TOP))<-0.001) THEN
01611 ! ! ! ! !       WRITE(*,*),"ZAGE_NOW=",ZAGE_NOW
01612 ! ! ! ! !       WRITE(*,*),"MAXVAL(PSNOWAGE_TOP)=",MAXVAL(PSNOWAGE_TOP)
01613 ! ! ! ! !       CALL ABOR1_SFX(&
01614 ! ! ! ! !       'FATAL ERROR in SNOWCRO: Snow layer date inconsistent with the current day !')
01615 ! ! ! ! ! END IF
01616 
01617 DO JJ=1, SIZE(PALBEDOSC)
01618   IF (INLVLS_USE(JJ)==0) THEN
01619 ! case with no snow on the ground 
01620       PALBEDOSC(JJ) = ZANSMIN(JJ)
01621   ELSE
01622 ! case with snow on the ground 
01623 ! top layer
01624     
01625     IF (PSNOWRHO(JJ,1) < XRHOTHRESHOLD_ICE) THEN
01626       ! Normal case (snow)
01627 
01628       IF (PSNOWGRAN1_TOP(JJ)<0.) THEN
01629         ZDIAM_TOP(JJ) = -PSNOWGRAN1_TOP(JJ)*XD1/XX+(1.+PSNOWGRAN1_TOP(JJ)/XX)* &
01630                         (PSNOWGRAN2_TOP(JJ)*XD2/XX+(1.-PSNOWGRAN2_TOP(JJ)/XX)*XD3) 
01631         ZDIAM_TOP(JJ)=ZDIAM_TOP(JJ)/10000.      
01632       ELSE 
01633         ZDIAM_TOP(JJ)=MAX(0.0003,0.5*(1.+PSNOWGRAN1_TOP(JJ)/XX)*PSNOWGRAN2_TOP(JJ))       
01634       ENDIF
01635       ZALB_TOP(JJ,1)=MIN(XVALB2-XVALB3*SQRT(ZDIAM_TOP(JJ)),XVALB4)
01636       ZALB_TOP(JJ,2)=MAX(0.3,XVALB5-XVALB6*SQRT(ZDIAM_TOP(JJ)))
01637       ZDIAM_TOP(JJ)=MIN(ZDIAM_TOP(JJ),XVDIOP1)
01638       ZALB_TOP(JJ,3)=MAX(0.,XVALB7*ZDIAM_TOP(JJ)-XVALB8*SQRT(ZDIAM_TOP(JJ))+XVALB9)
01639       !
01640       ! AGE CORRECTION ONLY FOR VISIBLE BAND
01641       !
01642 ! ! ! ! !       ZALB_TOP(JJ,1)=MAX(XVALB11,ZALB_TOP(JJ,1)-MIN(MAX(PPS(JJ)/XVPRES1,XVRPRE1), &
01643 ! ! ! ! !                       XVRPRE2)*XVALB10*(ZAGE_NOW-PSNOWAGE_TOP(JJ))/NVAGE1(JJ))
01644       ZALB_TOP(JJ,1) = MAX(XVALB11,ZALB_TOP(JJ,1)-MIN(MAX(PPS(JJ)/XVPRES1,XVRPRE1), &
01645                         XVRPRE2)*XVALB10*PSNOWAGE_TOP(JJ)/NVAGE1(JJ))
01646 
01647 
01648     ELSE
01649 
01650       ! Prescribed spectral albedo for surface ice
01651       ZALB_TOP(JJ,1)=XALBICE1
01652       ZALB_TOP(JJ,2)=XALBICE2
01653       ZALB_TOP(JJ,3)=XALBICE3
01654 
01655     END IF
01656                   
01657 !      IF (INLVLS_USE(JJ)>=1) THEN
01658     IF (INLVLS_USE(JJ)>=2) THEN !modif ML
01659 ! second surface layer when it exists 
01660 
01661       IF (PSNOWRHO(JJ,2) < XRHOTHRESHOLD_ICE) THEN
01662         ! Normal case (snow)
01663      
01664         IF(PSNOWGRAN1_BOT(JJ)<0.) THEN
01665           ZDIAM_BOT(JJ) = -PSNOWGRAN1_BOT(JJ)*XD1/XX+(1.+PSNOWGRAN1_BOT(JJ)/XX)* &
01666                           (PSNOWGRAN2_BOT(JJ)*XD2/XX+(1.-PSNOWGRAN2_BOT(JJ)/XX)*XD3) 
01667           ZDIAM_BOT(JJ)=ZDIAM_BOT(JJ)/10000.      
01668         ELSE 
01669           ZDIAM_BOT(JJ)=MAX(0.0003,0.5*(1.+PSNOWGRAN1_BOT(JJ)/XX)*PSNOWGRAN2_BOT(JJ))       
01670         ENDIF
01671 
01672         ZALB_BOT(JJ,1)=MIN(XVALB2-XVALB3*SQRT(ZDIAM_BOT(JJ)),XVALB4)
01673         ZALB_BOT(JJ,2)=MAX(0.3,XVALB5-XVALB6*SQRT(ZDIAM_BOT(JJ)))
01674         ZDIAM_BOT(JJ)=MIN(ZDIAM_BOT(JJ),XVDIOP1)
01675         ZALB_BOT(JJ,3)=MAX(0.,XVALB7*ZDIAM_BOT(JJ)-XVALB8*SQRT(ZDIAM_BOT(JJ))+XVALB9) 
01676         !
01677         ! AGE CORRECTION ONLY FOR VISIBLE BAND
01678  
01679 ! ! ! ! !               ZALB_BOT(JJ,1)=MAX(XVALB11,ZALB_BOT(JJ,1)-MIN(MAX(PPS(JJ)/XVPRES1,XVRPRE1), &
01680 ! ! ! ! !                       XVRPRE2)*XVALB10*MIN(365.,ZAGE_NOW-PSNOWAGE_BOT(JJ))/NVAGE1(JJ))
01681 
01682         ZALB_BOT(JJ,1) = MAX(XVALB11,ZALB_BOT(JJ,1)-MIN(MAX(PPS(JJ)/XVPRES1,XVRPRE1), &
01683                          XVRPRE2)*XVALB10*MIN(365.,PSNOWAGE_BOT(JJ))/NVAGE1(JJ))
01684       ELSE
01685 
01686         ! Prescribed spectral albedo for surface ice
01687         ZALB_BOT(JJ,1)=XALBICE1
01688         ZALB_BOT(JJ,2)=XALBICE2
01689         ZALB_BOT(JJ,3)=XALBICE3
01690 
01691       ENDIF
01692 
01693     ELSE
01694 
01695       ! when it does not exist, the second surface layer gets top layer albedo   
01696       ZALB_BOT(JJ,1)= ZALB_TOP(JJ,1)
01697       ZALB_BOT(JJ,2)= ZALB_TOP(JJ,2)
01698       ZALB_BOT(JJ,3)= ZALB_TOP(JJ,3)
01699     
01700     ENDIF
01701 ! 
01702 ! computation of spectral albedo over 3 bands taking into account the respective
01703 ! depths of top layers 
01704 !
01705      PSPECTRALALBEDO(JJ,1)=(XVW1*min(1.,PSNOWDZ(JJ)/XVD1)+ &
01706                  XVW2*min(1.,max(0.,(PSNOWDZ(JJ)-XVD1)/XVD2))) *ZALB_TOP(JJ,1) + &
01707                  (XVW1*(1.-min(1.,PSNOWDZ(JJ)/XVD1))+ &
01708                  XVW2*(1.- min(1.,max(0.,(PSNOWDZ(JJ)-XVD1)/XVD2))))*ZALB_BOT(JJ,1) 
01709      PSPECTRALALBEDO(JJ,2)=(XVW1*min(1.,PSNOWDZ(JJ)/XVD1)+ &
01710                  XVW2*min(1.,max(0.,(PSNOWDZ(JJ)-XVD1)/XVD2))) *ZALB_TOP(JJ,2) + &
01711                  (XVW1*(1.-min(1.,PSNOWDZ(JJ)/XVD1))+ &
01712                  XVW2*(1.- min(1.,max(0.,(PSNOWDZ(JJ)-XVD1)/XVD2))))*ZALB_BOT(JJ,2) 
01713      PSPECTRALALBEDO(JJ,3)=(XVW1*min(1.,PSNOWDZ(JJ)/XVD1)+ &
01714                  XVW2*min(1.,max(0.,(PSNOWDZ(JJ)-XVD1)/XVD2))) *ZALB_TOP(JJ,3) + &
01715                  (XVW1*(1.-min(1.,PSNOWDZ(JJ)/XVD1))+ &
01716                  XVW2*(1.- min(1.,max(0.,(PSNOWDZ(JJ)-XVD1)/XVD2))))*ZALB_BOT(JJ,3) 
01717 !                
01718 ! arbitrarily specified spectral distribution  
01719 ! to be changed when solar radiation distribution is an input variable 
01720     PALBEDOSC(JJ)=XVSPEC1*PSPECTRALALBEDO(JJ,1)+XVSPEC2*PSPECTRALALBEDO(JJ,2)+XVSPEC3*PSPECTRALALBEDO(JJ,3) 
01721 !    
01722 
01723   ENDIF ! end case with snow on the ground
01724 ENDDO ! end loop grid points
01725 IF (LHOOK) CALL DR_HOOK('SNOWCROALB',1,ZHOOK_HANDLE)
01726 !-------------------------------------------------------------------------------
01727 !
01728 END SUBROUTINE SNOWCROALB
01729 !####################################################################
01730 !####################################################################
01731 !####################################################################
01732       SUBROUTINE SNOWCRORAD(TPTIME, OGLACIER,  &
01733                             PSW_RAD, PSNOWALB, PSNOWDZ,  &
01734                             PSNOWRHO, PALB, PRADSINK, PRADXS,        &
01735                             PSNOWGRAN1, PSNOWGRAN2, PSNOWAGE,PPS,    &
01736                             PZENITH, PPERMSNOWFRAC,INLVLS_USE        ) 
01737 !
01738 !!    PURPOSE
01739 !!    -------
01740 !     Calculate the transmission of shortwave (solar) radiation
01741 !     through the snowpack (using a form of Beer's Law: exponential
01742 !     decay of radiation with increasing snow depth).
01743 !     Needs a first calculation of the albedo to stay coherent with
01744 !     ISBA-ES ==> make sure to keep SNOWCRORAD coherent with SNOWCROALB
01745 !
01746 USE MODD_CSTS,     ONLY : XDAY
01747 USE MODD_SNOW_PAR, ONLY : XWCRN, XANSMAX, XANSMIN, XANS_TODRY, &
01748                            XSNOWDMIN, XANS_T, XAGLAMIN, XAGLAMAX ,&
01749                            XD1,XD2,XD3,XX,XVSPEC1,XVSPEC2,XVSPEC3
01750 USE MODD_TYPE_DATE_SURF, ONLY: DATE_TIME                      
01751 !
01752 IMPLICIT NONE
01753 !
01754 !*      0.1    declarations of arguments
01755 !
01756 TYPE(DATE_TIME), INTENT(IN)       :: TPTIME      ! current date and time
01757 LOGICAL, INTENT(IN)               :: OGLACIER   ! True = Over permanent snow and ice, 
01758 !                                                   initialise WGI=WSAT,
01759 !                                                   Hsnow>=10m and allow 0.8<SNOALB<0.85
01760                                                 ! False = No specific treatment
01761 !
01762 REAL, DIMENSION(:), INTENT(IN)      :: PSW_RAD, PSNOWALB, PALB,PPERMSNOWFRAC
01763 !
01764 REAL, DIMENSION(:,:), INTENT(IN)    :: PSNOWRHO, PSNOWDZ
01765 !
01766 REAL, DIMENSION(:), INTENT(OUT)     :: PRADXS
01767 !
01768 REAL, DIMENSION(:,:), INTENT(OUT)   :: PRADSINK
01769 !
01770 REAL, DIMENSION(:,:), INTENT(IN)    :: PSNOWGRAN1, PSNOWGRAN2, PSNOWAGE 
01771 REAL, DIMENSION(:), INTENT(IN)      :: PPS 
01772 INTEGER, DIMENSION(:), INTENT(IN)   :: INLVLS_USE
01773 REAL, DIMENSION(:), INTENT(IN)      :: PZENITH 
01774 !*      0.2    declarations of local variables
01775 !
01776 INTEGER                             :: JJ,JST   ! looping indexes
01777 !
01778 REAL, DIMENSION(SIZE(PSNOWRHO,1))    :: ZRADTOT, ZANSMIN, ZANSMAX
01779 REAL, DIMENSION(SIZE(PSNOWRHO,1))    :: ZALB_NEW
01780 REAL     :: ZPROJLAT
01781 REAL, DIMENSION(SIZE(PSNOWRHO,2))   :: ZDIAM
01782 REAL, DIMENSION(SIZE(PSNOWRHO,2),3)   :: ZBETA
01783 REAL, DIMENSION(SIZE(PSNOWRHO,1),3)   :: ZALB !albedo 3 bands
01784 REAL, DIMENSION(3)   :: ZOPTICALPATH
01785 
01786 ! calibration coefficients for exctinction computation
01787 REAL, PARAMETER ::  PPVBETA1=1.92E-3,PPVBETA2=40.,PPVBETA3=1.098E-2,            
01788                      PPVBETA4=100., PPVBETA5=2000.
01789 
01790 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01791 !-------------------------------------------------------------------------------
01792 !
01793 ! 0. Initialization:
01794 ! ------------------
01795 !
01796   IF (LHOOK) CALL DR_HOOK('SNOWCRORAD',0,ZHOOK_HANDLE)
01797   PRADSINK(:,:)=0.
01798 !  
01799 IF(OGLACIER)THEN
01800    ZANSMIN(:) = XAGLAMIN * PPERMSNOWFRAC(:) + XANSMIN * (1.0-PPERMSNOWFRAC(:))
01801    ZANSMAX(:) = XAGLAMAX * PPERMSNOWFRAC(:) + XANSMAX * (1.0-PPERMSNOWFRAC(:))  
01802 ELSE
01803    ZANSMIN(:) = XANSMIN
01804    ZANSMAX(:) = XANSMAX   
01805 ENDIF
01806 !
01807 !
01808 ! 1. Computation of the new albedo (see SNOWCROALB):
01809 ! -----------------------------------
01810 !
01811 !  
01812  CALL SNOWCROALB(TPTIME,OGLACIER,&
01813                 ZALB_NEW,ZALB,PSNOWDZ(:,1),PSNOWRHO(:,1:2),   &
01814                 PPERMSNOWFRAC,PSNOWGRAN1(:,1),PSNOWGRAN2(:,1), &
01815                 PSNOWAGE(:,1),PSNOWGRAN1(:,2),PSNOWGRAN2(:,2),PSNOWAGE(:,2),&
01816                 PPS, PZENITH, INLVLS_USE) 
01817 
01818 DO JJ=1, SIZE(PSW_RAD)
01819 ! Coefficient for taking into account the increase of path length of rays
01820 ! in snow due to zenithal angle
01821 ZPROJLAT=1./MAX(UEPSI,COS(PZENITH(JJ)))
01822 !
01823   DO JST=1, INLVLS_USE(JJ)                     
01824   IF (PSNOWGRAN1(JJ,JST)<0.) THEN
01825      ZDIAM(JST)=-PSNOWGRAN1(JJ,JST)*XD1/XX+(1.+PSNOWGRAN1(JJ,JST)/XX)* &
01826                      (PSNOWGRAN2(JJ,JST)*XD2/XX+(1.-PSNOWGRAN2(JJ,JST)/XX)*XD3) 
01827      ZDIAM(JST)=ZDIAM(JST)/10000.      
01828   ELSE 
01829      ZDIAM(JST)=MAX(0.0003,0.5*(1.+PSNOWGRAN1(JJ,JST)/XX)*PSNOWGRAN2(JJ,JST))      
01830   ENDIF
01831   ENDDO    ! end loop snow layers
01832 
01833 !
01834 ! 2. Extinction of net shortwave radiation
01835 ! ----------------------------------------
01836 ! First calculates extinction coefficients fn of grain size and density
01837 ! then calculates exctinction in the layer and increases optical path length
01838 !
01839 !   Initialize optical depth  
01840     ZOPTICALPATH(1)=0.
01841     ZOPTICALPATH(2)=0.
01842     ZOPTICALPATH(3)=0.
01843   DO JST=1, INLVLS_USE(JJ)                     
01844     ZBETA(JST,1)=MAX(PPVBETA1*PSNOWRHO(JJ,JST)/SQRT(ZDIAM(JST)),PPVBETA2)
01845     ZBETA(JST,2)=MAX(PPVBETA3*PSNOWRHO(JJ,JST)/SQRT(ZDIAM(JST)),PPVBETA4)
01846     ZBETA(JST,3)=PPVBETA5
01847     ZOPTICALPATH(1)=ZOPTICALPATH(1)+ ZBETA(JST,1)*PSNOWDZ(JJ,JST)
01848     ZOPTICALPATH(2)=ZOPTICALPATH(2)+ ZBETA(JST,2)*PSNOWDZ(JJ,JST)
01849     ZOPTICALPATH(3)=ZOPTICALPATH(3)+ ZBETA(JST,3)*PSNOWDZ(JJ,JST)
01850     PRADSINK(JJ,JST)  = -PSW_RAD(JJ)*(1.-PSNOWALB(JJ))/(1.-ZALB_NEW(JJ))*    &
01851          ( XVSPEC1*(1.-ZALB(JJ,1))*EXP(-ZOPTICALPATH(1)*ZPROJLAT)  &
01852          + XVSPEC2*(1.-ZALB(JJ,2))*EXP(-ZOPTICALPATH(2)*ZPROJLAT)  &
01853          + XVSPEC3*(1.-ZALB(JJ,3))*EXP(-ZOPTICALPATH(3)*ZPROJLAT))       
01854   ENDDO    ! end loop snow layers
01855 !
01856 ! For thin snow packs, radiation might reach base of
01857 ! snowpack and the reflected energy can be absorbed by the bottom of snow layer:
01858 ! THIS PROCESS IS NOT SIMULATED
01859 !
01860 !
01861 ! 4. Excess radiation not absorbed by snowpack (W/m2)JJ
01862 ! ----------------------------------------------------
01863 !
01864   PRADXS(JJ) = -PRADSINK(JJ,INLVLS_USE(JJ))
01865 
01866 ENDDO    !end loop grid points
01867 IF (LHOOK) CALL DR_HOOK('SNOWCRORAD',1,ZHOOK_HANDLE)
01868 !
01869 !-------------------------------------------------------------------------------
01870 !
01871 END SUBROUTINE SNOWCRORAD
01872 !####################################################################
01873 !####################################################################
01874 !####################################################################
01875       SUBROUTINE SNOWCROTHRM(PSNOWRHO,PSCOND,PSNOWTEMP,PPS,PSNOWLIQ,  &
01876                              OCOND_GRAIN,OCOND_YEN) 
01877 !
01878 !!    PURPOSE
01879 !!    -------
01880 !     Calculate snow thermal conductivity from
01881 !     Sun et al. 1999, J. of Geophys. Res., 104, 19587-19579
01882 !     (vapor) and Anderson, 1976, NOAA Tech. Rep. NWS 19 (snow).
01883 !
01884 !     Upon activation of flag OCOND_YEN, use the Yen (1981) formula for thermal conductivity
01885 !     This formula was originally used in Crocus.
01886 !
01887 !
01888 USE MODD_CSTS,ONLY : XP00, XCONDI, XRHOLW
01889 !
01890 IMPLICIT NONE
01891 !
01892 !*      0.1    declarations of arguments
01893 !
01894 REAL, DIMENSION(:), INTENT(IN)      :: PPS
01895 !
01896 REAL, DIMENSION(:,:), INTENT(IN)    :: PSNOWTEMP, PSNOWRHO, PSNOWLIQ
01897 !
01898 REAL, DIMENSION(:,:), INTENT(OUT)   :: PSCOND
01899 !
01900 LOGICAL, INTENT(IN)                 :: OCOND_GRAIN, OCOND_YEN
01901 !
01902 !*      0.2    declarations of local variables
01903 !
01904 INTEGER JJ, JST ! looping indexes
01905 !
01906 ! ISBA-ES Thermal conductivity coefficients from Anderson (1976):
01907 ! see Boone, Meteo-France/CNRM Note de Centre No. 70 (2002)
01908 !
01909 REAL, PARAMETER                      :: ZSNOWTHRMCOND1 = 0.02    ! [W/(m K)]
01910 REAL, PARAMETER                      :: ZSNOWTHRMCOND2 = 2.5E-6  ! [W m5/(kg2 K)]
01911 !
01912 ! ISBA-ES Thermal conductivity: Implicit vapor diffn effects
01913 ! (sig only for new snow OR high altitudes)
01914 ! from Sun et al. (1999): based on data from Jordan (1991)
01915 ! see Boone, Meteo-France/CNRM Note de Centre No. 70 (2002)
01916 !
01917 REAL, PARAMETER                      :: ZSNOWTHRMCOND_AVAP  = -0.06023 ! [W/(m K)]
01918 REAL, PARAMETER                      :: ZSNOWTHRMCOND_BVAP  = -2.5425  ! (W/m)
01919 REAL, PARAMETER                      :: ZSNOWTHRMCOND_CVAP  = -289.99  ! (K)
01920 !-------------------------------------------------------------------------------
01921 ! Crocus thermal conducitivity coefficient from Yen (1981)
01922 REAL, PARAMETER                      :: VRKZ6 = 1.88
01923 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01924 !
01925 ! 1. Snow thermal conductivity
01926 ! ----------------------------
01927 !
01928 
01929 IF (LHOOK) CALL DR_HOOK('SNOWCROTHRM',0,ZHOOK_HANDLE)
01930 DO JJ=1,SIZE(PSNOWRHO(:,:),1)
01931     DO JST=1,SIZE(PSNOWRHO(:,:),2)
01932 !
01933            IF (OCOND_YEN) THEN
01934              PSCOND(JJ,JST) = XCONDI * EXP(VRKZ6 * LOG(PSNOWRHO(JJ,JST)/XRHOLW))
01935            ELSE
01936          PSCOND(JJ,JST) = (ZSNOWTHRMCOND1 + ZSNOWTHRMCOND2*PSNOWRHO(JJ,JST)* &
01937                      PSNOWRHO(JJ,JST))  +      &
01938                     MAX(0.0,(ZSNOWTHRMCOND_AVAP+  &
01939                    (ZSNOWTHRMCOND_BVAP/(PSNOWTEMP(JJ,JST)+  &
01940                    ZSNOWTHRMCOND_CVAP)))*(XP00/PPS(JJ))) 
01941            ENDIF
01942 !
01943 ! Snow thermal conductivity is set to be above 0.04 W m-1 K-1
01944            IF(OCOND_GRAIN) THEN                  
01945                PSCOND(JJ,JST) = MAX(0.04,PSCOND(JJ,JST))
01946 ! Snow thermal conductivity is annihilated in presence of liquid water            
01947                IF(PSNOWLIQ(JJ,JST)>UEPSI) PSCOND(JJ,JST) =0.01*PSCOND(JJ,JST)  
01948            ENDIF
01949 !
01950    ENDDO   !  end loop JST
01951 ENDDO      ! end loop JST
01952 IF (LHOOK) CALL DR_HOOK('SNOWCROTHRM',1,ZHOOK_HANDLE)
01953 !
01954 !-------------------------------------------------------------------------------
01955 !
01956 END SUBROUTINE SNOWCROTHRM
01957 !####################################################################
01958 !####################################################################
01959 !####################################################################
01960       SUBROUTINE SNOWCROEBUD(HSNOWRES, HIMPLICIT_WIND,                                   &
01961                              PPEW_A_COEF, PPEW_B_COEF,                                   &
01962                              PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF,         &
01963                              PSNOWDZMIN,                                                 &
01964                              PZREF,PTS,PSNOWRHO,PSNOWLIQ,PSCAP,PSCOND1,PSCOND2,          &
01965                              PUREF,PEXNS,PEXNA,PDIRCOSZW,PVMOD,                          &
01966                              PLW_RAD,PSW_RAD,PTA,PQA,PPS,PTSTEP,                         &
01967                              PSNOWDZ1,PSNOWDZ2,PALBT,PZ0,PZ0EFF,PZ0H,                    &
01968                              PSFCFRZ,PRADSINK,PHPSNOW,                                   &
01969                              PCT,PEMIST,PRHOA,PTSTERM1,PTSTERM2,PRA,PCDSNOW,PCHSNOW,     &
01970                              PQSAT,PDQSAT,PRSRA,PUSTAR2_IC, PRI,                           &
01971                              PPET_A_COEF_T,PPEQ_A_COEF_T,PPET_B_COEF_T,PPEQ_B_COEF_T     ) 
01972 !
01973 !!    PURPOSE
01974 !!    -------
01975 !     Calculate surface energy budget linearization (terms) and turbulent
01976 !     exchange coefficients/resistance between surface and atmosphere.
01977 !     (Noilhan and Planton 1989; Giordani 1993; Noilhan and Mahfouf 1996)
01978 !
01979 !!    MODIFICATIONS
01980 !!    -------------
01981 !!      Original A. Boone 
01982 !!      Modified by E. Brun (24/09/2012) :
01983 !!      * Correction coupling coefficient for specific humidity in SNOWCROEBUD
01984 !!      * PSFCFRZ(:)  = 1.0 for systematic solid/vapor latent fluxes in SNOWCROEBUD
01985 !!      Modified by B. Decharme 09/12  new wind implicitation
01986 !
01987 USE MODD_SURF_PAR, ONLY : XUNDEF
01988 USE MODD_CSTS,     ONLY : XCPD, XRHOLW, XSTEFAN, XLVTT, XLSTT, XRHOLW
01989 USE MODD_SNOW_PAR, ONLY : X_RI_MAX, XEMISSN
01990 !
01991 USE MODE_THERMOS
01992 !
01993 USE MODI_SURFACE_RI
01994 USE MODI_SURFACE_AERO_COND
01995 USE MODI_SURFACE_CD
01996 !
01997 !
01998 IMPLICIT NONE
01999 !
02000 !*      0.1    declarations of arguments
02001 !
02002 REAL, INTENT(IN)                    :: PTSTEP, PSNOWDZMIN
02003 !
02004  CHARACTER(LEN=*),     INTENT(IN)    :: HSNOWRES ! type of sfc resistance
02005 !                                      DEFAULT=Louis (1979), standard ISBA
02006 !                                      method. Option to limit Ri number
02007 !                                      for very stable conditions
02008 !
02009  CHARACTER(LEN=*),     INTENT(IN)  :: HIMPLICIT_WIND   ! wind implicitation option
02010 !                                                     ! 'OLD' = direct
02011 !                                                     ! 'NEW' = Taylor serie, order 1
02012 !
02013 REAL, DIMENSION(:), INTENT(IN)      :: PPEW_A_COEF, PPEW_B_COEF,                   
02014                                         PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF,      
02015                                         PPEQ_B_COEF  
02016 !                                      PPEW_A_COEF = wind coefficient (m2s/kg)
02017 !                                      PPEW_B_COEF = wind coefficient (m/s)
02018 !                                      PPET_A_COEF = A-air temperature coefficient
02019 !                                      PPET_B_COEF = B-air temperature coefficient
02020 !                                      PPEQ_A_COEF = A-air specific humidity coefficient
02021 !                                      PPEQ_B_COEF = B-air specific humidity coefficient                                    
02022 !
02023 REAL, DIMENSION(:), INTENT(IN)      :: PZREF, PTS, PSNOWDZ1, PSNOWDZ2,        
02024                                         PRADSINK, PSNOWRHO, PSNOWLIQ, PSCAP,   
02025                                         PSCOND1, PSCOND2,                      
02026                                         PZ0, PHPSNOW,                          
02027                                         PALBT, PZ0EFF, PZ0H 
02028 !
02029 REAL, DIMENSION(:), INTENT(IN)      :: PSW_RAD, PLW_RAD, PTA, PQA, PPS, PRHOA
02030 !
02031 REAL, DIMENSION(:), INTENT(IN)      :: PUREF, PEXNS, PEXNA, PDIRCOSZW, PVMOD
02032 !
02033 REAL, DIMENSION(:), INTENT(OUT)   :: PTSTERM1, PTSTERM2, PEMIST, PRA,         
02034                                       PCT, PSFCFRZ, PCDSNOW, PCHSNOW,          
02035                                       PQSAT, PDQSAT, PRSRA 
02036 !
02037 REAL, DIMENSION(:), INTENT(OUT)   :: PUSTAR2_IC,                        
02038                                       PPET_A_COEF_T, PPEQ_A_COEF_T,    
02039                                       PPET_B_COEF_T, PPEQ_B_COEF_T 
02040 !
02041 REAL, DIMENSION(:), INTENT(OUT)   :: PRI
02042 !
02043 !
02044 !*      0.2    declarations of local variables
02045 !
02046 REAL, DIMENSION(SIZE(PTS))        :: ZAC, ZRI,                        
02047                                       ZSCONDA, ZA, ZB, ZC,             
02048                                       ZCDN, ZSNOWDZM1, ZSNOWDZM2,      
02049                                       ZVMOD, ZUSTAR2, ZTS3, ZLVT,      
02050                                       Z_CCOEF 
02051 REAL, DIMENSION(SIZE(PTS))       ::  ZSNOWEVAPX                                 !   
02052 REAL(KIND=JPRB) :: ZHOOK_HANDLE
02053 !
02054 INTEGER                               :: JJ   ! looping indexes
02055 !-------------------------------------------------------------------------------
02056 !
02057 ! 1. New saturated specific humidity and derrivative:
02058 ! ---------------------------------------------------
02059 !
02060 IF (LHOOK) CALL DR_HOOK('SNOWCROEBUD',0,ZHOOK_HANDLE)
02061 !
02062 ZRI   (:) = XUNDEF
02063 !
02064 PQSAT (:) =  QSATI(PTS(:),PPS(:))
02065 PDQSAT(:) = DQSATI(PTS(:),PPS(:),PQSAT(:))
02066 !
02067 !
02068 ! 2. Surface properties:
02069 ! ----------------------
02070 ! It might be of interest to use snow-specific roughness
02071 ! or a temperature dependence on emissivity:
02072 ! but for now, use ISBA defaults.
02073 !
02074 PEMIST(:) = XEMISSN
02075 !
02076 ! 2. Computation of resistance and drag coefficient
02077 ! -------------------------------------------------
02078 !
02079  CALL SURFACE_RI(PTS, PQSAT, PEXNS, PEXNA, PTA, PQA,                  &
02080                  PZREF, PUREF, PDIRCOSZW, PVMOD, ZRI                  ) 
02081 !
02082 ! Simple adaptation of method by Martin and Lejeune (1998)
02083 ! to apply a lower limit to turbulent transfer coef
02084 ! by defining a maximum Richarson number for stable
02085 ! conditions:
02086 !
02087 IF(HSNOWRES=='RIL') ZRI(:) = MIN(X_RI_MAX, ZRI(:))
02088 !
02089 PRI(:)=ZRI(:)
02090 !
02091 ! Surface aerodynamic resistance for heat transfers
02092 !
02093  CALL SURFACE_AERO_COND(ZRI, PZREF, PUREF, PVMOD, PZ0, PZ0H, ZAC, PRA, PCHSNOW)
02094 !
02095 PRSRA(:) = PRHOA(:) / PRA(:)
02096 !
02097 ! For atmospheric model coupling:
02098 !
02099  CALL SURFACE_CD(ZRI, PZREF, PUREF, PZ0EFF, PZ0H, PCDSNOW, ZCDN)
02100 !
02101 !
02102 ! Modify flux-form implicit coupling coefficients:
02103 ! - wind components:
02104 !
02105 IF(HIMPLICIT_WIND=='OLD')THEN
02106 ! old implicitation
02107   ZUSTAR2(:) = (PCDSNOW(:)*PVMOD(:)*PPEW_B_COEF(:))/           &
02108                (1.0-PRHOA(:)*PCDSNOW(:)*PVMOD(:)*PPEW_A_COEF(:)) 
02109 ELSE                 
02110 ! new implicitation
02111   ZUSTAR2(:) = (PCDSNOW(:)*PVMOD(:)*(2.*PPEW_B_COEF(:)-PVMOD(:)))  &
02112              / (1.0-2.0*PRHOA(:)*PCDSNOW(:)*PVMOD(:)*PPEW_A_COEF(:))
02113 ENDIF               
02114 !
02115 ZVMOD(:)       = PRHOA(:)*PPEW_A_COEF(:)*ZUSTAR2(:) + PPEW_B_COEF(:)
02116 ZVMOD(:)       = MAX(ZVMOD(:),0.)
02117 !
02118 WHERE(PPEW_A_COEF(:)/= 0.)
02119       ZUSTAR2(:) = MAX( ( ZVMOD(:) - PPEW_B_COEF(:) ) / (PRHOA(:)*PPEW_A_COEF(:)), 0.)
02120 ENDWHERE
02121 !
02122 ! implicit wind friction
02123 ZUSTAR2(:) = MAX(ZUSTAR2(:),0.)
02124 !
02125 PUSTAR2_IC(:) =  ZUSTAR2(:)
02126 !
02127 ! 3. Calculate linearized surface energy budget components:
02128 ! ---------------------------------------------------------
02129 ! To prevent numerical difficulties for very thin snow
02130 ! layers, limit the grid "thinness": this is important as
02131 ! layers become vanishing thin:
02132 !
02133 ZSNOWDZM1(:) = MAX(PSNOWDZ1(:), PSNOWDZMIN)
02134 ZSNOWDZM2(:) = MAX(PSNOWDZ2(:), PSNOWDZMIN)
02135 !
02136 ! Surface thermal inertia:
02137 !
02138 PCT(:)      = 1.0/(PSCAP(:)*ZSNOWDZM1(:))
02139 !
02140 ! Fraction of surface frozen (sublimation) with the remaining
02141 ! fraction being liquid (evaporation):
02142 !
02143 PSFCFRZ(:)  = 1.0 
02144 !
02145 ! Thermal conductivity between uppermost and lower snow layers:
02146 !
02147 ZSCONDA(:)  = (ZSNOWDZM1(:)*PSCOND1(:) + ZSNOWDZM2(:)*PSCOND2(:))/           &
02148                (ZSNOWDZM1(:)+ZSNOWDZM2(:)) 
02149 !
02150 ! Transform implicit coupling coefficients: 
02151 ! Note, surface humidity is 100% over snow.
02152 !
02153 ! - specific humidity:
02154 !
02155 Z_CCOEF(:)       = 1.0 - PPEQ_A_COEF(:)*PRSRA(:)
02156 !
02157 PPEQ_A_COEF_T(:) = - PPEQ_A_COEF(:)*PRSRA(:)*PDQSAT(:)/Z_CCOEF(:)
02158 !
02159 PPEQ_B_COEF_T(:) = ( PPEQ_B_COEF(:) - PPEQ_A_COEF(:)*PRSRA(:)*(PQSAT(:) - &
02160                       PDQSAT(:)*PTS(:)) )/Z_CCOEF(:)  
02161 !
02162 ! - air temperature:
02163 !   (assumes A and B correspond to potential T):
02164 !
02165 Z_CCOEF(:)       = (1.0 - PPET_A_COEF(:)*PRSRA(:))/PEXNA(:)
02166 !
02167 PPET_A_COEF_T(:) = - PPET_A_COEF(:)*PRSRA(:)/(PEXNS(:)*Z_CCOEF(:))
02168 !
02169 PPET_B_COEF_T(:) = PPET_B_COEF(:)/Z_CCOEF(:)
02170 !
02171 !
02172 ! Energy budget solution terms:
02173 !
02174 ZTS3(:) = PEMIST(:) * XSTEFAN * PTS(:)**3
02175 ZLVT(:) = (1.-PSFCFRZ(:))*XLVTT + PSFCFRZ(:)*XLSTT
02176 !
02177 ZA(:)   = 1. / PTSTEP + PCT(:) * (4. * ZTS3(:) +                               &
02178            PRSRA(:) *  ZLVT(:) * (PDQSAT(:) - PPEQ_A_COEF_T(:))                 &
02179            + PRSRA(:) * XCPD * ( (1./PEXNS(:))-(PPET_A_COEF_T(:)/PEXNA(:)) )    &
02180            + (2*ZSCONDA(:)/(ZSNOWDZM2(:)+ZSNOWDZM1(:))) )  
02181 !
02182 ZB(:)   = 1. / PTSTEP + PCT(:) * (3. * ZTS3(:) +                               &
02183            PRSRA(:) * PDQSAT(:) *  ZLVT(:) )  
02184 !
02185 ZC(:)   = PCT(:) * (PRSRA(:) * XCPD * PPET_B_COEF_T(:)/PEXNA(:) + PSW_RAD(:) * &
02186            (1. - PALBT(:)) + PEMIST(:)*PLW_RAD(:) - PRSRA(:) *                  &
02187            ZLVT(:) *  (PQSAT(:)-PPEQ_B_COEF_T(:))                               &
02188            + PHPSNOW(:) + PRADSINK(:) )  
02189 !
02190 !
02191 ! Coefficients needed for implicit solution
02192 ! of linearized surface energy budget:
02193 !
02194 PTSTERM2(:) = 2*ZSCONDA(:)*PCT(:)/(ZA(:)*(ZSNOWDZM2(:)+ZSNOWDZM1(:)))
02195 !
02196 PTSTERM1(:) = (PTS(:)*ZB(:) + ZC(:))/ZA(:)
02197 IF (LHOOK) CALL DR_HOOK('SNOWCROEBUD',1,ZHOOK_HANDLE)
02198 !
02199 !-------------------------------------------------------------------------------
02200 !
02201 END SUBROUTINE SNOWCROEBUD
02202 !####################################################################
02203 !####################################################################
02204 !####################################################################
02205       SUBROUTINE SNOWCROSOLVT(PTSTEP,PSNOWDZMIN,                    &
02206                               PSNOWDZ,PSCOND,PSCAP,PTG,              &
02207                               PSOILCOND,PD_G,                        &
02208                               PRADSINK,PCT,PTERM1,PTERM2,            &
02209                               PPET_A_COEF_T,PPEQ_A_COEF_T,           &
02210                               PPET_B_COEF_T,PPEQ_B_COEF_T,           &
02211                               PTA_IC, PQA_IC,                        &
02212                               PGBAS,PSNOWTEMP,PSNOWFLUX,             &
02213                               INLVLS_USE                             ) 
02214 !
02215 !!    PURPOSE
02216 !!    -------
02217 !     This subroutine solves the 1-d diffusion of 'ZSNOWTEMP' using a
02218 !     layer averaged set of equations which are time differenced
02219 !     using the backward-difference scheme (implicit).
02220 !     The eqs are solved rapidly by taking advantage of the
02221 !     fact that the matrix is tridiagonal. This is a very
02222 !     general routine and can be used for the 1-d diffusion of any
02223 !     quantity as long as the diffusity is not a function of the
02224 !     quantity being diffused. Aaron Boone 8-98. Soln to the eq:
02225 !
02226 !                 c  dQ    d  k dQ    dS
02227 !                    -- =  --   -- -  --
02228 !                    dt    dx   dx    dx
02229 !
02230 !     where k = k(x) (thermal conductivity), c = c(x) (heat capacity)
02231 !     as an eg. for temperature/heat eq. S is a sink (-source) term.
02232 !     Diffusivity is k/c
02233 !
02234 !!     MODIFICATIONS
02235 !!     -------------
02236 !!      Original A. Boone 
02237 !!       05/2011: Brun  Special treatment to tackle the variable number
02238 !!                      of snow layers
02239 !
02240 USE MODD_CSTS,ONLY : XTT
02241 !
02242 IMPLICIT NONE
02243 !
02244 !*      0.1    declarations of arguments
02245 !
02246 REAL, INTENT(IN)                    :: PTSTEP, PSNOWDZMIN
02247 !
02248 REAL, DIMENSION(:), INTENT(IN)      :: PTG, PSOILCOND, PD_G,        
02249                                         PCT, PTERM1, PTERM2 
02250 
02251 !
02252 REAL, DIMENSION(:,:), INTENT(IN)    :: PSNOWDZ, PSCOND, PSCAP,      
02253                                         PRADSINK 
02254 !
02255 REAL, DIMENSION(:), INTENT(IN)      :: PPET_A_COEF_T, PPEQ_A_COEF_T, 
02256                                         PPET_B_COEF_T, PPEQ_B_COEF_T 
02257 !
02258 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWTEMP
02259 !
02260 REAL, DIMENSION(:), INTENT(OUT)     :: PGBAS, PSNOWFLUX, PTA_IC, PQA_IC
02261 !
02262 INTEGER, DIMENSION(:), INTENT(IN)   :: INLVLS_USE
02263 !
02264 !*      0.2    declarations of local variables
02265 !
02266 !
02267 INTEGER                               :: JJ   ! looping indexes
02268 !
02269 INTEGER                             :: INLVLS
02270 !
02271 REAL, DIMENSION(SIZE(PTG))                     :: ZGBAS, ZSNOWTEMP_DELTA
02272 !
02273 REAL, DIMENSION(SIZE(PSNOWDZ,1),SIZE(PSNOWDZ,2)) :: ZSNOWTEMP, ZDTERM, ZCTERM, 
02274                                                      ZFRCV, ZAMTRX, ZBMTRX,     
02275                                                      ZCMTRX 
02276 !
02277 REAL, DIMENSION(SIZE(PSNOWDZ,1),SIZE(PSNOWDZ,2)) :: ZWORK1, ZWORK2, ZDZDIF,    
02278                                                      ZSNOWDZM 
02279 !
02280 REAL, DIMENSION(SIZE(PSNOWDZ,1),SIZE(PSNOWDZ,2)-1) :: ZSNOWTEMP_M,             
02281                                                      ZFRCV_M, ZAMTRX_M,         
02282                                                      ZBMTRX_M, ZCMTRX_M 
02283 REAL(KIND=JPRB) :: ZHOOK_HANDLE
02284 !-------------------------------------------------------------------------------
02285 !
02286 ! 0. Initialize:
02287 ! ------------------
02288 !
02289 IF (LHOOK) CALL DR_HOOK('SNOWCROSOLVT',0,ZHOOK_HANDLE)
02290 ZSNOWTEMP(:,:)  = PSNOWTEMP(:,:)
02291 INLVLS          = SIZE(PSNOWDZ(:,:),2)
02292 !
02293 !
02294 ! 1. Calculate tri-diagnoal matrix coefficients:
02295 ! ----------------------------------------------
02296 ! For heat transfer, assume a minimum grid
02297 ! thickness (to prevent numerical
02298 ! problems for very thin snow cover):
02299 !
02300 DO JJ=1,SIZE(PTG)        
02301 ZSNOWDZM(JJ,1:INLVLS_USE(JJ)) = MAX(PSNOWDZ(JJ,1:INLVLS_USE(JJ)), PSNOWDZMIN)
02302 ZDZDIF(JJ,1:INLVLS_USE(JJ)-1) = ZSNOWDZM(JJ,1:INLVLS_USE(JJ)-1) + &
02303                                  ZSNOWDZM(JJ,2:INLVLS_USE(JJ)) 
02304 ZDZDIF(JJ,INLVLS_USE(JJ))     = ZSNOWDZM(JJ,INLVLS_USE(JJ)) + PD_G(JJ)
02305 ZWORK1(JJ,1:INLVLS_USE(JJ))   = ZSNOWDZM(JJ,1:INLVLS_USE(JJ))* &
02306                                  PSCOND(JJ,1:INLVLS_USE(JJ)) 
02307 ZWORK2(JJ,1:INLVLS_USE(JJ)-1) = ZSNOWDZM(JJ,2:INLVLS_USE(JJ))*PSCOND(JJ,2:INLVLS_USE(JJ))
02308 ZWORK2(JJ,INLVLS_USE(JJ))     = PD_G(JJ)*PSOILCOND(JJ)
02309 !
02310 ZDTERM(JJ,1:INLVLS_USE(JJ))   = 2.0*(ZWORK1(JJ,1:INLVLS_USE(JJ))+ &
02311                                 ZWORK2(JJ,1:INLVLS_USE(JJ)))/ &
02312                                 (ZDZDIF(JJ,1:INLVLS_USE(JJ))* &
02313                                 ZDZDIF(JJ,1:INLVLS_USE(JJ))) 
02314 !
02315 ZCTERM(JJ,1:INLVLS_USE(JJ))   = PSCAP(JJ,1:INLVLS_USE(JJ))* &
02316                                  ZSNOWDZM(JJ,1:INLVLS_USE(JJ))/PTSTEP 
02317 ENDDO
02318 !
02319 ! 2. Set up tri-diagonal matrix
02320 ! -----------------------------
02321 !
02322 ! Upper BC
02323 !
02324 ZAMTRX(:,1) =  0.0
02325 ZBMTRX(:,1) =  1./(PCT(:)*PTSTEP)
02326 ZCMTRX(:,1) = -PTERM2(:)*ZBMTRX(:,1)
02327 ZFRCV(:,1)  =  PTERM1(:)*ZBMTRX(:,1)
02328 !
02329 !
02330 !
02331 DO JJ=1,SIZE(PTG)        
02332 ! Interior Grid
02333 ZAMTRX(JJ,2:INLVLS_USE(JJ)-1) = -ZDTERM(JJ,1:INLVLS_USE(JJ)-2)
02334 ZBMTRX(JJ,2:INLVLS_USE(JJ)-1) =  ZCTERM(JJ,2:INLVLS_USE(JJ)-1) + &
02335                                       ZDTERM(JJ,1:INLVLS_USE(JJ)-2) + &
02336                                       ZDTERM(JJ,2:INLVLS_USE(JJ)-1) 
02337 ZCMTRX(JJ,2:INLVLS_USE(JJ)-1) = -ZDTERM(JJ,2:INLVLS_USE(JJ)-1)
02338 ZFRCV(JJ,2:INLVLS_USE(JJ)-1)  =  ZCTERM(JJ,2:INLVLS_USE(JJ)-1)* &
02339                                       PSNOWTEMP(JJ,2:INLVLS_USE(JJ)-1) - &
02340                                       (PRADSINK(JJ,1:INLVLS_USE(JJ)-2)- &
02341                                       PRADSINK(JJ,2:INLVLS_USE(JJ)-1)) 
02342 !Lower BC
02343 ZAMTRX(JJ,INLVLS_USE(JJ)) = -ZDTERM(JJ,INLVLS_USE(JJ)-1)
02344 ZBMTRX(JJ,INLVLS_USE(JJ)) =  ZCTERM(JJ,INLVLS_USE(JJ)) +    &
02345                          ZDTERM(JJ,INLVLS_USE(JJ)-1) +ZDTERM(JJ,INLVLS_USE(JJ)) 
02346 ZCMTRX(JJ,INLVLS_USE(JJ)) =  0.0
02347 ZFRCV(JJ,INLVLS_USE(JJ))  =  ZCTERM(JJ,INLVLS_USE(JJ))*     &
02348           PSNOWTEMP(JJ,INLVLS_USE(JJ)) +  ZDTERM(JJ,INLVLS_USE(JJ))*PTG(JJ)   &
02349            - (PRADSINK(JJ,INLVLS_USE(JJ)-1)-PRADSINK(JJ,INLVLS_USE(JJ))) 
02350 ENDDO
02351 !
02352 ! - - -------------------------------------------------
02353 !
02354 ! 4. Compute solution vector
02355 ! --------------------------
02356 !
02357  CALL TRIDIAG_GROUND_SNOWCRO(ZAMTRX,ZBMTRX,ZCMTRX,ZFRCV,ZSNOWTEMP,   &
02358             INLVLS_USE,0) 
02359 !
02360 ! Heat flux between surface and 2nd snow layers: (W/m2)
02361 !
02362 PSNOWFLUX(:)      = ZDTERM(:,1)*(ZSNOWTEMP(:,1) - ZSNOWTEMP(:,2))
02363 !
02364 !
02365 ! 5. Snow melt case
02366 ! -----------------
02367 ! If melting in uppermost layer, assume surface layer
02368 ! temperature at freezing point and re-evaluate lower
02369 ! snowpack temperatures. This is done as it is most likely
02370 ! most signigant melting will occur within a time step in surface layer.
02371 ! Surface energy budget (and fluxes) will
02372 ! be re-calculated (outside of this routine):
02373 !
02374 ZAMTRX_M(:,1)  =  0.0
02375 ZBMTRX_M(:,1)  =  ZCTERM(:,2) + ZDTERM(:,1) + ZDTERM(:,2)
02376 ZCMTRX_M(:,1)  = -ZDTERM(:,2)
02377 ZFRCV_M(:,1)   =  ZCTERM(:,2)*PSNOWTEMP(:,2) + XTT*ZDTERM(:,1)  -  &
02378                    (PRADSINK(:,1)-PRADSINK(:,2)) 
02379 !
02380 DO JJ=1,SIZE(PTG)        
02381    ZAMTRX_M(JJ,2:INLVLS_USE(JJ)-1)    = ZAMTRX(JJ,3:INLVLS_USE(JJ))
02382    ZBMTRX_M(JJ,2:INLVLS_USE(JJ)-1)    = ZBMTRX(JJ,3:INLVLS_USE(JJ))
02383    ZCMTRX_M(JJ,2:INLVLS_USE(JJ)-1)    = ZCMTRX(JJ,3:INLVLS_USE(JJ))
02384    ZFRCV_M(JJ,2:INLVLS_USE(JJ)-1)     = ZFRCV(JJ,3:INLVLS_USE(JJ))
02385    ZSNOWTEMP_M(JJ,2:INLVLS_USE(JJ)-1) = PSNOWTEMP(JJ,3:INLVLS_USE(JJ))
02386 ENDDO
02387 !
02388  CALL TRIDIAG_GROUND_SNOWCRO(ZAMTRX_M,ZBMTRX_M,ZCMTRX_M,ZFRCV_M,ZSNOWTEMP_M,   &
02389                     INLVLS_USE,1) 
02390 !
02391 ! If melting for 2 consecuative time steps, then replace current T-profile
02392 ! with one assuming T=Tf in surface layer:
02393 !
02394 ZSNOWTEMP_DELTA(:)    = 0.0
02395 !
02396 WHERE(ZSNOWTEMP(:,1) > XTT .AND. PSNOWTEMP(:,1) >= XTT)
02397    PSNOWFLUX(:)       = ZDTERM(:,1)*(XTT - ZSNOWTEMP_M(:,1))
02398    ZSNOWTEMP_DELTA(:) = 1.0
02399 END WHERE
02400 !
02401 DO JJ=1,SIZE(PTG)        
02402    ZSNOWTEMP(JJ,2:INLVLS_USE(JJ)) = ZSNOWTEMP_DELTA(JJ)* &
02403                       ZSNOWTEMP_M(JJ,1:INLVLS_USE(JJ)-1)   + &
02404                       (1.0-ZSNOWTEMP_DELTA(JJ))*ZSNOWTEMP(JJ,2:INLVLS_USE(JJ)) 
02405 ENDDO
02406 !
02407 !
02408 ! 6. Lower boundary flux:
02409 ! -----------------------
02410 ! NOTE: evaluate this term assuming the snow layer
02411 ! can't exceed the freezing point as this adjustment
02412 ! is made in melting routine. Then must adjust temperature
02413 ! to conserve energy:
02414 !
02415 DO JJ=1, SIZE(PTG)
02416  ZGBAS(JJ)            = ZDTERM(JJ,INLVLS_USE(JJ))*    &
02417                           (ZSNOWTEMP(JJ,INLVLS_USE(JJ))         -PTG(JJ)) 
02418  PGBAS(JJ)            = ZDTERM(JJ,INLVLS_USE(JJ))*    &
02419                           (MIN(XTT,ZSNOWTEMP(JJ,INLVLS_USE(JJ)))-PTG(JJ)) 
02420  ZSNOWTEMP(JJ,INLVLS_USE(JJ)) = ZSNOWTEMP(JJ,INLVLS_USE(JJ)) + &
02421                        (ZGBAS(JJ)-PGBAS(JJ))/ZCTERM(JJ,INLVLS_USE(JJ))      
02422 ENDDO
02423 !
02424 
02425 !
02426 ! 7. Update temperatute profile in time:
02427 ! --------------------------------------
02428 !
02429 DO JJ=1, SIZE(PTG)
02430 PSNOWTEMP(JJ,1:INLVLS_USE(JJ))      = ZSNOWTEMP(JJ,1:INLVLS_USE(JJ))
02431 ENDDO
02432 !
02433 !
02434 ! 8. Compute new (implicit) air T and specific humidity
02435 ! -----------------------------------------------------
02436 !
02437 PTA_IC(:) = PPET_B_COEF_T(:) + PPET_A_COEF_T(:)* PSNOWTEMP(:,1)
02438 !
02439 PQA_IC(:) = PPEQ_B_COEF_T(:) + PPEQ_A_COEF_T(:)* PSNOWTEMP(:,1)
02440 IF (LHOOK) CALL DR_HOOK('SNOWCROSOLVT',1,ZHOOK_HANDLE)
02441 !
02442 !
02443 END SUBROUTINE SNOWCROSOLVT
02444 !####################################################################
02445 !####################################################################
02446 !####################################################################
02447       SUBROUTINE SNOWCROMELT(PSCAP,PSNOWTEMP,PSNOWDZ,         &
02448                              PSNOWRHO,PSNOWLIQ,INLVLS_USE     ) 
02449 !
02450 !
02451 !!    PURPOSE
02452 !!    -------
02453 !     Calculate snow melt (resulting from surface fluxes, ground fluxes,
02454 !     or internal shortwave radiation absorbtion). It is used to
02455 !     augment liquid water content, maintain temperatures
02456 !     at or below freezing, and possibly reduce the mass
02457 !     or compact the layer(s).
02458 !
02459 !
02460 USE MODD_CSTS,ONLY : XTT, XLMTT, XRHOLW, XRHOLI
02461 !
02462 USE MODE_SNOW3L
02463 !
02464 IMPLICIT NONE
02465 !
02466 !*      0.1    declarations of arguments
02467 !
02468 REAL, DIMENSION(:,:), INTENT(IN)    :: PSCAP
02469 !
02470 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWDZ, PSNOWTEMP, PSNOWRHO,   
02471                                           PSNOWLIQ 
02472 !
02473 INTEGER, DIMENSION(:), INTENT(IN)   :: INLVLS_USE 
02474 !
02475 !*      0.2    declarations of local variables
02476 !
02477 INTEGER                             :: JJ, JST ! looping indexes
02478 !
02479 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZPHASE, ZCMPRSFACT,   
02480                                                        ZSNOWLWE,   
02481                                                        ZSNOWMELT, ZSNOWTEMP 
02482 REAL(KIND=JPRB) :: ZHOOK_HANDLE
02483 !-------------------------------------------------------------------------------
02484 !
02485 ! 0. Initialize:
02486 ! ---------------------------
02487 !
02488 IF (LHOOK) CALL DR_HOOK('SNOWCROMELT',0,ZHOOK_HANDLE)
02489 DO JJ=1,SIZE(PSNOWDZ,1)
02490    DO JST=1,INLVLS_USE(JJ)
02491 ZPHASE(JJ,JST)     = 0.0
02492 ZCMPRSFACT(JJ,JST) = 0.0
02493 ZSNOWLWE(JJ,JST)   = 0.0
02494 ZSNOWMELT(JJ,JST)  = 0.0
02495 ZSNOWTEMP(JJ,JST)  = 0.0
02496    ENDDO
02497 ENDDO
02498 !
02499 ! 1. Determine amount of melt in each layer:
02500 ! ------------------------------------------
02501 !
02502 DO JJ=1,SIZE(PSNOWDZ,1)
02503    DO JST=1, INLVLS_USE(JJ)
02504 !
02505 ! Total Liquid equivalent water content of snow (m):
02506 !
02507    ZSNOWLWE(JJ,JST) = PSNOWRHO(JJ,JST)*PSNOWDZ(JJ,JST)/XRHOLW
02508 !
02509 ! Melt snow if excess energy and snow available:
02510 ! Phase change (J/m2)
02511 !
02512    ZPHASE(JJ,JST)  = MIN(PSCAP(JJ,JST)*MAX(0.0, PSNOWTEMP(JJ,JST) - XTT)*      &
02513                    PSNOWDZ(JJ,JST),                                       &
02514                    MAX(0.0,ZSNOWLWE(JJ,JST)-PSNOWLIQ(JJ,JST))*XLMTT*XRHOLW) 
02515 !
02516 ! Update snow liq water content and temperature if melting:
02517 ! liquid water available for next layer from melting of snow
02518 ! which is assumed to be leaving the current layer (m):
02519 !
02520    ZSNOWMELT(JJ,JST) = ZPHASE(JJ,JST)/(XLMTT*XRHOLW)
02521 !
02522 ! Cool off snow layer temperature due to melt:
02523 !
02524    ZSNOWTEMP(JJ,JST) = PSNOWTEMP(JJ,JST) - ZPHASE(JJ,JST)/(PSCAP(JJ,JST)*PSNOWDZ(JJ,JST))
02525 !
02526 ! Difference with ISBA_ES: ZMELTXS should never be different of 0.
02527 ! because of the introduction of the tests in LLAYERGONE
02528 !
02529    PSNOWTEMP(JJ,JST) =  ZSNOWTEMP(JJ,JST)
02530 ! The control below should be suppressed after further tests
02531 IF (PSNOWTEMP(JJ,JST)-XTT > UEPSI) THEN
02532   WRITE(*,*) 'pb dans MELT PSNOWTEMP(JJ,JST) >XTT:', JJ,JST, PSNOWTEMP(JJ,JST)
02533   CALL ABOR1_SFX('SNOWCRO: pb dans MELT')
02534 ENDIF
02535 !
02536 ! Loss of snowpack depth: (m) and liquid equiv (m):
02537 ! Compression factor for melt loss: this decreases
02538 ! layer thickness and increases density thereby leaving
02539 ! total SWE constant. 
02540 !
02541 ! Difference with ISBA_ES: All melt is considered to decrease the depth
02542 ! without consideration to the irreducible content
02543 !
02544    ZCMPRSFACT(JJ,JST) = (ZSNOWLWE(JJ,JST)-(PSNOWLIQ(JJ,JST)+ZSNOWMELT(JJ,JST)))&
02545                        / (ZSNOWLWE(JJ,JST)-PSNOWLIQ(JJ,JST)) 
02546    PSNOWDZ(JJ,JST)    = PSNOWDZ(JJ,JST)*ZCMPRSFACT(JJ,JST)
02547    PSNOWRHO(JJ,JST)   = ZSNOWLWE(JJ,JST)*XRHOLW/PSNOWDZ(JJ,JST)
02548 !
02549 ! 2. Add snow melt to current snow liquid water content:
02550 ! ------------------------------------------------------
02551 !
02552    PSNOWLIQ(JJ,JST)   = PSNOWLIQ(JJ,JST) + ZSNOWMELT(JJ,JST)
02553 !
02554    ENDDO   ! loop JST active snow layers
02555 ENDDO   ! loop JJ grid points 
02556 IF (LHOOK) CALL DR_HOOK('SNOWCROMELT',1,ZHOOK_HANDLE)
02557 !
02558 !
02559 END SUBROUTINE SNOWCROMELT
02560 !####################################################################
02561 !####################################################################
02562 !####################################################################
02563       SUBROUTINE SNOWCROREFRZ(PTSTEP,PRR,                            &
02564                               PSNOWRHO,PSNOWTEMP,PSNOWDZ,PSNOWLIQ,   &
02565                               PTHRUFAL, PSCAP, PLEL3L,INLVLS_USE) 
02566 !
02567 !
02568 !!    PURPOSE
02569 !!    -------
02570 !     Calculate any freezing/refreezing of liquid water in the snowpack.
02571 !     Also, calculate liquid water transmission and snow runoff.
02572 !     Refreezing causes densification of a layer.
02573 !
02574 !
02575 USE MODD_CSTS,     ONLY : XTT, XLMTT, XRHOLW, XCI,XRHOLI
02576 USE MODD_SNOW_PAR, ONLY : XSNOWDMIN
02577 !
02578 USE MODE_SNOW3L
02579 !
02580 IMPLICIT NONE
02581 !
02582 !*      0.1    declarations of arguments
02583 !
02584 REAL, INTENT(IN)                      :: PTSTEP
02585 !
02586 REAL, DIMENSION(:), INTENT(IN)        :: PRR
02587 !
02588 REAL, DIMENSION(:,:), INTENT(INOUT)   :: PSNOWDZ, PSNOWTEMP, PSNOWLIQ, PSNOWRHO
02589 !
02590 REAL, DIMENSION(:), INTENT(INOUT)     :: PTHRUFAL
02591 !
02592 !
02593 ! modifs_EB layers
02594 INTEGER, DIMENSION(:), INTENT(IN)      :: INLVLS_USE
02595 REAL, DIMENSION(:,:), INTENT(IN)       :: PSCAP
02596 REAL, DIMENSION(:), INTENT(IN)         :: PLEL3L
02597 
02598 !
02599 !*      0.2    declarations of local variables
02600 !
02601 INTEGER                               :: JJ, JST   ! looping indexes
02602 !
02603 INTEGER                               :: INLVLS     ! maximum snow layers number
02604 !
02605 !
02606 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZPHASE,     
02607                                                        ZSNOWLIQ, ZSNOWRHO,  
02608                                                        ZWHOLDMAX, ZSNOWDZ,  
02609                                                        ZSNOWTEMP 
02610 !
02611 REAL, DIMENSION(SIZE(PSNOWRHO,1),0:SIZE(PSNOWRHO,2)) :: ZFLOWLIQ
02612 REAL(KIND=JPRB) :: ZHOOK_HANDLE
02613 !
02614 !-------------------------------------------------------------------------------
02615 !
02616 ! 0. Initialize:
02617 ! --------------
02618 !
02619 IF (LHOOK) CALL DR_HOOK('SNOWCROREFRZ',0,ZHOOK_HANDLE)
02620 INLVLS = SIZE(PSNOWDZ,2)
02621 DO JJ=1,SIZE(PSNOWDZ,1)        
02622    DO JST=1,INLVLS_USE(JJ)
02623       ZSNOWRHO(JJ,JST)  = PSNOWRHO(JJ,JST)
02624       ZSNOWTEMP(JJ,JST) = PSNOWTEMP(JJ,JST)
02625       ZWHOLDMAX(JJ,JST) = SNOWCROHOLD(PSNOWRHO(JJ,JST),PSNOWLIQ(JJ,JST),PSNOWDZ(JJ,JST))
02626    ENDDO
02627 ENDDO
02628 !
02629 DO JJ=1,SIZE(PSNOWDZ,1)  ! loop JJ grid points        
02630 !
02631 ! 1. Increases Liquid Water of top layer from rain
02632 !    ---------------------------------------------
02633 !
02634 !  Rainfall (m) initialises the liquid flow whih feeds the top layer 
02635 !  and evaporation/condensation are taken into account
02636 ! 
02637 IF(INLVLS_USE(JJ) > 0.) THEN
02638           ZFLOWLIQ(JJ,0)= PRR(JJ)*PTSTEP/XRHOLW 
02639           ZFLOWLIQ(JJ,0)= MAX(0.,ZFLOWLIQ(JJ,0)- PLEL3L(JJ)*PTSTEP/(XLVTT*XRHOLW)) 
02640 ELSE
02641           ZFLOWLIQ(JJ,0)=0
02642 ENDIF
02643 !
02644 !
02645 DO JST=1,INLVLS_USE(JJ) ! loop JST active snow layers
02646 
02647 
02648 ! 2. Increases Liquid Water from the upper layers flow (or rain for top layer) 
02649 !    -----------------------------
02650 !
02651       PSNOWLIQ(JJ,JST)  = PSNOWLIQ(JJ,JST) + ZFLOWLIQ(JJ,JST-1)
02652 !                        
02653 ! 3. Freezes liquid water in any cold layers
02654 !    ---------------------------------------
02655 !                        
02656 ! Calculate the maximum possible refreezing 
02657 !
02658 ZPHASE(JJ,JST)    = MIN(PSCAP(JJ,JST)*                                          &
02659                    MAX(0.0, XTT - ZSNOWTEMP(JJ,JST))*PSNOWDZ(JJ,JST),             &
02660                    PSNOWLIQ(JJ,JST)*XLMTT*XRHOLW) 
02661 !
02662 ! Reduce liquid content if freezing occurs:
02663 !
02664 ZSNOWLIQ(JJ,JST)  = PSNOWLIQ(JJ,JST) - ZPHASE(JJ,JST)/(XLMTT*XRHOLW)       
02665 !
02666 ! Warm layer and reduce liquid if freezing occurs:
02667 !
02668 ZSNOWDZ(JJ,JST)   = MAX(XSNOWDMIN/INLVLS, PSNOWDZ(JJ,JST))
02669 !
02670 !
02671 ! Difference with ISBA-ES: a possible cooling of current refreezing water
02672 !                          is taken into account to calculate temperature change
02673 !
02674 PSNOWTEMP(JJ,JST)=XTT+(ZSNOWTEMP(JJ,JST)-XTT)* &
02675      (ZSNOWRHO(JJ,JST)*ZSNOWDZ(JJ,JST)-(PSNOWLIQ(JJ,JST)-ZFLOWLIQ(JJ,JST-1))*XRHOLW)/ &
02676      (ZSNOWRHO(JJ,JST)*ZSNOWDZ(JJ,JST)-(ZSNOWLIQ(JJ,JST)-ZFLOWLIQ(JJ,JST-1))*XRHOLW) &
02677      + ZPHASE(JJ,JST)/(XCI*(ZSNOWRHO(JJ,JST)*ZSNOWDZ(JJ,JST)-  &
02678        (ZSNOWLIQ(JJ,JST)-ZFLOWLIQ(JJ,JST-1))*XRHOLW)) 
02679      
02680 !
02681 ! 4. Calculate flow from the excess of holding capacity
02682 !    --------------------------------------------------------------
02683 ! Any water in excess of the maximum holding space for liquid water
02684 ! amount is drained into next layer down.
02685 !
02686 ZFLOWLIQ(JJ,JST)  = MAX(0.,ZSNOWLIQ(JJ,JST)-ZWHOLDMAX(JJ,JST))
02687 !
02688 ZSNOWLIQ(JJ,JST)  = ZSNOWLIQ(JJ,JST) - ZFLOWLIQ(JJ,JST)
02689 !
02690 ! 5. Density is adjusted to conserve the mass
02691 !    --------------------------------------------------------------
02692 ZSNOWRHO(JJ,JST)  = (ZSNOWRHO(JJ,JST)*PSNOWDZ(JJ,JST)  &
02693                   -(ZFLOWLIQ(JJ,JST)-ZFLOWLIQ(JJ,JST-1))*XRHOLW)/ZSNOWDZ(JJ,JST) 
02694 ! keeps snow density below ice density
02695 IF(ZSNOWRHO(JJ,JST)> XRHOLI) THEN
02696  PSNOWDZ(JJ,JST)=PSNOWDZ(JJ,JST)*ZSNOWRHO(JJ,JST)/XRHOLI
02697  ZSNOWRHO(JJ,JST)=XRHOLI
02698 ENDIF
02699 
02700 ! 6. Update thickness and density and any freezing:
02701 !    ----------------------------------------------
02702 !
02703 PSNOWRHO(JJ,JST) = ZSNOWRHO(JJ,JST)
02704 PSNOWLIQ(JJ,JST) = ZSNOWLIQ(JJ,JST)
02705 !
02706 ENDDO ! loop JST active snow layers
02707 !
02708 ! Any remaining throughflow after freezing is available to
02709 ! the soil for infiltration or surface runoff (m).
02710 ! I.E. This is the amount of water leaving the snowpack:
02711 ! Rate water leaves the snowpack [kg/(m2 s)]:
02712 !
02713 PTHRUFAL(JJ)  = PTHRUFAL(JJ) + ZFLOWLIQ(JJ,INLVLS_USE(JJ))*XRHOLW/PTSTEP
02714 ENDDO ! loop JJ grid points
02715 IF (LHOOK) CALL DR_HOOK('SNOWCROREFRZ',1,ZHOOK_HANDLE)
02716 !
02717 !
02718 !-------------------------------------------------------------------------------
02719 !
02720 END SUBROUTINE SNOWCROREFRZ
02721 !####################################################################
02722 !####################################################################
02723 !####################################################################
02724       SUBROUTINE SNOWCROFLUX(PSNOWTEMP,PSNOWDZ,PEXNS,PEXNA,          &
02725                              PUSTAR2_IC,                             &
02726                              PTSTEP,PALBT,PSW_RAD,PEMIST,PLWUPSNOW,  &
02727                              PLW_RAD,PTA,PSFCFRZ,PQA,PHPSNOW,        &
02728                              PSNOWTEMPO1,PSNOWFLUX,PCT,PRADSINK,     &
02729                              PQSAT,PDQSAT,PRSRA,                     &
02730                              PRN,PH,PGFLUX,PLES3L,PLEL3L,PEVAP,      &
02731                              PUSTAR                                  ) 
02732 !
02733 !
02734 !!    PURPOSE
02735 !!    -------
02736 !     Calculate the surface fluxes (atmospheric/surface).
02737 !     (Noilhan and Planton 1989; Noilhan and Mahfouf 1996)
02738 !
02739 !
02740 USE MODD_CSTS,ONLY : XSTEFAN, XCPD, XLSTT, XLVTT, XTT
02741 !
02742 USE MODE_THERMOS
02743 !
02744 IMPLICIT NONE
02745 !
02746 !*      0.1    declarations of arguments
02747 !
02748 REAL, INTENT(IN)                    :: PTSTEP
02749 !
02750 REAL, DIMENSION(:), INTENT(IN)      :: PSNOWDZ, PSNOWTEMPO1, PSNOWFLUX, PCT, 
02751                                         PRADSINK, PEXNS, PEXNA 
02752 !
02753 REAL, DIMENSION(:), INTENT(IN)      :: PALBT, PSW_RAD, PEMIST, PLW_RAD,      
02754                                         PTA, PSFCFRZ, PQA,                    
02755                                         PHPSNOW, PQSAT, PDQSAT, PRSRA,        
02756                                         PUSTAR2_IC 
02757 !
02758 REAL, DIMENSION(:), INTENT(INOUT)   :: PSNOWTEMP
02759 !
02760 REAL, DIMENSION(:), INTENT(OUT)     :: PRN, PH, PGFLUX, PLES3L, PLEL3L,      
02761                                         PEVAP, PLWUPSNOW, PUSTAR 
02762 !
02763 !
02764 !*      0.2    declarations of local variables
02765 !
02766 REAL, DIMENSION(SIZE(PSNOWDZ))      :: ZEVAPC, ZLE, ZSNOWTEMP, ZSMSNOW, ZGFLUX,  
02767                                         ZDELTAT, ZSNOWTO3 
02768 REAL(KIND=JPRB) :: ZHOOK_HANDLE
02769 !
02770 !-------------------------------------------------------------------------------
02771 !
02772 ! 0. Initialize:
02773 ! --------------
02774 !
02775 IF (LHOOK) CALL DR_HOOK('SNOWCROFLUX',0,ZHOOK_HANDLE)
02776 ZSNOWTEMP(:)  = PSNOWTEMP(:)
02777 ZLE(:)        = 0.0
02778 ZSMSNOW(:)    = 0.0
02779 ZGFLUX(:)     = 0.0
02780 !
02781 ZSNOWTO3(:)   = PSNOWTEMPO1(:) ** 3  ! to save some CPU time, store this
02782 !
02783 ! 1. Flux calculations when melt not occuring at surface (W/m2):
02784 ! --------------------------------------------------------------
02785 !
02786 !
02787 ZDELTAT(:)   = PSNOWTEMP(:) - PSNOWTEMPO1(:)   ! surface T time change:
02788 !
02789 PLWUPSNOW(:) = PEMIST(:) * XSTEFAN * ZSNOWTO3(:)*( PSNOWTEMPO1(:) + 4.* ZDELTAT(:) )
02790 !
02791 PRN(:)       = (1. - PALBT(:)) * PSW_RAD(:) + PEMIST(:) * PLW_RAD(:) - PLWUPSNOW(:)
02792 !
02793 PH(:)        = PRSRA(:) * XCPD * (PSNOWTEMP(:)/PEXNS(:) - PTA(:)/PEXNA(:))
02794 !
02795 ZEVAPC(:)    = PRSRA(:) * ( (PQSAT(:) - PQA(:)) + PDQSAT(:)*ZDELTAT(:) )
02796 !
02797 PLES3L(:)    = PSFCFRZ(:)     * XLSTT * ZEVAPC(:)
02798 !
02799 PLEL3L(:)    = (1.-PSFCFRZ(:))* XLVTT * ZEVAPC(:)
02800 !
02801 ZLE(:)       = PLES3L(:) + PLEL3L(:)
02802 !
02803 PGFLUX(:)    = PRN(:) - PH(:) - ZLE(:) + PHPSNOW(:)
02804 !
02805 !
02806 ! 2. Initial melt adjustment
02807 ! --------------------------
02808 ! If energy avalabile to melt snow, then recalculate fluxes
02809 ! at the freezing point and add residual heat to layer
02810 ! average heat.
02811 !
02812 ! A) If temperature change is > 0 and passes freezing point this timestep,
02813 !    then recalculate fluxes at freezing point and excess energy
02814 !    will be used outside of this routine to change snow heat content:
02815 !
02816 !write (*,*) 'attention test LFLUX traitement XTT supprime!'
02817 WHERE (PSNOWTEMP > XTT .AND. PSNOWTEMPO1 < XTT)
02818 !
02819    ZDELTAT(:) = XTT - PSNOWTEMPO1(:)
02820 !
02821    PLWUPSNOW(:) = PEMIST(:) * XSTEFAN * ZSNOWTO3(:)*( PSNOWTEMPO1(:) + 4.* ZDELTAT(:) )    
02822 !
02823    PRN(:)       = (1. - PALBT(:)) * PSW_RAD(:) + PEMIST(:) * PLW_RAD(:) - PLWUPSNOW(:)  
02824 !
02825    PH(:)        = PRSRA(:) * XCPD * (XTT/PEXNS(:) - PTA(:)/PEXNA(:))
02826 !
02827    ZEVAPC(:)    = PRSRA(:) * ( (PQSAT(:) - PQA(:)) + PDQSAT(:)*ZDELTAT(:) )
02828 !
02829    PLES3L(:)    = PSFCFRZ(:)     * XLSTT * ZEVAPC(:)
02830 !
02831    PLEL3L(:)    = (1.-PSFCFRZ(:))* XLVTT * ZEVAPC(:)
02832 !
02833    ZLE(:)       = PLES3L(:) + PLEL3L(:)
02834 !
02835    ZGFLUX(:)    = PRN(:) - PH(:) - ZLE(:) + PHPSNOW(:)
02836 !
02837    ZSMSNOW(:)   = PGFLUX(:) - ZGFLUX(:)
02838 !
02839    PGFLUX(:)    = ZGFLUX(:)
02840 !
02841 ! This will be used to change heat content of snow:
02842 !
02843    ZSNOWTEMP(:) = PSNOWTEMP(:) - ZSMSNOW(:)*PTSTEP*PCT(:)
02844 !
02845 END WHERE
02846 !
02847 ! 3. Ongoing melt adjustment: explicit solution
02848 ! ---------------------------------------------
02849 !    If temperature change is 0 and at freezing point this timestep,
02850 !    then recalculate fluxes and surface temperature *explicitly*
02851 !    as this is *exact* for snow at freezing point (Brun, Martin)
02852 !
02853 WHERE(PSNOWTEMP(:) > XTT .AND. PSNOWTEMPO1(:) >= XTT )
02854 !
02855    PLWUPSNOW(:) = PEMIST(:) * XSTEFAN * (XTT ** 4)    
02856 !
02857    PRN(:)       = (1. - PALBT(:)) * PSW_RAD(:) + PEMIST(:) * PLW_RAD(:) - PLWUPSNOW(:)  
02858 !
02859    PH(:)        = PRSRA(:) * XCPD * (XTT/PEXNS(:) - PTA(:)/PEXNA(:))
02860 !
02861    ZEVAPC(:)    = PRSRA(:) * (PQSAT(:) - PQA(:))
02862 !
02863    PLES3L(:)    = PSFCFRZ(:)     * XLSTT * ZEVAPC(:)
02864 !
02865    PLEL3L(:)    = (1.-PSFCFRZ(:))* XLVTT * ZEVAPC(:)
02866 !
02867    ZLE(:)       = PLES3L(:) + PLEL3L(:)
02868 !
02869    PGFLUX(:)    = PRN(:) - PH(:) - ZLE(:) + PHPSNOW(:)
02870 !
02871    ZSNOWTEMP(:) = XTT + PTSTEP*PCT(:)*(PGFLUX(:) + PRADSINK(:) - PSNOWFLUX(:))
02872 !
02873 END WHERE
02874 !
02875 ! 4. Update surface temperature:
02876 ! ------------------------------
02877 !
02878 PSNOWTEMP(:) = ZSNOWTEMP(:)
02879 !
02880 ! 5. Final evaporative flux (kg/m2/s)
02881 !
02882 PEVAP(:)     = ZEVAPC(:)
02883  !write(*,*) 'Flux surface:',PGFLUX(1),PRN(1),PH(1), ZLE(1), PHPSNOW(1)
02884 !
02885 ! 5. Friction velocity
02886 ! --------------------
02887 !
02888 PUSTAR(:) = SQRT(PUSTAR2_IC(:)) 
02889 !
02890 IF (LHOOK) CALL DR_HOOK('SNOWCROFLUX',1,ZHOOK_HANDLE)
02891 !
02892 !-------------------------------------------------------------------------------
02893 !
02894 END SUBROUTINE SNOWCROFLUX
02895 !####################################################################
02896 !####################################################################
02897 !####################################################################
02898       SUBROUTINE SNOWCROEVAPN(PLES3L,PTSTEP,PSNOWTEMP, &
02899                               PSNOWRHO,PSNOWDZ,PEVAPCOR,    &
02900                               PSNOWHMASS ) 
02901 !
02902 !
02903 !!    PURPOSE
02904 !!    -------
02905 !     Remove mass from uppermost snow layer in response to
02906 !     evaporation (liquid) and sublimation.
02907 !
02908 !!     MODIFICATIONS
02909 !!     -------------
02910 !!      Original A. Boone 
02911 !!      05/2011: E. Brun  Takes only into account sublimation and solid
02912 !!                         condensation. Evaporation and liquid condensation
02913 !!                         are taken into account in SNOWCROREFRZ
02914 !
02915 USE MODD_CSTS,     ONLY : XLVTT, XRHOLW, XLSTT, XLMTT, XCI, XTT
02916 USE MODD_SNOW_PAR, ONLY : XRHOSMIN_ES
02917 !
02918 IMPLICIT NONE
02919 !
02920 !*      0.1    declarations of arguments
02921 !
02922 REAL, INTENT(IN)                    :: PTSTEP
02923 !
02924 REAL, DIMENSION(:), INTENT(IN)      :: PSNOWTEMP
02925 !
02926 REAL, DIMENSION(:), INTENT(IN)      :: PLES3L   ! (W/m2)
02927 !
02928 REAL, DIMENSION(:), INTENT(INOUT)   :: PSNOWRHO, PSNOWDZ, PSNOWHMASS, 
02929                                         PEVAPCOR 
02930 !
02931 !*      0.2    declarations of local variables
02932 !
02933 REAL, DIMENSION(SIZE(PLES3L))       :: ZSNOWEVAPS, ZSNOWEVAP, ZSNOWEVAPX,          
02934                                         ZSNOWDZ, ZEVAPCOR 
02935 REAL(KIND=JPRB) :: ZHOOK_HANDLE
02936 !                                      ZEVAPCOR = for vanishingy thin snow cover,
02937 !                                                 allow any excess evaporation
02938 !                                                 to be extracted from the soil
02939 !                                                 to maintain an accurate water
02940 !                                                 balance [kg/(m2 s)]
02941 !
02942 !
02943 !-------------------------------------------------------------------------------
02944 !
02945 ! 0. Initialize:
02946 ! --------------
02947 !
02948 IF (LHOOK) CALL DR_HOOK('SNOWCROEVAPN',0,ZHOOK_HANDLE)
02949 ZEVAPCOR(:)    = 0.0
02950 ZSNOWEVAPS(:)  = 0.0
02951 ZSNOWEVAP(:)   = 0.0
02952 ZSNOWEVAPX(:)  = 0.0
02953 ZSNOWDZ(:)     = 0.0
02954 !
02955 !
02956 !
02957 WHERE(PSNOWDZ > 0.0)
02958 !
02959 !! 1. Sublimation/condensation of snow ice
02960 ! ----------------------------------------
02961 ! Reduce layer thickness and total snow depth
02962 ! if sublimation: add to correction term if potential
02963 ! sublimation exceeds available snow cover.
02964 !
02965    ZSNOWEVAPS(:)  = PLES3L(:)*PTSTEP/(XLSTT*PSNOWRHO(:))
02966    ZSNOWDZ(:)     = PSNOWDZ(:) - ZSNOWEVAPS(:)
02967    PSNOWDZ(:)     = MAX(0.0, ZSNOWDZ(:))
02968    ZEVAPCOR(:)    = ZEVAPCOR(:) + MAX(0.0,-ZSNOWDZ(:))*PSNOWRHO(:)/PTSTEP
02969 !
02970 ! Total heat content change due to snowfall and sublimation (added here):
02971 ! (for budget calculations):
02972 !
02973    PSNOWHMASS(:)  = PSNOWHMASS(:) - PLES3L(:)*(PTSTEP/XLSTT)*     &
02974                      ( XCI*(PSNOWTEMP(:)-XTT)- XLMTT) 
02975 END WHERE
02976 !
02977 ! 3. Update evaporation correction term:
02978 ! --------------------------------------
02979 !
02980 PEVAPCOR(:) = PEVAPCOR(:) + ZEVAPCOR(:)
02981 IF (LHOOK) CALL DR_HOOK('SNOWCROEVAPN',1,ZHOOK_HANDLE)
02982 !
02983 !-------------------------------------------------------------------------------
02984 !
02985 END SUBROUTINE SNOWCROEVAPN
02986 !####################################################################
02987 !####################################################################
02988 !####################################################################
02989 SUBROUTINE SNOWCROGONE(PTSTEP,PLEL3L,PLES3L,PSNOWRHO,         &
02990                   PSNOWHEAT,PRADSINK_2D,PEVAPCOR,PTHRUFAL,PGRNDFLUX,    &
02991                   PGFLUXSNOW,PSNOWDZ,PSNOWLIQ,PSNOWTEMP,PRADXS,   &
02992                   PRR,INLVLS_USE) 
02993 !
02994 !
02995 !!    PURPOSE
02996 !!    -------
02997 !     Account for the case when the last trace of snow melts
02998 !     during a time step: ensure mass and heat balance of
02999 !     snow AND underlying surface.
03000 !     Original A. Boone 
03001 !     05/2011: E. Brun  Takes into account sublimation and PGRNDFLUX 
03002 !                       Adds rain and evaporation/liquid condensation
03003 !                       in PTHRUFAL
03004 !
03005 USE MODD_CSTS,ONLY : XTT, XLSTT, XLVTT
03006 !
03007 IMPLICIT NONE
03008 !
03009 !*      0.1    declarations of arguments
03010 !
03011 REAL, INTENT(IN)                    :: PTSTEP
03012 !
03013 REAL, DIMENSION(:), INTENT(IN)      :: PLEL3L, PLES3L, PGFLUXSNOW,PRR
03014 !  
03015 REAL, DIMENSION(:,:), INTENT(IN)    :: PRADSINK_2D
03016 !
03017 REAL, DIMENSION(:,:), INTENT(IN)    :: PSNOWRHO, PSNOWHEAT
03018 !
03019 REAL, DIMENSION(:), INTENT(INOUT)   :: PGRNDFLUX, PRADXS
03020 !
03021 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWDZ, PSNOWLIQ, PSNOWTEMP
03022 !
03023 REAL, DIMENSION(:), INTENT(OUT)     :: PTHRUFAL   ! melt water [kg/(m2 s)]
03024 !
03025 REAL, DIMENSION(:), INTENT(OUT)     :: PEVAPCOR   ! [kg/(m2 s)]
03026 !                                      PEVAPCOR = for vanishingy thin snow cover,
03027 !                                                 allow any excess evaporation
03028 !                                                 to be extracted from the soil
03029 !                                                 to maintain an accurate water
03030 !                                                 balance.
03031 !
03032 INTEGER, DIMENSION(:), INTENT(INOUT)      :: INLVLS_USE
03033 !
03034 !*      0.2    declarations of local variables
03035 !
03036 REAL, DIMENSION(SIZE(PLES3L))       :: PRADSINK
03037 !
03038 INTEGER                             :: JJ
03039 !
03040 REAL, DIMENSION(SIZE(PLES3L))       :: ZSNOWHEATC
03041 INTEGER, DIMENSION(SIZE(PLES3L))    :: ISNOWGONE_DELTA
03042 REAL(KIND=JPRB) :: ZHOOK_HANDLE
03043 !
03044 !-------------------------------------------------------------------------------
03045 !
03046 ! 0. Initialize:
03047 ! --------------
03048 !
03049 IF (LHOOK) CALL DR_HOOK('SNOWCROGONE',0,ZHOOK_HANDLE)
03050 PEVAPCOR(:)           = 0.0
03051 PTHRUFAL(:)           = 0.0
03052 !
03053 DO JJ=1, SIZE(PRADSINK)
03054 PRADSINK(JJ) = PRADSINK_2D(JJ,INLVLS_USE(JJ)) 
03055 ZSNOWHEATC(JJ) = SUM(PSNOWHEAT(JJ,1:INLVLS_USE(JJ))) !total heat content (J m-2)
03056 END DO
03057 !
03058 ISNOWGONE_DELTA(:)    = 1
03059 !
03060 ! 1. Simple test to see if snow vanishes:
03061 ! ---------------------------------------
03062 ! If so, set thicknesses (and therefore mass and heat) and liquid content
03063 ! to zero, and adjust fluxes of water, evaporation and heat into underlying
03064 ! surface.
03065 !
03066 ! takes into account the heat content corresponding to the occasional
03067 ! sublimation  and then PGRNDFLUX
03068 !
03069  ZSNOWHEATC(:) = ZSNOWHEATC(:)+MAX(0.,PLES3L(:)*PTSTEP/XLSTT)* &
03070                   XLMTT 
03071 !
03072 WHERE(PGFLUXSNOW(:) + PRADSINK(:) - PGRNDFLUX(:)  >= (-ZSNOWHEATC(:)/PTSTEP) )
03073    PGRNDFLUX(:)       = PGFLUXSNOW(:) + (ZSNOWHEATC(:)/PTSTEP)
03074    PEVAPCOR(:)        = PLES3L(:)/XLSTT
03075    PRADXS(:)          = 0.0
03076    ISNOWGONE_DELTA(:) = 0          ! FLAG...if=0 then snow vanishes, else=1
03077 END WHERE
03078 !
03079 ! 2. Final update of snow state and computation of corresponding flow
03080 !    Only if snow vanishes
03081 ! -----------------------------
03082 PTHRUFAL(:) = 0.
03083 DO JJ=1, SIZE(PRADSINK)
03084    IF(ISNOWGONE_DELTA(JJ) == 0 ) THEN
03085     PTHRUFAL(JJ) = PTHRUFAL(JJ) + SUM(PSNOWRHO(JJ,1:INLVLS_USE(JJ))* &
03086                                        PSNOWDZ(JJ,1:INLVLS_USE(JJ)))/PTSTEP 
03087 ! takes into account rain and condensation/evaporation
03088     PTHRUFAL(JJ)= PTHRUFAL(JJ) + PRR(JJ)-PLEL3L(JJ)/XLVTT
03089     PSNOWTEMP(JJ,:) = XTT
03090     PSNOWDZ(JJ,:)   = 0.
03091     PSNOWLIQ(JJ,:)  = 0.
03092     INLVLS_USE(JJ)=0
03093    ENDIF
03094 ENDDO
03095 IF (LHOOK) CALL DR_HOOK('SNOWCROGONE',1,ZHOOK_HANDLE)
03096 !
03097 !
03098 END SUBROUTINE SNOWCROGONE
03099 !####################################################################
03100 !####################################################################
03101 !####################################################################
03102         SUBROUTINE SNOWCROEVAPGONE(PSNOWHEAT,PSNOWDZ,PSNOWRHO,PSNOWTEMP,PSNOWLIQ,&
03103                    PSNOWGRAN1,PSNOWGRAN2,PSNOWHIST,PSNOWAGE, INLVLS_USE) 
03104 !
03105 !!    PURPOSE
03106 !!    -------
03107 !
03108 !     If all snow in uppermost layer evaporates/sublimates, re-distribute
03109 !     grid (below assumes very thin snowpacks so layer-thicknesses are
03110 !     constant).
03111 !     Original A. Boone 
03112 !     05/2011: E. Brun  Takes into account previous changes in the energy
03113 !                       content
03114 !
03115 !
03116 USE MODD_CSTS,     ONLY : XTT, XRHOLW, XLMTT
03117 USE MODD_SNOW_PAR, ONLY : XRHOSMIN_ES, XSNOWDMIN, XRHOSMAX_ES
03118 USE MODE_SNOW3L
03119 USE MODD_SNOW_METAMO
03120 USE MODD_TYPE_DATE_SURF
03121 !
03122 IMPLICIT NONE
03123 !
03124 !*      0.1    declarations of arguments
03125 !
03126 REAL, DIMENSION(:,:), INTENT(INOUT)   :: PSNOWRHO   ! snow density profile                (kg/m3)
03127 REAL, DIMENSION(:,:), INTENT(INOUT)   :: PSNOWDZ    ! snow layer thickness profile        (m)
03128 REAL, DIMENSION(:,:), INTENT(INOUT)   :: PSNOWHEAT  ! snow heat content/enthalpy          (J/m2)
03129 REAL, DIMENSION(:,:), INTENT(INOUT)   :: PSNOWGRAN1 ! snow grain parameter 1              (-)
03130 REAL, DIMENSION(:,:), INTENT(INOUT)   :: PSNOWGRAN2 ! snow grain parameter 2              (-)
03131 REAL, DIMENSION(:,:), INTENT(INOUT)   :: PSNOWHIST  ! snow grain historical variable      (-)
03132 REAL, DIMENSION(:,:), INTENT(INOUT)   :: PSNOWAGE  ! Snow grain age
03133 ! 
03134 REAL, DIMENSION(:,:), INTENT(INOUT)   :: PSNOWTEMP  ! snow temperature profile            (K)
03135 REAL, DIMENSION(:,:), INTENT(INOUT)   :: PSNOWLIQ   ! snow liquid water profile           (m)
03136 ! 
03137 INTEGER, DIMENSION(:), INTENT(IN)      :: INLVLS_USE
03138 !
03139 !*      0.2    declarations of local variables
03140 !
03141 INTEGER                               :: JJ,JST          ! loop control
03142 INTEGER                               :: JNLVLS
03143 !
03144 REAL, DIMENSION(SIZE(PSNOWDZ,1))      :: ZSNOWHEAT_1D ! total heat content                (J/m2)
03145 REAL, DIMENSION(SIZE(PSNOWDZ,1))      :: ZSNOWRHO_1D  ! total snowpack average density    (kg/m3)
03146 REAL, DIMENSION(SIZE(PSNOWDZ,1))      :: ZSNOW        ! total snow depth                  (m)
03147 REAL, DIMENSION(SIZE(PSNOWDZ,1))      :: ZSCAP        ! Snow layer heat capacity          (J/K/m3)
03148 REAL, DIMENSION(SIZE(PSNOWDZ,1))      :: ZNDENT       ! Number of dendritic layers        (-)
03149 REAL, DIMENSION(SIZE(PSNOWDZ,1))      :: ZNVIEU       ! Number of non dendritic layers    (-)
03150 REAL, DIMENSION(SIZE(PSNOWDZ,1))      :: ZSNOWAGE_1D  ! total snowpack average 
03151 !age (days)
03152 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) ::ZSNOWGRAN1N,   
03153                                  ZSNOWGRAN2N,ZSNOWHISTN 
03154 REAL(KIND=JPRB) :: ZHOOK_HANDLE
03155 
03156 !
03157 !-------------------------------------------------------------------------------
03158 !
03159 ! Initialize:
03160 !
03161 IF (LHOOK) CALL DR_HOOK('SNOWCROEVAPGONE',0,ZHOOK_HANDLE)
03162 JNLVLS          = SIZE(PSNOWDZ,2)
03163 ZSNOWHEAT_1D(:) = 0.0; ZSNOWRHO_1D(:) = 0.0; ZSNOW(:) = 0.0; ZSCAP(:) = 0.0
03164 !
03165 ! First, determine where uppermost snow layer has completely
03166 ! evaporated/sublimated (as it becomes thin):
03167 !
03168 ZSNOWHEAT_1D(:) = 0.
03169 ZSNOW(:)        = 0.
03170 ZSNOWRHO_1D(:)  = 0.
03171 ZNDENT(:)       = 0.
03172 ZNVIEU(:)       = 0.  
03173 ZSNOWAGE_1D(:)  = 0.
03174 !           
03175 DO JJ=1,size(PSNOWRHO,1)
03176    IF(PSNOWDZ(JJ,1) == 0.0)THEN   
03177       DO JST=2,INLVLS_USE(JJ)
03178          ZSNOWHEAT_1D(JJ) = ZSNOWHEAT_1D(JJ) +  PSNOWDZ(JJ,JST)* &
03179             (SNOW3LSCAP(PSNOWRHO(JJ,JST))*(ZSNOWTEMP(JJ,JST)-XTT) &
03180              - XLMTT*PSNOWRHO(JJ,JST) ) + XLMTT*XRHOLW*PSNOWLIQ(JJ,JST) 
03181          ZSNOW       (JJ) = ZSNOW       (JJ) + PSNOWDZ  (JJ,JST)
03182          ZSNOWRHO_1D (JJ) = ZSNOWRHO_1D (JJ) + &
03183                            PSNOWDZ  (JJ,JST)*PSNOWRHO(JJ,JST)     
03184          ZSNOWAGE_1D (JJ) = ZSNOWAGE_1D (JJ) + &
03185                            PSNOWDZ  (JJ,JST)*PSNOWRHO(JJ,JST)*PSNOWAGE(JJ,JST)   
03186 !        snow grains
03187          IF(PSNOWGRAN1(JJ,JST)<-XEPSI)THEN   ! Dendritic snow
03188             ZNDENT(JJ) = ZNDENT(JJ)+ 1.0
03189          ELSE                                ! Non dendritic snow
03190             ZNVIEU(JJ) = ZNVIEU(JJ)+1.0
03191          ENDIF
03192       ENDDO
03193    ENDIF
03194 END DO
03195 ZSNOWRHO_1D (:) = ZSNOWRHO_1D (:) / MAX(XSNOWDMIN,ZSNOW(:))
03196 ZSNOWAGE_1D (:)= ZSNOWAGE_1D (:)/ MAX(XSNOWDMIN,ZSNOW(:)*ZSNOWRHO_1D (:))
03197 ZSNOWRHO_1D (:) = MAX(XRHOSMIN_ES,MIN(XRHOSMAX_ES,ZSNOWRHO_1D(:)))
03198 !
03199 ! Where uppermost snow layer has vanished, redistribute vertical
03200 ! snow mass and heat profiles (and associated quantities):
03201 !
03202  CALL SNOW3LAVGRAIN(PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST, &
03203                  ZSNOWGRAN1N, ZSNOWGRAN2N, ZSNOWHISTN,ZNDENT, ZNVIEU)         
03204 !
03205 DO JJ=1,SIZE(PSNOWRHO,1)
03206   IF(ZSNOW(JJ) /= 0.0) THEN
03207       PSNOWDZ(JJ,1:INLVLS_USE(JJ))   = ZSNOW(JJ)/INLVLS_USE(JJ)
03208       PSNOWHEAT(JJ,1:INLVLS_USE(JJ)) = ZSNOWHEAT_1D(JJ)/INLVLS_USE(JJ)
03209       PSNOWRHO(JJ,1:INLVLS_USE(JJ))  = ZSNOWRHO_1D(JJ)
03210 !
03211       ZSCAP(JJ)        = SNOW3LSCAP(ZSNOWRHO_1D(JJ))
03212       PSNOWTEMP(JJ,1:INLVLS_USE(JJ)) = XTT + ( ((PSNOWHEAT(JJ,1:INLVLS_USE(JJ))/PSNOWDZ(JJ,1:INLVLS_USE(JJ)))        &
03213                          + XLMTT*PSNOWRHO(JJ,1:INLVLS_USE(JJ)))/ZSCAP(JJ) ) 
03214       PSNOWLIQ(JJ,1:INLVLS_USE(JJ))  = MAX(0.0,PSNOWTEMP(JJ,1:INLVLS_USE(JJ))-XTT)*ZSCAP(JJ)*       &
03215                          PSNOWDZ(JJ,1:INLVLS_USE(JJ))/(XLMTT*XRHOLW) 
03216       PSNOWTEMP(JJ,1:INLVLS_USE(JJ)) = MIN(XTT,PSNOWTEMP(JJ,1:INLVLS_USE(JJ)))
03217    ENDIF
03218 ENDDO
03219 IF (LHOOK) CALL DR_HOOK('SNOWCROEVAPGONE',1,ZHOOK_HANDLE)
03220 
03221 !
03222 END SUBROUTINE SNOWCROEVAPGONE
03223 !
03224 !
03225 !
03226 
03227 !####################################################################
03228 !####################################################################
03229 !####################################################################
03230 SUBROUTINE SNOWNLFALL_UPGRID(TPTIME, OGLACIER,                 &
03231             PTSTEP,PSR,PTA,PVMOD,                               &
03232             PSNOW,PSNOWRHO,PSNOWDZ,PSNOWHEAT,PSNOWHMASS,PSNOWALB,PPERMSNOWFRAC, &
03233             PSNOWGRAN1,PSNOWGRAN2, GSNOWFALL,PSNOWDZN, &
03234             PSNOWRHOF,PSNOWDZF,PSNOWGRAN1F,PSNOWGRAN2F,PSNOWHISTF,PSNOWAGEF, &
03235             OMODIF_GRID,INLVLS_USE,OSNOWDRIFT) 
03236 !
03237 !!    PURPOSE
03238 !!    -------
03239 ! Adds new snowfall and updates the vertical grid in order to keep an
03240 ! optimal discertisation
03241 !
03242 !!    AUTHOR
03243 !!    ------
03244 !!      E. Brun           * Meteo-France *
03245 !!
03246 !
03247 USE MODD_CSTS,     ONLY : XLMTT, XTT, XCI
03248 USE MODD_SNOW_PAR, ONLY : XRHOSMIN_ES, XSNOWDMIN, XANSMAX,XAGLAMAX,XSNOWCRITD
03249 USE MODD_SNOW_METAMO
03250 !
03251 USE MODE_SNOW3L
03252 USE MODD_TYPE_DATE_SURF,  ONLY: DATE_TIME
03253 !
03254 IMPLICIT NONE
03255 !
03256 !*      0.1    declarations of arguments
03257 !
03258 TYPE(DATE_TIME), INTENT(IN)       :: TPTIME      ! current date and time
03259 LOGICAL, INTENT(IN)               :: OGLACIER   ! True = Over permanent snow and ice, 
03260 !                                                   initialise WGI=WSAT,
03261 !                                                   Hsnow>=10m and allow 0.8<SNOALB<0.85
03262                                                 ! False = No specific treatment
03263 !
03264 REAL, INTENT(IN)                    :: PTSTEP
03265 !
03266 REAL, DIMENSION(:), INTENT(IN)      :: PSR, PTA, PVMOD, PPERMSNOWFRAC
03267 !
03268 REAL, DIMENSION(:), INTENT(INOUT)   :: PSNOW, PSNOWALB
03269 ! 
03270 REAL, DIMENSION(:,:), INTENT(IN)    :: PSNOWRHO, PSNOWDZ, PSNOWHEAT
03271 !
03272 REAL, DIMENSION(:), INTENT(OUT)     :: PSNOWHMASS
03273 !
03274 REAL, DIMENSION(:,:), INTENT(IN)    :: PSNOWGRAN1, PSNOWGRAN2
03275 !
03276 LOGICAL, DIMENSION(:), INTENT(INOUT):: GSNOWFALL   
03277 !
03278 ! Fresh snow characteristics
03279 REAL, DIMENSION(:), INTENT(OUT)     :: PSNOWRHOF, PSNOWDZF 
03280 REAL, DIMENSION(:), INTENT(OUT)     :: PSNOWGRAN1F, PSNOWGRAN2F, PSNOWHISTF 
03281 REAL, DIMENSION(:), INTENT(OUT)     :: PSNOWAGEF  
03282 ! New vertical grid
03283 REAL, DIMENSION(:,:), INTENT(OUT)   :: PSNOWDZN
03284 !
03285 LOGICAL, DIMENSION(:), INTENT(OUT)  ::OMODIF_GRID
03286 ! 
03287 INTEGER, DIMENSION(:), INTENT(INOUT)       :: INLVLS_USE
03288 
03289 LOGICAL,INTENT(IN) :: OSNOWDRIFT ! if snowdrift then grain types are not modified by wind
03290 
03291 !*      0.2    declarations of local variables
03292 !
03293 INTEGER                             :: INLVLS, INLVLSMIN, INLVLSMAX, JJ, JST
03294 !
03295 LOGICAL, DIMENSION(SIZE(PTA))       :: OAGREG_SURF 
03296 !
03297 REAL, DIMENSION(SIZE(PTA))          :: ZSNOWFALL,ZSNOWTEMP,ZSCAP,ZANSMAX
03298 REAL                                :: ZAGE_NOW
03299 !
03300 ! ISBA-ES CROCUS (Pahaut 1976): snowfall density coefficients:
03301 !
03302 REAL, PARAMETER                      :: ZSNOWFALL_A_SN = 109.0  ! kg/m3
03303 REAL, PARAMETER                      :: ZSNOWFALL_B_SN =   6.0  ! kg/(m3 K)
03304 REAL, PARAMETER                      :: ZSNOWFALL_C_SN =  26.0  ! kg/(m7/2 s1/2)
03305 !
03306 ! Coefficients for the optimal vertical grid calculation
03307 REAL, PARAMETER                      ::  DZ1=0.01
03308 REAL, PARAMETER                      ::  DZ2=0.0125
03309 REAL, PARAMETER                      ::  DZ3=0.015
03310 REAL, PARAMETER                      ::  DZ3_bis=0.03
03311 REAL, PARAMETER                      ::  DZ4=0.04
03312 REAL, PARAMETER                      ::  DZ5=0.05
03313 REAL, PARAMETER                      ::  DZ_base=0.02
03314 REAL, PARAMETER                      ::  DZ_internal=0.07
03315 REAL, PARAMETER                      ::  scale_cm=100.
03316 REAL,DIMENSION(5), PARAMETER         ::  DZMAX_internal=(/0.5,1.,2.,4.,10./)
03317 REAL, PARAMETER                     ::  DZMIN_TOP_EXTREM=0.0001
03318 !
03319 
03320 ! Below this threshold of snowfall, new snowfall are aggregated with surface layer to avoid numerical problems
03321 ! (0.03 mm/h)
03322 REAL,PARAMETER                      ::   XSNOWFALL_THRESHOLD=0.0333/3600.
03323 
03324 ! The ratio between a new surface layer thickness and the second layer surface thickness is limited to 1/10
03325 REAL,PARAMETER                      ::   XRATIO_NEWLAYER=0.1
03326 
03327 ! Coefficients for cases with very thick snowpacks
03328 REAL, PARAMETER                      ::  DEPTH_THRESHOLD1=3.
03329 REAL, PARAMETER                      ::  DEPTH_THRESHOLD2=20.
03330 REAL, PARAMETER                      ::  DEPTH_SURFACE=3.
03331 REAL                                 ::  PSNOW_UPPER ! snow depth treated normally (<= DEPTH_SURFACE)
03332 INTEGER                              ::  NB_DEEP_LAYER,NB_UPPER_LAYER !separation between deep and upper layers
03333                                         ! if snow depth below DEPTH_SURFACE then NB_DEEP_LAYER=0
03334 REAL                                 ::  COEF_DEPTH !coefficient for repartition of deep snow above 3 meters
03335 INTEGER                              :: NB_MIN_LAYERS !why this test ?
03336 INTEGER                              ::  NB_INTERMEDIATE ! number of intermediate layers (constant optimal gridding)
03337 INTEGER                              ::  END_INTERMEDIATE ! layer indice for bottom of intermediate layers
03338 REAL                                 ::  THICKNESS_INTERMEDIATE
03339 INTEGER                              ::  JSTDEEP,JSTEND
03340 !
03341 ! Coefficients for computing the difference in 2 snow layer characteristics
03342 REAL, PARAMETER                      ::  DIFF_1=20.
03343 REAL, PARAMETER                      ::  DIFF_MAX=200.
03344 REAL, PARAMETER                      ::  scale_DIFF=25.
03345 !
03346 ! Coeefficients for snow layer splitting
03347 REAL, PARAMETER                      ::  DZMIN_TOP=0.01
03348 REAL, PARAMETER                      ::  DZMIN_TOP_BIS=0.005
03349 REAL, PARAMETER                      ::  DZMIN_BOT=0.02
03350 REAL, PARAMETER                      ::  SPLIT_COEF=8.
03351 !
03352 ! Coeefficients for snow layer agregation 
03353 REAL, PARAMETER                      ::  AGREG_COEF_1=5.
03354 REAL, PARAMETER                      ::  AGREG_COEF_2=4.5
03355 !
03356 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) ::ZDZOPT 
03357 
03358 REAL        :: ZPENALTY, ZDIFTYPE_INF,ZDIFTYPE_SUP,ZCRITSIZE, 
03359                      ZCRITSIZE_INF, ZCRITSIZE_SUP 
03360 !        
03361 INTEGER JST_1, JJ_A_AGREG_SUP, JJ_A_AGREG_INF,JJ_A_DEDOUB
03362 
03363 REAL :: ZSNOW2L
03364 
03365 REAL(KIND=JPRB) :: ZHOOK_HANDLE
03366 !
03367 !*      1.0   Initialization and snowage calculation for the present date 
03368 !
03369 IF (LHOOK) CALL DR_HOOK('SNOWNLFALL_UPGRID',0,ZHOOK_HANDLE)
03370 INLVLS         = SIZE (PSNOWRHO(:,:),2)
03371 INLVLSMAX      = SIZE (PSNOWRHO(:,:),2)
03372 INLVLSMIN      = 3 
03373 ZSNOWTEMP(:)   = XTT
03374 GSNOWFALL(:)   =.FALSE.
03375 ZSNOWFALL(:)   = 0.0 !Matthieu Lafaysse 21/09/2012
03376 PSNOWHMASS(:)  = 0.0 
03377 PSNOWRHOF(:)   = 0.0 
03378 PSNOWDZF(:)    = 0.0 
03379 PSNOWGRAN1F(:) = 0.0 
03380 PSNOWGRAN2F(:) = 0.0      
03381 PSNOWHISTF(:)  = 0.0
03382 PSNOWDZN(:,:)  = PSNOWDZ(:,:)
03383 OAGREG_SURF(:)=.FALSE.
03384 OMODIF_GRID(:)=.FALSE.
03385 !
03386 ! 
03387 !                     
03388 !*      1.1   Calculation of the optimal vertical grid size 
03389 !             as a function of maximum number of layers and of current 
03390 !             snow depth (modified 05/06/2012 by Matthieu Lafaysse)
03391 !
03392 NB_MIN_LAYERS = 2 + INLVLSMAX/3
03393 !
03394 DO JJ=1, SIZE(PSNOW(:))
03395 
03396   IF ((PSNOW(JJ) > DEPTH_THRESHOLD2).AND.( INLVLS_USE(JJ) > NB_MIN_LAYERS)) THEN
03397  
03398     ! for very thick snowpack with enough snow layers
03399     ! special treatment
03400     ! we put the highest thickness in the lowest layers
03401     ! about 1/3 of layers for all snow except DEPTH_SURFACE=3 first meters
03402 
03403     !number of "deep layers"
03404     NB_DEEP_LAYER= (INLVLS_USE(JJ)+INLVLSMAX)/6
03405 
03406     !number of "upper layers"
03407     NB_UPPER_LAYER= INLVLS_USE(JJ)-NB_DEEP_LAYER
03408     !thickness of "upper layers"
03409     PSNOW_UPPER=DEPTH_SURFACE
03410 
03411     !Arithmetic serie : 1+2+3+...+NB_DEEP_LAYER=NB_DEEP_LAYER*(NB_DEEP_LAYER+1)/2
03412     COEF_DEPTH = (PSNOW(JJ) - DEPTH_SURFACE)*2./((NB_DEEP_LAYER+1)*NB_DEEP_LAYER)
03413 
03414     ! deep layers optimal thickness :
03415     ! increasing thickness with depth
03416     DO JSTDEEP=1,NB_DEEP_LAYER
03417       JST = NB_UPPER_LAYER + JSTDEEP
03418       ZDZOPT(JJ,JST) = COEF_DEPTH*JSTDEEP
03419       !This sum is equal to PSNOW(JJ)-DEPTH_SURFACE
03420     ENDDO
03421 
03422   ELSE
03423     NB_UPPER_LAYER=INLVLS_USE(JJ)
03424     PSNOW_UPPER=PSNOW(JJ)
03425   END IF
03426 
03427   ZDZOPT(JJ,1) = MIN(DZ1,PSNOW_UPPER/MAX(INLVLSMIN,NB_UPPER_LAYER)) 
03428   ZDZOPT(JJ,2) = MIN(DZ2,PSNOW_UPPER/MAX(INLVLSMIN,NB_UPPER_LAYER)) 
03429   ZDZOPT(JJ,3) = MIN(DZ3,PSNOW_UPPER/MAX(INLVLSMIN,NB_UPPER_LAYER)) 
03430   ZDZOPT(JJ,4:5) = 0.0 ! initialization to avoid a problem in thickness_intermediate
03431 
03432   IF (NB_UPPER_LAYER>0) THEN
03433 
03434     !ML : replace > by >= on 12-12-20 because the last layer was not initialised in case of thick snowpacks
03435     IF (NB_UPPER_LAYER>=3)  ZDZOPT(JJ,3) = MIN(DZ3_bis,PSNOW_UPPER/NB_UPPER_LAYER)
03436     IF (NB_UPPER_LAYER>=4)  ZDZOPT(JJ,4) = MIN(DZ4,PSNOW_UPPER/NB_UPPER_LAYER)
03437     IF (NB_UPPER_LAYER>=5)  ZDZOPT(JJ,5) = MIN(DZ5,PSNOW_UPPER/NB_UPPER_LAYER)
03438 
03439     IF (NB_UPPER_LAYER==INLVLS_USE(JJ)) THEN
03440       ! last layer of' upper layers' : normal case : thin layer
03441       ZDZOPT(JJ,NB_UPPER_LAYER)=   &
03442         MIN(DZ_base,PSNOW_UPPER/MAX(INLVLSMIN,NB_UPPER_LAYER))
03443 
03444       !remaining snow for remaining layers
03445       THICKNESS_INTERMEDIATE=PSNOW_UPPER - SUM(ZDZOPT(JJ,1:5))-ZDZOPT(JJ,NB_UPPER_LAYER)
03446 
03447       IF (PSNOW_UPPER<DEPTH_THRESHOLD1) THEN
03448         NB_INTERMEDIATE=NB_UPPER_LAYER-6
03449         END_INTERMEDIATE=NB_UPPER_LAYER-1
03450       ELSE
03451         NB_INTERMEDIATE=NB_UPPER_LAYER-8
03452         END_INTERMEDIATE=NB_UPPER_LAYER-3
03453         IF (NB_INTERMEDIATE>0) THEN
03454           THICKNESS_INTERMEDIATE=THICKNESS_INTERMEDIATE*NB_INTERMEDIATE/FLOAT(NB_INTERMEDIATE+1)
03455         END IF
03456       END IF
03457     ELSE
03458       ! case with very thick snowpacks :
03459       ! the last layer of upper layers is not an exception
03460       THICKNESS_INTERMEDIATE=PSNOW_UPPER - SUM(ZDZOPT(JJ,1:5))
03461       NB_INTERMEDIATE=NB_UPPER_LAYER-5
03462       END_INTERMEDIATE=NB_UPPER_LAYER   
03463     END IF
03464 
03465     ! For thick snowpack : add maximum value of optimal thickness to avoid too 
03466     ! large differencies between layers
03467     IF (NB_INTERMEDIATE>0) THEN
03468       JSTEND=MIN(END_INTERMEDIATE,10)
03469       DO JST=6,JSTEND
03470         ZDZOPT(JJ,JST) = MIN(DZMAX_internal(JST-5),&
03471                 MAX(DZ_internal,THICKNESS_INTERMEDIATE/NB_INTERMEDIATE)) 
03472       END DO
03473 
03474       IF (END_INTERMEDIATE>10) THEN
03475         DO JST=11,END_INTERMEDIATE
03476           ZDZOPT(JJ,JST) = MAX(DZ_internal,THICKNESS_INTERMEDIATE/NB_INTERMEDIATE)
03477         END DO
03478       END IF
03479     END IF
03480 
03481     IF ((PSNOW_UPPER>DEPTH_THRESHOLD1).AND.(NB_UPPER_LAYER>=8)) THEN
03482 
03483       !Linear interpolation of optimal thickness between layers N-3 and N :
03484       ZDZOPT(JJ,NB_UPPER_LAYER-2) = 0.34*ZDZOPT(JJ,NB_UPPER_LAYER)+&
03485                                     0.66*ZDZOPT(JJ,NB_UPPER_LAYER-3)
03486       ZDZOPT(JJ,NB_UPPER_LAYER-1) = 0.66*ZDZOPT(JJ,NB_UPPER_LAYER)+&
03487                                     0.34*ZDZOPT(JJ,NB_UPPER_LAYER-3)
03488     ENDIF
03489   END IF
03490 END DO
03491 
03492 
03493 !************************************************************************************
03494 !This was the initial code for optimal layers until may 2012
03495 
03496 
03497 ! ! ! ! ! 
03498 ! ! ! ! ! !*      1.1   Calculation of the optimal vertical grid size 
03499 ! ! ! ! ! !             as a function of maximum number of layers and of current 
03500 ! ! ! ! ! !             snow depth
03501 ! ! ! ! ! !
03502 ! ! ! ! ! DO JJ=1, SIZE(PSNOW(:))
03503 ! ! ! ! !    ZDZOPT(JJ,1) = MIN(DZ1,PSNOW(JJ)/MAX(INLVLSMIN,INLVLS_USE(JJ))) 
03504 ! ! ! ! !    ZDZOPT(JJ,2) = MIN(DZ2,PSNOW(JJ)/MAX(INLVLSMIN,INLVLS_USE(JJ))) 
03505 ! ! ! ! !    ZDZOPT(JJ,3) = MIN(DZ3,PSNOW(JJ)/MAX(INLVLSMIN,INLVLS_USE(JJ))) 
03506 ! ! ! ! !    IF (INLVLS_USE(JJ)>3)  ZDZOPT(JJ,3) = MIN(DZ3_bis,PSNOW(JJ)/INLVLS_USE(JJ))
03507 ! ! ! ! !    IF (INLVLS_USE(JJ)>4)  ZDZOPT(JJ,4) = MIN(DZ4,PSNOW(JJ)/INLVLS_USE(JJ))
03508 ! ! ! ! !    IF (INLVLS_USE(JJ)>5)  ZDZOPT(JJ,5) = MIN(DZ5,PSNOW(JJ)/INLVLS_USE(JJ))
03509 ! ! ! ! !    IF (INLVLS_USE(JJ)>0) ZDZOPT(JJ,INLVLS_USE(JJ))=   &
03510 ! ! ! ! !               MIN(DZ_base,PSNOW(JJ)/MAX(INLVLSMIN,INLVLS_USE(JJ)))  
03511 ! ! ! ! !    DO JST=6,INLVLS_USE(JJ)-1,1
03512 ! ! ! ! !        ZDZOPT(JJ,JST) = MAX(DZ_internal,(PSNOW(JJ) - SUM(ZDZOPT(JJ,1:5))-    &
03513 ! ! ! ! !                          ZDZOPT(JJ,INLVLS_USE(JJ))) /(INLVLS_USE(JJ)-6)) 
03514 ! ! ! ! !    END DO
03515 ! ! ! ! ! END DO
03516 ! ! ! ! ! !
03517 ! ! ! ! ! 
03518 
03519 !************************************************************************************
03520 
03521 !*      2.0   Fresh snow characteristics
03522 !
03523 !
03524 !
03525 ! Heat content of newly fallen snow (J/m2):
03526 ! NOTE for now we assume the snowfall has
03527 ! the temperature of the snow surface upon reaching the snow.
03528 ! This is done as opposed to using the air temperature since
03529 ! this flux is quite small and has little to no impact
03530 ! on the time scales of interest. If we use the above assumption
03531 ! then, then the snowfall advective heat flux is zero.
03532 !!
03533 DO JJ=1, SIZE(PSNOW(:)) 
03534 IF (PSR(JJ) > UEPSI ) THEN  
03535 ! newly fallen snow characteristics:
03536   IF (INLVLS_USE(JJ)>0) THEN !Case of new snowfall on a previously snow-free surface 
03537     ZSCAP(JJ)      = XCI*PSNOWRHO(JJ,1)
03538     ZSNOWTEMP(JJ)  = XTT + (PSNOWHEAT(JJ,1) +                              &
03539                        XLMTT*PSNOWRHO(JJ,1)*PSNOWDZ(JJ,1))/                 &
03540                        (ZSCAP(JJ)*MAX(XSNOWDMIN/INLVLS,PSNOWDZ(JJ,1))) 
03541   ELSE  ! case with bare ground
03542     ZSNOWTEMP(JJ)=PTA(JJ)
03543   ENDIF
03544   ZSNOWTEMP(JJ)  = MIN(XTT, ZSNOWTEMP(JJ))
03545 !
03546   PSNOWHMASS(JJ) = PSR(JJ)*(XCI*(ZSNOWTEMP(JJ)-XTT)-XLMTT)*PTSTEP
03547   PSNOWRHOF(JJ)  = MAX(XRHOSMIN_ES, ZSNOWFALL_A_SN + &
03548                     ZSNOWFALL_B_SN*(PTA(JJ)-XTT)+ &
03549                     ZSNOWFALL_C_SN*MIN(PVMOD(JJ),SQRT(PVMOD(JJ)))) 
03550   ZSNOWFALL(JJ)  = PSR(JJ)*PTSTEP/PSNOWRHOF(JJ)    ! snowfall thickness (m)
03551   PSNOW(JJ)      = PSNOW(JJ) + ZSNOWFALL(JJ)
03552   PSNOWDZF(JJ)   = ZSNOWFALL(JJ)
03553   IF (OSNOWDRIFT) THEN
03554     PSNOWGRAN1F(JJ)=-XGRAN
03555     PSNOWGRAN2F(JJ)=XNSPH3
03556   ELSE
03557     PSNOWGRAN1F(JJ)= MAX(MIN(XNDEN1*PVMOD(JJ)-XNDEN2,XNDEN3),-XGRAN)
03558     PSNOWGRAN2F(JJ)= MIN(MAX(XNSPH1*PVMOD(JJ)+XNSPH2,XNSPH3),XNSPH4)     
03559   END IF
03560   PSNOWHISTF(JJ) = 0.0
03561   PSNOWAGEF(JJ)  = 0.
03562   GSNOWFALL(JJ)  =.TRUE. 
03563   OMODIF_GRID(JJ)=.TRUE.
03564 !      
03565 ENDIF
03566 ENDDO
03567 !                   
03568 !  intialize the albedo:
03569 !  penser a changer 0.000001 par UEPSI
03570 IF(OGLACIER)THEN
03571    ZANSMAX(:) = XAGLAMAX * PPERMSNOWFRAC(:) + XANSMAX * (1.0-PPERMSNOWFRAC(:))
03572 ELSE
03573    ZANSMAX(:) = XANSMAX
03574 ENDIF
03575 WHERE(GSNOWFALL(:) .AND. ABS(PSNOW(:)-ZSNOWFALL(:))< 0.000001)
03576    PSNOWALB(:) = ZANSMAX(:)
03577 END WHERE
03578 !
03579 ! Computation of the new grid size
03580 ! It starts with successive exclusive cases
03581 ! Each case is described inside the corresponding condition
03582 ! 
03583 ! cases with fresh snow
03584 !
03585 DO JJ=1,SIZE(PSNOW(:)) ! grid point loop
03586 IF((.NOT.GSNOWFALL(JJ)).AND.PSNOW(JJ)>=XSNOWCRITD.AND. &
03587                        INLVLS_USE(JJ)>=INLVLSMIN) THEN 
03588 ! no fresh snow + deep enough snowpack + enough snow layers ==> no change
03589 !
03590 ELSEIF(PSNOW(JJ)<XSNOWCRITD.OR.PSNOW(JJ)==ZSNOWFALL(JJ).OR. &
03591                               INLVLS_USE(JJ)<INLVLSMIN  ) THEN 
03592 ! too shallow snowpack or only fresh snow or too few layers
03593 ! ==> uniform grid and identical snow layers / number depends on snow depth 
03594   OMODIF_GRID(JJ)=.TRUE.
03595   INLVLS_USE(JJ)= MAX(INLVLSMIN,MIN(INLVLSMAX,INT(PSNOW(JJ)*scale_cm)))
03596   PSNOWDZN(JJ,1:INLVLS_USE(JJ))=PSNOW(JJ)/INLVLS_USE(JJ)
03597 ELSE
03598 ! fresh snow over snow covered ground + enough snow layers 
03599   OMODIF_GRID(JJ)=.TRUE.
03600   ZDIFTYPE_SUP= SNOW3LDIFTYP(PSNOWGRAN1(JJ,1),PSNOWGRAN1F(JJ),&
03601                         PSNOWGRAN2(JJ,1),PSNOWGRAN2F(JJ)) 
03602   IF ((ZDIFTYPE_SUP<DIFF_1.AND.PSNOWDZ(JJ,1)< ZDZOPT(JJ,1)).OR. &
03603        (PSR(JJ)<XSNOWFALL_THRESHOLD .AND.PSNOWDZ(JJ,1) < 2.* ZDZOPT(JJ,1)) &
03604        .OR. PSNOWDZ(JJ,1)< DZMIN_TOP_EXTREM ) THEN
03605 ! Fresh snow is similar to a shallow surface layer (< ZDZOPT)
03606 ! or snowfall is very low and the surface layer not too deep (< 2*ZDZOPT) [NEW CONDITION 11/2012]
03607 ! or the surface layer is extremely thin (< DZMIN_TOP_EXTREM) [NEW CONDITION 11/2012]
03608 ! The two new conditions are necessary for forcings with very low precipitation
03609 ! (e.g. ERA interim reanalyses, or climate models)
03610 
03611 ! ==> fresh snow is agregated to the surface layer
03612        PSNOWDZN(JJ,1)=PSNOWDZ(JJ,1)+PSNOWDZF(JJ)
03613        DO JST=  INLVLS_USE(JJ), 2,-1
03614           PSNOWDZN(JJ, JST)=PSNOWDZ(JJ,JST)
03615        ENDDO
03616    ELSEIF(INLVLS_USE(JJ)<INLVLSMAX) THEN
03617 ! fresh snow is too different from the surface or the surface is too deep
03618 ! and there is room for extra layers ==> we create a new layer
03619        INLVLS_USE(JJ)=INLVLS_USE(JJ)+1
03620 
03621        IF(PSNOWDZF(JJ) > XRATIO_NEWLAYER * PSNOWDZ(JJ,2)) THEN 
03622 ! Snowfall is sufficient to create a new layer not lower than 1/10 of the second layer
03623           PSNOWDZN(JJ,1)=PSNOWDZF(JJ)
03624           DO JST=  INLVLS_USE(JJ), 2,-1
03625              PSNOWDZN(JJ, JST)=PSNOWDZ(JJ,JST-1)
03626           ENDDO
03627        ELSE 
03628 ! The ratio would be lower than 1/10 : [NEW : 11/2012]
03629 ! aggregate a part of the old layer with fresh snow to limit the ratio to 1/10.
03630           ZSNOW2L=PSNOWDZF(JJ)+PSNOWDZ(JJ,1)
03631           PSNOWDZN(JJ,1)=XRATIO_NEWLAYER*ZSNOW2L
03632           PSNOWDZN(JJ,2)=(1.-XRATIO_NEWLAYER)*ZSNOW2L
03633           DO JST=  INLVLS_USE(JJ), 3,-1
03634              PSNOWDZN(JJ, JST)=PSNOWDZ(JJ,JST-1)
03635           ENDDO
03636        ENDIF     
03637 
03638 
03639    ELSE
03640 ! fresh snow is too different from the surface or the surface is too deep
03641 ! and there is no room for extra layers
03642 ! ==> we agregate internal most similar snowlayers and create a new surface layer
03643    JJ_A_AGREG_SUP=1
03644    JJ_A_AGREG_INF=2
03645    ZDIFTYPE_INF= SNOW3LDIFTYP(PSNOWGRAN1(JJ,1),PSNOWGRAN1F(JJ),&
03646                      PSNOWGRAN2(JJ,1),PSNOWGRAN2F(JJ)) 
03647    ZCRITSIZE_INF= scale_DIFF*(PSNOWDZ(JJ,1)/ZDZOPT(JJ,1)+ &
03648                      PSNOWDZ(JJ,2)/ZDZOPT(JJ,2)) 
03649    ZPENALTY=ZDIFTYPE_INF+ZCRITSIZE_INF
03650    DO JST=2, INLVLS_USE(JJ)-1
03651    ZDIFTYPE_SUP= SNOW3LDIFTYP(PSNOWGRAN1(JJ,JST-1),PSNOWGRAN1(JJ, JST),&
03652                         PSNOWGRAN2(JJ,JST-1),PSNOWGRAN2(JJ, JST)) 
03653    ZDIFTYPE_INF= SNOW3LDIFTYP(PSNOWGRAN1(JJ,JST+1),PSNOWGRAN1(JJ, JST),&
03654                         PSNOWGRAN2(JJ,JST+1),PSNOWGRAN2(JJ, JST)) 
03655    ZCRITSIZE_SUP= scale_DIFF*(PSNOWDZ(JJ,JST)/ZDZOPT(JJ,JST)+ &
03656                         PSNOWDZ(JJ,JST-1)/ZDZOPT(JJ,JST-1))  
03657    ZCRITSIZE_INF= scale_DIFF*(PSNOWDZ(JJ,JST)/ZDZOPT(JJ,JST)+ &
03658                         PSNOWDZ(JJ,JST+1)/ZDZOPT(JJ,JST+1))  
03659    IF(ZDIFTYPE_SUP+ZCRITSIZE_SUP < ZPENALTY) THEN
03660      ZPENALTY=ZDIFTYPE_SUP+ZCRITSIZE_SUP
03661      JJ_A_AGREG_SUP=JST-1
03662      JJ_A_AGREG_INF=JST
03663    ENDIF
03664    IF(ZDIFTYPE_INF+ZCRITSIZE_INF < ZPENALTY) THEN
03665      ZPENALTY=ZDIFTYPE_INF+ZCRITSIZE_INF
03666      JJ_A_AGREG_SUP=JST
03667      JJ_A_AGREG_INF=JST+1
03668    ENDIF
03669    ENDDO
03670    ZDIFTYPE_SUP= SNOW3LDIFTYP(PSNOWGRAN1(JJ,INLVLS_USE(JJ)-1),   &
03671         PSNOWGRAN1(JJ,INLVLS_USE(JJ)), PSNOWGRAN2(JJ,INLVLS_USE(JJ)-1),  &
03672         PSNOWGRAN2(JJ, INLVLS_USE(JJ))) 
03673    ZCRITSIZE_SUP=scale_DIFF*(PSNOWDZ(JJ,INLVLS_USE(JJ))/ZDZOPT(JJ,INLVLS_USE(JJ))+ &
03674                   PSNOWDZ(JJ,INLVLS_USE(JJ)-1)/ZDZOPT(JJ,INLVLS_USE(JJ)-1))  
03675    IF(ZDIFTYPE_SUP+ZCRITSIZE_SUP < ZPENALTY) THEN
03676       JJ_A_AGREG_SUP=INLVLS_USE(JJ)-1
03677       JJ_A_AGREG_INF=INLVLS_USE(JJ)
03678    ENDIF
03679 ! agregation of the similar layers and shift of upper layers
03680    PSNOWDZN(JJ,JJ_A_AGREG_INF)=PSNOWDZ(JJ,JJ_A_AGREG_INF) + &
03681                   PSNOWDZ(JJ,JJ_A_AGREG_SUP) 
03682    DO JST=  JJ_A_AGREG_SUP, 2,-1
03683      PSNOWDZN(JJ, JST)=PSNOWDZ(JJ,JST-1)
03684    ENDDO
03685      PSNOWDZN(JJ,1)=PSNOWDZF(JJ)
03686 
03687 ! Limit the ratio between the new layer and the one beneath (ratio 1/10)
03688 ! [NEW : 11/2012]
03689        IF(PSNOWDZN(JJ,1) < XRATIO_NEWLAYER * PSNOWDZN(JJ,2)) THEN 
03690           ZSNOW2L=PSNOWDZN(JJ,1) + PSNOWDZN(JJ,2)
03691           PSNOWDZN(JJ,1) = XRATIO_NEWLAYER*ZSNOW2L
03692           PSNOWDZN(JJ,2)= (1.-XRATIO_NEWLAYER)* ZSNOW2L
03693        ENDIF    
03694 
03695   ENDIF
03696 
03697 ENDIF ! end of the case with fresh snow
03698 ENDDO ! end loop grid points
03699 !
03700 ! cases with no fresh snow and no previous grid resize
03701 !
03702 IF(INLVLSMIN==INLVLSMAX) THEN ! specific case with INLSVSMIN = INLVLSMAX  (INLVLS)
03703 ! check if surface layer depth is too small
03704 ! in such a case looks for an other layer to be split
03705  DO JJ=1,SIZE(PSNOW(:)) ! loop grid points
03706   IF(.NOT.OMODIF_GRID(JJ)) THEN 
03707    IF(PSNOWDZ(JJ,1)< DZMIN_TOP) THEN
03708      OMODIF_GRID(JJ)=.TRUE.
03709      OAGREG_SURF(JJ)=.TRUE.
03710      ZPENALTY=PSNOWDZ(JJ,2)/ZDZOPT(JJ,2)
03711      IF(PSNOWDZ(JJ,2)<DZMIN_TOP) ZPENALTY=0.
03712        JJ_A_DEDOUB=2
03713        DO JST=3, INLVLS
03714           ZCRITSIZE=PSNOWDZ(JJ,JST)/ZDZOPT(JJ,JST)
03715           IF(JST==INLVLS.AND.PSNOWDZ(JJ,JST)<DZMIN_BOT) ZCRITSIZE=0.
03716           IF (ZCRITSIZE > ZPENALTY) THEN
03717              ZPENALTY=ZCRITSIZE
03718              JJ_A_DEDOUB=JST
03719           ENDIF
03720        ENDDO
03721        IF(JJ_A_DEDOUB == 2) THEN
03722             PSNOWDZN(JJ,1)=0.5*(PSNOWDZ(JJ,1)+PSNOWDZ(JJ,2))
03723             PSNOWDZN(JJ,2)=0.5*(PSNOWDZ(JJ,1)+PSNOWDZ(JJ,2))
03724        ELSE
03725             PSNOWDZN(JJ,1)=(PSNOWDZ(JJ,1)+PSNOWDZ(JJ,2))
03726             DO JST=2, JJ_A_DEDOUB-2
03727                PSNOWDZN(JJ,JST)=PSNOWDZ(JJ,JST+1)
03728             ENDDO
03729             PSNOWDZN(JJ,JJ_A_DEDOUB-1)=0.5*PSNOWDZ(JJ,JJ_A_DEDOUB)
03730             PSNOWDZN(JJ,JJ_A_DEDOUB)=0.5*PSNOWDZ(JJ,JJ_A_DEDOUB)
03731        ENDIF
03732      ENDIF
03733   ENDIF   
03734  ENDDO ! end grid points loop
03735 !
03736 ! check if bottom layer depth is too small
03737 ! in such a case agregation with upper layer and
03738 ! looks for an other layer to be splitted
03739  DO JJ=1,SIZE(PSNOW(:)) ! loop grid points
03740   IF(.NOT.OMODIF_GRID(JJ)) THEN 
03741    IF(PSNOWDZ(JJ,INLVLS)< DZMIN_TOP) THEN
03742       OMODIF_GRID(JJ)=.TRUE.
03743       ZPENALTY=PSNOWDZ(JJ,INLVLS-2)/ZDZOPT(JJ,INLVLS-2)
03744       JJ_A_DEDOUB=INLVLS-2
03745       DO JST= MAX(1,INLVLS-3),1,-1
03746        ZCRITSIZE=PSNOWDZ(JJ,JST)/ZDZOPT(JJ,JST)
03747        IF(JST==1.AND.PSNOWDZ(JJ,JST)<DZMIN_BOT) ZCRITSIZE=0.
03748        IF (ZCRITSIZE > ZPENALTY) THEN
03749          ZPENALTY=ZCRITSIZE
03750          JJ_A_DEDOUB=JST
03751        ENDIF
03752       ENDDO
03753       IF(JJ_A_DEDOUB == INLVLS-1) THEN
03754        PSNOWDZN(JJ,INLVLS)=0.5*(PSNOWDZ(JJ,INLVLS)+PSNOWDZ(JJ,INLVLS-1))
03755        PSNOWDZN(JJ,INLVLS-1)=0.5*(PSNOWDZ(JJ,INLVLS)+PSNOWDZ(JJ,INLVLS-1))
03756 ! write( *,*) '2 couches basales agregees pour creer 2 couches identiques'       
03757       ELSE
03758 ! write( *,*) 'couches basales agregees et on dedouble ',JJ_A_DEDOUB       
03759        PSNOWDZN(JJ,INLVLS)=(PSNOWDZ(JJ,INLVLS)+PSNOWDZ(JJ,INLVLS-1))
03760        DO JST=INLVLS-1, JJ_A_DEDOUB+1,-1
03761           PSNOWDZN(JJ,JST)=PSNOWDZ(JJ,JST-1)
03762        ENDDO
03763        PSNOWDZN(JJ,JJ_A_DEDOUB)=0.5*PSNOWDZ(JJ,JJ_A_DEDOUB)
03764        PSNOWDZN(JJ,JJ_A_DEDOUB+1)=0.5*PSNOWDZ(JJ,JJ_A_DEDOUB)
03765      ENDIF
03766    ENDIF
03767   ENDIF   
03768  ENDDO ! end grid points loop
03769 ENDIF  ! end specific case INLSVSMIN = INLVLSMAX
03770 !
03771 ! case without new snowfall and INVLS > INLVLSMIN
03772 !
03773 ! check if surface layer depth is too small
03774 ! in such a case agregation with layer beneath
03775 ! in case of reaching INLVLSMIN, looks for an other layer to be splitted
03776 DO JJ=1,SIZE(PSNOW(:))
03777 IF((.NOT.GSNOWFALL(JJ)).AND.PSNOW(JJ)> XSNOWCRITD.AND. &
03778   (.NOT.OMODIF_GRID(JJ))) THEN  
03779   IF(PSNOWDZ(JJ,1)< DZMIN_TOP_BIS) THEN ! case shallow surface layer 
03780     OMODIF_GRID(JJ)=.TRUE.
03781     OAGREG_SURF(JJ)=.TRUE.
03782     IF(INLVLS_USE(JJ)>INLVLSMIN) THEN ! case minimum not reached 
03783      INLVLS_USE(JJ)=INLVLS_USE(JJ)-1
03784      PSNOWDZN(JJ,1)=PSNOWDZ(JJ,1)+PSNOWDZ(JJ,2)
03785      DO JST=2,INLVLS_USE(JJ) 
03786           PSNOWDZN(JJ,JST)=PSNOWDZ(JJ,JST+1)
03787      ENDDO
03788     ELSE ! case minimum reached         
03789      ZPENALTY=PSNOWDZ(JJ,2)/ZDZOPT(JJ,2)
03790      IF(PSNOWDZ(JJ,2)<DZMIN_TOP) ZPENALTY=0.
03791      JJ_A_DEDOUB=2
03792      DO JST=3, INLVLS_USE(JJ)
03793        ZCRITSIZE=PSNOWDZ(JJ,JST)/ZDZOPT(JJ,JST)
03794        IF(JST==INLVLS_USE(JJ).AND.PSNOWDZ(JJ,JST)<DZMIN_BOT) ZCRITSIZE=0.
03795        IF (ZCRITSIZE > ZPENALTY) THEN
03796          ZPENALTY=ZCRITSIZE
03797          JJ_A_DEDOUB=JST
03798        ENDIF
03799      ENDDO
03800      IF(JJ_A_DEDOUB == 2) THEN ! case splitted layer == 2
03801        PSNOWDZN(JJ,1)=0.5*(PSNOWDZ(JJ,1)+PSNOWDZ(JJ,2))
03802        PSNOWDZN(JJ,2)=0.5*(PSNOWDZ(JJ,1)+PSNOWDZ(JJ,2))
03803      ELSE ! case splitted layer =/ 2
03804        PSNOWDZN(JJ,1)=PSNOWDZ(JJ,1)+PSNOWDZ(JJ,2)
03805        DO JST=2, JJ_A_DEDOUB-2
03806           PSNOWDZN(JJ,JST)=PSNOWDZ(JJ,JST+1)
03807        ENDDO
03808        PSNOWDZN(JJ,JJ_A_DEDOUB-1)=0.5*PSNOWDZ(JJ,JJ_A_DEDOUB)
03809        PSNOWDZN(JJ,JJ_A_DEDOUB)=0.5*PSNOWDZ(JJ,JJ_A_DEDOUB)
03810      ENDIF ! end case splitted layer =/ 2
03811     ENDIF ! end case minimum reached
03812    ENDIF ! end case shallow surface layer
03813 ENDIF   
03814 ENDDO ! end grid points loop
03815 !
03816 ! check if bottom layer depth is too small
03817 ! in such a case agregation with above layer 
03818 ! in case of reaching INLVLSMIN, looks for an other layer to be splitted
03819 DO JJ=1,SIZE(PSNOW(:))
03820 IF((.NOT.GSNOWFALL(JJ)).AND.(.NOT.OAGREG_SURF(JJ)).AND.  &
03821         (.NOT.OMODIF_GRID(JJ)).AND. PSNOW(JJ)> XSNOWCRITD) THEN  
03822    IF(PSNOWDZ(JJ,INLVLS_USE(JJ))< DZMIN_TOP) THEN ! case shallow bottom layer
03823       OMODIF_GRID(JJ)=.TRUE.
03824      IF(INLVLS_USE(JJ)>INLVLSMIN) THEN ! case minimum not reached
03825         OMODIF_GRID(JJ)=.TRUE.
03826         INLVLS_USE(JJ)=INLVLS_USE(JJ)-1
03827         PSNOWDZN(JJ,INLVLS_USE(JJ))=PSNOWDZ(JJ,INLVLS_USE(JJ))+  &
03828                   PSNOWDZ(JJ,INLVLS_USE(JJ)+1) 
03829      ELSE  ! case minimum reached
03830      ZPENALTY=PSNOWDZ(JJ,INLVLS_USE(JJ)-2)/ZDZOPT(JJ,INLVLS_USE(JJ)-2)
03831      JJ_A_DEDOUB=INLVLS_USE(JJ)-2
03832      DO JST= MAX(1,INLVLS_USE(JJ)-3),1,-1
03833        ZCRITSIZE=PSNOWDZ(JJ,JST)/ZDZOPT(JJ,JST)
03834        IF(JST==1.AND.PSNOWDZ(JJ,JST)<DZMIN_BOT) ZCRITSIZE=0.
03835        IF (ZCRITSIZE > ZPENALTY) THEN
03836          ZPENALTY=ZCRITSIZE
03837          JJ_A_DEDOUB=JST
03838        ENDIF
03839      ENDDO
03840      IF(JJ_A_DEDOUB == INLVLS_USE(JJ)-1) THEN
03841        PSNOWDZN(JJ,INLVLS_USE(JJ))=0.5*(PSNOWDZ(JJ,INLVLS_USE(JJ))+   &
03842                  PSNOWDZ(JJ,INLVLS_USE(JJ)-1)) 
03843        PSNOWDZN(JJ,INLVLS_USE(JJ)-1)=0.5*(PSNOWDZ(JJ,INLVLS_USE(JJ))+ &
03844                  PSNOWDZ(JJ,INLVLS_USE(JJ)-1)) 
03845      ELSE
03846        PSNOWDZN(JJ,INLVLS_USE(JJ))=(PSNOWDZ(JJ,INLVLS_USE(JJ))+    &
03847                  PSNOWDZ(JJ,INLVLS_USE(JJ)-1)) 
03848        DO JST=INLVLS_USE(JJ)-1, JJ_A_DEDOUB+1,-1
03849           PSNOWDZN(JJ,JST)=PSNOWDZ(JJ,JST-1)
03850        ENDDO
03851        PSNOWDZN(JJ,JJ_A_DEDOUB)=0.5*PSNOWDZ(JJ,JJ_A_DEDOUB)
03852        PSNOWDZN(JJ,JJ_A_DEDOUB+1)=0.5*PSNOWDZ(JJ,JJ_A_DEDOUB)
03853      ENDIF ! end case splitted layer =/ 2
03854     ENDIF ! end case minimum reached
03855    ENDIF ! end case shallow surface layer
03856 ENDIF   
03857 ENDDO ! end grid points loop       
03858 !
03859 ! case whithout new snow fall and without a previous grid resize 
03860 ! looks for a shallow layer to be splitted according to its depth and to
03861 ! the optimal grid size
03862 DO JJ=1,SIZE(PSNOW(:))
03863 IF (.NOT.OMODIF_GRID(JJ))THEN
03864         DO JST=1,INLVLS-3
03865           IF (JST<=INLVLS_USE(JJ).AND.INLVLS_USE(JJ)<INLVLS-3.AND. &
03866             (.NOT.OMODIF_GRID(JJ))) THEN 
03867                 IF(PSNOWDZ(JJ,JST)>(SPLIT_COEF-FLOAT(INLVLS-INLVLS_USE(JJ))/&
03868                   MAX(1.,FLOAT(INLVLS-INLVLSMIN)))*ZDZOPT(JJ,JST)) THEN 
03869                     DO JST_1=INLVLS_USE(JJ)+1, JST+2,-1
03870                         PSNOWDZN(JJ,JST_1)=PSNOWDZ(JJ,JST_1-1)
03871                         ZDZOPT(JJ,JST_1)=ZDZOPT(JJ,JST_1-1)
03872                     ENDDO
03873                     ! generale case : old layer divided in two equal layers
03874                     IF(JST/=1.OR.PSNOWDZ(JJ,JST) < 3.*ZDZOPT(JJ,1))THEN
03875                       PSNOWDZN(JJ,JST+1)=0.5*PSNOWDZ(JJ,JST)
03876                       PSNOWDZN(JJ,JST)=0.5*PSNOWDZ(JJ,JST)
03877                     ELSE
03878                     ! if thick surface layer : force the surface layer to this value to avoid successive resizing
03879                     ! [NEW : 11/2012]
03880                       PSNOWDZN(JJ,1)= 1.5*ZDZOPT(JJ,1)
03881                       PSNOWDZN(JJ,2)= PSNOWDZ(JJ,JST)-PSNOWDZN(JJ,1) 
03882                     ENDIF
03883                     INLVLS_USE(JJ)=INLVLS_USE(JJ)+1
03884                     OMODIF_GRID(JJ)=.TRUE.
03885                 ENDIF
03886 
03887           ENDIF
03888         ENDDO
03889 ENDIF   
03890 ENDDO
03891 !
03892 ! case whithout new snow fall and without a previous grid resize 
03893 ! looks for a deep layer to be agregated to the layer beneath if similar
03894 ! according to its depth and to the optimal grid size
03895 
03896 !NB : allow these changes for 5 layers and more [NEW] (before : 6 layers)
03897 
03898 DO JJ=1,SIZE(PSNOW(:))
03899 IF (.NOT.OMODIF_GRID(JJ))THEN
03900   DO JST=2,INLVLS
03901     IF (JST<=INLVLS_USE(JJ)-1.AND.INLVLS_USE(JJ)>INLVLSMIN+1.AND. &
03902             (.NOT.OMODIF_GRID(JJ))) THEN 
03903        ZDIFTYPE_INF= SNOW3LDIFTYP(PSNOWGRAN1(JJ,JST+1),PSNOWGRAN1(JJ, JST),&
03904                         PSNOWGRAN2(JJ,JST+1),PSNOWGRAN2(JJ, JST)) 
03905        ZDIFTYPE_INF=MAX(DIFF_1,MIN(DIFF_MAX,ZDIFTYPE_INF))
03906        IF(PSNOWDZ(JJ,JST)<ZDZOPT(JJ,JST)*AGREG_COEF_1/ZDIFTYPE_INF &
03907              .AND.PSNOWDZ(JJ,JST)+PSNOWDZ(JJ,JST+1)<AGREG_COEF_2*&
03908               MAX(ZDZOPT(JJ,JST),ZDZOPT(JJ,JST+1))) THEN 
03909            PSNOWDZN(JJ,JST)= PSNOWDZ(JJ,JST)+PSNOWDZ(JJ,JST+1)
03910            ZDZOPT(JJ,JST)=ZDZOPT(JJ,JST+1)
03911            DO JST_1=JST+1,INLVLS_USE(JJ)-1
03912               PSNOWDZN(JJ,JST_1)=PSNOWDZ(JJ,JST_1+1)
03913               ZDZOPT(JJ,JST_1)=ZDZOPT(JJ,JST_1+1)
03914            ENDDO
03915            INLVLS_USE(JJ)=INLVLS_USE(JJ)-1
03916            OMODIF_GRID(JJ)=.TRUE.
03917        ENDIF
03918     ENDIF
03919   ENDDO
03920 ENDIF   
03921 ENDDO
03922 
03923 ! [NEW : 11/2012]
03924 ! In case of very low snow fall checks if a new internal snow layer is too shallow
03925 ! even if a the grid has already been resized in this time step
03926 ! starts from bottom to INLVS_USE-3 until old and new grid differ
03927 
03928 DO JJ=1,SIZE(PSNOW(:))
03929    IF (.NOT. GSNOWFALL(JJ).OR.INLVLS_USE(JJ)< INLVLSMIN+3) CYCLE ! go to next point 
03930    IF(ABS(PSNOWDZN(JJ,INLVLS_USE(JJ))-PSNOWDZ(JJ,INLVLS_USE(JJ))) > UEPSI) &
03931            CYCLE ! go to next point 
03932 ! bottom layer
03933    IF(PSNOWDZN(JJ,INLVLS_USE(JJ))< DZMIN_TOP) THEN ! case shallow bottom layer
03934       INLVLS_USE(JJ)=INLVLS_USE(JJ)-1
03935       PSNOWDZN(JJ,INLVLS_USE(JJ))=PSNOWDZN(JJ,INLVLS_USE(JJ))+  &
03936                    PSNOWDZN(JJ,INLVLS_USE(JJ)+1)
03937    ELSE
03938 ! internal layer
03939        DO JST=INLVLS_USE(JJ)-1,4 
03940           IF(ABS(PSNOWDZN(JJ,JST)-PSNOWDZ(JJ,JST)) &
03941               > UEPSI) EXIT ! old/new grid differ ==> go to next grid point 
03942          ZDIFTYPE_SUP= SNOW3LDIFTYP(PSNOWGRAN1(JJ,JST-1),PSNOWGRAN1(JJ, JST),&
03943                        PSNOWGRAN2(JJ,JST-1),PSNOWGRAN2(JJ, JST))
03944          ZDIFTYPE_SUP=MAX(DIFF_1,MIN(DIFF_MAX,ZDIFTYPE_SUP))
03945          IF(PSNOWDZN(JJ,JST)>ZDZOPT(JJ,JST)*AGREG_COEF_1/ZDIFTYPE_SUP &
03946             .OR.PSNOWDZN(JJ,JST)+PSNOWDZN(JJ,JST-1)>AGREG_COEF_2*&
03947              MAX(ZDZOPT(JJ,JST),ZDZOPT(JJ,JST-1))) CYCLE! cheks upper layer
03948 ! shallow internal layer to be merged with the upper layer             
03949          PSNOWDZN(JJ,JST)= PSNOWDZN(JJ,JST)+PSNOWDZN(JJ,JST-1)
03950          INLVLS_USE(JJ)=INLVLS_USE(JJ)-1
03951 ! shifts the upper layers       
03952          DO JST_1=JST-1,1
03953             PSNOWDZN(JJ,JST_1)=PSNOWDZ(JJ,JST_1-1)
03954             ZDZOPT(JJ,JST_1)=ZDZOPT(JJ,JST_1-1)
03955          ENDDO             
03956          EXIT ! goto to next grid point
03957       ENDDO ! end loop internal layers             
03958    ENDIF
03959 ENDDO ! end grid loops for checking shallow layers   
03960 
03961 
03962 
03963 
03964 !
03965 !final check of the consistensy of the new grid size
03966 !
03967 DO JJ=1,SIZE(PSNOW(:))
03968   IF(ABS(SUM(PSNOWDZN(JJ,1:INLVLS_USE(JJ)))-PSNOW(JJ)) > UEPSI) THEN
03969    write(*,*) 'error in grid resizing',JJ, SUM(PSNOWDZN(JJ,1:INLVLS_USE(JJ))), &
03970                PSNOW(JJ),INLVLS_USE(JJ) 
03971 write( *,*) 'PSNOWDZ:',     PSNOWDZ
03972 write( *,*) 'PSNOWDZN:',     PSNOWDZN
03973  CALL ABOR1_SFX("SNOWCRO: error in grid resizing")
03974    ENDIF       
03975 ENDDO
03976 IF (LHOOK) CALL DR_HOOK('SNOWNLFALL_UPGRID',1,ZHOOK_HANDLE)
03977 !
03978 END SUBROUTINE SNOWNLFALL_UPGRID
03979 
03980 !###############################################################################
03981 !###############################################################################
03982 !################################################################################
03983 !################################################################################
03984 !
03985 SUBROUTINE SNOWNLGRIDFRESH_1D (PSNOW,PSNOWDZ,PSNOWDZN, &
03986                                 PSNOWRHO,PSNOWHEAT,PSNOWGRAN1,PSNOWGRAN2,   &
03987                                   PSNOWHIST,PSNOWAGE,GSNOWFALL, &
03988                                   PSNOWRHOF, PSNOWDZF,PSNOWHEATF,PSNOWGRAN1F,&
03989                                       PSNOWGRAN2F, PSNOWHISTF,PSNOWAGEF,     &
03990                                       INLVLS_USE) 
03991 !
03992 !!    PURPOSE
03993 !!    -------
03994 !     Snow mass,heat and characteristics redistibution in case of
03995 !     grid resizing. Total mass and heat content of the overall snowpack
03996 !     unchanged/conserved within this routine.
03997 !     Grain size and type of mixed layers is deduced from the conservation
03998 !     of the average optical size
03999 !
04000 !!    AUTHOR
04001 !!    ------
04002 !!      E. Brun           * Meteo-France *
04003 !!
04004 !
04005 USE MODD_SNOW_PAR, ONLY : XSNOWCRITD,XD1,XD2,XD3,XX,XVALB5,XVALB6
04006 USE MODD_SNOW_METAMO
04007 USE MODE_SNOW3L
04008 !
04009 !
04010 IMPLICIT NONE
04011 !
04012 !
04013 !*      0.1    declarations of arguments
04014 !
04015 REAL, INTENT(IN)                  :: PSNOW
04016 !
04017 REAL, DIMENSION(:), INTENT(INOUT) :: PSNOWHEAT, PSNOWRHO, PSNOWDZ, 
04018                                         PSNOWDZN, PSNOWGRAN1, PSNOWGRAN2, 
04019                                         PSNOWHIST 
04020 REAL, DIMENSION(:), INTENT(INOUT) :: PSNOWAGE  
04021 REAL,  INTENT(IN)                 :: PSNOWRHOF, PSNOWDZF,PSNOWHEATF,
04022                                         PSNOWGRAN1F,PSNOWGRAN2F, PSNOWHISTF 
04023 REAL, INTENT(IN)                  :: PSNOWAGEF                                 
04024 !
04025 INTEGER, INTENT(IN)               :: INLVLS_USE
04026 !
04027 LOGICAL, INTENT(IN)               :: GSNOWFALL
04028 !
04029 !*      0.2    declarations of local variables
04030 !
04031 INTEGER JST 
04032 !
04033 INTEGER                             :: INLVLS_OLD, INLVLS_NEW
04034 !
04035 REAL, DIMENSION(SIZE(PSNOWRHO,1)) :: ZSNOWRHON,ZSNOWGRAN1N,ZSNOWGRAN2N,     
04036                                         ZSNOWHEATN,ZSNOWHISTN 
04037            , ZSNOWZTOP_NEW, ZSNOWZBOT_NEW                                       
04038 REAL,DIMENSION(SIZE(PSNOWRHO,1)) ::ZSNOWAGEN          
04039 REAL, DIMENSION(SIZE(PSNOWRHO,1)+1) :: ZSNOWRHOO,ZSNOWGRAN1O,ZSNOWGRAN2O,     
04040                                         ZSNOWHEATO,ZSNOWHISTO,ZSNOWDZO 
04041            , ZSNOWZTOP_OLD,  ZSNOWZBOT_OLD                                        
04042 REAL,DIMENSION(SIZE(PSNOWRHO,1)+1) ::ZSNOWAGEO          
04043 !
04044                                        
04045                                    
04046 INTEGER :: JST_OLD,JST_NEW
04047 REAL :: ZDENTMOYN ,ZSPHERMOYN, ZALBMOYN, ZMASTOTN,ZMASTOTO, ZSNOWHEAN, 
04048           ZSNOWHEAO,ZPROPOR,ZMASDZ_OLD, ZDIAM,ZHISTMOYN 
04049 REAL :: ZAGEMOYN
04050 REAL :: ZPSNOW_OLD, ZPSNOW_NEW
04051 REAL(KIND=JPRB) :: ZHOOK_HANDLE
04052 
04053 !-------------------------------------------------------------------------------
04054 !
04055 ! 0. Initialization:
04056 ! ------------------
04057 !
04058 ! starts by checking the consistency between both vertical grid sizes
04059 !
04060 IF (LHOOK) CALL DR_HOOK('SNOWNLGRIDFRESH_1D',0,ZHOOK_HANDLE)
04061 INLVLS_NEW     = INLVLS_USE 
04062 INLVLS_OLD = -1
04063 ZPSNOW_NEW=0.
04064 ZPSNOW_OLD=0.
04065 !
04066 DO JST_NEW=1,INLVLS_NEW
04067 ZPSNOW_NEW=ZPSNOW_NEW+PSNOWDZN(JST_NEW)
04068 ENDDO
04069 IF (ABS(ZPSNOW_NEW-PSNOWDZF)<UEPSI) THEN
04070         INLVLS_OLD=0
04071 ELSE
04072    DO JST_OLD=1,SIZE(PSNOWRHO)
04073      IF(PSNOWDZ(JST_OLD)>=UEPSI) THEN
04074         ZPSNOW_OLD=ZPSNOW_OLD+PSNOWDZ(JST_OLD)
04075         IF (ABS(ZPSNOW_NEW-PSNOWDZF-ZPSNOW_OLD)<UEPSI) THEN
04076            INLVLS_OLD=JST_OLD
04077      ENDIF
04078      ENDIF
04079    ENDDO
04080    IF (INLVLS_OLD==-1) THEN
04081        write(*,*)'pb INLVLS_OLD INLVLS_NEW=',INLVLS_NEW
04082        write(*,*)'pb INLVLS_OLD',PSNOWDZF
04083        write(*,*)'pb INLVLS_OLD',PSNOWDZN
04084        write(*,*)'pb INLVLS_OLD',PSNOWDZ
04085        CALL ABOR1_SFX('SNOWCRO: Error INLVLS_OLD')
04086    ENDIF
04087 ENDIF
04088 !
04089 IF (GSNOWFALL) INLVLS_OLD=INLVLS_OLD+1
04090 ZPSNOW_OLD=PSNOW
04091 ZPSNOW_NEW=ZPSNOW_OLD
04092 
04093 ! initialization of variables describing the initial snowpack + new snowfall
04094 
04095 IF(GSNOWFALL) THEN
04096         DO JST_OLD=2, INLVLS_OLD
04097             ZSNOWDZO(JST_OLD) =PSNOWDZ(JST_OLD-1)
04098             ZSNOWRHOO(JST_OLD) =PSNOWRHO(JST_OLD-1)
04099             ZSNOWHEATO(JST_OLD) = PSNOWHEAT(JST_OLD-1)
04100             ZSNOWGRAN1O(JST_OLD) = PSNOWGRAN1(JST_OLD-1)
04101             ZSNOWGRAN2O(JST_OLD) = PSNOWGRAN2(JST_OLD-1)
04102             ZSNOWHISTO(JST_OLD) = PSNOWHIST(JST_OLD-1)
04103             ZSNOWAGEO(JST_OLD) = PSNOWAGE(JST_OLD-1)
04104         ENDDO
04105             ZSNOWDZO(1) =PSNOWDZF
04106             ZSNOWRHOO(1) =PSNOWRHOF
04107             ZSNOWHEATO(1) = PSNOWHEATF
04108             ZSNOWGRAN1O(1) = PSNOWGRAN1F
04109             ZSNOWGRAN2O(1) = PSNOWGRAN2F
04110             ZSNOWHISTO(1) = PSNOWHISTF
04111             ZSNOWAGEO(1) = PSNOWAGEF
04112 ELSE
04113         DO JST_OLD=1, INLVLS_OLD
04114             ZSNOWDZO(JST_OLD) =PSNOWDZ(JST_OLD)
04115             ZSNOWRHOO(JST_OLD) =PSNOWRHO(JST_OLD)
04116             ZSNOWHEATO(JST_OLD) = PSNOWHEAT(JST_OLD)
04117             ZSNOWGRAN1O(JST_OLD) = PSNOWGRAN1(JST_OLD)
04118             ZSNOWGRAN2O(JST_OLD) = PSNOWGRAN2(JST_OLD)
04119             ZSNOWHISTO(JST_OLD) = PSNOWHIST(JST_OLD)
04120             ZSNOWAGEO(JST_OLD) = PSNOWAGE(JST_OLD)
04121         ENDDO
04122 ENDIF        
04123 
04124             
04125 
04126 !
04127 ! 1. Calculate vertical grid limits (m):
04128 ! --------------------------------------
04129 !
04130 ZSNOWZTOP_OLD(1) = ZPSNOW_OLD
04131 ZSNOWZTOP_NEW(1) = ZPSNOW_NEW
04132 ZSNOWZBOT_OLD(1) = ZSNOWZTOP_OLD(1)-ZSNOWDZO(1)
04133 ZSNOWZBOT_NEW(1) = ZSNOWZTOP_NEW(1)-PSNOWDZN(1)
04134 !
04135 DO JST_OLD=2,INLVLS_OLD
04136    ZSNOWZTOP_OLD(JST_OLD) = ZSNOWZBOT_OLD(JST_OLD-1)
04137    ZSNOWZBOT_OLD(JST_OLD) = ZSNOWZTOP_OLD(JST_OLD)-ZSNOWDZO(JST_OLD)
04138 ENDDO
04139 ! Check consistency
04140 IF (ABS(ZSNOWZBOT_OLD(INLVLS_OLD)) > 0.00001) write (*,*) 'Error bottom OLD'
04141 !
04142 ZSNOWZBOT_OLD(INLVLS_OLD)=0.
04143 DO JST_NEW=2,INLVLS_NEW
04144    ZSNOWZTOP_NEW(JST_NEW) = ZSNOWZBOT_NEW(JST_NEW-1)
04145    ZSNOWZBOT_NEW(JST_NEW) = ZSNOWZTOP_NEW(JST_NEW)-PSNOWDZN(JST_NEW)
04146 ENDDO
04147 ! Check consistency
04148 if (ABS(ZSNOWZBOT_NEW(INLVLS_NEW)) > 0.00001) write (*,*) 'Error bottom NEW'
04149 ZSNOWZBOT_NEW(INLVLS_NEW)=0.
04150 !
04151 ! 3. Calculate mass, heat, charcateristics mixing due to vertical grid resizing:
04152 ! --------------------------------------------------------------------
04153 !
04154 
04155 ! loop over the new snow layers
04156 ! Summ or avergage of the constituting quantities of the old snow layers
04157 ! which are totally or partially inserted in the new snow layer
04158 
04159 DO JST_NEW=1,INLVLS_NEW
04160     ZSNOWHEAN=0.
04161     ZMASTOTN=0.
04162     ZDENTMOYN=0.
04163     ZSPHERMOYN=0.
04164     ZALBMOYN=0.
04165     ZDIAM=0.
04166     ZHISTMOYN=0.
04167     ZAGEMOYN=0.
04168 
04169     ! lopp over the ols snow layers 
04170     DO JST_OLD=1, INLVLS_OLD
04171         IF( ZSNOWZTOP_OLD(JST_OLD) <= ZSNOWZBOT_NEW(JST_NEW)) THEN
04172                 ! JST_OLD lower than JJ_NEW ==> no contribution
04173         ELSEIF ( ZSNOWZBOT_OLD(JST_OLD) >= ZSNOWZTOP_NEW(JST_NEW)) THEN
04174                 ! JST_OLD higher than JJ_NEW ==> no contribution
04175         ELSE
04176                 ! old layer contributes to the new one
04177           ! computation of its contributing ratio and mass/heat 
04178           ZPROPOR= (MIN(ZSNOWZTOP_OLD(JST_OLD), ZSNOWZTOP_NEW(JST_NEW))&
04179                  - MAX(ZSNOWZBOT_OLD(JST_OLD), ZSNOWZBOT_NEW(JST_NEW))) &
04180                  / ZSNOWDZO(JST_OLD) 
04181           ZMASDZ_OLD= ZPROPOR*ZSNOWRHOO(JST_OLD)*ZSNOWDZO(JST_OLD)   
04182           ZMASTOTN=ZMASTOTN + ZMASDZ_OLD
04183           ZSNOWHEAN=ZSNOWHEAN+ZPROPOR*ZSNOWHEATO(JST_OLD)
04184           ! contribution to the grain optical size and then to the albedo
04185           IF(ZSNOWGRAN1O(JST_OLD)<0.) THEN
04186             ZDIAM=-ZSNOWGRAN1O(JST_OLD)*XD1/XX+(1.+ZSNOWGRAN1O(JST_OLD)/XX)* &
04187                   (ZSNOWGRAN2O(JST_OLD)*XD2/XX+(1.-ZSNOWGRAN2O(JST_OLD)/XX)*XD3) 
04188             ZDIAM=ZDIAM/10000.      
04189             ZDENTMOYN= ZDENTMOYN-ZMASDZ_OLD*ZSNOWGRAN1O(JST_OLD)/XX
04190             ZSPHERMOYN=ZSPHERMOYN+ZMASDZ_OLD*ZSNOWGRAN2O(JST_OLD)/XX
04191           ELSE
04192             ZDIAM=ZSNOWGRAN2O(JST_OLD)
04193             ZDENTMOYN= ZDENTMOYN+ZMASDZ_OLD*0.
04194             ZSPHERMOYN=ZSPHERMOYN+ZMASDZ_OLD*ZSNOWGRAN1O(JST_OLD)/XX
04195           ENDIF
04196           ZALBMOYN=ZALBMOYN+MAX(0.,ZMASDZ_OLD*(XVALB5-XVALB6*SQRT(ZDIAM)))
04197           ZHISTMOYN=ZHISTMOYN+ZMASDZ_OLD*ZSNOWHISTO(JST_OLD)
04198           ZAGEMOYN=ZAGEMOYN+ZMASDZ_OLD*ZSNOWAGEO(JST_OLD)
04199         ENDIF
04200     ENDDO 
04201 ! the new layer inherits from the weihted average properties of the old ones
04202      ! heat and mass
04203      ZSNOWHEATN(JST_NEW)= ZSNOWHEAN
04204      ZSNOWRHON(JST_NEW)= ZMASTOTN/PSNOWDZN(JST_NEW)
04205      ! grain type and size decuced from the average albedo
04206      ZALBMOYN=ZALBMOYN/ZMASTOTN
04207      ZSPHERMOYN=MAX(0.,ZSPHERMOYN/ZMASTOTN)
04208      ZDENTMOYN=MAX(0.,ZDENTMOYN/ZMASTOTN)
04209      ZDIAM=((XVALB5-ZALBMOYN)/XVALB6)**2
04210      IF (ZDIAM <XD2/10000. - 0.0000001) THEN
04211          ! dendricity is preserved if possible and sphericity is adjusted
04212          ZSNOWGRAN1N(JST_NEW)=-XX*ZDENTMOYN
04213                IF(ABS(ZSNOWGRAN1N(JST_NEW)+XX)< 0.01) THEN
04214                  ZSNOWGRAN2N(JST_NEW)=XX*ZSPHERMOYN                  
04215                ELSEIF  (ABS(ZSNOWGRAN1N(JST_NEW))< 0.0001) THEN
04216                ! dendritic snow               
04217                 ZSNOWGRAN1N(JST_NEW)=XX*ZSPHERMOYN
04218                 ZSNOWGRAN2N(JST_NEW)=ZDIAM 
04219                ELSE ! non dendritic
04220                 ZSNOWGRAN2N(JST_NEW)=XX*((ZDIAM*10000.+ZSNOWGRAN1N(JST_NEW)*XD1/XX) &
04221                   / (1.+ZSNOWGRAN1N(JST_NEW)/XX)-XD3)/(XD2-XD3) 
04222                  IF (ZSNOWGRAN2N(JST_NEW)<0.) THEN
04223                    ZSNOWGRAN2N(JST_NEW)=0.
04224                  ENDIF  
04225                  IF (ZSNOWGRAN2N(JST_NEW)>  XX + 0.0000001) THEN
04226                    ZSNOWGRAN2N(JST_NEW)=XX
04227                  ENDIF  
04228                ENDIF
04229      ELSEIF  (ZDIAM >XD3/10000.) THEN
04230                 ZSNOWGRAN1N(JST_NEW)=XX*ZSPHERMOYN
04231                 ZSNOWGRAN2N(JST_NEW)=ZDIAM 
04232      ELSEIF(ZDENTMOYN<= 0.+0.0000001) THEN
04233                ! size between D2 and D3 and dendricity == 0         
04234                ZSNOWGRAN1N(JST_NEW)=XX*ZSPHERMOYN
04235                ZSNOWGRAN2N(JST_NEW)=ZDIAM
04236      ELSE
04237                ! size between D2 and D3 and dendricity < 0         
04238                ! sphericity is firts preserved, if possible. If not,
04239                ! denditricity =0
04240                ZSNOWGRAN1N(JST_NEW)=-XX*ZDENTMOYN
04241                ZSNOWGRAN2N(JST_NEW)=XX*((ZDIAM*10000.+ZSNOWGRAN1N(JST_NEW)*XD1/XX) &
04242                 / (1.+ZSNOWGRAN1N(JST_NEW)/XX)-XD3)/(XD2-XD3) 
04243                IF ( ZSNOWGRAN2N(JST_NEW)<0..OR. ZSNOWGRAN2N(JST_NEW)> XX) THEN
04244                ! inconsistency with ZDIAM ==>  dendricity = 0  
04245                   ZSNOWGRAN1N(JST_NEW)=XX*ZSPHERMOYN
04246                   ZSNOWGRAN2N(JST_NEW)=ZDIAM
04247                ENDIF
04248      ENDIF
04249         ZSNOWHISTN(JST_NEW)=NINT(ZHISTMOYN/ZMASTOTN)
04250         ZSNOWAGEN(JST_NEW)=ZAGEMOYN/ZMASTOTN
04251 ENDDO        
04252 !
04253 ! check of consistency between new and old snowpacks
04254     ZSNOWHEAN=0.
04255     ZMASTOTN=0.
04256     ZSNOWHEAO=0.
04257     ZMASTOTO=0.    
04258     ZPSNOW_NEW=0.
04259     ZPSNOW_OLD=0.
04260 
04261 DO JST=1,INLVLS_NEW
04262 ZSNOWHEAN=ZSNOWHEAN+ZSNOWHEATN(JST)
04263 ZMASTOTN=ZMASTOTN+ZSNOWRHON(JST)*PSNOWDZN(JST)
04264 ZPSNOW_NEW=ZPSNOW_NEW +PSNOWDZN(JST)
04265 ENDDO
04266 DO JST=1,INLVLS_OLD
04267 ZSNOWHEAO=ZSNOWHEAO+ZSNOWHEATO(JST)
04268 ZMASTOTO=ZMASTOTO+ZSNOWRHOO(JST)*ZSNOWDZO(JST)
04269 ZPSNOW_OLD=ZPSNOW_OLD +ZSNOWDZO(JST)
04270 ENDDO
04271     if (abs(ZSNOWHEAN-ZSNOWHEAO)>0.0001.OR.ABS(ZMASTOTN-ZMASTOTO)>0.0001 &
04272      .OR. ABS(ZPSNOW_NEW-ZPSNOW_OLD)> 0.0001) THEN 
04273 write(*,*) 'Warning diff', ZSNOWHEAN-ZSNOWHEAO,ZMASTOTN-ZMASTOTO,ZPSNOW_NEW-ZPSNOW_OLD
04274 ENDIF
04275 
04276 
04277 !
04278 ! 5. Update mass (density and thickness) and heat:
04279 ! ------------------------------------------------
04280 !
04281 PSNOWDZ(:)    = PSNOWDZN(:)
04282 PSNOWRHO(:)   = ZSNOWRHON(:)
04283 PSNOWHEAT(:)  = ZSNOWHEATN(:)
04284 PSNOWGRAN1(:) = ZSNOWGRAN1N(:)
04285 PSNOWGRAN2(:) = ZSNOWGRAN2N(:)
04286 PSNOWHIST(:)  =  ZSNOWHISTN(:)
04287 PSNOWAGE(:)  =  ZSNOWAGEN(:)
04288         IF (LHOOK) CALL DR_HOOK('SNOWNLGRIDFRESH_1D',1,ZHOOK_HANDLE)
04289 !
04290 !
04291 !--------------------------------------------------------------------------------
04292 !
04293         END SUBROUTINE SNOWNLGRIDFRESH_1D
04294 !####################################################################
04295 !####################################################################
04296 !###################################################################
04297         SUBROUTINE SNOWDRIFT(PTSTEP, PVMOD, PSNOWRHO,PSNOWDZ,PSNOW,    &
04298                    PSNOWGRAN1, PSNOWGRAN2,PSNOWHIST,INLVLS_USE &
04299                    ,PTA,PQA,PPS,PRHOA)
04300 !
04301 !!    PURPOSE
04302 !!    -------
04303 !     Snow compaction  and metamorphism due to drift
04304 !     Mass is unchanged: layer thickness is reduced
04305 !     in proportion to density increases. Method inspired from
04306 !     Brun et al. (1997) and Guyomarch
04307 !     
04308 !     - computes a mobility index of each snow layer from its grains, density
04309 !                 and history
04310 !     - computes a drift index of each layer from its mobility and wind speed
04311 !     - computes a transport index with an exponential decay taking into
04312 !                 account its depth and the mobility of upper layers
04313 !     - increases density and changes grains in case of transport
04314 !
04315 !     HISTORY:
04316 !     Basic parameterization from Crocus/ARPEGE Coupling (1997) 
04317 !     Implementation in V5 
04318 !     Insertion in V6 of grains type evolution in case of dendritic snow (V.
04319 !     Vionnet) 
04320 !     07/2012 (for V7.3): E. Brun, M. Lafaysse : optional sublimation of drifted snow
04321 !     2012-09-20 : bug correction : ZFF was not computed if LSNOWDRIFT_SUBLIM=FALSE.
04322 
04323 USE MODD_CSTS,ONLY : XTT
04324 USE MODE_THERMOS
04325 
04326 USE MODD_SNOW_PAR, ONLY : LSNOWDRIFT_SUBLIM
04327 !
04328 IMPLICIT NONE
04329 !
04330 !*      0.1    declarations of arguments
04331 !
04332 REAL, INTENT(IN)                    :: PTSTEP
04333 !
04334 REAL, DIMENSION(:), INTENT(IN)      :: PVMOD
04335 !
04336 
04337 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWRHO, PSNOWDZ,PSNOWGRAN1,    
04338                                        PSNOWGRAN2,PSNOWHIST
04339 REAL, DIMENSION(:), INTENT(OUT)     :: PSNOW
04340 !
04341 INTEGER, DIMENSION(:), INTENT(IN)   :: INLVLS_USE
04342 !
04343 !*      0.2    declarations of local variables
04344 !
04345 INTEGER                             :: JJ,JST   ! looping indexes
04346 !
04347 !
04348 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZSNOWRHO2
04349 !
04350 REAL                                :: ZPROFEQU, ZRMOB, ZRDRIFT, ZRT, ZDRO, 
04351                                         ZDGR1, ZDGR2
04352 ! modif_EB pour blowing snow sublimation
04353 REAL, DIMENSION(:), INTENT(IN)      :: PTA, PQA,PPS, PRHOA
04354 REAL                                :: ZVT ! wind speed threshold for surface
04355 !transport
04356 REAL                                :: ZQS_EFFECT ! effect of QS on snow
04357 REAL                                :: ZWIND_EFFECT ! effect of wind on snow
04358 REAL                                :: ZDRIFT_EFFECT ! effect of QS and wind on snow
04359 ! transformation
04360 REAL                                :: ZQS !Blowing snow sublimation (kg/m2/s) 
04361 REAL                                :: ZRHI
04362 REAL, DIMENSION(SIZE(PSNOWRHO,1))   :: ZQSATI,ZFF ! QS wrt ice, gust speed
04363 !
04364 ! Calibration coefficients
04365 REAL, PARAMETER                      ::VTIME= 48*3600. ! characteristic time for
04366 !compaction and metamorphism by wind drift
04367 !
04368 REAL, PARAMETER                      ::VROMAX= 350. !  maximum density for
04369 ! drift compaction     UNIT : kg m-3
04370 REAL, PARAMETER                      ::VROMIN= 50.  !  minimum density for
04371 ! mobility computation UNIT : kg m-3
04372 REAL, PARAMETER                      ::VMOB1= 0.295  !  coefficient for computing
04373 ! the mobility index
04374 REAL, PARAMETER                      ::VMOB2= 0.833  !  coefficient for computing
04375 ! the mobility index
04376 REAL, PARAMETER                      ::VMOB3= 0.583  !  coefficient for computing
04377 ! the mobility index
04378 REAL, PARAMETER                      ::VMOB4= -0.0583 !  coefficient for computing
04379 ! the mobility index
04380 REAL, PARAMETER                      ::VDRIFT1= 2.868 !  coefficient for computing
04381 ! the drift index
04382 REAL, PARAMETER                      ::VDRIFT2= 0.085 !  coefficient for computing
04383 ! the drift index
04384 REAL, PARAMETER                      ::VDRIFT3= 3.25  !  coefficient for computing
04385 ! the drift index
04386 REAL, PARAMETER                      ::VSIZEMIN=3.E-4 !  minimum size decrease 
04387 ! by drift  UNIT = m
04388 !
04389 ! modif_EB pour sublim 
04390 ! a pour but de tenir compte du fait que le vent moyen est > rafales
04391 ! on en tient compte egalement pour diminuer la duree de l'effet
04392 REAL, PARAMETER :: COEF_FF=1.25 ! coefficient for gust diagnosis from average wind 
04393 REAL, PARAMETER :: COEF_EFFECT=1.0 ! coefficient for impact on density du drift
04394 REAL, PARAMETER :: ZQS_REF=2.E-5 ! valeur de reference de ZQS pour effet neige
04395 REAL(KIND=JPRB) :: ZHOOK_HANDLE
04396 
04397 !-------------------------------------------------------------------------------
04398 !
04399 ! 0. Initialization:
04400 ! ------------------
04401 IF (LHOOK) CALL DR_HOOK('SNOWDRIFT',0,ZHOOK_HANDLE)
04402 !
04403 ! PRINT*,LSNOWDRIFT_SUBLIM
04404 
04405 DO JJ=1, SIZE(PSNOW)
04406   DO JST=1, INLVLS_USE(JJ)
04407     ZSNOWRHO2(JJ,JST)  = PSNOWRHO(JJ,JST)
04408   ENDDO
04409 ENDDO
04410 !
04411 
04412 IF (LSNOWDRIFT_SUBLIM) THEN
04413         ZQSATI(:)= QSATI(PTA(:),PPS(:))
04414 END IF
04415 ! 1. Computation of drift and induced settling and metamorphism
04416 ! ------------------
04417 !
04418 DO JJ=1, SIZE(PSNOW)
04419 !
04420 ! gust speed
04421   ZFF(JJ)=PVMOD(JJ)*COEF_FF
04422 
04423 !   initialization decay coeff
04424       ZPROFEQU=0.
04425   DO JST=1, INLVLS_USE(JJ)
04426 !  mobility index computation of a layer as a function of its properties
04427       IF(PSNOWGRAN1(JJ,JST) < 0.) THEN        
04428 !     dendritic case              
04429           ZRMOB=0.34*(0.5+0.75*(-PSNOWGRAN1(JJ,JST)/99.)-0.5* & 
04430           PSNOWGRAN2(JJ,JST)/99.)+   &
04431           0.66*(1.25-1.25*(MAX(PSNOWRHO(JJ,JST),VROMIN)/1000.-VROMIN/1000.) / VMOB1) 
04432       ELSE
04433 !     non dendritic case         
04434           ZRMOB=0.34*(VMOB2-VMOB2*PSNOWGRAN1(JJ,JST)/99.-VMOB3*  &
04435           PSNOWGRAN2(JJ,JST)*10000./100.)+    &
04436           0.66*(1.25-1.25*(MAX(PSNOWRHO(JJ,JST),VROMIN)/1000.-VROMIN/1000.) / VMOB1)
04437       ENDIF
04438 !     correction in case of former wet snow
04439       IF (PSNOWHIST(JJ,JST) >= 2) ZRMOB = MIN(ZRMOB, VMOB4)
04440 !      
04441 !     computation of drift index supposing no overburden snow
04442       ZRDRIFT = ZRMOB - (VDRIFT1 *exp(-VDRIFT2*ZFF(JJ))-1.)
04443 !     update the decay coeff by half the current layer
04444       ZPROFEQU = ZPROFEQU  +0.5 * PSNOWDZ(JJ,JST) *0.1 * (VDRIFT3-ZRDRIFT)
04445 !     computation of the drift index inclunding the decay by overburden snow 
04446       ZRT = max(0.,ZRDRIFT * exp(-ZPROFEQU*100))
04447 !     modif_EB exit loop if there is no drift
04448       IF (ZRDRIFT <= 0.) EXIT
04449 
04450       IF (LSNOWDRIFT_SUBLIM) THEN
04451 !      
04452         IF (JST==1)  THEN
04453         ! modif_EB cas specifique surface pour blowing snow sublimation        
04454 
04455         ! computation of wind speed threshold QSATI and RH withe respect to ice
04456                 ZVT=-LOG((ZRMOB+1.)/VDRIFT1)/VDRIFT2
04457                 ZRHI=PQA(JJ)/ZQSATI(JJ)
04458         ! computation of sublimation rate according to Gordon's PhD
04459                 ZQS=0.0018*(XTT/PTA(JJ))**4*ZVT*PRHOA(JJ)*ZQSATI(JJ)* &
04460                 (1.-ZRHI)*(ZFF(JJ)/ZVT)**3.6
04461         !       write(*,*) 'surface Vt vent*coef  ZRDRIFT ZRMOB :',ZVT,&
04462         !       ZFF(JJ),ZRDRIFT,ZRMOB 
04463         !       write(*,*) 'V>Vt ZQS   :',ZQS
04464                 !surface depth decrease in case of blowing snow sublimation
04465         !       write(*,*) 'V>Vt DSWE DZ Z:',- MAX(0.,ZQS)*PTSTEP/COEF_FF,&
04466         !       - MAX(0.,ZQS)*PTSTEP/COEF_FF/PSNOWRHO(JJ,JST),PSNOWDZ(JJ,JST)
04467         ! 2 lignes ci-dessous a valider pour avoir sublim drift
04468                 PSNOWDZ(JJ,JST)=MAX(0.5*PSNOWDZ(JJ,JST),PSNOWDZ(JJ,JST) - &
04469                 MAX(0.,ZQS)*PTSTEP/COEF_FF/PSNOWRHO(JJ,JST))
04470                 
04471         ENDIF
04472         !     modif_EB enhancement of snow transformation in case of sublimation      
04473         ZQS_EFFECT= (MIN(3.,MAX(0.,ZQS)/ZQS_REF)) * ZRT
04474         ZWIND_EFFECT= COEF_EFFECT * ZRT
04475         ZDRIFT_EFFECT= (ZQS_EFFECT+ZWIND_EFFECT)* PTSTEP/COEF_FF/ VTIME
04476         !     write(*,*) 'ZQS_EFFECT,ZWIND_EFFECT,ZDRIFT_EFFECT:',ZQS_EFFECT,ZWIND_EFFECT,ZDRIFT_EFFECT
04477       ENDIF
04478 
04479 !     settling by wind transport only in case of not too dense snow
04480       IF(PSNOWRHO(JJ,JST) < VROMAX) THEN
04481           ZDRO = ZDRIFT_EFFECT*(VROMAX - PSNOWRHO(JJ,JST))
04482           PSNOWRHO(JJ,JST) = MIN(VROMAX , PSNOWRHO(JJ,JST)+ZDRO)
04483           PSNOWDZ(JJ,JST) = PSNOWDZ(JJ,JST)*ZSNOWRHO2(JJ,JST)/   &
04484                             PSNOWRHO(JJ,JST)
04485       ENDIF
04486 !      
04487 !     metamorphism induced by snow drift
04488       IF(PSNOWGRAN1(JJ,JST) < 0.) THEN        
04489 !     dendritic case              
04490           ZDGR1 = ZDRIFT_EFFECT*(-PSNOWGRAN1(JJ,JST))*0.5
04491           ZDGR1 = MIN(ZDGR1,-0.99*PSNOWGRAN1(JJ,JST))
04492           PSNOWGRAN1(JJ,JST) = PSNOWGRAN1(JJ,JST)+ZDGR1
04493 ! modif_VV_140910          
04494           ZDGR2 = ZDRIFT_EFFECT*(99.-PSNOWGRAN2(JJ,JST))
04495           PSNOWGRAN2(JJ,JST) = MIN(99.,PSNOWGRAN2(JJ,JST)+ZDGR2)
04496 ! fin modif_VV_140910          
04497       ELSE
04498 !     non dendritic case         
04499           ZDGR1 = ZDRIFT_EFFECT*(99.-PSNOWGRAN1(JJ,JST))
04500           ZDGR2 = ZDRIFT_EFFECT*5./10000.
04501           PSNOWGRAN1(JJ,JST) = MIN(99.,PSNOWGRAN1(JJ,JST)+ZDGR1)
04502           PSNOWGRAN2(JJ,JST) = MAX(VSIZEMIN,PSNOWGRAN2(JJ,JST)-ZDGR2)
04503       ENDIF
04504 
04505 !     update the decay coeff by half the current layer
04506       ZPROFEQU = ZPROFEQU  +0.5 * PSNOWDZ(JJ,JST) *0.1 * (VDRIFT3-ZRDRIFT)
04507 !      
04508   ENDDO  ! snow layers loop
04509 ENDDO    ! grid points loop
04510 !
04511 ! 2. Update total snow depth:
04512 ! -----------------------------------------------
04513 !
04514 ! Compaction of total snowpack depth
04515 !
04516 DO JJ=1, SIZE(PSNOWDZ,1)
04517    PSNOW(JJ)=SUM(PSNOWDZ(JJ,1:INLVLS_USE(JJ)))
04518 ENDDO
04519         IF (LHOOK) CALL DR_HOOK('SNOWDRIFT',1,ZHOOK_HANDLE)
04520 !
04521         END SUBROUTINE SNOWDRIFT
04522 !####################################################################
04523 !###################################################################
04524        SUBROUTINE TRIDIAG_GROUND_SNOWCRO(PA,PB,PC,PY,PX,INLVLS_USE,IDIFLOOP)
04525 !      #########################################
04526 !
04527 !
04528 !!****   *TRIDIAG_GROUND* - routine to solve a time implicit scheme
04529 !!
04530 !!
04531 !!     PURPOSE
04532 !!     -------
04533 !        The purpose of this routine is to resolve the linear system:
04534 !
04535 !       A.X = Y
04536 !
04537 !      where A is a tridiagonal matrix, and X and Y two vertical vectors.
04538 !     However, the computations are performed at the same time for all
04539 !     the verticals where an inversion of the system is necessary.
04540 !     This explain the dimansion of the input variables.
04541 !
04542 !!**   METHOD
04543 !!     ------
04544 !!                      
04545 !!        Then, the classical tridiagonal algorithm is used to invert the 
04546 !!     implicit operator. Its matrix is given by:
04547 !!
04548 !!     (  b(1)      c(1)      0        0        0         0        0        0  )
04549 !!     (  a(2)      b(2)     c(2)      0  ...    0        0        0        0  ) 
04550 !!     (   0        a(3)     b(3)     c(3)       0        0        0        0  ) 
04551 !!      .......................................................................
04552 !!     (   0   ...   0      a(k)      b(k)     c(k)       0   ...  0        0  ) 
04553 !!      .......................................................................
04554 !!     (   0         0        0        0        0 ...  a(n-1)   b(n-1)   c(n-1))
04555 !!     (   0         0        0        0        0 ...     0      a(n)     b(n) )
04556 !!
04557 !!
04558 !!       All these computations are purely vertical and vectorizations are 
04559 !!     easely achieved by processing all the verticals in parallel.
04560 !!
04561 !!     EXTERNAL
04562 !!     --------
04563 !!
04564 !!       NONE
04565 !!
04566 !!     IMPLICIT ARGUMENTS
04567 !!     ------------------
04568 !!
04569 !!     REFERENCE
04570 !!     ---------
04571 !!
04572 !!     AUTHOR
04573 !!     ------
04574 !!       V. Masson
04575 !! 
04576 !!     MODIFICATIONS
04577 !!     -------------
04578 !!       Original        May 13, 1998
04579 !!       05/2011: Brun  Special treatment to tackle the variable number
04580 !!                      of snow layers 
04581 !!                      In case of second call, a shift of 1 snow layer
04582 !!                      is applied in the control loops.
04583 !! ---------------------------------------------------------------------
04584 !
04585 !*       0. DECLARATIONS
04586 !
04587 IMPLICIT NONE
04588 !
04589 !
04590 !*       0.1 declarations of arguments
04591 !
04592 REAL,    DIMENSION(:,:), INTENT(IN)  :: PA  ! lower diag. elements of A matrix
04593 REAL,    DIMENSION(:,:), INTENT(IN)  :: PB  ! main  diag. elements of A matrix
04594 REAL,    DIMENSION(:,:), INTENT(IN)  :: PC  ! upper diag. elements of A matrix
04595 REAL,    DIMENSION(:,:), INTENT(IN)  :: PY  ! r.h.s. term   
04596 !
04597 REAL,    DIMENSION(:,:), INTENT(OUT) :: PX  ! solution of A.X = Y 
04598 !
04599 INTEGER,    DIMENSION(:), INTENT(IN) :: INLVLS_USE ! number of effective layers 
04600 !
04601 INTEGER           :: IDIFLOOP       ! shift in control loops: 0 or 1
04602 !*       0.2 declarations of local variables
04603 !
04604 INTEGER           :: JK             ! vertical loop control
04605 INTEGER           :: IN             ! number of vertical levels
04606 !
04607 REAL, DIMENSION(SIZE(PA,1)           ) :: ZDET ! work array
04608 REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2)) :: ZW   ! work array
04609 REAL(KIND=JPRB) :: ZHOOK_HANDLE
04610 ! ---------------------------------------------------------------------------
04611 !
04612 IF (LHOOK) CALL DR_HOOK('TRIDIAG_GROUND_SNOWCRO',0,ZHOOK_HANDLE)
04613 IN=SIZE(PX,2)
04614 !
04615 !
04616 !*       1.  levels going up
04617 !            ---------------
04618 !
04619 !*       1.1 first level
04620 !            -----------
04621 !
04622 ZDET(:)   = PB(:,1)
04623 !
04624 PX  (:,1) = PY(:,1) / ZDET(:)
04625 !
04626 !*       1.2 other levels
04627 !            ------------
04628 !
04629 DO JK=2,IN
04630 WHERE (JK<=INLVLS_USE(:)-IDIFLOOP)
04631   ZW(:,JK)    = PC(:,JK-1)/ZDET(:)
04632   ZDET(:)       = PB(:,JK  ) - PA(:,JK)*ZW(:,JK)
04633 
04634   PX  (:,JK)    = ( PY(:,JK) - PA(:,JK)*PX(:,JK-1) ) / ZDET(:)
04635 ENDWHERE
04636 END DO
04637 !
04638 !-------------------------------------------------------------------------------
04639 !
04640 !*       2.  levels going down
04641 !            -----------------
04642 !
04643 DO JK=IN-1,1,-1
04644 WHERE (JK<=INLVLS_USE(:)-1-IDIFLOOP)
04645   PX  (:,JK) = PX(:,JK) - ZW(:,JK+1)*PX(:,JK+1)
04646 ENDWHERE
04647 END DO
04648 IF (LHOOK) CALL DR_HOOK('TRIDIAG_GROUND_SNOWCRO',1,ZHOOK_HANDLE)
04649 !
04650 !-------------------------------------------------------------------------------
04651 !
04652 END SUBROUTINE TRIDIAG_GROUND_SNOWCRO
04653 
04654 
04655 !####################################################################
04656 !####################################################################
04657 !####################################################################
04658       SUBROUTINE SNOWCROLAYER_GONE(PTSTEP,PSCAP,PSNOWTEMP,PSNOWDZ,      &
04659                              PSNOWRHO,PSNOWLIQ,PSNOWGRAN1,PSNOWGRAN2,   &
04660                              PSNOWHIST,PSNOWAGE,PLES3L, INLVLS_USE) 
04661 !
04662 !
04663 !!    PURPOSE
04664 !     Account for the case when one or several snow layers melt
04665 !     during a time step:
04666 !     in that case, merge these layers with the underlying layer
04667 !     except for the bottom layer which is merged to the abovelying layer
04668 !     energy and mass are conserved
04669 !     a new merged layer keeps the grain, histo and age properties of the 
04670 !     non-melted layer
04671 !
04672 USE MODD_CSTS,ONLY : XTT, XLMTT, XRHOLW, XRHOLI, XLVTT
04673 !
04674 USE MODE_SNOW3L
04675 !
04676 IMPLICIT NONE
04677 !
04678 !*      0.1    declarations of arguments
04679 !
04680 REAL, INTENT(IN)                    :: PTSTEP
04681 !
04682 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSCAP
04683 !
04684 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWDZ, PSNOWTEMP, PSNOWRHO,   
04685                                           PSNOWLIQ 
04686 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSNOWGRAN1,PSNOWGRAN2,PSNOWHIST,PSNOWAGE
04687 !
04688 INTEGER, DIMENSION(:), INTENT(INOUT)  :: INLVLS_USE ! 
04689 !
04690 REAL, DIMENSION(:), INTENT(IN) :: PLES3L
04691 !
04692 !*      0.2    declarations of local variables
04693 !
04694 REAL                                :: ZHEAT, ZMASS, ZDZ, ZLIQ, ZSNOWLWE
04695 !
04696 INTEGER :: JJ,JST,JST_1, JST_2,JST_MAX,IDIFF_LAYER ! loop counter
04697 !
04698 REAL, PARAMETER                     :: ZSNOWDZMIN = 0.0001 ! (m)
04699 REAL(KIND=JPRB) :: ZHOOK_HANDLE
04700 !                                      ZSNOWDZMIN = minimum snow layer thickness
04701 !-------------------------------------------------------------------------------
04702 !
04703 IF (LHOOK) CALL DR_HOOK('SNOWCROLAYER_GONE',0,ZHOOK_HANDLE)
04704 DO JJ=1,SIZE(PSNOWRHO,1)  ! loop on gridpoints
04705 
04706      JST_MAX= INLVLS_USE(JJ)
04707      IDIFF_LAYER=0  ! used as shift counter of previously melted layers
04708 !     
04709      DO JST_1=JST_MAX,1-JST_MAX,-1 ! loop on 2 x layers in case of multi melt
04710 !   
04711        JST= JST_1+IDIFF_LAYER     
04712        ! Merge is possible only in case of 2 active layers or more
04713        IF(JST>=1.AND.INLVLS_USE(JJ)>1) THEN 
04714 ! Total Liquid equivalent water content of snow (m):
04715        ZSNOWLWE = PSNOWRHO(JJ,JST)*PSNOWDZ(JJ,JST)/XRHOLW
04716 ! Consideration of sublimation if any       
04717        IF(JST==1) ZSNOWLWE = ZSNOWLWE- MAX(0.,PLES3L(JJ)*PTSTEP/(XLSTT*XRHOLW))
04718 !
04719 ! Test if avalaible energy exceeds total latent heat
04720        IF (PSCAP(JJ,JST)*MAX(0.0, PSNOWTEMP(JJ,JST) - XTT)* PSNOWDZ(JJ,JST)>=  &
04721                    (ZSNOWLWE-PSNOWLIQ(JJ,JST))*XLMTT*XRHOLW-UEPSI) THEN 
04722         IF(JST==INLVLS_USE(JJ)) THEN
04723 ! Case of a total melt of the bottom layer: merge with above layer 
04724 !        which keeps its grain, histo and age properties
04725            ZHEAT= PSNOWDZ(JJ,JST)*(PSCAP(JJ,JST)*(PSNOWTEMP(JJ,JST)-XTT)  &
04726                  - XLMTT*PSNOWRHO(JJ,JST) ) + XLMTT*XRHOLW*PSNOWLIQ(JJ,JST) &
04727                  + PSNOWDZ(JJ,JST-1)*(PSCAP(JJ,JST-1)*(PSNOWTEMP(JJ,JST-1)-XTT)&
04728                  - XLMTT*PSNOWRHO(JJ,JST-1) ) + XLMTT*XRHOLW*PSNOWLIQ(JJ,JST-1) 
04729            ZMASS= PSNOWDZ(JJ,JST)*PSNOWRHO(JJ,JST)   &
04730                  + PSNOWDZ(JJ,JST-1)*PSNOWRHO(JJ,JST-1)    
04731            ZDZ  = PSNOWDZ(JJ,JST) + PSNOWDZ(JJ,JST-1)   
04732            ZLIQ = PSNOWLIQ(JJ,JST)+PSNOWLIQ(JJ,JST-1)
04733            PSNOWDZ(JJ,JST-1)=ZDZ
04734            PSNOWRHO(JJ,JST-1)=ZMASS/ZDZ
04735            PSNOWLIQ(JJ,JST-1)=ZLIQ
04736 ! Temperature of the merged layer is deduced from the heat content 
04737            PSCAP(JJ,JST-1)= SNOW3LSCAP(PSNOWRHO(JJ,JST-1)-PSNOWLIQ(JJ,JST-1) &
04738                            * XRHOLW / MAX(PSNOWDZ(JJ,JST-1),ZSNOWDZMIN)) 
04739            PSNOWTEMP(JJ,JST-1)=XTT +((((ZHEAT-XLMTT*XRHOLW*PSNOWLIQ(JJ,JST-1)) &
04740                /PSNOWDZ(JJ,JST-1)) + XLMTT*PSNOWRHO(JJ,JST-1))/PSCAP(JJ,JST-1) ) 
04741 ! Decrease the number of active snow layers              
04742            INLVLS_USE(JJ)=INLVLS_USE(JJ)-1           
04743 !
04744         ELSE                
04745 ! Case of a total melt of the bottom layer: merge with beneath layer 
04746 !        which keeps its grain, histo and age properties
04747 ! 
04748            ZHEAT= PSNOWDZ(JJ,JST)*(PSCAP(JJ,JST)*(PSNOWTEMP(JJ,JST)-XTT)  &
04749                  - XLMTT*PSNOWRHO(JJ,JST) ) + XLMTT*XRHOLW*PSNOWLIQ(JJ,JST) &
04750                  + PSNOWDZ(JJ,JST+1)*(PSCAP(JJ,JST+1)*(PSNOWTEMP(JJ,JST+1)-XTT)&
04751                  - XLMTT*PSNOWRHO(JJ,JST+1) ) + XLMTT*XRHOLW*PSNOWLIQ(JJ,JST+1) 
04752            ZMASS= PSNOWDZ(JJ,JST)*PSNOWRHO(JJ,JST)   &
04753                  + PSNOWDZ(JJ,JST+1)*PSNOWRHO(JJ,JST+1)    
04754            ZDZ  = PSNOWDZ(JJ,JST) + PSNOWDZ(JJ,JST+1)   
04755            ZLIQ = PSNOWLIQ(JJ,JST)+PSNOWLIQ(JJ,JST+1)
04756            PSNOWDZ(JJ,JST)=ZDZ
04757            PSNOWRHO(JJ,JST)=ZMASS/ZDZ
04758            PSNOWLIQ(JJ,JST)=ZLIQ
04759            PSNOWGRAN1(JJ,JST)=PSNOWGRAN1(JJ,JST+1)
04760            PSNOWGRAN2(JJ,JST)=PSNOWGRAN2(JJ,JST+1)
04761            PSNOWHIST(JJ,JST)=PSNOWHIST(JJ,JST+1)
04762            PSNOWAGE(JJ,JST)=PSNOWAGE(JJ,JST+1)
04763 ! Temperature of the merged layer is deduced from the heat content 
04764            PSCAP(JJ,JST)= SNOW3LSCAP(PSNOWRHO(JJ,JST)-PSNOWLIQ(JJ,JST) &
04765                            * XRHOLW / MAX(PSNOWDZ(JJ,JST),ZSNOWDZMIN)) 
04766            PSNOWTEMP(JJ,JST) = XTT + ( (((ZHEAT-XLMTT*XRHOLW*PSNOWLIQ(JJ,JST)) &
04767                    /PSNOWDZ(JJ,JST)) + XLMTT*PSNOWRHO(JJ,JST))/PSCAP(JJ,JST) ) 
04768 ! Shift the above layers
04769            DO JST_2=JST+1,INLVLS_USE(JJ)-1
04770               PSNOWTEMP(JJ,JST_2)=PSNOWTEMP(JJ,JST_2+1)
04771               PSCAP(JJ,JST_2)=PSCAP(JJ,JST_2+1)
04772               PSNOWDZ(JJ,JST_2)=PSNOWDZ(JJ,JST_2+1)
04773               PSNOWRHO(JJ,JST_2)=PSNOWRHO(JJ,JST_2+1)
04774               PSNOWLIQ(JJ,JST_2)=PSNOWLIQ(JJ,JST_2+1)
04775               PSNOWGRAN1(JJ,JST_2)=PSNOWGRAN1(JJ,JST_2+1)
04776               PSNOWGRAN2(JJ,JST_2)=PSNOWGRAN2(JJ,JST_2+1)
04777               PSNOWHIST(JJ,JST_2)=PSNOWHIST(JJ,JST_2+1)
04778               PSNOWAGE(JJ,JST_2)=PSNOWAGE(JJ,JST_2+1)
04779            ENDDO !  loop JST_2
04780 ! Decrease the number of active snow layers              
04781            INLVLS_USE(JJ)=INLVLS_USE(JJ)-1           
04782 ! Update the shift counter IDIFF_LAYER
04783            IDIFF_LAYER=IDIFF_LAYER+1
04784         ENDIF ! end test of bottom layer       
04785        ENDIF ! end test on availibility of energy      
04786       ENDIF ! end test on the number of remaining active layers
04787      ENDDO ! end loop on the snow layers
04788 ENDDO ! end loop gridpoints
04789 IF (LHOOK) CALL DR_HOOK('SNOWCROLAYER_GONE',1,ZHOOK_HANDLE)
04790 !
04791 END SUBROUTINE SNOWCROLAYER_GONE
04792 !####################################################################
04793 !###################################################################
04794 
04795 !####################################################################
04796 !###################################################################
04797 SUBROUTINE SNOWCROPRINTPROFILE(CINFO,NLAYERS,LPRINTGRAN,PSNOWDZ,PSNOWRHO,PSNOWTEMP,&
04798         PSNOWLIQ,PSNOWHEAT,PSNOWGRAN1,PSNOWGRAN2,PSNOWHIST,PSNOWAGE)
04799 
04800 ! Matthieu Lafaysse 08/06/2012
04801 ! This routine prints the snow profile of a given point for debugging
04802 
04803 IMPLICIT NONE
04804 
04805  CHARACTER(*),INTENT(IN)::CINFO
04806 LOGICAL,INTENT(IN)::LPRINTGRAN
04807 INTEGER,INTENT(IN)::NLAYERS
04808 REAL,DIMENSION(:),INTENT(IN)::PSNOWDZ,PSNOWRHO,PSNOWTEMP,PSNOWLIQ,
04809         PSNOWHEAT,PSNOWGRAN1,PSNOWGRAN2,PSNOWHIST,PSNOWAGE
04810 
04811 
04812 INTEGER::JST
04813 
04814 IF (LPRINTGRAN) THEN
04815 
04816   WRITE(*,*)
04817   WRITE(*,*)TRIM(CINFO)
04818   WRITE(*,'(9(A12,"|"))')"------------","------------","------------",&
04819         "------------","------------","------------","------------",&
04820         "------------","------------"
04821   WRITE(*,'(9(A12,"|"))')"PSNOWDZ","PSNOWRHO","PSNOWTEMP","PSNOWLIQ","PSNOWHEAT",&
04822         "PSNOWGRAN1","PSNOWGRAN2","PSNOWHIST","PSNOWAGE"
04823   WRITE(*,'(9(A12,"|"))')"------------","------------","------------",&
04824         "------------","------------","------------","------------",&
04825         "------------","------------"
04826   DO JST=1,NLAYERS
04827     WRITE(*,'(9(ES12.3,"|")," L",I2.2)')PSNOWDZ(JST),PSNOWRHO(JST),PSNOWTEMP(JST),&
04828         PSNOWLIQ(JST),PSNOWHEAT(JST),PSNOWGRAN1(JST),PSNOWGRAN2(JST),&
04829         PSNOWHIST(JST),PSNOWAGE(JST),JST
04830   ENDDO
04831   WRITE(*,'(9(A12,"|"))')"------------","------------","------------",&
04832         "------------","------------","------------","------------",&
04833         "------------","------------"
04834   WRITE(*,*)
04835 
04836 ELSE
04837 
04838   WRITE(*,*)
04839   WRITE(*,*)TRIM(CINFO)
04840   WRITE(*,'(5(A12,"|"))')"------------","------------","------------",&
04841         "------------","------------"
04842   WRITE(*,'(5(A12,"|"))')"PSNOWDZ","PSNOWRHO","PSNOWTEMP","PSNOWLIQ","PSNOWHEAT"
04843   WRITE(*,'(5(A12,"|"))')"------------","------------","------------",&
04844         "------------","------------"
04845   DO JST=1,NLAYERS
04846     WRITE(*,'(5(ES12.3,"|")," L",I2.2)')PSNOWDZ(JST),PSNOWRHO(JST),PSNOWTEMP(JST),&
04847         PSNOWLIQ(JST),PSNOWHEAT(JST),JST
04848   ENDDO
04849   WRITE(*,'(5(A12,"|"))')"------------","------------","------------",&
04850         "------------","------------"
04851   WRITE(*,*)
04852 
04853 END IF
04854 
04855 
04856 END SUBROUTINE SNOWCROPRINTPROFILE
04857 !####################################################################
04858 !###################################################################
04859 SUBROUTINE SNOWCROPRINTATM(CINFO,PTA,PQA,PVMOD,PRR,PSR,PSW_RAD,PLW_RAD,&
04860 PTG, PSOILCOND, PD_G, PPSN3L)
04861 
04862 ! Matthieu Lafaysse 08/06/2012
04863 ! This routine prints the atmospheric forcing of a given point for debugging
04864 ! and ground data
04865 
04866 IMPLICIT NONE
04867 
04868  CHARACTER(*),INTENT(IN)::CINFO
04869 REAL,INTENT(IN)::PTA,PQA,PVMOD,PRR,PSR,PSW_RAD,PLW_RAD
04870 REAL,INTENT(IN)::PTG, PSOILCOND, PD_G, PPSN3L
04871 
04872 
04873 INTEGER::JST
04874 
04875  CALL SNOWCROPRINTDATE()
04876 WRITE(*,*)
04877 WRITE(*,*)TRIM(CINFO)
04878 WRITE(*,'(4(A12,"|"))')"------------","------------","------------",&
04879 "------------"
04880 WRITE(*,'(4(A12,"|"))')"PTA","PQA","PRR","PSR"
04881 WRITE(*,'(4(A12,"|"))')"------------","------------","------------",&
04882 "------------"
04883 WRITE(*,'(4(ES12.3,"|")," meteo1")')PTA,PQA,PRR,PSR
04884 WRITE(*,'(4(A12,"|"))')"------------","------------","------------",&
04885 "------------"
04886 WRITE(*,'(3(A12,"|"))')"------------","------------","------------"
04887 WRITE(*,'(3(A12,"|"))')"PSW_RAD","PLW_RAD","PVMOD"
04888 WRITE(*,'(3(A12,"|"))')"------------","------------","------------"
04889 WRITE(*,'(3(ES12.3,"|")," meteo2")')PSW_RAD,PLW_RAD,PVMOD
04890 WRITE(*,'(3(A12,"|"))')"------------","------------","------------"
04891 WRITE(*,*)
04892 WRITE(*,*)"Ground :"
04893 WRITE(*,'(4(A12,"|"))')"------------","------------","------------",&
04894 "------------"
04895 WRITE(*,'(4(A12,"|"))')"PTG","PSOILCOND","PD_G","PPSN3L"
04896 WRITE(*,'(4(A12,"|"))')"------------","------------","------------",&
04897 "------------"
04898 WRITE(*,'(4(ES12.3,"|")," soil")')PTG,PSOILCOND,PD_G,PPSN3L
04899 WRITE(*,'(4(A12,"|"))')"------------","------------","------------",&
04900 "------------"
04901 
04902 
04903 
04904 
04905 END SUBROUTINE SNOWCROPRINTATM
04906 
04907 SUBROUTINE SNOWCROSTOPBALANCE(PSUMMASS_INI,PSUMHEAT_INI,PSUMMASS_FIN,PSUMHEAT_FIN,&
04908         PSR,PRR,PTHRUFAL,PEVAP,PEVAPCOR,PGRNDFLUX,PHSNOW,PRNSNOW,PLEL3L,PLES3L,&
04909         PHPSNOW,PSNOWHMASS,PSNOWDZ,PTSTEP)
04910 
04911 ! stop if energy and mass balances are not closed
04912 
04913 IMPLICIT NONE
04914 
04915 REAL , DIMENSION(:), INTENT(IN) :: PSUMMASS_INI,PSUMHEAT_INI,PSUMMASS_FIN,PSUMHEAT_FIN
04916 REAL , DIMENSION(:), INTENT(IN) :: PSR,PRR,PTHRUFAL,PEVAP,PEVAPCOR
04917 REAL , DIMENSION(:), INTENT(IN) :: PGRNDFLUX,PHSNOW,PRNSNOW,PLEL3L,PLES3L,PHPSNOW,PSNOWHMASS
04918 REAL , DIMENSION(:), INTENT(IN) :: PSNOWDZ !first layer
04919 REAL ,  INTENT(IN) :: PTSTEP !time step
04920 
04921 REAL,PARAMETER :: XWARNING_MASSBALANCE=1.E-4
04922 REAL,PARAMETER :: XWARNING_ENERGYBALANCE=1.E-4
04923 
04924 
04925 REAL,DIMENSION(SIZE(PSR)) :: ZMASSBALANCE,ZENERGYBALANCE
04926 
04927 
04928 ZMASSBALANCE=  PSUMMASS_FIN-PSUMMASS_INI- &
04929   (PSR+PRR-PTHRUFAL-PEVAP)*PTSTEP  - &
04930   PEVAPCOR*PTSTEP
04931 
04932 ZENERGYBALANCE=(PSUMHEAT_FIN-PSUMHEAT_INI)/PTSTEP- &
04933       (-PGRNDFLUX-PHSNOW+PRNSNOW-  &
04934       PLEL3L-PLES3L+PHPSNOW) &
04935       -PSNOWHMASS/PTSTEP    &
04936       -PEVAPCOR*PSNOWDZ/MAX(UEPSI,PSNOWDZ)*  &
04937       (ABS(PLEL3L)*XLVTT/MAX(UEPSI,ABS(PLEL3L))+ &
04938       ABS(PLES3L)*XLSTT/MAX(UEPSI,ABS(PLES3L))) 
04939 
04940 IF (ANY(ZMASSBALANCE>XWARNING_MASSBALANCE)) STOP "WARNING MASS BALANCE !"
04941 IF (ANY(ZENERGYBALANCE>XWARNING_ENERGYBALANCE)) STOP "WARNING ENERGY BALANCE !"
04942 
04943 
04944 
04945 END SUBROUTINE SNOWCROSTOPBALANCE
04946 
04947 !####################################################################
04948 !###################################################################
04949 SUBROUTINE SNOWCROPRINTBALANCE(PSUMMASS_INI,PSUMHEAT_INI,PSUMMASS_FIN,PSUMHEAT_FIN,&
04950         PSR,PRR,PTHRUFAL,PEVAP,PEVAPCOR,PGRNDFLUX,PHSNOW,PRNSNOW,PLEL3L,PLES3L,&
04951         PHPSNOW,PSNOWHMASS,PSNOWDZ,PTSTEP)
04952 
04953 ! Matthieu Lafaysse / Eric Brun 03/10/2012
04954 ! Print energy and mass balances.
04955 
04956 IMPLICIT NONE
04957 
04958 REAL ,  INTENT(IN) :: PSUMMASS_INI,PSUMHEAT_INI,PSUMMASS_FIN,PSUMHEAT_FIN
04959 REAL ,  INTENT(IN) :: PSR,PRR,PTHRUFAL,PEVAP,PEVAPCOR
04960 REAL ,  INTENT(IN) :: PGRNDFLUX,PHSNOW,PRNSNOW,PLEL3L,PLES3L,PHPSNOW,PSNOWHMASS
04961 REAL ,  INTENT(IN) :: PSNOWDZ !first layer
04962 REAL ,  INTENT(IN) :: PTSTEP !time step
04963 
04964 REAL :: ZMASSBALANCE,ZENERGYBALANCE
04965 
04966 write(*,*) ' '
04967 write(*,FMT='(A1,67("+"),A1)')"+","+"
04968  CALL SNOWCROPRINTDATE()
04969 write(*,*) ' '
04970 
04971 ! print des residus de bilan et des differents termes pour le point
04972 write (*,FMT="(A25,1x,E17.10)") 'final mass (kg/m2) =',PSUMMASS_FIN
04973 write (*,FMT="(A25,1x,E17.10)") 'final energy (J/m2) =',ZSUMHEAT_FIN
04974 write(*,*) ' '
04975 ZMASSBALANCE=  PSUMMASS_FIN-PSUMMASS_INI- &
04976   (PSR+PRR-PTHRUFAL-PEVAP)*PTSTEP  - &
04977   PEVAPCOR*PTSTEP
04978 write(*,FMT="(A25,1x,E17.10)") 'mass balance (kg/m2) =', ZMASSBALANCE
04979 
04980 write(*,*) ' '
04981 write(*,FMT="(A35)") 'mass balance contribution (kg/m2) ' 
04982 write(*,FMT="(A51,1x,E17.10)") 'delta mass:',(PSUMMASS_FIN-PSUMMASS_INI)
04983 write(*,FMT="(A51,1x,E17.10)") 'hoar or condensation (>0 towards snow):',-PEVAP*PTSTEP
04984 write(*,FMT="(A51,1x,E17.10)") 'rain:',PRR*PTSTEP
04985 write(*,FMT="(A51,1x,E17.10)") 'snow:',PSR*PTSTEP
04986 write(*,FMT="(A51,1x,E17.10)") 'run-off:',PTHRUFAL*PTSTEP
04987 write(*,FMT="(A51,1x,E17.10)") 'evapcor:',PEVAPCOR*PTSTEP
04988 
04989 write(*,FMT='(A1,55("-"),A1)')"+","+"
04990 write(*,*) ' '
04991 ZENERGYBALANCE=(PSUMHEAT_FIN-PSUMHEAT_INI)/PTSTEP- &
04992       (-PGRNDFLUX-PHSNOW+PRNSNOW-  &
04993       PLEL3L-PLES3L+PHPSNOW) &
04994       -PSNOWHMASS/PTSTEP    &
04995       -PEVAPCOR*PSNOWDZ/MAX(UEPSI,PSNOWDZ)*  &
04996       (ABS(PLEL3L)*XLVTT/MAX(UEPSI,ABS(PLEL3L))+ &
04997       ABS(PLES3L)*XLSTT/MAX(UEPSI,ABS(PLES3L))) 
04998 write(*,FMT="(A25,4(1x,E17.10))") 'energy balance (W/m2)=',ZENERGYBALANCE
04999 
05000 write(*,*) ' '
05001 write(*,FMT="(A55)") 'energy balance contribution (W/m2) >0 towards snow :' 
05002 write(*,FMT="(A51,1x,E17.10)") 'delta heat:',(ZSUMHEAT_FIN-ZSUMHEAT_INI)/PTSTEP
05003 write(*,FMT="(A51,1x,E17.10)") 'radiation (LW + SW):',PRNSNOW
05004 write(*,FMT="(A51,1x,E17.10)") 'sensible flux :',-PHSNOW
05005 write(*,FMT="(A51,1x,E17.10)") 'ground heat flux :',-PGRNDFLUX
05006 write(*,FMT="(A51,1x,E17.10)") 'liquid latent flux:',-PLEL3L
05007 write(*,FMT="(A51,1x,E17.10)") 'solid latent flux:',-PLES3L
05008 write(*,FMT="(A51,1x,E17.10)") 'rain sensible heat:',PHPSNOW
05009 write(*,FMT="(A51,1x,E17.10)") 'snowfall/hoar heat (sensible + melt heat):',PSNOWHMASS/PTSTEP
05010 write(*,FMT="(A51,1x,E17.10)") 'evapcor:',PEVAPCOR* &         
05011        PSNOWDZ/MAX(UEPSI,PSNOWDZ)*  &
05012       (ABS(PLEL3L)*XLVTT/MAX(UEPSI,ABS(PLEL3L))+ &
05013        ABS(PLES3L)*XLSTT/MAX(UEPSI,ABS(PLES3L)))
05014 write(*,FMT='(A1,67("+"),A1)')"+","+"
05015 
05016 
05017 
05018 
05019 END SUBROUTINE SNOWCROPRINTBALANCE
05020 
05021 !####################################################################
05022 !###################################################################
05023 SUBROUTINE SNOWCROPRINTDATE()
05024 
05025 WRITE(*,FMT='(I4.4,2("-",I2.2)," Hour=",F5.2)')          &
05026         TPTIME%TDATE%YEAR,TPTIME%TDATE%MONTH,TPTIME%TDATE%DAY,TPTIME%TIME/3600
05027 
05028 END SUBROUTINE SNOWCROPRINTDATE
05029 !####################################################################
05030 !###################################################################
05031 
05032 !
05033 END SUBROUTINE SNOWCRO