SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/mode_snow3l.F90
Go to the documentation of this file.
00001 !     ##################
00002       MODULE MODE_SNOW3L
00003 !     ##################
00004 !
00005 !!****  *MODE_SNOW * - contains explicit snow (ISBA-ES) characteristics functions
00006 !!                     for total liquid water holding capacity of a snow layer (m)
00007 !!                     and the thermal heat capacity of a layer (J K-1 m-3)
00008 !!
00009 !!    PURPOSE
00010 !!    -------
00011 !
00012 !!**  METHOD
00013 !!    ------
00014 !!    direct calculation
00015 !!
00016 !!    EXTERNAL
00017 !!    --------
00018 !!       
00019 !!    IMPLICIT ARGUMENTS
00020 !!    ------------------ 
00021 !!
00022 !!    REFERENCE
00023 !!    ---------
00024 !!    Boone and Etchevers, J. HydroMeteor., 2001
00025 !!      
00026 !!
00027 !!    AUTHOR
00028 !!    ------
00029 !!      A. Boone       * Meteo France *
00030 !!
00031 !!    MODIFICATIONS
00032 !!    -------------
00033 !!      Original        01/08/02
00034 !!      V. Masson       01/2004  add snow grid computations
00035 !!      V. Vionnet      06/2008 -Introduction of Crocus formulation to
00036 !                       calculate maximum liquid water holding capacity
00037 !!                              - New algorithm to compute snow grid :
00038 !                       10 layers
00039 !!                              - Routine to aggregate snow grain type
00040 !                       from 2 layers    
00041 !!                              _ Routine to compute average grain
00042 !                       type when snow depth< 3 cm. 
00043 !     S. Morin          02/2011 - Add routines for Crocus
00044 !     A. Boone          02/2012 - Add optimization of do-loops.
00045 !     M. Lafaysse       01/2013 - Remove SNOWCROWLIQMAX routines (not used)
00046 !----------------------------------------------------------------------------
00047 !
00048 !*       0.    DECLARATIONS
00049 !
00050 !
00051 INTERFACE SNOW3LWLIQMAX
00052   MODULE PROCEDURE SNOW3LWLIQMAX_3D
00053   MODULE PROCEDURE SNOW3LWLIQMAX_2D
00054   MODULE PROCEDURE SNOW3LWLIQMAX_1D
00055 END INTERFACE
00056 INTERFACE SNOW3LHOLD
00057   MODULE PROCEDURE SNOW3LHOLD_3D
00058   MODULE PROCEDURE SNOW3LHOLD_2D
00059   MODULE PROCEDURE SNOW3LHOLD_1D
00060   MODULE PROCEDURE SNOW3LHOLD_0D
00061 END INTERFACE
00062 INTERFACE SNOWCROHOLD
00063   MODULE PROCEDURE SNOWCROHOLD_3D
00064   MODULE PROCEDURE SNOWCROHOLD_2D
00065   MODULE PROCEDURE SNOWCROHOLD_1D
00066   MODULE PROCEDURE SNOWCROHOLD_0D
00067 END INTERFACE
00068 !
00069 INTERFACE SNOW3LSCAP
00070   MODULE PROCEDURE SNOW3LSCAP_3D
00071   MODULE PROCEDURE SNOW3LSCAP_2D
00072   MODULE PROCEDURE SNOW3LSCAP_1D
00073   MODULE PROCEDURE SNOW3LSCAP_0D
00074 END INTERFACE
00075 !
00076 INTERFACE SNOW3L_MARBOUTY
00077   MODULE PROCEDURE SNOW3L_MARBOUTY
00078 END INTERFACE
00079 !
00080 INTERFACE SNOW3LGRID
00081   MODULE PROCEDURE SNOW3LGRID_2D
00082   MODULE PROCEDURE SNOW3LGRID_1D
00083 END INTERFACE
00084 !
00085 INTERFACE SNOW3LAGREG
00086   MODULE PROCEDURE SNOW3LAGREG
00087 END INTERFACE
00088 !
00089 INTERFACE SNOW3LAVGRAIN
00090   MODULE PROCEDURE SNOW3LAVGRAIN
00091 END INTERFACE
00092 !
00093 INTERFACE SNOW3LDIFTYP
00094   MODULE PROCEDURE SNOW3LDIFTYP
00095 END INTERFACE
00096 !
00097 !-------------------------------------------------------------------------------
00098 CONTAINS
00099 !
00100 !####################################################################
00101       FUNCTION SNOW3LWLIQMAX_3D(PSNOWRHO) RESULT(PWLIQMAX)
00102 !
00103 !!    PURPOSE
00104 !!    -------
00105 !     Calculate the maximum liquid water holding capacity of
00106 !     snow layer(s).
00107 !
00108 USE MODD_SNOW_PAR, ONLY : XRHOSMAX_ES, XSNOWRHOHOLD,      &
00109                           XWSNOWHOLDMAX2, XWSNOWHOLDMAX1
00110 !
00111 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00112 USE PARKIND1  ,ONLY : JPRB
00113 !
00114 IMPLICIT NONE
00115 !
00116 !*      0.1    declarations of arguments
00117 !
00118 REAL, DIMENSION(:,:,:), INTENT(IN)                                  :: PSNOWRHO ! (kg/m3)
00119 !
00120 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),SIZE(PSNOWRHO,3)) :: PWLIQMAX ! (kg/m3)
00121 !
00122 !*      0.2    declarations of local variables
00123 !
00124 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),SIZE(PSNOWRHO,3)) :: ZHOLDMAXR, ZSNOWRHO
00125 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00126 !-----------------------------------------------------------------------
00127 ! Evaluate capacity using upper density limit:
00128 !
00129 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LWLIQMAX_3D',0,ZHOOK_HANDLE)
00130 ZSNOWRHO(:,:,:) = MIN(XRHOSMAX_ES, PSNOWRHO(:,:,:))
00131 !
00132 ! Maximum ratio of liquid to SWE:
00133 !
00134 ZHOLDMAXR(:,:,:) = XWSNOWHOLDMAX1 + (XWSNOWHOLDMAX2-XWSNOWHOLDMAX1)*    &
00135                   MAX(0.,XSNOWRHOHOLD-ZSNOWRHO(:,:,:))/XSNOWRHOHOLD 
00136 !
00137 ! Maximum liquid water holding capacity of the snow (kg/m3):
00138 !
00139 PWLIQMAX(:,:,:) = ZHOLDMAXR(:,:,:)*ZSNOWRHO(:,:,:)           
00140 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LWLIQMAX_3D',1,ZHOOK_HANDLE)
00141 !
00142 END FUNCTION SNOW3LWLIQMAX_3D
00143 !####################################################################
00144       FUNCTION SNOW3LWLIQMAX_2D(PSNOWRHO) RESULT(PWLIQMAX)
00145 !
00146 !!    PURPOSE
00147 !!    -------
00148 !     Calculate the maximum liquid water holding capacity of
00149 !     snow layer(s).
00150 !
00151 USE MODD_SNOW_PAR, ONLY : XRHOSMAX_ES, XSNOWRHOHOLD,      &
00152                           XWSNOWHOLDMAX2, XWSNOWHOLDMAX1
00153 !
00154 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00155 USE PARKIND1  ,ONLY : JPRB
00156 !
00157 IMPLICIT NONE
00158 !
00159 !*      0.1    declarations of arguments
00160 !
00161 REAL, DIMENSION(:,:), INTENT(IN)                   :: PSNOWRHO ! (kg/m3)
00162 !
00163 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: PWLIQMAX ! (kg/m3)
00164 !
00165 !*      0.2    declarations of local variables
00166 !
00167 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZHOLDMAXR, ZSNOWRHO
00168 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00169 !-----------------------------------------------------------------------
00170 ! Evaluate capacity using upper density limit:
00171 !
00172 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LWLIQMAX_2D',0,ZHOOK_HANDLE)
00173 ZSNOWRHO(:,:) = MIN(XRHOSMAX_ES, PSNOWRHO(:,:))
00174 !
00175 ! Maximum ratio of liquid to SWE:
00176 !
00177 ZHOLDMAXR(:,:) = XWSNOWHOLDMAX1 + (XWSNOWHOLDMAX2-XWSNOWHOLDMAX1)*    &
00178                   MAX(0.,XSNOWRHOHOLD-ZSNOWRHO(:,:))/XSNOWRHOHOLD 
00179 !
00180 ! Maximum liquid water holding capacity of the snow (kg/m3):
00181 !
00182 PWLIQMAX(:,:) = ZHOLDMAXR(:,:)*ZSNOWRHO(:,:)               
00183 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LWLIQMAX_2D',1,ZHOOK_HANDLE)
00184 !
00185 END FUNCTION SNOW3LWLIQMAX_2D
00186 !####################################################################
00187       FUNCTION SNOW3LWLIQMAX_1D(PSNOWRHO) RESULT(PWLIQMAX)
00188 !
00189 !!    PURPOSE
00190 !!    -------
00191 !     Calculate the maximum liquid water holding capacity of
00192 !     snow layer(s).
00193 !
00194 USE MODD_SNOW_PAR, ONLY : XRHOSMAX_ES, XSNOWRHOHOLD,      &
00195                            XWSNOWHOLDMAX2, XWSNOWHOLDMAX1
00196 !
00197 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00198 USE PARKIND1  ,ONLY : JPRB
00199 !
00200 IMPLICIT NONE
00201 !
00202 !*      0.1    declarations of arguments
00203 !
00204 REAL, DIMENSION(:), INTENT(IN)  :: PSNOWRHO ! (kg/m3)
00205 !
00206 REAL, DIMENSION(SIZE(PSNOWRHO)) :: PWLIQMAX ! (kg/m3)
00207 !
00208 !*      0.2    declarations of local variables
00209 !
00210 REAL, DIMENSION(SIZE(PSNOWRHO)) :: ZHOLDMAXR, ZSNOWRHO
00211 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00212 !----------------------------------------------------------------------
00213 ! Evaluate capacity using upper density limit:
00214 !
00215 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LWLIQMAX_1D',0,ZHOOK_HANDLE)
00216 ZSNOWRHO(:) = MIN(XRHOSMAX_ES, PSNOWRHO(:))
00217 !
00218 ! Maximum ratio of liquid to SWE:
00219 !
00220 ZHOLDMAXR(:) = XWSNOWHOLDMAX1 + (XWSNOWHOLDMAX2-XWSNOWHOLDMAX1)*    &
00221                   MAX(0.,XSNOWRHOHOLD-ZSNOWRHO(:))/XSNOWRHOHOLD 
00222 !
00223 ! Maximum liquid water holding capacity of the snow (kg/m3):
00224 !
00225 PWLIQMAX(:) = ZHOLDMAXR(:)*ZSNOWRHO(:)                
00226 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LWLIQMAX_1D',1,ZHOOK_HANDLE)
00227 !
00228 END FUNCTION SNOW3LWLIQMAX_1D
00229 !####################################################################
00230 !####################################################################
00231       FUNCTION SNOW3LHOLD_3D(PSNOWRHO,PSNOWDZ) RESULT(PWHOLDMAX)
00232 !
00233 !!    PURPOSE
00234 !!    -------
00235 !     Calculate the maximum liquid water holding capacity of
00236 !     snow layer(s).
00237 !
00238 USE MODD_CSTS,     ONLY : XRHOLW
00239 USE MODD_SNOW_PAR, ONLY : XRHOSMAX_ES, XSNOWRHOHOLD,      &
00240                           XWSNOWHOLDMAX2, XWSNOWHOLDMAX1
00241 !
00242 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00243 USE PARKIND1  ,ONLY : JPRB
00244 !
00245 IMPLICIT NONE
00246 !
00247 !*      0.1    declarations of arguments
00248 !
00249 REAL, DIMENSION(:,:,:), INTENT(IN)                 :: PSNOWDZ, PSNOWRHO
00250 !
00251 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),SIZE(PSNOWRHO,3)) :: PWHOLDMAX
00252 !
00253 !*      0.2    declarations of local variables
00254 !
00255 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),SIZE(PSNOWRHO,3)) :: ZHOLDMAXR, ZSNOWRHO
00256 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00257 !-------------------------------------------------------------------------
00258 ! Evaluate capacity using upper density limit:
00259 !
00260 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LHOLD_3D',0,ZHOOK_HANDLE)
00261 ZSNOWRHO(:,:,:) = MIN(XRHOSMAX_ES, PSNOWRHO(:,:,:))
00262 !
00263 ! Maximum ratio of liquid to SWE:
00264 !
00265 ZHOLDMAXR(:,:,:) = XWSNOWHOLDMAX1 + (XWSNOWHOLDMAX2-XWSNOWHOLDMAX1)*    &
00266                   MAX(0.,XSNOWRHOHOLD-ZSNOWRHO(:,:,:))/XSNOWRHOHOLD 
00267 !
00268 ! Maximum liquid water holding capacity of the snow (m):
00269 !
00270 PWHOLDMAX(:,:,:) = ZHOLDMAXR(:,:,:)*PSNOWDZ(:,:,:)*ZSNOWRHO(:,:,:)/XRHOLW
00271 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LHOLD_3D',1,ZHOOK_HANDLE)
00272 !
00273 END FUNCTION SNOW3LHOLD_3D
00274 !####################################################################
00275       FUNCTION SNOW3LHOLD_2D(PSNOWRHO,PSNOWDZ) RESULT(PWHOLDMAX)
00276 !
00277 !!    PURPOSE
00278 !!    -------
00279 !     Calculate the maximum liquid water holding capacity of
00280 !     snow layer(s).
00281 !
00282 USE MODD_CSTS,     ONLY : XRHOLW
00283 USE MODD_SNOW_PAR, ONLY : XRHOSMAX_ES, XSNOWRHOHOLD,      &
00284                           XWSNOWHOLDMAX2, XWSNOWHOLDMAX1
00285 !
00286 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00287 USE PARKIND1  ,ONLY : JPRB
00288 !
00289 IMPLICIT NONE
00290 !
00291 !*      0.1    declarations of arguments
00292 !
00293 REAL, DIMENSION(:,:), INTENT(IN)                   :: PSNOWDZ, PSNOWRHO
00294 !
00295 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: PWHOLDMAX
00296 !
00297 !*      0.2    declarations of local variables
00298 !
00299 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: ZHOLDMAXR, ZSNOWRHO
00300 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00301 !-----------------------------------------------------------------------
00302 ! Evaluate capacity using upper density limit:
00303 !
00304 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LHOLD_2D',0,ZHOOK_HANDLE)
00305 ZSNOWRHO(:,:) = MIN(XRHOSMAX_ES, PSNOWRHO(:,:))
00306 !
00307 ! Maximum ratio of liquid to SWE:
00308 !
00309 ZHOLDMAXR(:,:) = XWSNOWHOLDMAX1 + (XWSNOWHOLDMAX2-XWSNOWHOLDMAX1)*    &
00310                   MAX(0.,XSNOWRHOHOLD-ZSNOWRHO(:,:))/XSNOWRHOHOLD 
00311 !
00312 ! Maximum liquid water holding capacity of the snow (m):
00313 !
00314 PWHOLDMAX(:,:) = ZHOLDMAXR(:,:)*PSNOWDZ(:,:)*ZSNOWRHO(:,:)/XRHOLW
00315 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LHOLD_2D',1,ZHOOK_HANDLE)
00316 !
00317 END FUNCTION SNOW3LHOLD_2D
00318 !####################################################################
00319       FUNCTION SNOW3LHOLD_1D(PSNOWRHO,PSNOWDZ) RESULT(PWHOLDMAX)
00320 !
00321 !!    PURPOSE
00322 !!    -------
00323 !     Calculate the maximum liquid water holding capacity of
00324 !     snow layer(s).
00325 !
00326 USE MODD_CSTS,     ONLY : XRHOLW
00327 USE MODD_SNOW_PAR, ONLY : XRHOSMAX_ES, XSNOWRHOHOLD,     &
00328                           XWSNOWHOLDMAX2, XWSNOWHOLDMAX1 
00329 !
00330 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00331 USE PARKIND1  ,ONLY : JPRB
00332 !
00333 IMPLICIT NONE
00334 !
00335 !*      0.1    declarations of arguments
00336 !
00337 REAL, DIMENSION(:), INTENT(IN)                     :: PSNOWDZ, PSNOWRHO
00338 !
00339 REAL, DIMENSION(SIZE(PSNOWRHO))                    :: PWHOLDMAX
00340 !
00341 !*      0.2    declarations of local variables
00342 !
00343 REAL, DIMENSION(SIZE(PSNOWRHO))                    :: ZHOLDMAXR, ZSNOWRHO
00344 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00345 !-----------------------------------------------------------------------
00346 ! Evaluate capacity using upper density limit:
00347 !
00348 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LHOLD_1D',0,ZHOOK_HANDLE)
00349 ZSNOWRHO(:) = MIN(XRHOSMAX_ES, PSNOWRHO(:))
00350 !
00351 ! Maximum ratio of liquid to SWE:
00352 !
00353 ZHOLDMAXR(:) = XWSNOWHOLDMAX1 + (XWSNOWHOLDMAX2-XWSNOWHOLDMAX1)*     &
00354                   MAX(0.,XSNOWRHOHOLD-ZSNOWRHO(:))/XSNOWRHOHOLD 
00355 !
00356 ! Maximum liquid water holding capacity of the snow (m):
00357 !
00358 PWHOLDMAX(:) = ZHOLDMAXR(:)*PSNOWDZ(:)*ZSNOWRHO(:)/XRHOLW               
00359 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LHOLD_1D',1,ZHOOK_HANDLE)
00360 !
00361 END FUNCTION SNOW3LHOLD_1D
00362 !####################################################################
00363       FUNCTION SNOW3LHOLD_0D(PSNOWRHO,PSNOWDZ) RESULT(PWHOLDMAX)
00364 !
00365 !!    PURPOSE
00366 !!    -------
00367 !     Calculate the maximum liquid water holding capacity of
00368 !     snow layer(s).
00369 !
00370 USE MODD_CSTS,     ONLY : XRHOLW
00371 USE MODD_SNOW_PAR, ONLY : XRHOSMAX_ES, XSNOWRHOHOLD,     &
00372                           XWSNOWHOLDMAX2, XWSNOWHOLDMAX1
00373 !
00374 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00375 USE PARKIND1  ,ONLY : JPRB
00376 !
00377 IMPLICIT NONE
00378 !
00379 !*      0.1    declarations of arguments
00380 !
00381 REAL, INTENT(IN)        :: PSNOWDZ, PSNOWRHO
00382 !
00383 REAL                    :: PWHOLDMAX
00384 !
00385 !*      0.2    declarations of local variables
00386 !
00387 REAL                    :: ZHOLDMAXR, ZSNOWRHO
00388 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00389 !-------------------------------------------------------------------------------
00390 ! Evaluate capacity using upper density limit:
00391 !
00392 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LHOLD_0D',0,ZHOOK_HANDLE)
00393 ZSNOWRHO = MIN(XRHOSMAX_ES, PSNOWRHO)
00394 !
00395 ! Maximum ratio of liquid to SWE:
00396 !
00397 ZHOLDMAXR = XWSNOWHOLDMAX1 + (XWSNOWHOLDMAX2-XWSNOWHOLDMAX1)*     &
00398                   MAX(0.,XSNOWRHOHOLD-ZSNOWRHO)/XSNOWRHOHOLD 
00399 !
00400 ! Maximum liquid water holding capacity of the snow (m):
00401 !
00402 PWHOLDMAX = ZHOLDMAXR*PSNOWDZ*ZSNOWRHO/XRHOLW              
00403 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LHOLD_0D',1,ZHOOK_HANDLE)
00404 !
00405 END FUNCTION SNOW3LHOLD_0D
00406 !####################################################################
00407       FUNCTION SNOWCROHOLD_3D(PSNOWRHO,PSNOWLIQ,PSNOWDZ) RESULT(PWHOLDMAX)
00408 !
00409 !!    PURPOSE
00410 !!    -------
00411 !     Calculate the maximum liquid water holding capacity of
00412 !     snow layer(s).
00413 !
00414 USE MODD_CSTS,     ONLY : XRHOLW,XRHOLI
00415 !
00416 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00417 USE PARKIND1  ,ONLY : JPRB
00418 !
00419 IMPLICIT NONE
00420 !
00421 !*      0.1    declarations of arguments
00422 !
00423 REAL, DIMENSION(:,:,:), INTENT(IN)                 :: PSNOWDZ, PSNOWLIQ, PSNOWRHO
00424 !
00425 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),SIZE(PSNOWRHO,3)) :: PWHOLDMAX
00426 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00427 !-------------------------------------------------------------------------------
00428 ! computation of water holding capacity based on Crocus, 
00429 !taking into account the conversion between wet and dry density - 
00430 !S. Morin/V. Vionnet 2010 12 09
00431 
00432 ! PWHOLDMAX is expressed in m water for each layer
00433 ! In short, PWHOLDMAX = XPERCENTAGEPORE * porosity * PSNOWDZ .
00434 ! The porosity is computed as (rho_ice - (rho_snow - lwc))/(rho_ice)
00435 ! where everything has to be in kg m-3 units. In practice, since
00436 ! PSNOWLIQ is expressed in m water, expressing the lwc in kg m-3
00437 ! is achieved as PSNOWLIQ*XRHOLW/PSNOWDZ. After some rearranging one
00438 ! obtains the equation given above.
00439 ! Note that equation (19) in Vionnet et al., GMD 2012, is wrong,
00440 ! because it does not take into account the fact that liquid water
00441 ! content has to be substracted from total density to compute the
00442 ! porosity.
00443 
00444 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOWCROHOLD_3D',0,ZHOOK_HANDLE)
00445 PWHOLDMAX(:,:,:) = 0.05/XRHOLI * (PSNOWDZ * (XRHOLI-PSNOWRHO) + PSNOWLIQ*XRHOLW)    
00446 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOWCROHOLD_3D',1,ZHOOK_HANDLE)
00447 !
00448 END FUNCTION SNOWCROHOLD_3D
00449 !####################################################################
00450       FUNCTION SNOWCROHOLD_2D(PSNOWRHO,PSNOWLIQ,PSNOWDZ) RESULT(PWHOLDMAX)
00451 !
00452 !!    PURPOSE
00453 !!    -------
00454 !     Calculate the maximum liquid water holding capacity of
00455 !     snow layer(s).
00456 !
00457 USE MODD_CSTS,     ONLY : XRHOLW,XRHOLI
00458 !
00459 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00460 USE PARKIND1  ,ONLY : JPRB
00461 !
00462 IMPLICIT NONE
00463 !
00464 !*      0.1    declarations of arguments
00465 !
00466 REAL, DIMENSION(:,:), INTENT(IN)                   :: PSNOWDZ, PSNOWRHO, PSNOWLIQ
00467 !
00468 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: PWHOLDMAX
00469 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00470 !-------------------------------------------------------------------------------
00471 ! computation of water holding capacity based on Crocus, 
00472 !taking into account the conversion between wet and dry density - 
00473 !S. Morin/V. Vionnet 2010 12 09
00474 
00475 ! PWHOLDMAX is expressed in m water for each layer
00476 ! In short, PWHOLDMAX = XPERCENTAGEPORE * porosity * PSNOWDZ .
00477 ! The porosity is computed as (rho_ice - (rho_snow - lwc))/(rho_ice)
00478 ! where everything has to be in kg m-3 units. In practice, since
00479 ! PSNOWLIQ is expressed in m water, expressing the lwc in kg m-3
00480 ! is achieved as PSNOWLIQ*XRHOLW/PSNOWDZ. After some rearranging one
00481 ! obtains the equation given above.
00482 ! Note that equation (19) in Vionnet et al., GMD 2012, is wrong,
00483 ! because it does not take into account the fact that liquid water
00484 ! content has to be substracted from total density to compute the
00485 ! porosity.
00486 
00487 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOWCROHOLD_2D',0,ZHOOK_HANDLE)
00488 PWHOLDMAX(:,:) = 0.05/XRHOLI * (PSNOWDZ * (XRHOLI-PSNOWRHO) + PSNOWLIQ*XRHOLW)    
00489 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOWCROHOLD_2D',1,ZHOOK_HANDLE)
00490 !
00491 END FUNCTION SNOWCROHOLD_2D
00492 !####################################################################
00493 !####################################################################
00494 !####################################################################
00495       FUNCTION SNOWCROHOLD_1D(PSNOWRHO,PSNOWLIQ,PSNOWDZ) RESULT(PWHOLDMAX)
00496 !
00497 !!    PURPOSE
00498 !!    -------
00499 !     Calculate the maximum liquid water holding capacity of
00500 !     snow layer(s).
00501 !
00502 USE MODD_CSTS,     ONLY : XRHOLW,XRHOLI
00503 !
00504 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00505 USE PARKIND1  ,ONLY : JPRB
00506 !
00507 IMPLICIT NONE
00508 !
00509 !*      0.1    declarations of arguments
00510 !
00511 REAL, DIMENSION(:), INTENT(IN)                     :: PSNOWDZ, PSNOWRHO, PSNOWLIQ
00512 !
00513 REAL, DIMENSION(SIZE(PSNOWRHO))                    :: PWHOLDMAX
00514 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00515 !-------------------------------------------------------------------------------
00516 ! computation of water holding capacity based on Crocus, 
00517 !taking into account the conversion between wet and dry density -
00518 !S. Morin/V. Vionnet 2010 12 09
00519 
00520 ! PWHOLDMAX is expressed in m water for each layer
00521 ! In short, PWHOLDMAX = XPERCENTAGEPORE * porosity * PSNOWDZ .
00522 ! The porosity is computed as (rho_ice - (rho_snow - lwc))/(rho_ice)
00523 ! where everything has to be in kg m-3 units. In practice, since
00524 ! PSNOWLIQ is expressed in m water, expressing the lwc in kg m-3
00525 ! is achieved as PSNOWLIQ*XRHOLW/PSNOWDZ. After some rearranging one
00526 ! obtains the equation given above.
00527 ! Note that equation (19) in Vionnet et al., GMD 2012, is wrong,
00528 ! because it does not take into account the fact that liquid water
00529 ! content has to be substracted from total density to compute the
00530 ! porosity.
00531 
00532 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOWCROHOLD_1D',0,ZHOOK_HANDLE)
00533 PWHOLDMAX(:) = 0.05/XRHOLI * (PSNOWDZ * (XRHOLI-PSNOWRHO) + PSNOWLIQ*XRHOLW)  
00534 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOWCROHOLD_1D',1,ZHOOK_HANDLE)
00535 !
00536 END FUNCTION SNOWCROHOLD_1D
00537 !####################################################################
00538       FUNCTION SNOWCROHOLD_0D(PSNOWRHO,PSNOWLIQ,PSNOWDZ) RESULT(PWHOLDMAX)
00539 !
00540 !!    PURPOSE
00541 !!    -------
00542 !     Calculate the maximum liquid water holding capacity of
00543 !     snow layer(s).
00544 !
00545 USE MODD_CSTS,     ONLY : XRHOLW,XRHOLI
00546 !
00547 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00548 USE PARKIND1  ,ONLY : JPRB
00549 !
00550 IMPLICIT NONE
00551 !
00552 !*      0.1    declarations of arguments
00553 !
00554 REAL, INTENT(IN)        :: PSNOWDZ, PSNOWRHO, PSNOWLIQ
00555 !
00556 REAL                    :: PWHOLDMAX
00557 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00558 !-------------------------------------------------------------------------------
00559 ! computation of water holding capacity based on Crocus, 
00560 !taking into account the conversion between wet and dry density - 
00561 !S. Morin/V. Vionnet 2010 12 09
00562 
00563 ! PWHOLDMAX is expressed in m water for each layer
00564 ! In short, PWHOLDMAX = XPERCENTAGEPORE * porosity * PSNOWDZ .
00565 ! The porosity is computed as (rho_ice - (rho_snow - lwc))/(rho_ice)
00566 ! where everything has to be in kg m-3 units. In practice, since
00567 ! PSNOWLIQ is expressed in m water, expressing the lwc in kg m-3
00568 ! is achieved as PSNOWLIQ*XRHOLW/PSNOWDZ. After some rearranging one
00569 ! obtains the equation given above.
00570 ! Note that equation (19) in Vionnet et al., GMD 2012, is wrong,
00571 ! because it does not take into account the fact that liquid water
00572 ! content has to be substracted from total density to compute the
00573 ! porosity.
00574 
00575 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOWCROHOLD_0D',0,ZHOOK_HANDLE)
00576 PWHOLDMAX = 0.05/XRHOLI * (PSNOWDZ * (XRHOLI-PSNOWRHO) + PSNOWLIQ*XRHOLW) 
00577 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOWCROHOLD_0D',1,ZHOOK_HANDLE)
00578 !
00579 END FUNCTION SNOWCROHOLD_0D
00580 !####################################################################
00581 !####################################################################
00582 !####################################################################
00583       FUNCTION SNOW3LSCAP_3D(PSNOWRHO) RESULT(PSCAP)
00584 !
00585 !!    PURPOSE
00586 !!    -------
00587 !     Calculate the heat capacity of a snow layer.
00588 !
00589 USE MODD_CSTS,ONLY : XCI
00590 !
00591 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00592 USE PARKIND1  ,ONLY : JPRB
00593 !
00594 IMPLICIT NONE
00595 !
00596 !*      0.1    declarations of arguments
00597 !
00598 REAL, DIMENSION(:,:,:), INTENT(IN)                                  :: PSNOWRHO
00599 !
00600 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2),SIZE(PSNOWRHO,3)) :: PSCAP
00601 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00602 !-------------------------------------------------------------------------------
00603 !     The method of Verseghy (1991), Int. J. Climat., 11, 111-133.
00604 !
00605 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LSCAP_3D',0,ZHOOK_HANDLE)
00606 PSCAP(:,:,:) = PSNOWRHO(:,:,:)*XCI      ! (J K-1 m-3)
00607 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LSCAP_3D',1,ZHOOK_HANDLE)
00608 !
00609 END FUNCTION SNOW3LSCAP_3D
00610 !####################################################################
00611       FUNCTION SNOW3LSCAP_2D(PSNOWRHO) RESULT(PSCAP)
00612 !
00613 !!    PURPOSE
00614 !!    -------
00615 !     Calculate the heat capacity of a snow layer.
00616 !
00617 USE MODD_CSTS,ONLY : XCI
00618 !
00619 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00620 USE PARKIND1  ,ONLY : JPRB
00621 !
00622 IMPLICIT NONE
00623 !
00624 !*      0.1    declarations of arguments
00625 !
00626 REAL, DIMENSION(:,:), INTENT(IN)                   :: PSNOWRHO
00627 !
00628 REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) :: PSCAP
00629 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00630 !-------------------------------------------------------------------------------
00631 !     The method of Verseghy (1991), Int. J. Climat., 11, 111-133.
00632 !
00633 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LSCAP_2D',0,ZHOOK_HANDLE)
00634 PSCAP(:,:) = PSNOWRHO(:,:)*XCI      ! (J K-1 m-3)
00635 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LSCAP_2D',1,ZHOOK_HANDLE)
00636 !
00637 END FUNCTION SNOW3LSCAP_2D
00638 !####################################################################
00639       FUNCTION SNOW3LSCAP_1D(PSNOWRHO) RESULT(PSCAP)
00640 !
00641 !!    PURPOSE
00642 !!    -------
00643 !     Calculate the heat capacity of a snow layer.
00644 !
00645 USE MODD_CSTS,ONLY : XCI
00646 !
00647 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00648 USE PARKIND1  ,ONLY : JPRB
00649 !
00650 IMPLICIT NONE
00651 !
00652 !*      0.1    declarations of arguments
00653 !
00654 REAL, DIMENSION(:), INTENT(IN)                   :: PSNOWRHO
00655 !
00656 REAL, DIMENSION(SIZE(PSNOWRHO))                  :: PSCAP
00657 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00658 !-------------------------------------------------------------------------------
00659 !     The method of Verseghy (1991), Int. J. Climat., 11, 111-133.
00660 !
00661 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LSCAP_1D',0,ZHOOK_HANDLE)
00662 PSCAP(:) = PSNOWRHO(:)*XCI      ! (J K-1 m-3)
00663 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LSCAP_1D',1,ZHOOK_HANDLE)
00664 !
00665 END FUNCTION SNOW3LSCAP_1D
00666 !####################################################################
00667       FUNCTION SNOW3LSCAP_0D(PSNOWRHO) RESULT(PSCAP)
00668 !
00669 !!    PURPOSE
00670 !!    -------
00671 !     Calculate the heat capacity of a snow layer.
00672 !
00673 USE MODD_CSTS,ONLY : XCI
00674 !
00675 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00676 USE PARKIND1  ,ONLY : JPRB
00677 !
00678 IMPLICIT NONE
00679 !
00680 !*      0.1    declarations of arguments
00681 !
00682 REAL, INTENT(IN)       :: PSNOWRHO
00683 !
00684 REAL                   :: PSCAP
00685 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00686 !-------------------------------------------------------------------------------
00687 !     The method of Verseghy (1991), Int. J. Climat., 11, 111-133.
00688 !
00689 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LSCAP_0D',0,ZHOOK_HANDLE)
00690 PSCAP = PSNOWRHO*XCI      ! (J K-1 m-3)
00691 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LSCAP_0D',1,ZHOOK_HANDLE)
00692 !
00693 END FUNCTION SNOW3LSCAP_0D
00694 !
00695 !####################################################################
00696 !####################################################################
00697 !####################################################################
00698       FUNCTION SNOW3L_MARBOUTY(PSNOWRHO,PSNOWTEMP,PGRADT) RESULT(PDANGL) 
00699 !**** *ZDANGL* - CROISSANCE DES GRAINS NON DENDRITIQUES ET ANGULEUX .
00700 !              - GROWTH RATES FOR NON DENDRITIC GRAINS WITH SPHERICITY=0 
00701 
00702 
00703 !     OBJET.
00704 !     ------
00705 
00706 !**   INTERFACE.
00707 !     ----------
00708 
00709 !     *ZDANGL*(PST,PSRO,PGRADT)*
00710 
00711 !        *PST*     -  TEMPERATURE DE LA STRATE DE NEIGE.
00712 !        *PSRO*    -  MASSE VOLUMIQUE DE LA STRATE DE NEIGE.
00713 !        *PGRADT*  -  GRADIENT DE TEMPERATURE AFFECTANT LA STRATE DE NEIGE.
00714 
00715 !     METHODE.
00716 !     --------
00717 !     THE FUNCTION RETURN A VALUE BETWEEN 0 AND 1 WHICH IS USED IN THE DETERMINATION OF THE 
00718 !     GROWTH RATE FOR THE CONSIDERED LAYER.
00719 !     THIS VALUE (WITHOUT UNIT) IS THE PRODUCT OF 3 FUNCTIONS (WHICH HAVE THEIR SOLUTIONS BETWEEN 0 AND 1) :
00720 !     F(TEMPERATURE) * H(DENSITY) * G(TEMPERATURE GRADIENT)
00721 
00722 !     EXTERNES.
00723 !     ---------
00724 
00725 !     REFERENCES.
00726 !     -----------
00727 !        MARBOUTY D (1980) AN EXPERIMENTAL STUDY OF TEMPERATURE GRADIENT 
00728 !                          METAMORPHISM J GLACIOLOGY
00729 
00730 !     AUTEURS.
00731 !     --------
00732 !        DOMINIQUE MARBOUTY (FMARBO/GMARBO/HMARBO).
00733 
00734 !     MODIFICATIONS.
00735 !     --------------
00736 !        08/95: YANNICK DANIELOU - CODAGE A LA NORME DOCTOR.
00737 !        03/06: JM WILLEMET      - F90 AND SI UNITS
00738 !        01/08: JM WILLEMET      - ERROR ON THE FORMULATION OF G FUNCTION (WITH GRADIENT) IS CORRECTED 
00739 
00740 USE MODD_CSTS, ONLY : XTT
00741 USE MODD_SNOW_METAMO  
00742 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00743 USE PARKIND1  ,ONLY : JPRB
00744 !
00745 IMPLICIT NONE
00746 
00747 
00748 !     DECLARATIONS.
00749 !     -------------
00750 REAL ,INTENT(IN) :: PSNOWTEMP,PSNOWRHO,PGRADT
00751 REAL             :: PDANGL
00752 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00753 
00754 
00755 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3L_MARBOUTY',0,ZHOOK_HANDLE)
00756 PDANGL=0.0
00757 ! INFLUENCE DE LA TEMPERATURE /TEMPERATURE INFLUENCE.
00758 
00759 IF(PSNOWTEMP >= XTT-VTANG1)THEN
00760   IF(PSNOWTEMP >= XTT-VTANG2)THEN
00761     PDANGL=VTANG4+VTANG5*(XTT-PSNOWTEMP)/VTANG6
00762   ELSEIF(PSNOWTEMP >= XTT-VTANG3)THEN
00763     PDANGL=VTANG7-VTANG8*(XTT-VTANG2-PSNOWTEMP)/VTANG9
00764   ELSE
00765     PDANGL=VTANGA-VTANGB*(XTT-VTANG3-PSNOWTEMP)/VTANGC
00766   ENDIF
00767 
00768 ! INFLUENCE DE LA MASSE VOLUMIQUE / DENSITY INFLUENCE.
00769 
00770   IF (PSNOWRHO <= VRANG1) THEN
00771     IF(PSNOWRHO > VRANG2) THEN
00772       PDANGL=PDANGL*(1.-(PSNOWRHO-VRANG2)/(VRANG1-VRANG2))
00773     ENDIF
00774 !   INFLUENCE DU GRADIENT DE TEMPERATURE / TEMPERATURE GRADIENT INFLUENCE.
00775 
00776     IF(PGRADT <= VGANG1)THEN
00777       IF(PGRADT <= VGANG2)THEN
00778         PDANGL=PDANGL*VGANG5*(PGRADT-VGANG6)/(VGANG2-VGANG6)
00779       ELSEIF(PGRADT <= VGANG3)THEN
00780         PDANGL = PDANGL*(VGANG7 + VGANG8*(PGRADT-VGANG2)/(VGANG3-VGANG2))
00781       ELSEIF(PGRADT <= VGANG4)THEN
00782         PDANGL = PDANGL*(VGANG9 + VGANGA*(PGRADT-VGANG3)/(VGANG4-VGANG3))
00783       ELSE
00784         PDANGL = PDANGL*(VGANGB + VGANGC*(PGRADT-VGANG4)/(VGANG1-VGANG4))
00785       ENDIF
00786     ENDIF
00787   ELSE
00788     PDANGL=0.
00789   ENDIF
00790 ELSE
00791   PDANGL=0.
00792 ENDIF                   
00793 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3L_MARBOUTY',1,ZHOOK_HANDLE)
00794 END FUNCTION SNOW3L_MARBOUTY     
00795         
00796 !####################################################################
00797 !####################################################################
00798 !####################################################################
00799 
00800       SUBROUTINE SNOW3LGRID_2D(PSNOWDZ,PSNOW)
00801 !
00802 !!    PURPOSE
00803 !!    -------
00804 !     Once during each time step, update grid to maintain
00805 !     grid proportions. Similar to approach of Lynch-Steiglitz,
00806 !     1994, J. Clim., 7, 1842-1855. Corresponding mass and
00807 !     heat adjustments made directly after the call to this
00808 !     routine. 3 grid configurations:
00809 !     1) for very thin snow, constant grid spacing
00810 !     2) for intermediate thicknesses, highest resolution at soil/snow
00811 !        interface and at the snow/atmosphere interface
00812 !     3) for deep snow, vertical resoution finest at snow/atmosphere
00813 !        interface (set to a constant value) and increases with snow depth.
00814 !        Second layer can't be more than an order of magnitude thicker
00815 !        than surface layer.
00816 !
00817 !
00818 USE MODD_SURF_PAR,   ONLY : XUNDEF
00819 USE MODD_SNOW_PAR,   ONLY : XSNOWCRITD
00820 !
00821 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00822 USE PARKIND1  ,ONLY : JPRB
00823 !
00824 IMPLICIT NONE
00825 !
00826 !*      0.1    declarations of arguments
00827 !
00828 REAL, DIMENSION(:), INTENT(IN)    :: PSNOW
00829 !
00830 REAL, DIMENSION(:,:), INTENT(OUT) :: PSNOWDZ
00831 !
00832 !*      0.1    declarations of local variables
00833 !
00834 INTEGER                           :: JJ, JI
00835 !
00836 INTEGER                           :: INLVLS, INI
00837 !   
00838 REAL, DIMENSION(SIZE(PSNOW))      :: ZWORK
00839 !
00840 ! ISBA-ES snow grid parameters
00841 !
00842 REAL, PARAMETER, DIMENSION(3)     :: ZSGCOEF1  = (/0.25, 0.50, 0.25/) 
00843 REAL, PARAMETER, DIMENSION(2)     :: ZSGCOEF2  = (/0.05, 0.34/)       
00844 REAL, PARAMETER, DIMENSION(10)    :: ZSGCOEF3  = (/0.025, 0.033, 0.043,
00845   0.055, 0.071, 0.091, 0.117, 0.150, 0.193, 0.247/) 
00846       
00847 ! Minimum total snow depth at which surface layer thickness is constant:
00848 !
00849 REAL, PARAMETER                   :: ZSNOWTRANS = 0.20                ! (m)
00850 REAL, PARAMETER                   :: ZSNOWTRANS1 = 0.40                ! (m)
00851 REAL, PARAMETER                   :: ZSNOWTRANS2 = 0.6061                ! (m)
00852 REAL, PARAMETER                   :: ZSNOWTRANS3 = 0.7143               ! (m)
00853 REAL, PARAMETER                   :: ZSNOWTRANS4 = 0.9259                ! (m)
00854 REAL, PARAMETER                   :: ZSNOWTRANS5 = 1.4493                ! (m)
00855 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00856 !
00857 !-------------------------------------------------------------------------------
00858 !
00859 ! 0. Initialization:
00860 ! ------------------
00861 !
00862 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LGRID_2D',0,ZHOOK_HANDLE)
00863 INLVLS = SIZE(PSNOWDZ(:,:),2)
00864 INI    = SIZE(PSNOWDZ(:,:),1)
00865 !
00866 ZWORK(:)  = 0.0
00867 !
00868 ! 1. Calculate current grid for 3-layer (default) configuration):
00869 ! ---------------------------------------------------------------
00870 ! Based on formulation of Lynch-Stieglitz (1994)
00871 ! except for 3 modifications: 
00872 ! i) smooth transition here at ZSNOWTRANS
00873 ! ii) constant ratio for very thin snow:
00874 ! iii) ratio of layer 2 to surface layer <= 10
00875 !
00876 IF(INLVLS == 3)THEN
00877 !
00878    WHERE(PSNOW <= XSNOWCRITD+0.01)
00879       PSNOWDZ(:,1) = MIN(0.01, PSNOW(:)/INLVLS)
00880       PSNOWDZ(:,3) = MIN(0.01, PSNOW(:)/INLVLS)
00881       PSNOWDZ(:,2) = PSNOW(:) - PSNOWDZ(:,1) - PSNOWDZ(:,3)
00882    END WHERE
00883 !
00884    WHERE(PSNOW <= ZSNOWTRANS .AND. PSNOW > XSNOWCRITD+0.01)
00885       PSNOWDZ(:,1) = PSNOW(:)*ZSGCOEF1(1)
00886       PSNOWDZ(:,2) = PSNOW(:)*ZSGCOEF1(2)
00887       PSNOWDZ(:,3) = PSNOW(:)*ZSGCOEF1(3)
00888    END WHERE
00889 !
00890    WHERE(PSNOW > ZSNOWTRANS)
00891       PSNOWDZ(:,1) = ZSGCOEF2(1)
00892       PSNOWDZ(:,2) = (PSNOW(:)-ZSGCOEF2(1))*ZSGCOEF2(2) + ZSGCOEF2(1)
00893 !
00894 ! When using simple finite differences, limit the thickness
00895 ! factor between the top and 2nd layers to at most 10
00896 ! 
00897       PSNOWDZ(:,2) = MIN(10*ZSGCOEF2(1),  PSNOWDZ(:,2))
00898       PSNOWDZ(:,3) = PSNOW(:) - PSNOWDZ(:,2) - PSNOWDZ(:,1)
00899    END WHERE
00900 !
00901 ! 2. For more than 3-layers:
00902 ! --------------------------
00903 ! For the case when more than 3 layers are to be used, specifiy how
00904 ! grid should be defined here. For now, a very simple arbitrary method
00905 ! herein. WARNING: Detailed testing using more than 3-layers has not been done
00906 ! to date, only minor tests.
00907 !
00908 ELSE IF(INLVLS>3 .AND. INLVLS<10) THEN
00909       DO JJ=1,INLVLS
00910          DO JI=1,INI
00911             PSNOWDZ(JI,JJ)  = PSNOW(JI)/INLVLS
00912          ENDDO
00913       ENDDO
00914 !
00915      PSNOWDZ(:,INLVLS) = PSNOWDZ(:,INLVLS) + (PSNOWDZ(:,1) - MIN(0.05, PSNOWDZ(:,1)))
00916      PSNOWDZ(:,1)      = MIN(0.05, PSNOWDZ(:,1))
00917 ! ajout EB pour permettre > 10
00918 ELSE IF(INLVLS==10) THEN 
00919 !
00920 !   
00921 !    DO JJ=1,INLVLS
00922 !        WHERE(PSNOW <=XSNOWCRITD+0.07 )
00923 !        PSNOWDZ(:,JJ) = PSNOW(:)/INLVLS
00924 !        ENDWHERE
00925 !        WHERE(PSNOW >XSNOWCRITD+0.07)
00926 !        PSNOWDZ(:,JJ) = (PSNOW(:)-1)*ZSGCOEF3(JJ)
00927 !        ENDWHERE
00928 !    END DO
00929 !        
00930 !     
00931 !   WHERE(PSNOW <= ZSNOWTRANS2 .AND. PSNOW > ZSNOWTRANS1)
00932 !        PSNOWDZ(:,INLVLS)=PSNOWDZ(:,INLVLS)-0.01+PSNOWDZ(:,1)
00933 !        PSNOWDZ(:,1)=0.01
00934 !   END WHERE
00935 !
00936 !    WHERE(PSNOW <= ZSNOWTRANS3 .AND. PSNOW > ZSNOWTRANS2)
00937 !        PSNOWDZ(:,INLVLS)=PSNOWDZ(:,INLVLS)+(PSNOWDZ(:,1)-0.01)+(PSNOWDZ(:,2)-0.02)
00938 !        PSNOWDZ(:,1)=0.01
00939 !        PSNOWDZ(:,2)=0.02
00940 !   END WHERE
00941 !
00942 !    WHERE(PSNOW <= ZSNOWTRANS4 .AND. PSNOW > ZSNOWTRANS3)
00943 !        PSNOWDZ(:,INLVLS)=PSNOWDZ(:,INLVLS)+(PSNOWDZ(:,1)-0.01)+(PSNOWDZ(:,2)-0.02)+(PSNOWDZ(:,3)-0.03)
00944 !        PSNOWDZ(:,1)=0.01
00945 !        PSNOWDZ(:,2)=0.02
00946 !        PSNOWDZ(:,3)=0.03
00947 !   END WHERE
00948 !
00949 !    WHERE(PSNOW <= ZSNOWTRANS5 .AND. PSNOW > ZSNOWTRANS4)
00950 !        PSNOWDZ(:,INLVLS)=PSNOWDZ(:,INLVLS)+(PSNOWDZ(:,1)-0.01)+(PSNOWDZ(:,2)-0.02)+(PSNOWDZ(:,3)-0.03)&
00951 !        &+(PSNOWDZ(:,4)-0.05) 
00952 !        PSNOWDZ(:,1)=0.01
00953 !        PSNOWDZ(:,2)=0.02
00954 !        PSNOWDZ(:,3)=0.03
00955 !        PSNOWDZ(:,4)=0.05
00956 !   END WHERE
00957 !        
00958 !    WHERE(PSNOW > ZSNOWTRANS5)
00959 !
00960 !         PSNOWDZ(:,INLVLS) = PSNOWDZ(:,INLVLS)+(PSNOWDZ(:,1)-0.01)+(PSNOWDZ(:,2)-0.02)+(PSNOWDZ(:,3)-0.03)+&
00961 !&(PSNOWDZ(:,4)-0.05)+(PSNOWDZ(:,5)-0.1)
00962 !
00963 !        PSNOWDZ(:,1)=0.01
00964 !        PSNOWDZ(:,2)=0.02
00965 !        PSNOWDZ(:,3)=0.03
00966 !        PSNOWDZ(:,4)=0.05
00967 !        PSNOWDZ(:,5)=0.1
00968 !                
00969 !     END WHERE
00970         
00971      WHERE(PSNOW <= XSNOWCRITD+0.07)
00972       PSNOWDZ(:,1) = MIN(0.01, PSNOW(:)/INLVLS)
00973       PSNOWDZ(:,2) = MIN(0.01, PSNOW(:)/INLVLS)
00974       PSNOWDZ(:,3) = MIN(0.01, PSNOW(:)/INLVLS)
00975       PSNOWDZ(:,4) = MIN(0.01, PSNOW(:)/INLVLS)
00976       PSNOWDZ(:,5) = MIN(0.01, PSNOW(:)/INLVLS)
00977       PSNOWDZ(:,6) = MIN(0.01, PSNOW(:)/INLVLS)
00978       PSNOWDZ(:,7) = MIN(0.01, PSNOW(:)/INLVLS)
00979       PSNOWDZ(:,8) = MIN(0.01, PSNOW(:)/INLVLS)
00980       PSNOWDZ(:,9) = MIN(0.01, PSNOW(:)/INLVLS)
00981       PSNOWDZ(:,INLVLS) = PSNOW(:) - SUM(PSNOWDZ(:,1:9))
00982      END WHERE
00983 
00984      WHERE(PSNOW > XSNOWCRITD+0.07 .AND. PSNOW<=0.19)
00985       PSNOWDZ(:,1) = 0.01 
00986       PSNOWDZ(:,2) = 0.01+(PSNOW(:)-0.1)/9
00987       PSNOWDZ(:,3) = 0.01+(PSNOW(:)-0.1)/9
00988       PSNOWDZ(:,4) = 0.01+(PSNOW(:)-0.1)/9
00989       PSNOWDZ(:,5) = 0.01+(PSNOW(:)-0.1)/9 
00990       PSNOWDZ(:,6) = 0.01+(PSNOW(:)-0.1)/9
00991       PSNOWDZ(:,7) = 0.01+(PSNOW(:)-0.1)/9
00992       PSNOWDZ(:,8) = 0.01+(PSNOW(:)-0.1)/9
00993       PSNOWDZ(:,9) = 0.01+(PSNOW(:)-0.1)/9
00994       PSNOWDZ(:,INLVLS) = PSNOW(:) - SUM(PSNOWDZ(:,1:9))
00995      END WHERE
00996 
00997      WHERE(PSNOW > 0.19 .AND. PSNOW<=0.27)
00998       PSNOWDZ(:,1) = 0.01 
00999       PSNOWDZ(:,2) = 0.02
01000       PSNOWDZ(:,3) = 0.02+(PSNOW(:)-0.19)/8
01001       PSNOWDZ(:,4) = 0.02+(PSNOW(:)-0.19)/8
01002       PSNOWDZ(:,5) = 0.02+(PSNOW(:)-0.19)/8 
01003       PSNOWDZ(:,6) = 0.02+(PSNOW(:)-0.19)/8
01004       PSNOWDZ(:,7) = 0.02+(PSNOW(:)-0.19)/8
01005       PSNOWDZ(:,8) = 0.02+(PSNOW(:)-0.19)/8
01006       PSNOWDZ(:,9) = 0.02+(PSNOW(:)-0.19)/8
01007       PSNOWDZ(:,INLVLS) = PSNOW(:) - SUM(PSNOWDZ(:,1:9))
01008      END WHERE
01009 
01010       WHERE(PSNOW > 0.27 .AND. PSNOW<=0.41)
01011       PSNOWDZ(:,1) = 0.01 
01012       PSNOWDZ(:,2) = 0.02
01013       PSNOWDZ(:,3) = 0.03
01014       PSNOWDZ(:,4) = 0.03+(PSNOW(:)-0.27)/7
01015       PSNOWDZ(:,5) = 0.03+(PSNOW(:)-0.27)/7 
01016       PSNOWDZ(:,6) = 0.03+(PSNOW(:)-0.27)/7
01017       PSNOWDZ(:,7) = 0.03+(PSNOW(:)-0.27)/7
01018       PSNOWDZ(:,8) = 0.03+(PSNOW(:)-0.27)/7
01019       PSNOWDZ(:,9) = 0.03+(PSNOW(:)-0.27)/7
01020       PSNOWDZ(:,INLVLS) = PSNOW(:) - SUM(PSNOWDZ(:,1:9))
01021      END WHERE
01022 
01023       WHERE(PSNOW > 0.41 .AND. PSNOW<=0.71)
01024       PSNOWDZ(:,1) = 0.01 
01025       PSNOWDZ(:,2) = 0.02
01026       PSNOWDZ(:,3) = 0.03
01027       PSNOWDZ(:,4) = 0.05
01028       PSNOWDZ(:,5) = 0.05+(PSNOW(:)-0.41)/6 
01029       PSNOWDZ(:,6) = 0.05+(PSNOW(:)-0.41)/6
01030       PSNOWDZ(:,7) = 0.05+(PSNOW(:)-0.41)/6
01031       PSNOWDZ(:,8) = 0.05+(PSNOW(:)-0.41)/6
01032       PSNOWDZ(:,9) = 0.05+(PSNOW(:)-0.41)/6
01033       PSNOWDZ(:,INLVLS) = PSNOW(:) - SUM(PSNOWDZ(:,1:9))
01034      END WHERE
01035   
01036       WHERE(PSNOW > 0.71)
01037       PSNOWDZ(:,1) = 0.01 
01038       PSNOWDZ(:,2) = 0.02
01039       PSNOWDZ(:,3) = 0.03
01040       PSNOWDZ(:,4) = 0.05
01041       PSNOWDZ(:,5) = 0.1
01042       PSNOWDZ(:,6) = 0.1+(PSNOW(:)-0.71)/5
01043       PSNOWDZ(:,7) = 0.1+(PSNOW(:)-0.71)/5
01044       PSNOWDZ(:,8) = 0.1+(PSNOW(:)-0.71)/5
01045       PSNOWDZ(:,9) = 0.1+(PSNOW(:)-0.71)/5
01046       PSNOWDZ(:,INLVLS) = PSNOW(:) - SUM(PSNOWDZ(:,1:9))
01047      END WHERE
01048        
01049 ! ajout EB pour permettre cas INLVLS > 10
01050 ELSE   
01051       PSNOWDZ(:,1) = MIN(0.02,PSNOW(:)/INLVLS) 
01052       PSNOWDZ(:,2) = MIN(0.01*PSNOW(:),PSNOW(:)/INLVLS)
01053       PSNOWDZ(:,3) = MIN(0.02*PSNOW(:),PSNOW(:)/INLVLS)
01054       PSNOWDZ(:,4) = MIN(0.03*PSNOW(:),PSNOW(:)/INLVLS)
01055       PSNOWDZ(:,5) = MIN(0.05*PSNOW(:),PSNOW(:)/INLVLS)
01056       PSNOWDZ(:,INLVLS)=MIN(0.05*PSNOW(:),PSNOW(:)/INLVLS) 
01057       ZWORK(:) = SUM(PSNOWDZ(:,1:5))    
01058       DO JJ=6,INLVLS-1,1
01059          DO JI=1,INI
01060             PSNOWDZ(JI,JJ) = (PSNOW(JI) - ZWORK(JI) -PSNOWDZ(JI,INLVLS)) &
01061                  /(INLVLS-6) 
01062          ENDDO
01063       ENDDO
01064 !
01065 ENDIF
01066 !
01067 DO JJ=1,INLVLS
01068    DO JI=1,INI
01069       IF(PSNOW(JI)==XUNDEF)THEN
01070          PSNOWDZ(JI,JJ) = XUNDEF
01071       ENDIF
01072    ENDDO
01073 ENDDO
01074 !
01075 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LGRID_2D',1,ZHOOK_HANDLE)
01076 !
01077 END SUBROUTINE SNOW3LGRID_2D
01078 !####################################################################
01079 !####################################################################
01080 !####################################################################
01081 
01082       SUBROUTINE SNOW3LGRID_1D(PSNOWDZ,PSNOW)
01083 !
01084 !!    PURPOSE
01085 !!    -------
01086 !     Once during each time step, update grid to maintain
01087 !     grid proportions. Similar to approach of Lynch-Steiglitz,
01088 !     1994, J. Clim., 7, 1842-1855. Corresponding mass and
01089 !     heat adjustments made directly after the call to this
01090 !     routine. 3 grid configurations:
01091 !     1) for very thin snow, constant grid spacing
01092 !     2) for intermediate thicknesses, highest resolution at soil/snow
01093 !        interface and at the snow/atmosphere interface
01094 !     3) for deep snow, vertical resoution finest at snow/atmosphere
01095 !        interface (set to a constant value) and increases with snow depth.
01096 !        Second layer can't be more than an order of magnitude thicker
01097 !        than surface layer.
01098 !
01099 !
01100 USE MODD_SURF_PAR,   ONLY : XUNDEF
01101 USE MODD_SNOW_PAR,   ONLY : XSNOWCRITD
01102 !
01103 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
01104 USE PARKIND1  ,ONLY : JPRB
01105 !
01106 IMPLICIT NONE
01107 !
01108 !*      0.1    declarations of arguments
01109 !
01110 REAL, INTENT(IN)    :: PSNOW
01111 !
01112 REAL, DIMENSION(:), INTENT(OUT) :: PSNOWDZ
01113 !
01114 !*      0.1    declarations of local variables
01115 !
01116 INTEGER JJ
01117 !
01118 INTEGER                           :: INLVLS
01119 !
01120 REAL                              :: ZWORK
01121 !
01122 ! ISBA-ES snow grid parameters
01123 !
01124 REAL, PARAMETER, DIMENSION(3)     :: ZSGCOEF1  = (/0.25, 0.50, 0.25/) 
01125 REAL, PARAMETER, DIMENSION(2)     :: ZSGCOEF2  = (/0.05, 0.34/)       
01126 REAL, PARAMETER, DIMENSION(10)    :: ZSGCOEF3  = (/0.025, 0.033, 0.043,
01127   0.055, 0.071, 0.091, 0.117, 0.150, 0.193, 0.247/) 
01128       
01129 ! Minimum total snow depth at which surface layer thickness is constant:
01130 !
01131 REAL, PARAMETER                   :: ZSNOWTRANS  = 0.20                ! (m)
01132 REAL, PARAMETER                   :: ZSNOWTRANS1 = 0.40                ! (m)
01133 REAL, PARAMETER                   :: ZSNOWTRANS2 = 0.6061                ! (m)
01134 REAL, PARAMETER                   :: ZSNOWTRANS3 = 0.7143               ! (m)
01135 REAL, PARAMETER                   :: ZSNOWTRANS4 = 0.9259                ! (m)
01136 REAL, PARAMETER                   :: ZSNOWTRANS5 = 1.4493                ! (m)
01137 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01138 !
01139 !-------------------------------------------------------------------------------
01140 !
01141 ! 0. Initialization:
01142 ! ------------------
01143 !
01144 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LGRID_1D',0,ZHOOK_HANDLE)
01145 INLVLS = SIZE(PSNOWDZ(:),1)
01146 !
01147 ! 1. Calculate current grid for 3-layer (default) configuration):
01148 ! ---------------------------------------------------------------
01149 ! Based on formulation of Lynch-Stieglitz (1994)
01150 ! except for 3 modifications: 
01151 ! i) smooth transition here at ZSNOWTRANS
01152 ! ii) constant ratio for very thin snow:
01153 ! iii) ratio of layer 2 to surface layer <= 10
01154 !
01155 IF(INLVLS == 3)THEN
01156 !
01157    IF(PSNOW <= XSNOWCRITD+0.01)THEN
01158       PSNOWDZ(1) = MIN(0.01, PSNOW/INLVLS)
01159       PSNOWDZ(3) = MIN(0.01, PSNOW/INLVLS)
01160       PSNOWDZ(2) = PSNOW - PSNOWDZ(1) - PSNOWDZ(3)
01161    ENDIF
01162 !
01163    IF(PSNOW <= ZSNOWTRANS .AND. PSNOW > XSNOWCRITD+0.01)THEN
01164       PSNOWDZ(1) = PSNOW*ZSGCOEF1(1)
01165       PSNOWDZ(2) = PSNOW*ZSGCOEF1(2)
01166       PSNOWDZ(3) = PSNOW*ZSGCOEF1(3)
01167    ENDIF
01168 !
01169    IF(PSNOW > ZSNOWTRANS)THEN
01170       PSNOWDZ(1) = ZSGCOEF2(1)
01171       PSNOWDZ(2) = (PSNOW-ZSGCOEF2(1))*ZSGCOEF2(2) + ZSGCOEF2(1)
01172 !
01173 ! When using simple finite differences, limit the thickness
01174 ! factor between the top and 2nd layers to at most 10
01175 ! 
01176       PSNOWDZ(2) = MIN(10*ZSGCOEF2(1),  PSNOWDZ(2))
01177       PSNOWDZ(3) = PSNOW - PSNOWDZ(2) - PSNOWDZ(1)
01178    END IF
01179 !
01180 !
01181 !plm
01182 ELSE IF(INLVLS>3 .AND. INLVLS<10) THEN
01183       DO JJ=1,INLVLS
01184          PSNOWDZ(JJ)  = PSNOW/INLVLS
01185       ENDDO
01186 !
01187      PSNOWDZ(INLVLS) = PSNOWDZ(INLVLS) + (PSNOWDZ(1) - MIN(0.05, PSNOWDZ(1)))
01188      PSNOWDZ(1)      = MIN(0.05, PSNOWDZ(1))
01189 ! ajout EB pour permettre > 10
01190 ELSE IF(INLVLS==10) THEN 
01191 ! plm
01192 ! ELSE 
01193 !
01194 ! 2. For more than 3-layers:
01195 ! --------------------------
01196 ! For the case when more than 3 layers are to be used, specifiy how
01197 ! grid should be defined here. For now, a very simple arbitrary method
01198 ! herein. WARNING: Detailed testing using more than 3-layers has not been done
01199 ! to date, only minor tests.
01200 !           
01201      IF(PSNOW <= XSNOWCRITD+0.07)THEN
01202       PSNOWDZ(1) = MIN(0.01, PSNOW/INLVLS)
01203       PSNOWDZ(2) = MIN(0.01, PSNOW/INLVLS)
01204       PSNOWDZ(3) = MIN(0.01, PSNOW/INLVLS)
01205       PSNOWDZ(4) = MIN(0.01, PSNOW/INLVLS)
01206       PSNOWDZ(5) = MIN(0.01, PSNOW/INLVLS)
01207       PSNOWDZ(6) = MIN(0.01, PSNOW/INLVLS)
01208       PSNOWDZ(7) = MIN(0.01, PSNOW/INLVLS)
01209       PSNOWDZ(8) = MIN(0.01, PSNOW/INLVLS)
01210       PSNOWDZ(9) = MIN(0.01, PSNOW/INLVLS)
01211       PSNOWDZ(INLVLS) = PSNOW - SUM(PSNOWDZ(1:9))
01212 !  
01213      ELSEIF(PSNOW > XSNOWCRITD+0.07 .AND. PSNOW<=0.19)THEN
01214       PSNOWDZ(1) = 0.01 
01215       PSNOWDZ(2) = 0.01+(PSNOW-0.1)/9
01216       PSNOWDZ(3) = 0.01+(PSNOW-0.1)/9
01217       PSNOWDZ(4) = 0.01+(PSNOW-0.1)/9
01218       PSNOWDZ(5) = 0.01+(PSNOW-0.1)/9 
01219       PSNOWDZ(6) = 0.01+(PSNOW-0.1)/9
01220       PSNOWDZ(7) = 0.01+(PSNOW-0.1)/9
01221       PSNOWDZ(8) = 0.01+(PSNOW-0.1)/9
01222       PSNOWDZ(9) = 0.01+(PSNOW-0.1)/9
01223       PSNOWDZ(INLVLS) = PSNOW - SUM(PSNOWDZ(1:9))
01224 !
01225      ELSEIF(PSNOW > 0.19 .AND. PSNOW<=0.27)THEN
01226       PSNOWDZ(1) = 0.01 
01227       PSNOWDZ(2) = 0.02
01228       PSNOWDZ(3) = 0.02+(PSNOW-0.19)/8
01229       PSNOWDZ(4) = 0.02+(PSNOW-0.19)/8
01230       PSNOWDZ(5) = 0.02+(PSNOW-0.19)/8 
01231       PSNOWDZ(6) = 0.02+(PSNOW-0.19)/8
01232       PSNOWDZ(7) = 0.02+(PSNOW-0.19)/8
01233       PSNOWDZ(8) = 0.02+(PSNOW-0.19)/8
01234       PSNOWDZ(9) = 0.02+(PSNOW-0.19)/8
01235       PSNOWDZ(INLVLS) = PSNOW - SUM(PSNOWDZ(1:9))
01236 !
01237       ELSEIF(PSNOW > 0.27 .AND. PSNOW<=0.41)THEN
01238       PSNOWDZ(1) = 0.01 
01239       PSNOWDZ(2) = 0.02
01240       PSNOWDZ(3) = 0.03
01241       PSNOWDZ(4) = 0.03+(PSNOW-0.27)/7
01242       PSNOWDZ(5) = 0.03+(PSNOW-0.27)/7 
01243       PSNOWDZ(6) = 0.03+(PSNOW-0.27)/7
01244       PSNOWDZ(7) = 0.03+(PSNOW-0.27)/7
01245       PSNOWDZ(8) = 0.03+(PSNOW-0.27)/7
01246       PSNOWDZ(9) = 0.03+(PSNOW-0.27)/7
01247       PSNOWDZ(INLVLS) = PSNOW - SUM(PSNOWDZ(1:9))
01248 !
01249       ELSEIF(PSNOW > 0.41 .AND. PSNOW<=0.71)THEN
01250       PSNOWDZ(1) = 0.01 
01251       PSNOWDZ(2) = 0.02
01252       PSNOWDZ(3) = 0.03
01253       PSNOWDZ(4) = 0.05
01254       PSNOWDZ(5) = 0.05+(PSNOW-0.41)/6 
01255       PSNOWDZ(6) = 0.05+(PSNOW-0.41)/6
01256       PSNOWDZ(7) = 0.05+(PSNOW-0.41)/6
01257       PSNOWDZ(8) = 0.05+(PSNOW-0.41)/6
01258       PSNOWDZ(9) = 0.05+(PSNOW-0.41)/6
01259       PSNOWDZ(INLVLS) = PSNOW - SUM(PSNOWDZ(1:9))
01260 !     
01261       ELSE
01262       PSNOWDZ(1) = 0.01 
01263       PSNOWDZ(2) = 0.02
01264       PSNOWDZ(3) = 0.03
01265       PSNOWDZ(4) = 0.05
01266       PSNOWDZ(5) = 0.1
01267       PSNOWDZ(6) = 0.1+(PSNOW-0.71)/5
01268       PSNOWDZ(7) = 0.1+(PSNOW-0.71)/5
01269       PSNOWDZ(8) = 0.1+(PSNOW-0.71)/5
01270       PSNOWDZ(9) = 0.1+(PSNOW-0.71)/5
01271       PSNOWDZ(INLVLS) = PSNOW - SUM(PSNOWDZ(1:9))
01272      ENDIF
01273        
01274 ! ajout EB pour permettre cas INLVLS > 10
01275 ELSE   
01276       PSNOWDZ(1) = MIN(0.02,PSNOW/INLVLS) 
01277       PSNOWDZ(2) = MIN(0.01*PSNOW,PSNOW/INLVLS)
01278       PSNOWDZ(3) = MIN(0.02*PSNOW,PSNOW/INLVLS)
01279       PSNOWDZ(4) = MIN(0.03*PSNOW,PSNOW/INLVLS)
01280       PSNOWDZ(5) = MIN(0.05*PSNOW,PSNOW/INLVLS)
01281       PSNOWDZ(INLVLS)=MIN(0.05*PSNOW,PSNOW/INLVLS) 
01282       ZWORK = SUM(PSNOWDZ(1:5))          
01283       DO JJ=6,INLVLS-1,1
01284          PSNOWDZ(JJ) = (PSNOW - ZWORK -PSNOWDZ(INLVLS)) &
01285           /(INLVLS-6) 
01286       END DO
01287 !
01288 ENDIF
01289 !
01290 DO JJ=1,INLVLS
01291   IF(PSNOW==XUNDEF)THEN
01292     PSNOWDZ(JJ) = XUNDEF
01293   ENDIF
01294 END DO
01295 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LGRID_1D',1,ZHOOK_HANDLE)
01296 !
01297 END SUBROUTINE SNOW3LGRID_1D
01298 !
01299 !###################################################################################
01300 !###################################################################################
01301 !
01302 !       
01303         SUBROUTINE SNOW3LAGREG(PSNOWDZN,PSNOWDZ,PSNOWRHO,PSNOWGRAN1, PSNOWGRAN2,&
01304                                  PSNOWHIST,PSNOWGRAN1N,PSNOWGRAN2N,PSNOWHISTN,   &
01305                                  KILAYER1,KILAYER2,PSNOWDDZ) 
01306 !
01307 USE MODD_SNOW_METAMO
01308 !
01309 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
01310 USE PARKIND1  ,ONLY : JPRB
01311 !
01312         IMPLICIT NONE
01313 !
01314 !       0.1 declarations of arguments        
01315 !        
01316         REAL, DIMENSION(:), INTENT(IN)         :: PSNOWDZN,PSNOWDZ,PSNOWRHO,
01317                                                      PSNOWDDZ  
01318 !                                                    
01319         REAL, DIMENSION(:), INTENT(IN)      :: PSNOWGRAN1, PSNOWGRAN2,
01320                                                      PSNOWHIST 
01321                                                     
01322         REAL, DIMENSION(:), INTENT(OUT)      :: PSNOWGRAN1N, PSNOWGRAN2N,
01323                                                      PSNOWHISTN                                                    
01324 
01325         INTEGER, INTENT(IN)                      :: KILAYER1 ! Indice
01326 !                                                couche de référence (i)
01327         INTEGER, INTENT(IN)                      :: KILAYER2 ! Indice de
01328 !        la couche (i-1 ou i+1) dont une partie est aggrégée à la couche (i)
01329 !
01330 !       0.2 declaration of local variables
01331 !        
01332         REAL, DIMENSION(SIZE(PSNOWRHO,1)) :: ZSNOWRHO
01333                                       
01334 !
01335         INTEGER                         :: IDENT, IVIEU, ILAYER
01336 !
01337         REAL                            :: ZDELTA
01338         REAL, DIMENSION(SIZE(PSNOWRHO,1))   :: ZDIAMD,
01339                                                  ZDIAMV,ZSPHERD,ZSPHERV,
01340                                                  ZDIAMN,ZSPHERN,ZDENT 
01341         REAL(KIND=JPRB) :: ZHOOK_HANDLE
01342      
01343 !
01344 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LAGREG',0,ZHOOK_HANDLE)
01345 IF(KILAYER1<KILAYER2)THEN
01346         ZDELTA=0.0
01347         ILAYER = KILAYER1
01348 ELSE
01349         ZDELTA=1.0
01350         ILAYER = KILAYER2
01351 ENDIF        
01352 ! Mean Properties
01353 !
01354 !       1. History
01355 !
01356         IF(PSNOWHIST(KILAYER1)/=PSNOWHIST(KILAYER2)) THEN
01357         PSNOWHISTN(KILAYER1)=0.0
01358         ENDIF
01359 !
01360 !       2. New grain types
01361 !
01362 !       2.1 Same grain type
01363 !
01364 !
01365           
01366         IF((PSNOWGRAN1(KILAYER1)*PSNOWGRAN1(KILAYER2)>0.0).OR.            &
01367          (PSNOWGRAN1(KILAYER1)==0.AND.PSNOWGRAN1(KILAYER2)>=0.0).OR.       &
01368          (PSNOWGRAN1(KILAYER2)==0.AND.PSNOWGRAN1(KILAYER1)>=0.0)) THEN 
01369 !
01370 !code original vincent          PSNOWGRAN1N(KILAYER1)=(PSNOWGRAN1(KILAYER1)*PSNOWRHO(KILAYER1)&
01371 !code original vincent        *(PSNOWDZN(KILAYER1)-(1.0-ZDELTA)*abs(PSNOWDDZ(KILAYER1))-ZDELTA*&
01372 !code original vincent        abs(PSNOWDDZ(KILAYER2)))+PSNOWGRAN1(KILAYER2)*                   &
01373 !code original vincent        PSNOWRHO(KILAYER2)*((1.0-ZDELTA)*abs(PSNOWDDZ(KILAYER1))+        &   
01374 !code original vincent        ZDELTA*abs(PSNOWDDZ(KILAYER2))))/((PSNOWDZN(KILAYER1)-(1.0-ZDELTA)&
01375 !code original vincent        *abs(PSNOWDDZ(KILAYER1))-ZDELTA*abs(PSNOWDDZ(KILAYER2)))*        &
01376 !code original vincent        PSNOWRHO(KILAYER1)+((1.0-ZDELTA)*abs(PSNOWDDZ(KILAYER1))+        &   
01377 !code original vincent        ZDELTA*abs(PSNOWDDZ(KILAYER2)))*PSNOWRHO(KILAYER2))
01378 !code original vincent !
01379 !code original vincent          PSNOWGRAN2N(KILAYER1)=(PSNOWGRAN2(KILAYER1)*PSNOWRHO(KILAYER1) &
01380 !code original vincent        *(PSNOWDZN(KILAYER1)-(1.0-ZDELTA)*abs(PSNOWDDZ(KILAYER1))-ZDELTA* &
01381 !code original vincent        abs(PSNOWDDZ(KILAYER2)))+PSNOWGRAN2(KILAYER2)*                   &
01382 !code original vincent        PSNOWRHO(KILAYER2)*((1.0-ZDELTA)*abs(PSNOWDDZ(KILAYER1))        &
01383 !code original vincent        +ZDELTA*abs(PSNOWDDZ(KILAYER2))))/((PSNOWDZN(KILAYER1)-(1.0-ZDELTA)&
01384 !code original vincent        *abs(PSNOWDDZ(KILAYER1))-ZDELTA*abs(PSNOWDDZ(KILAYER2)))*        &
01385 !code original vincent        PSNOWRHO(KILAYER1)+((1.0-ZDELTA)*abs(PSNOWDDZ(KILAYER1))+        &   
01386 !code original vincent        ZDELTA*abs(PSNOWDDZ(KILAYER2)))*PSNOWRHO(KILAYER2))
01387 !     
01388 !plm
01389          PSNOWGRAN1N(KILAYER1) = (   PSNOWGRAN1(KILAYER1) * PSNOWRHO(KILAYER1)         &
01390                                     * (PSNOWDZN(KILAYER1) - abs(PSNOWDDZ(ILAYER)))      &
01391                                     + PSNOWGRAN1(KILAYER2) * PSNOWRHO(KILAYER2)         &
01392                                     * abs(PSNOWDDZ(ILAYER))                        )  / &
01393                                   (   (PSNOWDZN(KILAYER1)-abs(PSNOWDDZ(ILAYER)))          &
01394                                     * PSNOWRHO(KILAYER1)                                &
01395                                     + abs(PSNOWDDZ(ILAYER))*PSNOWRHO(KILAYER2)     ) 
01396 !
01397          PSNOWGRAN2N(KILAYER1) = (   PSNOWGRAN2(KILAYER1) * PSNOWRHO(KILAYER1)         &
01398                                     * (PSNOWDZN(KILAYER1) - abs(PSNOWDDZ(ILAYER)))      &
01399                                     + PSNOWGRAN2(KILAYER2) * PSNOWRHO(KILAYER2)         &
01400                                     * abs(PSNOWDDZ(ILAYER))                        )  / &
01401                                   (   (PSNOWDZN(KILAYER1)-abs(PSNOWDDZ(ILAYER)))          &
01402                                     * PSNOWRHO(KILAYER1)                                &
01403                                     + abs(PSNOWDDZ(ILAYER))*PSNOWRHO(KILAYER2)     ) 
01404 !plm
01405 !     
01406         ELSE
01407 !
01408 !       2.2 Different types
01409 !        
01410         IF(PSNOWGRAN1(KILAYER1)<0.0) THEN
01411           IDENT = KILAYER1
01412           IVIEU = KILAYER2
01413         ELSE
01414           IDENT = KILAYER2
01415           IVIEU = KILAYER1
01416         ENDIF  
01417 !                        
01418         ZDIAMD(KILAYER1)=-PSNOWGRAN1(IDENT)*XDIAET/XGRAN+              &
01419                          (1.0+PSNOWGRAN1(IDENT)/XGRAN)*(PSNOWGRAN2(IDENT) &
01420                          *XDIAGF/XGRAN+(1.0-PSNOWGRAN2(IDENT)/XGRAN)&
01421                          *XDIAFP)                  
01422         ZSPHERD(KILAYER1)=PSNOWGRAN2(IDENT)/XGRAN                
01423         ZDIAMV(KILAYER1)=PSNOWGRAN2(IVIEU)
01424         ZSPHERV(KILAYER1)=PSNOWGRAN1(IVIEU)/XGRAN
01425         !IF(KILAYER1==1)THEN
01426         !write(*,*) 'ZDD1',ZDIAMD(1),'ZSD1',ZSPHERD(1)
01427         !write(*,*) 'ZDV1',ZDIAMV(1),'ZSV1',ZSPHERV(1)
01428         !ENDIF
01429 !
01430 !        
01431 !
01432         IF(IDENT==KILAYER1) THEN
01433 !code original vincent        ZDIAMN(KILAYER1)= (ZDIAMD(KILAYER1)*PSNOWRHO(IDENT)*&
01434 !code original vincent            (PSNOWDZN(IDENT)-(1.0-ZDELTA)*abs(PSNOWDDZ(KILAYER1))-ZDELTA*      &
01435 !code original vincent            abs(PSNOWDDZ(KILAYER2)))+ZDIAMV(KILAYER1)*PSNOWRHO(IVIEU)*(       &
01436 !code original vincent            (1.0-ZDELTA)*abs(PSNOWDDZ(KILAYER1))-ZDELTA*abs(PSNOWDDZ(KILAYER2))))/&
01437 !code original vincent            ((PSNOWDZN(KILAYER1)-(1.0-ZDELTA)*                                    &
01438 !code original vincent            abs(PSNOWDDZ(KILAYER1))-ZDELTA*abs(PSNOWDDZ(KILAYER2)))*            &
01439 !code original vincent            PSNOWRHO(KILAYER1)+((1.0-ZDELTA)*abs(PSNOWDDZ(KILAYER1))+          &   
01440 !code original vincent            ZDELTA*abs(PSNOWDDZ(KILAYER2)))*PSNOWRHO(KILAYER2))
01441 !
01442 !plm
01443         ZDIAMN(KILAYER1)= (ZDIAMD(KILAYER1)*PSNOWRHO(IDENT)*&
01444              (PSNOWDZN(IDENT)-abs(PSNOWDDZ(ILAYER)))+        &
01445              ZDIAMV(KILAYER1)*PSNOWRHO(IVIEU)*abs(PSNOWDDZ(ILAYER)))/&
01446              ((PSNOWDZN(KILAYER1)-abs(PSNOWDDZ(ILAYER)))*            &
01447              PSNOWRHO(KILAYER1)+abs(PSNOWDDZ(ILAYER))*PSNOWRHO(KILAYER2)) 
01448 !plm
01449 
01450 !
01451 !         
01452 !code original vincent        ZSPHERN(KILAYER1)= (ZSPHERD(KILAYER1)*PSNOWRHO(IDENT)*&
01453 !code original vincent            (PSNOWDZN(IDENT)-(1.0-ZDELTA)*abs(PSNOWDDZ(KILAYER1))-ZDELTA*      &
01454 !code original vincent            abs(PSNOWDDZ(KILAYER2)))+ZSPHERV(KILAYER1)*PSNOWRHO(IVIEU)*(       &
01455 !code original vincent            (1.0-ZDELTA)*abs(PSNOWDDZ(KILAYER1))-ZDELTA*abs(PSNOWDDZ(KILAYER2))))/&
01456 !code original vincent            ((PSNOWDZN(KILAYER1)-(1.0-ZDELTA)*                                    &
01457 !code original vincent            abs(PSNOWDDZ(KILAYER1))-ZDELTA*abs(PSNOWDDZ(KILAYER2)))*            &
01458 !code original vincent            PSNOWRHO(KILAYER1)+((1.0-ZDELTA)*abs(PSNOWDDZ(KILAYER1))+          &   
01459 !code original vincent            ZDELTA*abs(PSNOWDDZ(KILAYER2)))*PSNOWRHO(KILAYER2))
01460 
01461 !plm
01462         ZSPHERN(KILAYER1)= (ZSPHERD(KILAYER1)*PSNOWRHO(IDENT)*&
01463              (PSNOWDZN(IDENT)-abs(PSNOWDDZ(ILAYER)))+          &
01464              ZSPHERV(KILAYER1)*PSNOWRHO(IVIEU)* abs(PSNOWDDZ(ILAYER)))/&
01465              ((PSNOWDZN(KILAYER1)-abs(PSNOWDDZ(ILAYER)))*            &
01466              PSNOWRHO(KILAYER1)+abs(PSNOWDDZ(ILAYER))*PSNOWRHO(KILAYER2)) 
01467 !plm
01468 !
01469 !
01470 !
01471         ELSE
01472 !code original vincent        ZDIAMN(KILAYER1)= (ZDIAMD(KILAYER1)*PSNOWRHO(IDENT)*&
01473 !code original vincent            ((1.0-ZDELTA)*abs(PSNOWDDZ(KILAYER1))+ZDELTA*abs(PSNOWDDZ(KILAYER2)))&
01474 !code original vincent            +ZDIAMV(KILAYER1)*PSNOWRHO(IVIEU)*(PSNOWDZN(IVIEU)-(1.0-ZDELTA)*  & 
01475 !code original vincent            abs(PSNOWDDZ(KILAYER1))-ZDELTA*abs(PSNOWDDZ(KILAYER2))))/&
01476 !code original vincent            ((PSNOWDZN(KILAYER1)-(1.0-ZDELTA)*                          &
01477 !code original vincent            abs(PSNOWDDZ(KILAYER1))-ZDELTA*abs(PSNOWDDZ(KILAYER2)))*    &
01478 !code original vincent            PSNOWRHO(KILAYER1)+((1.0-ZDELTA)*abs(PSNOWDDZ(KILAYER1))+   &
01479 !code original vincent            ZDELTA*abs(PSNOWDDZ(KILAYER2)))*PSNOWRHO(KILAYER2))
01480 !code original vincent!            
01481 !code original vincent         ZSPHERN(KILAYER1)= (ZSPHERD(KILAYER1)*PSNOWRHO(IDENT)*&
01482 !code original vincent            ((1.0-ZDELTA)*abs(PSNOWDDZ(KILAYER1))+ZDELTA*abs(PSNOWDDZ(KILAYER2)))&
01483 !code original vincent            +ZSPHERV(KILAYER1)*PSNOWRHO(IVIEU)*(PSNOWDZN(IVIEU)-(1.0-ZDELTA)* & 
01484 !code original vincent            abs(PSNOWDDZ(KILAYER1))-ZDELTA*abs(PSNOWDDZ(KILAYER2))))/&
01485 !code original vincent            ((PSNOWDZN(KILAYER1)-(1.0-ZDELTA)*                                    &
01486 !code original vincent            abs(PSNOWDDZ(KILAYER1))-ZDELTA*abs(PSNOWDDZ(KILAYER2)))*            &
01487 !code original vincent            PSNOWRHO(KILAYER1)+((1.0-ZDELTA)*abs(PSNOWDDZ(KILAYER1))+          &   
01488 !code original vincent            ZDELTA*abs(PSNOWDDZ(KILAYER2)))*PSNOWRHO(KILAYER2))
01489 
01490 !plm
01491         ZDIAMN(KILAYER1)= (ZDIAMD(KILAYER1)*PSNOWRHO(IDENT)*&
01492              abs(PSNOWDDZ(ILAYER))&
01493              +ZDIAMV(KILAYER1)*PSNOWRHO(IVIEU)*(PSNOWDZN(IVIEU)-abs(PSNOWDDZ(ILAYER))))/&
01494              ((PSNOWDZN(KILAYER1)-abs(PSNOWDDZ(ILAYER)))*    &
01495              PSNOWRHO(KILAYER1)+abs(PSNOWDDZ(ILAYER))*PSNOWRHO(KILAYER2)) 
01496 !            
01497          ZSPHERN(KILAYER1)= (ZSPHERD(KILAYER1)*PSNOWRHO(IDENT)*&
01498              abs(PSNOWDDZ(ILAYER))&
01499              +ZSPHERV(KILAYER1)*PSNOWRHO(IVIEU)*(PSNOWDZN(IVIEU)-abs(PSNOWDDZ(ILAYER))))/&
01500              ((PSNOWDZN(KILAYER1)-abs(PSNOWDDZ(ILAYER)))*            &
01501              PSNOWRHO(KILAYER1)+abs(PSNOWDDZ(ILAYER))*PSNOWRHO(KILAYER2)) 
01502 !plm
01503         ENDIF
01504 !
01505 !
01506 !        
01507         IF(ZDIAMN(KILAYER1)<ZSPHERN(KILAYER1)*XDIAGF+&
01508                     (1-ZSPHERN(KILAYER1))*XDIAFP) THEN 
01509          ZDENT(KILAYER1)=(ZDIAMN(KILAYER1)-(ZSPHERN(KILAYER1)*&
01510              XDIAGF+(1-ZSPHERN(KILAYER1))*XDIAFP))/(XDIAET-&
01511              (ZSPHERN(KILAYER1)*XDIAGF+(1-ZSPHERN(KILAYER1))*XDIAFP)) 
01512          !IF(KILAYER1==1) write(*,*) 'ZDENT',ZDENT(1)   
01513          PSNOWGRAN1N(KILAYER1)=-XGRAN*ZDENT(KILAYER1)
01514          PSNOWGRAN2N(KILAYER1)= XGRAN*ZSPHERN(KILAYER1)
01515         ELSE
01516         PSNOWGRAN1N(KILAYER1)= XGRAN*ZSPHERN(KILAYER1)
01517         PSNOWGRAN2N(KILAYER1)= ZDIAMN(KILAYER1)
01518         ENDIF                       
01519         ENDIF
01520        IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LAGREG',1,ZHOOK_HANDLE)
01521 !
01522 !       3. Update snow grains parameters : GRAN1, GRAN2        
01523 !        PSNOWGRAN1(KILAYER1)=ZSNOWGRAN1(KILAYER1)
01524 !        PSNOWGRAN2(KILAYER1)=ZSNOWGRAN2(KILAYER1)
01525               
01526        
01527        END SUBROUTINE SNOW3LAGREG    
01528 !
01529 !###############################################################################                 
01530 !###############################################################################
01531 !
01532 !       
01533 !ajout EB : ajout des arguments "N" pour faire idem variables d'origine
01534 
01535         SUBROUTINE SNOW3LAVGRAIN(PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST,   &
01536                        ZSNOWGRAN1N, ZSNOWGRAN2N, ZSNOWHISTN,PNDENT, PNVIEU) 
01537 !
01538 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
01539 USE PARKIND1  ,ONLY : JPRB
01540 !
01541 !
01542         IMPLICIT NONE
01543 !
01544 !       0.1 declarations of arguments        
01545 !        
01546         REAL, DIMENSION(:,:), INTENT(INOUT)  :: PSNOWGRAN1,PSNOWGRAN2,  
01547                                                  PSNOWHIST 
01548 !
01549 ! ajout EB
01550         REAL, DIMENSION(:,:), INTENT(INOUT)  :: ZSNOWGRAN1N,ZSNOWGRAN2N,  
01551                                                  ZSNOWHISTN 
01552 
01553         REAL, DIMENSION(:), INTENT(IN)    :: PNDENT, PNVIEU          
01554 !
01555 !
01556 !       0.2 declaration of local variables
01557 !
01558          INTEGER                              :: JI, JJ
01559          INTEGER                              :: INLVLS, INI
01560 !
01561          REAL, DIMENSION(SIZE(PSNOWGRAN1,1)) ::KGRAN1, KGRAN2, KHIST    
01562          REAL(KIND=JPRB) :: ZHOOK_HANDLE
01563 !         
01564 !       0.3 initialization         
01565 !
01566 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LAVGRAIN',0,ZHOOK_HANDLE)
01567 INLVLS    = SIZE(PSNOWGRAN1,2) 
01568 INI       = SIZE(PSNOWGRAN1,1) 
01569 KGRAN1(:) = 0.0
01570 KGRAN2(:) = 0.0
01571 KHIST(:)  = 0.0
01572 !
01573 !      
01574 !         
01575 DO JJ=1,INLVLS
01576    DO JI=1,INI
01577       IF(PNDENT(JI)==0.0 .AND. PNVIEU(JI)==0.0)THEN
01578          KGRAN1(JI)    = 1.0
01579          KGRAN2(JI)    = 1.0 
01580          KHIST(JI)     = 1.0
01581       ELSEIF(PNDENT(JI)>=PNVIEU(JI))THEN      ! more dendritic than non dendritic snow layer
01582          IF(PSNOWGRAN1(JI,JJ)<0.0)THEN
01583             KGRAN1(JI) = KGRAN1(JI)+PSNOWGRAN1(JI,JJ)
01584             KGRAN2(JI) = KGRAN2(JI)+PSNOWGRAN2(JI,JJ)
01585          ENDIF
01586       ELSE                              ! more non dendritic than dendritic snow layers  
01587          IF(PSNOWGRAN1(JI,JJ)>=0)THEN
01588             KGRAN1(JI) = KGRAN1(JI)+PSNOWGRAN1(JI,JJ)
01589             KGRAN2(JI) = KGRAN2(JI)+PSNOWGRAN2(JI,JJ)
01590             KHIST(JI)  = KHIST(JI)+PSNOWHIST(JI,JJ) 
01591          ENDIF
01592       ENDIF
01593    ENDDO
01594 ENDDO
01595 !
01596 DO JJ=1,INLVLS
01597    DO JI=1,INI
01598       IF(PNDENT(JI)==0.0 .AND. PNVIEU(JI)==0.0)THEN
01599          KGRAN1(JI)        =1.0
01600       ELSEIF(PNDENT(JI)>=PNVIEU(JI))THEN
01601          ZSNOWGRAN1N(JI,JJ)= KGRAN1(JI)/PNDENT(JI)   
01602          ZSNOWGRAN2N(JI,JJ)= KGRAN2(JI)/PNDENT(JI)
01603          ZSNOWHISTN(JI,JJ) = 0.0
01604       ELSE
01605          ZSNOWGRAN1N(JI,JJ)= KGRAN1(JI)/PNVIEU(JI)
01606          ZSNOWGRAN2N(JI,JJ)= KGRAN2(JI)/PNVIEU(JI)
01607          ZSNOWHISTN(JI,JJ) = KHIST(JI) /PNVIEU(JI)
01608       ENDIF
01609    ENDDO
01610 ENDDO
01611 !
01612 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LAVGRAIN',1,ZHOOK_HANDLE)
01613 END SUBROUTINE SNOW3LAVGRAIN         
01614 !        
01615 !####################################################################
01616 !####################################################################
01617 !####################################################################
01618 FUNCTION SNOW3LDIFTYP(PGRAIN1,PGRAIN2,PGRAIN3,PGRAIN4) RESULT(ZDIFTYPE)
01619 !
01620 ! à remplacer sans doute par une routine equivalente du nouveau crocus
01621 !*    CALCUL DE LA DIFFERENCE ENTRE DEUX TYPES DE GRAINS
01622 !     VALEUR ENTRE 200 ET 0
01623 !
01624 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
01625 USE PARKIND1  ,ONLY : JPRB
01626 !
01627 IMPLICIT NONE
01628 !*      0.1    declarations of arguments
01629 REAL  :: PGRAIN1, PGRAIN2, PGRAIN3, PGRAIN4, ZDIFTYPE
01630 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01631 
01632 !*      0.2    calcul de la difference entre type de grains
01633 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LDIFTYP',0,ZHOOK_HANDLE)
01634 if (pgrain1==0.and.pgrain2>=0) then
01635 ZDIFTYPE=ABS(PGRAIN1-PGRAIN2)+ABS(PGRAIN3-PGRAIN4)*5.*10000.
01636 elseIF(PGRAIN1>=0.and.PGRAIN2==0) then
01637 ZDIFTYPE=ABS(PGRAIN1-PGRAIN2)+ABS(PGRAIN3-PGRAIN4)*5.*10000.
01638 else if(PGRAIN1<0.and.PGRAIN2==0) then
01639        zdiftype=200.
01640 else if(PGRAIN1==0.and.PGRAIN2<0) then
01641        zdiftype=200.
01642 ELSEIF(PGRAIN1*PGRAIN2.LT.0.) THEN
01643 ZDIFTYPE=200.
01644 ELSEIF(PGRAIN1.LT.0.) THEN
01645 ZDIFTYPE=ABS(PGRAIN1-PGRAIN2)*.5+ABS(PGRAIN3-PGRAIN4)*.5
01646 ELSE
01647 ZDIFTYPE=ABS(PGRAIN1-PGRAIN2)+ABS(PGRAIN3-PGRAIN4)*5.*10000.
01648 ENDIF
01649 IF (LHOOK) CALL DR_HOOK('MODE_SNOW3L:SNOW3LDIFTYP',1,ZHOOK_HANDLE)
01650 END FUNCTION SNOW3LDIFTYP
01651 !####################################################################
01652 !####################################################################
01653 !####################################################################
01654 
01655 END MODULE MODE_SNOW3L
01656