SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/snowcroupgrid.F90
Go to the documentation of this file.
00001 !     #########
00002         SUBROUTINE SNOWCROUPGRID(PSNOW, PSNOWDZ, PSNOWDZN, PSNOWRHO,       &
00003                                    PSNOWHEAT,PSNOWGRAN1, PSNOWGRAN2,         &
00004                                    PSNOWHIST,PSNOWHMASS,OSNOWFALL, PSNOWBIS, &
00005                                    PSNOWDZBIS,                               &
00006                                    PSNOWHEATBIS,PSNOWRHOBIS, PSNOWGRAN1BIS,     &
00007                                    PSNOWGRAN2BIS,PSNOWHISTBIS,PTSTEP,PSR,    &
00008                                    PTA,PVMOD                   )  
00009 !
00010 USE MODD_SNOW_PAR, ONLY : XSNOWCRITD
00011 USE MODE_SNOW3L
00012 !
00013 ! modifs_EB: transformation de grille uniquement si chute de neige, une couche
00014 ! trop petite ou HTN < 3 cm (==>omodifgrid=.T.)
00015 ! modifs pour traiter les grains comme les variables d'origine
00016 !
00017         USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00018         USE PARKIND1  ,ONLY : JPRB
00019 !
00020         IMPLICIT NONE
00021 !
00022 !       0.1 declarations of arguments        
00023 !        
00024         REAL, DIMENSION(:,:), INTENT(INOUT)   :: PSNOWDZ,PSNOWRHO,      
00025                                                    PSNOWDZN, PSNOWHEAT   
00026 !
00027         REAL, DIMENSION(:,:), INTENT(INOUT)   ::  PSNOWDZBIS,           
00028                                   PSNOWHEATBIS,PSNOWRHOBIS, PSNOWGRAN1BIS,   
00029                                   PSNOWGRAN2BIS,PSNOWHISTBIS                                     
00030         REAL, DIMENSION(:,:), INTENT(INOUT)   :: PSNOWGRAN1, PSNOWGRAN2,
00031                                                    PSNOWHIST    
00032 !
00033         REAL, DIMENSION(:), INTENT(INOUT)      :: PSNOW, PSNOWBIS,PSNOWHMASS 
00034 !        
00035         REAL, DIMENSION(:), INTENT(IN)         :: PSR, PTA, PVMOD
00036 !
00037         LOGICAL,DIMENSION(:), INTENT(IN)       :: OSNOWFALL 
00038 !
00039         REAL, INTENT(IN)                       :: PTSTEP 
00040 !
00041 !       0.2 declaration of local variables
00042 !
00043         REAL, DIMENSION(SIZE(PSNOW))           :: ZSUMHEAT, ZSUMSWE,    
00044                                                     ZSNOWMIX_DELTA,       
00045                                                     ZSNOWHMASS      
00046 !
00047         REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) ::ZSNOWHEATN, 
00048                                                  ZSNOWRHON  
00049 ! ajout EB
00050         REAL, DIMENSION(SIZE(PSNOWRHO,1),SIZE(PSNOWRHO,2)) ::ZSNOWGRAN1N,   
00051                                   ZSNOWGRAN2N,ZSNOWHISTN                                                  
00052         REAL, DIMENSION(SIZE(PSNOW))           :: ZNDENT, ZNVIEU
00053 !        
00054         INTEGER                                :: INLVLS
00055         INTEGER JJ1,JJ2
00056 ! ajout EB         
00057         REAL, DIMENSION(SIZE(PSNOW))           :: PSNOWMIN
00058         integer JJ3
00059         logical OMODIFGRID
00060 !
00061         REAL                                   :: ZTSTEP     
00062         REAL(KIND=JPRB) :: ZHOOK_HANDLE
00063 !        
00064 !       0.3 initialization
00065 IF (LHOOK) CALL DR_HOOK('SNOWCROUPGRID',0,ZHOOK_HANDLE)
00066 INLVLS = SIZE(PSNOWDZ(:,:),2)
00067 !        
00068 !       1. update grid for snowpack>3cm
00069 !
00070 !
00071 ! ajout EB
00072 IF((PSNOWGRAN1(1,3)>80.0).and.(PSNOWGRAN2(1,3)>2.E-2))then
00073    WRITE(*,*) 'pb1 psnowgran',PSNOWGRAN1(1,3),PSNOWGRAN2(1,3) &
00074                       , PSNOWRHO(1,3),PSNOWDZ(1,3)  
00075 ENDIF
00076 IF((PSNOWGRAN1BIS(1,3)>80.0).and.(PSNOWGRAN2BIS(1,3)>2.E-2))then
00077    WRITE(*,*) 'pb1 psnowgranBIS',PSNOWGRAN1BIS(1,3),PSNOWGRAN2BIS(1,3)
00078 ENDIF
00079 !
00080 OMODIFGRID=.FALSE.
00081 !         
00082 DO JJ1=1,SIZE(PSNOW(:))
00083 !
00084   IF(OSNOWFALL(JJ1).and.OMODIFGRID) THEN
00085 ! IF(OSNOWFALL(JJ1)) THEN
00086     WRITE(*,*) 'ALERTE'
00087 ! ajout EB
00088     OMODIFGRID=.TRUE.
00089     !
00090     ZTSTEP=PTSTEP/10.0
00091     PSNOWHMASS(JJ1)=0     
00092     DO JJ2=1,10
00093        PSNOWHMASS(JJ1)=0
00094        CALL SNOWCROADDSNOW(ZTSTEP,PSR(JJ1),PTA(JJ1),PVMOD(JJ1),&
00095                 PSNOW(JJ1),PSNOWRHO(JJ1,1),PSNOWDZ(JJ1,1),PSNOWHEAT(JJ1,1),&
00096                 ZSNOWHMASS(JJ1),PSNOWGRAN1(JJ1,1),PSNOWGRAN2(JJ1,1),&
00097                 PSNOWHIST(JJ1,1),INLVLS)  
00098        PSNOWHMASS(JJ1)=PSNOWHMASS(JJ1)+ZSNOWHMASS(JJ1)      
00099        ZSNOWRHON(JJ1,:)  = PSNOWRHO(JJ1,:)
00100        ZSNOWHEATN(JJ1,:) = PSNOWHEAT(JJ1,:)      
00101 !ajout EB           
00102        ZSNOWGRAN1N(JJ1,:) = PSNOWGRAN1(JJ1,:)      
00103        ZSNOWGRAN2N(JJ1,:) = PSNOWGRAN2(JJ1,:)      
00104        ZSNOWHISTN(JJ1,:) = PSNOWHIST(JJ1,:)      
00105 
00106        CALL SNOW3LGRID(PSNOWDZN(JJ1,:), PSNOW(JJ1))
00107        CALL SNOWCROTRANSF_1D(PSNOW(JJ1),PSNOWDZ(JJ1,:),PSNOWDZN(JJ1,:),&
00108                 ZSNOWRHON(JJ1,:),ZSNOWHEATN(JJ1,:),ZSNOWGRAN1N(JJ1,:),     &
00109                 ZSNOWGRAN2N(JJ1,:),ZSNOWHISTN(JJ1,:))            
00110     END DO
00111 !
00112   ELSE 
00113 !
00114     ZSNOWRHON(JJ1,:)  = PSNOWRHOBIS(JJ1,:)
00115     ZSNOWHEATN(JJ1,:) = PSNOWHEATBIS(JJ1,:)
00116 !ajout EB           
00117     ZSNOWGRAN1N(JJ1,:) = PSNOWGRAN1BIS(JJ1,:)      
00118     ZSNOWGRAN2N(JJ1,:) = PSNOWGRAN2BIS(JJ1,:)      
00119     ZSNOWHISTN(JJ1,:) = PSNOWHISTBIS(JJ1,:)      
00120 ! ajout EB         
00121 ! on change de grille seulement si il y a une trop petite couche
00122     PSNOWMIN(JJ1)=PSNOW(JJ1)
00123 !
00124     DO JJ3=1, INLVLS
00125       IF (PSNOWDZ(JJ1,JJ3) < PSNOWMIN(JJ1)) PSNOWMIN(JJ1)=PSNOWDZ(JJ1,JJ3)
00126     ENDDO
00127 !
00128     IF (PSNOWMIN(JJ1) < MIN(0.001,PSNOW(JJ1)/(2*INLVLS)) &
00129         .OR.PSR(JJ1) > 0.0) then  
00130       OMODIFGRID=.TRUE.
00131 !        write (*,*) 'avant recalcul: snowmin=',psnowmin(jj1),'psr=', psr(jj1) 
00132 !       write (*,*) PSNOW(JJ1), PSNOWBIS(JJ1)
00133 !       write (*,*) PSNOWRHO(JJ1,1), PSNOWRHOBIS(JJ1,1)
00134 !       write (*,*) PSNOWHEAT(JJ1,1), PSNOWHEATBIS(JJ1,1)
00135 !       write (*,*) PSNOWDZ(JJ1,1), PSNOWDZBIS(JJ1,1)
00136       CALL SNOW3LGRID(PSNOWDZN(JJ1,:),PSNOWBIS(JJ1))
00137 
00138       WRITE(*,*) 'psr, psnowmin,psnow', PSR(JJ1), PSNOWMIN(JJ1),PSNOW(JJ1)
00139 !       CALL SNOW3LTRANSF_1D(PSNOWBIS(JJ1),PSNOWDZBIS(JJ1,:),PSNOWDZN(JJ1,:),  &
00140 !                      ZSNOWRHON(JJ1,:),ZSNOWHEATN(JJ1,:),ZSNOWGRAN1N(JJ1,:),  &
00141 !                      ZSNOWGRAN2N(JJ1,:),ZSNOWHISTN(JJ1,:),OSNOW_METAMO)
00142       CALL SNOWNLTRANSFGRID_1D(PSNOWBIS(JJ1),PSNOWDZBIS(JJ1,:),PSNOWDZN(JJ1,:),  &
00143                          ZSNOWRHON(JJ1,:),ZSNOWHEATN(JJ1,:),ZSNOWGRAN1N(JJ1,:),  &
00144                          ZSNOWGRAN2N(JJ1,:),ZSNOWHISTN(JJ1,:))  
00145 !       write(*,*) 'après'
00146 !       write (*,*) PSNOW(JJ1), PSNOWBIS(JJ1)
00147 !       write (*,*) PSNOWRHO(JJ1,1), PSNOWRHOBIS(JJ1,1)
00148 !       write (*,*) PSNOWHEAT(JJ1,1), PSNOWHEATBIS(JJ1,1)
00149 !       write (*,*) PSNOWDZ(JJ1,1), PSNOWDZBIS(JJ1,1)
00150     ENDIF
00151 !
00152     PSNOW(JJ1)       = PSNOWBIS(JJ1)  
00153     PSNOWRHO(JJ1,:)  = PSNOWRHOBIS(JJ1,:)
00154     PSNOWHEAT(JJ1,:) = PSNOWHEATBIS(JJ1,:) 
00155     PSNOWDZ(JJ1,:)   = PSNOWDZBIS(JJ1,:)                       
00156 !          
00157     PSNOWGRAN1(JJ1,:) = PSNOWGRAN1BIS(JJ1,:)
00158     PSNOWGRAN2(JJ1,:) = PSNOWGRAN2BIS(JJ1,:) 
00159     PSNOWHIST(JJ1,:)  = PSNOWHISTBIS(JJ1,:)
00160 !
00161   ENDIF  
00162 
00163   IF((PSNOWGRAN1(1,3)>80.0).AND.(PSNOWGRAN2(1,3)>2.E-2)) THEN
00164     WRITE(*,*) 'pb2 psnowgran',PSNOWGRAN1(1,3),PSNOWGRAN2(1,3)
00165   ENDIF
00166   IF((PSNOWGRAN1BIS(1,3)>80.0).AND.(PSNOWGRAN2BIS(1,3)>2.E-2)) THEN
00167     WRITE(*,*) 'pb2 psnowgranBIS',PSNOWGRAN1BIS(1,3),PSNOWGRAN2BIS(1,3)
00168   ENDIF
00169   IF((ZSNOWGRAN1N(1,3)>80.0).and.(ZSNOWGRAN2N(1,3)>2.E-2)) THEN
00170     WRITE(*,*) 'pb2 psnowgranN',ZSNOWGRAN1N(1,3),ZSNOWGRAN2N(1,3) &
00171         , ZSNOWHISTN(1,3),PSNOW(1),inlvls  
00172   ENDIF
00173 !
00174 END DO       
00175 !
00176 !      2. update grid for thin snowpack<3 cm 
00177 !
00178 !  
00179 ZSUMHEAT(:)       = 0.0
00180 ZSUMSWE(:)        = 0.0
00181 ZSNOWMIX_DELTA(:) = 0.0
00182 ZNDENT(:)         = 0.0
00183 ZNVIEU(:)         = 0.0      
00184 !        
00185 DO JJ1=1, SIZE(PSNOWHEAT,1)
00186   IF(PSNOW(JJ1)<XSNOWCRITD)THEN
00187 ! ajout EB                
00188     OMODIFGRID=.TRUE.
00189     DO JJ2=1,INLVLS
00190       ZSUMHEAT(JJ1)       = ZSUMHEAT(JJ1) + ZSNOWHEATN(JJ1,JJ2)
00191       ZSUMSWE(JJ1)        = ZSUMSWE(JJ1)  + ZSNOWRHON (JJ1,JJ2)* PSNOWDZ(JJ1,JJ2)                     
00192       ZSNOWMIX_DELTA(:) = 1.0  
00193                
00194       IF(PSNOWGRAN1(JJ1,JJ2)<0)THEN       ! Dendritic snow
00195          ZNDENT(JJ1)       = ZNDENT(JJ1)+1.0
00196       ELSE                             ! Non dendritic snow
00197          ZNVIEU(JJ1)       = ZNVIEU(JJ1)+1.0
00198       ENDIF
00199     END DO
00200   ENDIF
00201 END DO
00202 !
00203 ! Average properties for grains : determine which grain type is the most
00204 ! important in the snowpack.
00205 !IF(OSNOW_METAMO)THEN
00206 ! modifs EB pour changer variables de la subroutine suivante        
00207 ! IF((PSNOWGRAN1(1,3)>80.0).and.(PSNOWGRAN2(1,3)>2.E-2))then
00208 !       write(*,*) 'pb2b psnowgran',PSNOWGRAN1(1,3),PSNOWGRAN2(1,3) &
00209 !              , PSNOWHIST(1,3),PSNOW(1),zndent(1),znvieu(1),inlvls
00210 !endif
00211 ! ajout EB suppression temporaire de cet appel pour vérif TRANSFGRID 
00212   CALL SNOW3LAVGRAIN(PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST, &
00213                       ZSNOWGRAN1N, ZSNOWGRAN2N, ZSNOWHISTN,ZNDENT, ZNVIEU)   
00214 !   IF((ZSNOWGRAN1N(1,3)>80.0).and.(ZSNOWGRAN2N(1,3)>2.E-2))then
00215 !         write(*,*) 'pb2b psnowgranN',ZSNOWGRAN1N(1,3),ZSNOWGRAN2N(1,3) &
00216 !                , ZSNOWHISTN(1,3),PSNOW(1),zndent(1),znvieu(1),inlvls
00217 ! endif
00218 !ENDIF
00219 !
00220 !IF(ZSNOWMIX_DELTA(1)>0.)THEN
00221  !       write(*,*) 'PG1_1',PSNOWGRAN1(1,1),'PG2_1',PSNOWGRAN2(1,1)
00222 !ENDIF
00223 !
00224 DO JJ1=1,INLVLS
00225    ZSNOWHEATN(:,JJ1) = ZSNOWMIX_DELTA(:)*(ZSUMHEAT(:)/INLVLS)  + &
00226                         (1.0-ZSNOWMIX_DELTA(:))*ZSNOWHEATN(:,JJ1)  
00227 !
00228    PSNOWDZN(:,JJ1)   = ZSNOWMIX_DELTA(:)*(PSNOW(:)/INLVLS)     + &
00229                         (1.0-ZSNOWMIX_DELTA(:))*PSNOWDZN(:,JJ1)  
00230 !
00231    ZSNOWRHON(:,JJ1)  = ZSNOWMIX_DELTA(:)*(ZSUMSWE(:)/PSNOW(:)) + &
00232                         (1.0-ZSNOWMIX_DELTA(:))*ZSNOWRHON(:,JJ1)  
00233 ENDDO
00234 !                      
00235 !     3. Update mass (density and thickness) and heat:
00236 !
00237 ! ajout EB pour ne faire cet update que pour les couches fines 
00238   IF((ZSNOWGRAN1N(1,3)>80.0).and.(ZSNOWGRAN2N(1,3)>2.E-2))then
00239         write(*,*) 'pb3 psnowgran',ZSNOWGRAN1N(1,3),ZSNOWGRAN2N(1,3)
00240   ENDIF
00241   IF((PSNOWGRAN1BIS(1,3)>80.0).and.(PSNOWGRAN2BIS(1,3)>2.E-2))then
00242         write(*,*) 'pb3 psnowgranBIS',PSNOWGRAN1BIS(1,3),PSNOWGRAN2BIS(1,3)
00243   ENDIF
00244 IF(OMODIFGRID) THEN
00245 ! write(*,*) omodifgrid, psnowmin(1), psr(1), zsnowmix_delta(1)        
00246   PSNOWRHO(:,:)   = ZSNOWRHON(:,:)
00247   PSNOWDZ(:,:)    = PSNOWDZN(:,:)
00248   PSNOWHEAT(:,:)  = ZSNOWHEATN(:,:) 
00249 
00250   PSNOWGRAN1(:,:) = ZSNOWGRAN1N(:,:)
00251   PSNOWGRAN2(:,:) = ZSNOWGRAN2N(:,:) 
00252   PSNOWHIST(:,:)  = ZSNOWHISTN(:,:)
00253 
00254 ENDIF
00255 !
00256 ! 
00257 !#############################################################
00258 !#############################################################
00259 !#############################################################
00260 !#############################################################
00261 !
00262 IF (LHOOK) CALL DR_HOOK('SNOWCROUPGRID',1,ZHOOK_HANDLE)
00263 CONTAINS
00264 !
00265 !
00266         SUBROUTINE SNOWCROADDSNOW(PTSTEP,PSR,PTA,PVMOD,          &
00267                      PSNOW,PSNOWRHO,PSNOWDZ,PSNOWHEAT,PSNOWHMASS, &
00268                      PSNOWGRAN1,PSNOWGRAN2,PSNOWHIST,KNLVLS)  
00269 !!    PURPOSE
00270 !!    -------
00271 !     Add snow to snowpack 
00272 !     Update mass and heat content of uppermost layer.
00273 !
00274 !
00275 USE MODD_CSTS,     ONLY : XLMTT, XTT, XCI
00276 USE MODD_SNOW_PAR, ONLY : XRHOSMIN_ES, XSNOWDMIN, XANSMAX,XSNOWCRITD
00277 USE MODD_SNOW_METAMO
00278 !
00279 USE MODE_SNOW3L
00280 !
00281 IMPLICIT NONE
00282 !
00283 !*      0.1    declarations of arguments
00284 !
00285 REAL, INTENT(IN)                     :: PTSTEP
00286 !
00287 REAL, INTENT(IN)                     :: PSR, PTA, PVMOD
00288 !
00289 REAL, INTENT(INOUT)                  :: PSNOW
00290 !
00291 REAL, INTENT (INOUT)                 :: PSNOWRHO, PSNOWDZ, PSNOWHEAT
00292 !
00293 REAL, INTENT(OUT)                    :: PSNOWHMASS
00294 !
00295 REAL, INTENT(INOUT)                   :: PSNOWGRAN1, PSNOWGRAN2, PSNOWHIST
00296 !   
00297 INTEGER                               :: KNLVLS  
00298 !
00299 !*      0.2    declarations of local variables
00300 !
00301 INTEGER JJ
00302 !
00303 !
00304 REAL                                :: ZSNOWFALL, ZRHOSNEW,        
00305                                          ZSNOW, ZSNOWTEMP,           
00306                                          ZSNOWFALL_DELTA, ZSCAP,     
00307                                          ZSDEN, ZSPHE, ZDIAMD,ZDIAMV,
00308                                          ZDIAMN,ZSPHERD,ZSPHERV,     
00309                                          ZSPHERN, ZDENT   
00310 !
00311 ! ISBA-ES CROCUS (Pahaut 1976): snowfall density coefficients:
00312 !
00313 REAL, PARAMETER                      :: ZSNOWFALL_A_SN = 109.0  ! kg/m3
00314 REAL, PARAMETER                      :: ZSNOWFALL_B_SN =   6.0  ! kg/(m3 K)
00315 REAL, PARAMETER                      :: ZSNOWFALL_C_SN =  26.0  ! kg/(m7/2 s1/2)
00316 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00317 !
00318 !-------------------------------------------------------------------------------
00319 !
00320 ! 0. Initialize:
00321 ! ------------------
00322 !
00323 IF (LHOOK) CALL DR_HOOK('SNOWCROADDSNOW',0,ZHOOK_HANDLE)
00324 ZRHOSNEW        = XRHOSMIN_ES
00325 ZSNOWFALL       = 0.0
00326 ZSCAP           = 0.0
00327 ZSNOW           = PSNOW
00328 ZSDEN           = 0.0
00329 ZSPHE           = 0.0
00330 !
00331 PSNOWHMASS      = 0.0
00332 !
00333 !
00334 ! 1. Add snow into snowpack:
00335 ! --------------------------
00336 !
00337 !
00338 ! Heat content of newly fallen snow (J/m2):
00339 ! NOTE for now we assume the snowfall has
00340 ! the temperature of the snow surface upon reaching the snow.
00341 ! This is done as opposed to using the air temperature since
00342 ! this flux is quite small and has little to no impact
00343 ! on the time scales of interest. If we use the above assumption
00344 ! then, then the snowfall advective heat flux is zero.
00345 !
00346 ZSNOWTEMP    = XTT
00347 !
00348 ZSCAP         = PSNOWRHO*XCI
00349 ZSNOWTEMP     = XTT + (PSNOWHEAT +                              &
00350                   XLMTT*PSNOWRHO*PSNOWDZ)/                        &
00351                   (ZSCAP*MAX(XSNOWDMIN/KNLVLS,PSNOWDZ))  
00352 ZSNOWTEMP     = MIN(XTT, ZSNOWTEMP)
00353 !
00354 !
00355 !
00356 PSNOWHMASS = PSR*(XCI*(ZSNOWTEMP-XTT)-XLMTT)*PTSTEP
00357 !
00358 ! Snowfall density: Following CROCUS (Pahaut 1976)
00359 !
00360 ZRHOSNEW     = MAX(XRHOSMIN_ES, ZSNOWFALL_A_SN + ZSNOWFALL_B_SN*(PTA-XTT)+         &
00361                    ZSNOWFALL_C_SN*SQRT(PVMOD))  
00362 !
00363 ZSDEN      = MAX(MIN(XNDEN1*PVMOD-XNDEN2,XNDEN3),-XGRAN)
00364 ZSPHE      = MIN(MAX(XNSPH1*PVMOD+XNSPH2,XNSPH3),XNSPH4)       
00365 !
00366 ! Augment total pack depth:
00367 !
00368 ZSNOWFALL  = PSR*PTSTEP/ZRHOSNEW    ! snowfall thickness (m)
00369 !
00370 !
00371 PSNOW      = PSNOW + ZSNOWFALL
00372 !
00373 ! Fresh snowfall changes the snowpack
00374 ! density, increases the total liquid water
00375 ! equivalent: in uppermost snow layer:
00376 !
00377     IF(PSNOWGRAN1<0.0)THEN
00378         PSNOWGRAN1 = (PSNOWDZ*PSNOWRHO*PSNOWGRAN1 + ZSNOWFALL*ZRHOSNEW*ZSDEN)/     &
00379                       (PSNOWDZ*PSNOWRHO+ZSNOWFALL*ZRHOSNEW)  
00380         PSNOWGRAN2 = (PSNOWDZ*PSNOWRHO*PSNOWGRAN2 + ZSNOWFALL*ZRHOSNEW*ZSPHE)/     &
00381                       (PSNOWDZ*PSNOWRHO+ZSNOWFALL*ZRHOSNEW)  
00382     ELSEIF(PSNOWGRAN1>=0.0)THEN
00383         ZDIAMD   = -ZSDEN*XDIAET/XGRAN+(1+ZSDEN/XGRAN)*(ZSPHE &
00384                           *XDIAGF/XGRAN+(1-ZSPHE/XGRAN)*XDIAFP)    
00385         ZSPHERD  = ZSPHE/XGRAN                
00386         ZDIAMV   = PSNOWGRAN2
00387         ZSPHERV  = PSNOWGRAN1/XGRAN
00388         ZDIAMN   = (ZDIAMD*ZRHOSNEW*ZSNOWFALL+ZDIAMV*PSNOWDZ*PSNOWRHO)/ &
00389                       (PSNOWDZ*PSNOWRHO+ZSNOWFALL*ZRHOSNEW)  
00390         ZSPHERN  = (ZSPHERD*ZRHOSNEW*ZSNOWFALL+ZSPHERV*PSNOWDZ*PSNOWRHO)/ &
00391                       (PSNOWDZ*PSNOWRHO+ZSNOWFALL*ZRHOSNEW)      
00392         IF(ZDIAMN<ZSPHERN*XDIAGF+(1-ZSPHERN)*XDIAFP)THEN
00393            ZDENT=(ZDIAMN-(ZSPHERN*XDIAGF+(1-ZSPHERN)*XDIAFP))/ &
00394                   (XDIAET-(ZSPHERN*XDIAGF+(1-ZSPHERN)*XDIAFP))  
00395             PSNOWGRAN1 = -XGRAN*ZDENT
00396             PSNOWGRAN2 =  XGRAN*ZSPHERN  
00397         ELSE
00398             PSNOWGRAN1 = XGRAN*ZSPHERN
00399             PSNOWGRAN2 = ZDIAMN
00400         ENDIF       
00401      ENDIF
00402      PSNOWHIST  = 0.0          
00403   
00404    PSNOWRHO   = (PSNOWDZ*PSNOWRHO + ZSNOWFALL*ZRHOSNEW)/     &
00405                      (PSNOWDZ+ZSNOWFALL)  
00406    PSNOWDZ    = PSNOWDZ + ZSNOWFALL
00407 !
00408 ! Add energy of snowfall to snowpack:
00409 ! Update heat content (J/m2) (therefore the snow temperature
00410 ! and liquid content):
00411 !
00412    PSNOWHEAT  = PSNOWHEAT + PSNOWHMASS
00413 IF (LHOOK) CALL DR_HOOK('SNOWCROADDSNOW',1,ZHOOK_HANDLE)
00414 !
00415 !
00416 END SUBROUTINE SNOWCROADDSNOW
00417 !
00418 !
00419 !################################################################################
00420 !################################################################################
00421 !################################################################################
00422 !
00423 !
00424 SUBROUTINE SNOWCROTRANSF_1D(PSNOW,PSNOWDZ,PSNOWDZN,                      &
00425                                   PSNOWRHO,PSNOWHEAT,PSNOWGRAN1,          &
00426                                   PSNOWGRAN2, PSNOWHIST)  
00427 !
00428 !!    PURPOSE
00429 !!    -------
00430 !     Snow mass and heat redistibution due to grid thickness
00431 !     configuration resetting. Total mass and heat content
00432 !     of the overall snowpack unchanged/conserved within this routine.
00433 !
00434 !
00435 USE MODD_SNOW_PAR, ONLY : XSNOWCRITD
00436 USE MODD_SNOW_METAMO
00437 USE MODE_SNOW3L
00438 !
00439 IMPLICIT NONE
00440 !
00441 !
00442 !*      0.1    declarations of arguments
00443 !
00444 REAL, INTENT(IN)                  :: PSNOW
00445 !
00446 REAL, DIMENSION(:), INTENT(INOUT) :: PSNOWHEAT, PSNOWRHO, PSNOWDZ, 
00447                                          PSNOWDZN, PSNOWGRAN1, PSNOWGRAN2, 
00448                                          PSNOWHIST    
00449 !
00450 !*      0.2    declarations of local variables
00451 !
00452 INTEGER :: JJ, KILAYER1, KILAYER2
00453 !
00454 INTEGER :: INLVLS
00455 !
00456 REAL, DIMENSION(SIZE(PSNOWRHO,1)) :: ZSNOWRHON,ZSNOWGRAN1,ZSNOWGRAN2,     
00457                                          ZSNOWHEATN,ZSNOWHIST                                         
00458 !
00459 REAL, DIMENSION(SIZE(PSNOWRHO,1)-1) :: ZSNOWZO, ZSNOWZN, ZSNOWDDZ, ZDELTA  
00460 ! ajout EB
00461 !integer :: jjj
00462 real :: htn_new, htn_old
00463 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00464 
00465 !
00466 !-------------------------------------------------------------------------------
00467 !
00468 ! 0. Initialization:
00469 ! ------------------
00470 !
00471 IF (LHOOK) CALL DR_HOOK('SNOWCROTRANSF_1D',0,ZHOOK_HANDLE)
00472 INLVLS = SIZE(PSNOWDZ(:),1)
00473 
00474 ZSNOWGRAN1(:)=PSNOWGRAN1(:)
00475 ZSNOWGRAN2(:)=PSNOWGRAN2(:)
00476 ZSNOWHIST(:)=PSNOWHIST(:)
00477 !ajout EB pour vérifier égalité des HTN
00478 
00479 htn_new=0.
00480 htn_old=0.
00481 do jj=1,inlvls
00482 htn_new=htn_new+PSNOWDZ(JJ)
00483 htn_old=htn_old+PSNOWDZN(JJ)
00484 enddo
00485 if (abs(htn_new-htn_old) > 1.E-7) write(*,*) 'difhtn:', htn_new, htn_old
00486 !
00487 !
00488 ! 1. Calculate vertical grid depths (m):
00489 ! --------------------------------------
00490 !
00491 ZSNOWZO(1)     = PSNOWDZ(1)
00492 ZSNOWZN(1)     = PSNOWDZN(1)
00493 !
00494 DO JJ=2,INLVLS-1
00495    ZSNOWZO(JJ) = ZSNOWZO(JJ-1) + PSNOWDZ(JJ)
00496    ZSNOWZN(JJ) = ZSNOWZN(JJ-1) + PSNOWDZN(JJ)
00497 ENDDO
00498 !
00499 ! 2. Calculate thickness changes (m):
00500 ! -----------------------------------
00501 !
00502 ZSNOWDDZ(:)    = ZSNOWZN(:) - ZSNOWZO(:)
00503 !
00504 ! Calculate the delta function:
00505 !
00506 ZDELTA(:)    = 0.0
00507 WHERE(ZSNOWDDZ(:) > 0.0) ZDELTA(:) = 1.0
00508 !
00509 !
00510 ! 3. Calculate mass and heat transfers due to grid adjustment/changes:
00511 ! --------------------------------------------------------------------
00512 ! Do transfers at boundaries first:
00513 ! Upper layer:
00514 !
00515 !write(*,*) 'AV_AGREG1', PSNOWGRAN1(1)
00516 IF(ZDELTA(1)==1.0)THEN
00517         KILAYER1=1
00518         KILAYER2=2
00519         CALL SNOW3LAGREG(PSNOWDZN,PSNOWDZ,PSNOWRHO,PSNOWGRAN1,PSNOWGRAN2,    &
00520                           PSNOWHIST,ZSNOWGRAN1,ZSNOWGRAN2,ZSNOWHIST,            &
00521                           KILAYER1,KILAYER2,ZSNOWDDZ)  
00522 
00523 ENDIF 
00524 !write(*,*) 'AP_AGREG1', PSNOWGRAN1(1)                       
00525 !                        
00526 ZSNOWRHON(1)  = ( PSNOWDZ(1)*PSNOWRHO(1) + ZSNOWDDZ(1)*      &
00527                     (     ZDELTA(1) *PSNOWRHO(2) +                 &
00528                      (1.0-ZDELTA(1))*PSNOWRHO(1) ) )               &
00529                     /PSNOWDZN(1)                  
00530 
00531 !
00532 ZSNOWHEATN(1) = PSNOWHEAT(1) + ZSNOWDDZ(1)*                    &
00533                     ((    ZDELTA(1) *PSNOWHEAT(2)/PSNOWDZ(2)) +  &
00534                     ((1.0-ZDELTA(1))*PSNOWHEAT(1)/PSNOWDZ(1)) )  
00535 ! 
00536 !IF(ZSNOWGRAN1(1)>99.OR.ZSNOWGRAN1(1)<-99.)THEN
00537 !     write(*,*) 'ZG1',ZSNOWGRAN1(1)
00538 !     read(*,*)
00539 !ENDIF           
00540 ! Lowest layer:
00541 !
00542 IF(ZDELTA(INLVLS-1)==0.0)THEN
00543         KILAYER1=INLVLS
00544         KILAYER2=INLVLS-1
00545         CALL SNOW3LAGREG(PSNOWDZN,PSNOWDZ,PSNOWRHO,PSNOWGRAN1,PSNOWGRAN2,    &
00546                           PSNOWHIST,ZSNOWGRAN1,ZSNOWGRAN2,ZSNOWHIST,           &
00547                           KILAYER1,KILAYER2,ZSNOWDDZ)  
00548 ENDIF 
00549 !
00550 ZSNOWRHON(INLVLS)  = ( PSNOWDZ(INLVLS)*PSNOWRHO(INLVLS) -      &
00551                            ZSNOWDDZ(INLVLS-1)*                       &
00552                     (     ZDELTA(INLVLS-1) *PSNOWRHO(INLVLS) +     &
00553                      (1.0-ZDELTA(INLVLS-1))*PSNOWRHO(INLVLS-1) ) ) &
00554                     /PSNOWDZN(INLVLS)  
00555 !
00556 
00557 ZSNOWHEATN(INLVLS) = PSNOWHEAT(INLVLS) - ZSNOWDDZ(INLVLS-1)*   &
00558                     ((    ZDELTA(INLVLS-1) *PSNOWHEAT(INLVLS)/     &
00559                           PSNOWDZ(INLVLS)) +                         &
00560                     ((1.0-ZDELTA(INLVLS-1))*PSNOWHEAT(INLVLS-1)    &
00561                           /PSNOWDZ(INLVLS-1)) )  
00562 !
00563 !
00564 ! Update interior layer mass and heat :
00565 !
00566 !write(*,*) 'AV_AGREG8', PSNOWGRAN1(8),'ZD7',ZDELTA(7),'ZD9',ZDELTA(9)
00567 DO JJ=2,INLVLS-1
00568  IF(ZDELTA(JJ-1)==0.0)THEN
00569          KILAYER1=JJ
00570          KILAYER2=JJ-1
00571          CALL SNOW3LAGREG(PSNOWDZN,PSNOWDZ,PSNOWRHO,PSNOWGRAN1,PSNOWGRAN2,    &
00572                           PSNOWHIST,ZSNOWGRAN1,ZSNOWGRAN2,ZSNOWHIST,             &
00573                           KILAYER1,KILAYER2,ZSNOWDDZ)  
00574 !           if (zsnowgran1(2) > 900.or. psnowgran1(2)>900.) then
00575 !                   write (*,*) 'agr',PSNOWGRAN1(2),PSNOWGRAN1(2), &
00576 !                   zSNOWGRAN1(2),zSNOWGRAN1(2), KILAYER1,KILAYER2
00577 !                   write(*,*) 'dzold:',(psnowdz(jjj),jjj=1, INLVLS)
00578 !                   write(*,*) 'dznew:',(psnowdzn(jjj),jjj=1, INLVLS)
00579 !                   stop
00580 !           endif
00581  ENDIF
00582 !
00583 !code initial vincent IF(OSNOW_METAMO.AND.ZDELTA(JJ+1)==1.0)THEN
00584 !code initial vincent         KILAYER1=JJ
00585 !code initial vincent         KILAYER2=JJ+1
00586 !code initial vincent         CALL SNOW3LAGREG(PSNOWDZN,PSNOWDZ,PSNOWRHO,PSNOWGRAN1,PSNOWGRAN2,    &
00587 !code initial vincent                        PSNOWHIST,ZSNOWGRAN1,ZSNOWGRAN2,ZSNOWHIST,            &
00588 !code initial vincent                        KILAYER1,KILAYER2,ZSNOWDDZ)
00589 !code initial vincent ENDIF
00590 
00591 !plm
00592  IF(ZDELTA(JJ)==1.0)THEN
00593          KILAYER1=JJ-1
00594          KILAYER2=JJ
00595          CALL SNOW3LAGREG(PSNOWDZN,PSNOWDZ,PSNOWRHO,PSNOWGRAN1,PSNOWGRAN2,    &
00596                           PSNOWHIST,ZSNOWGRAN1,ZSNOWGRAN2,ZSNOWHIST,            &
00597                           KILAYER1,KILAYER2,ZSNOWDDZ)  
00598  ENDIF
00599 !plm
00600 !
00601  ZSNOWRHON(JJ)  = ( PSNOWDZ(JJ)*PSNOWRHO(JJ)                            &
00602                       - ZSNOWDDZ(JJ-1)*                                   &
00603                     (     ZDELTA(JJ-1) *PSNOWRHO(JJ) +                    &
00604                      (1.0-ZDELTA(JJ-1))*PSNOWRHO(JJ-1) )                  &
00605                       + ZSNOWDDZ(JJ)*                                     &
00606                     (     ZDELTA(JJ)   *PSNOWRHO(JJ+1) +                  &
00607                      (1.0-ZDELTA(JJ))  *PSNOWRHO(JJ) ) )                  &
00608                     /PSNOWDZN(JJ)  
00609                    
00610 !
00611  ZSNOWHEATN(JJ) = PSNOWHEAT(JJ)                                         &
00612                       - ZSNOWDDZ(JJ-1)*                                   &
00613                     ((    ZDELTA(JJ-1) *PSNOWHEAT(JJ)                     &
00614                           /PSNOWDZ(JJ)) +                                 &
00615                     ((1.0-ZDELTA(JJ-1))*PSNOWHEAT(JJ-1)                   &
00616                           /PSNOWDZ(JJ-1)) )                               &
00617                       + ZSNOWDDZ(JJ)*                                     &
00618                     ((    ZDELTA(JJ) *PSNOWHEAT(JJ+1)                     &
00619                           /PSNOWDZ(JJ+1)) +                               &
00620                     ((1.0-ZDELTA(JJ))*PSNOWHEAT(JJ)                       &
00621                           /PSNOWDZ(JJ)) )  
00622 ENDDO
00623 !write(*,*) 'AP_AGREG8', PSNOWGRAN1(8)
00624 !
00625 !
00626 ! 5. Update mass (density and thickness) and heat:
00627 ! ------------------------------------------------
00628 !
00629 PSNOWRHO(:)   = ZSNOWRHON(:)
00630 !PSNOWDZ(:)    = PSNOWDZN(:)
00631 PSNOWHEAT(:)  = ZSNOWHEATN(:)
00632 PSNOWGRAN1(:) = ZSNOWGRAN1(:)
00633 PSNOWGRAN2(:) = ZSNOWGRAN2(:)
00634 PSNOWHIST(:) =  ZSNOWHIST(:)
00635         IF (LHOOK) CALL DR_HOOK('SNOWCROTRANSF_1D',1,ZHOOK_HANDLE)
00636 !
00637 !
00638 !-------------------------------------------------------------------------------
00639 !
00640         END SUBROUTINE SNOWCROTRANSF_1D
00641 !################################################################################
00642 !################################################################################
00643 !################################################################################
00644 !
00645 !
00646 SUBROUTINE SNOWNLTRANSFGRID_1D(PSNOW,PSNOWDZ,PSNOWDZN,                      &
00647                                   PSNOWRHO,PSNOWHEAT,PSNOWGRAN1,          &
00648                                   PSNOWGRAN2, PSNOWHIST)  
00649 !
00650 !!    PURPOSE
00651 !!    -------
00652 !     Snow mass and heat redistibution due to grid thickness
00653 !     configuration resetting. Total mass and heat content
00654 !     of the overall snowpack unchanged/conserved within this routine.
00655 !
00656 !
00657 USE MODD_SNOW_PAR, ONLY : XSNOWCRITD
00658 USE MODD_SNOW_METAMO
00659 USE MODE_SNOW3L
00660 !
00661 IMPLICIT NONE
00662 !
00663 !
00664 !*      0.1    declarations of arguments
00665 !
00666 REAL, INTENT(IN)                  :: PSNOW
00667 !
00668 REAL, DIMENSION(:), INTENT(INOUT) :: PSNOWHEAT, PSNOWRHO, PSNOWDZ, 
00669                                          PSNOWDZN, PSNOWGRAN1, PSNOWGRAN2, 
00670                                          PSNOWHIST  
00671 !
00672 !*      0.2    declarations of local variables
00673 !
00674 INTEGER JJ, KILAYER1, KILAYER2
00675 !
00676 INTEGER                             :: INLVLS,INLVLS_OLD, INLVLS_NEW
00677 !
00678 REAL, DIMENSION(SIZE(PSNOWRHO,1)) :: ZSNOWRHON,ZSNOWGRAN1N,ZSNOWGRAN2N,     
00679                                          ZSNOWHEATN,ZSNOWHISTN 
00680             , ZSNOWZTOP_OLD, ZSNOWZTOP_NEW, ZSNOWZBOT_OLD, ZSNOWZBOT_NEW                                        
00681 !
00682                                        
00683 REAL, PARAMETER :: D1=1., D2=3., D3=4., X=99., COEFALB2=15.4                                      
00684 INTEGER :: JJ_OLD,JJ_NEW
00685 REAL :: ZDENTMOYN ,ZSPHERMOYN, ZALBMOYN, ZMASTOTN, ZSNOWHEAN, 
00686           ZPROPOR,ZMASDZ_OLD, ZDIAM,ZHISTMOYN  
00687 REAL :: ZPSNOW_OLD, ZPSNOW_NEW
00688 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00689 
00690 !
00691 !-------------------------------------------------------------------------------
00692 !
00693 ! 0. Initialization:
00694 ! ------------------
00695 !
00696 IF (LHOOK) CALL DR_HOOK('SNOWNLTRANSFGRID_1D',0,ZHOOK_HANDLE)
00697 INLVLS = SIZE(PSNOWDZ(:),1)
00698 ! a ce stade, les couches restent identiques
00699 INLVLS_OLD=INLVLS
00700 INLVLS_NEW=INLVLS
00701 ZPSNOW_OLD=PSNOW
00702 ZPSNOW_NEW=PSNOW
00703 
00704 !
00705 ! 1. Calculate vertical grid limits (m):
00706 ! --------------------------------------
00707 !
00708 ZSNOWZTOP_OLD(1) = ZPSNOW_OLD
00709 ZSNOWZTOP_NEW(1) = ZPSNOW_NEW
00710 ZSNOWZBOT_OLD(1) = ZSNOWZTOP_OLD(1)-PSNOWDZ(1)
00711 ZSNOWZBOT_NEW(1) = ZSNOWZTOP_NEW(1)-PSNOWDZN(1)
00712 
00713 !
00714 DO JJ_OLD=2,INLVLS_OLD
00715    ZSNOWZTOP_OLD(JJ_OLD) = ZSNOWZBOT_OLD(JJ_OLD-1)
00716    ZSNOWZBOT_OLD(JJ_OLD) = ZSNOWZTOP_OLD(JJ_OLD)-PSNOWDZ(JJ_OLD)
00717 ENDDO
00718 DO JJ_NEW=2,INLVLS_NEW
00719    ZSNOWZTOP_NEW(JJ_NEW) = ZSNOWZBOT_NEW(JJ_NEW-1)
00720    ZSNOWZBOT_NEW(JJ_NEW) = ZSNOWZTOP_NEW(JJ_NEW)-PSNOWDZN(JJ_NEW)
00721 ENDDO
00722 !
00723 !
00724 ! 3. Calculate mass and heat transfers due to grid adjustment/changes:
00725 ! --------------------------------------------------------------------
00726 !
00727 
00728 ! on boucle sur les couches de la nouvelle grille et pour chaque couche
00729 ! on somme ou on moyenne les quantités des couches totales ou partielles
00730 ! des couches anciennes qui la constituent
00731 
00732 DO JJ_NEW=1,INLVLS_NEW
00733     ZSNOWHEAN=0.
00734     ZMASTOTN=0.
00735 
00736     ZDENTMOYN=0.
00737     ZSPHERMOYN=0.
00738     ZALBMOYN=0.
00739     ZDIAM=0.
00740     ZHISTMOYN=0.
00741 
00742     ! on balaye les couches anciennes pour identifier celles qui constituent les
00743 ! nouvelles et on somme leurs contribs à la nouvelle couche JJ_NEW
00744     DO JJ_OLD=1, INLVLS_OLD
00745         IF( ZSNOWZTOP_OLD(JJ_OLD) <= ZSNOWZBOT_NEW(JJ_NEW)) THEN
00746                 ! haut de JJ_O plus bas que bas de JJ_N ==> pas contrib
00747         ELSEIF ( ZSNOWZBOT_OLD(JJ_OLD) >= ZSNOWZTOP_NEW(JJ_NEW)) THEN
00748                 ! bas de JJ_O plus haut que bas de JJ_N ==> pas contrib
00749         ELSE
00750                 ! ancienne couche à cheval ou englobant nouvelle
00751           ZPROPOR= (MIN(ZSNOWZTOP_OLD(JJ_OLD), ZSNOWZTOP_NEW(JJ_NEW))&
00752                   - MAX(ZSNOWZBOT_OLD(JJ_OLD), ZSNOWZBOT_NEW(JJ_NEW))) &
00753                   / PSNOWDZ(JJ_OLD)  
00754           ZMASDZ_OLD= ZPROPOR*PSNOWRHO(JJ_OLD)*PSNOWDZ(JJ_OLD)   
00755           ZMASTOTN=ZMASTOTN + ZMASDZ_OLD
00756           ZSNOWHEAN=ZSNOWHEAN+ZPROPOR*PSNOWHEAT(JJ_OLD)
00757 
00758           IF(PSNOWGRAN1(JJ_OLD)<0.) THEN
00759               ! calcul dimametre optique en 1/10 mmm        
00760              ZDIAM=-PSNOWGRAN1(JJ_OLD)*D1/X+(1.+PSNOWGRAN1(JJ_OLD)/X)* &
00761                (PSNOWGRAN2(JJ_OLD)*D2/X+(1.-PSNOWGRAN2(JJ_OLD)/X)*D3)  
00762              ZDIAM=ZDIAM/10000.      
00763              ZDENTMOYN= ZDENTMOYN-ZMASDZ_OLD*PSNOWGRAN1(JJ_OLD)/X
00764              ZSPHERMOYN=ZSPHERMOYN+ZMASDZ_OLD*PSNOWGRAN2(JJ_OLD)/X
00765            ELSE
00766              ZDIAM=PSNOWGRAN2(JJ_OLD)
00767              ZDENTMOYN= ZDENTMOYN+ZMASDZ_OLD*0.
00768              ZSPHERMOYN=ZSPHERMOYN+ZMASDZ_OLD*PSNOWGRAN1(JJ_OLD)/X
00769            ENDIF
00770            ZALBMOYN=ZALBMOYN+MAX(0.,ZMASDZ_OLD*(1.-COEFALB2*SQRT(ZDIAM)))
00771            ZHISTMOYN=ZHISTMOYN+ZMASDZ_OLD*PSNOWHIST(JJ_OLD)
00772         ENDIF
00773     ENDDO 
00774 ! on affecte à la nouvelle couche ses propriétés moyennes
00775 
00776      ZSNOWHEATN(JJ_NEW)= ZSNOWHEAN
00777      ZSNOWRHON(JJ_NEW)= ZMASTOTN/PSNOWDZN(JJ_NEW)
00778        ZALBMOYN=ZALBMOYN/ZMASTOTN
00779        ZSPHERMOYN=MAX(0.,ZSPHERMOYN/ZMASTOTN)
00780        ZDENTMOYN=MAX(0.,ZDENTMOYN/ZMASTOTN)
00781        ZDIAM=((1.-ZALBMOYN)/COEFALB2)**2
00782        write(*,*) 'zdiam=', zdiam, zalbmoyn, zdentmoyn, zsphermoyn
00783 !      ZDIAM=MAX(1.E-4, ZDIAM)
00784        IF (ZDIAM <3.E-4-0.0000001) THEN
00785 !      on préserve dendricite  puis on calcule sphericite               
00786          ZSNOWGRAN1N(JJ_NEW)=-X*ZDENTMOYN
00787          IF(ABS(ZSNOWGRAN1N(JJ_NEW)+X)< 0.01) THEN
00788            ZSNOWGRAN2N(JJ_NEW)=X*ZSPHERMOYN                  
00789          ELSE
00790            ZSNOWGRAN2N(JJ_NEW)=X*((ZDIAM*10000.+ZSNOWGRAN1N(JJ_NEW)*D1/X) &
00791               / (1.+ZSNOWGRAN1N(JJ_NEW)/X)-D3)/(D2-D3)  
00792            IF (ZSNOWGRAN2N(JJ_NEW)<0.) THEN
00793              IF(ZSNOWGRAN2N(JJ_NEW)<-0.1) write(*,*) 'pb av1a',ZDIAM,ZDENTMOYN,ZSPHERMOYN, &
00794                               ZSNOWGRAN1N(JJ_NEW),ZSNOWGRAN2N(JJ_NEW)  
00795              ZSNOWGRAN2N(JJ_NEW)=0.
00796            ENDIF  
00797            IF (ZSNOWGRAN2N(JJ_NEW)>  X + 0.0000001) THEN
00798              IF(ZSNOWGRAN2N(JJ_NEW)>99.1) write(*,*) 'pb av1b',ZDIAM,ZDENTMOYN,ZSPHERMOYN, &
00799                         ZSNOWGRAN1N(JJ_NEW),ZSNOWGRAN2N(JJ_NEW)  
00800              ZSNOWGRAN2N(JJ_NEW)=X
00801            ENDIF  
00802          ENDIF
00803         ELSEIF  (ZDIAM >4.E-4) THEN
00804           ZSNOWGRAN1N(JJ_NEW)=X*ZSPHERMOYN
00805           ZSNOWGRAN2N(JJ_NEW)=ZDIAM 
00806         ELSEIF(ZDENTMOYN<= 0.+0.0000001) THEN
00807 ! taille entre 3.E-4 et 4E-4 et dendricite nulle        
00808           ZSNOWGRAN1N(JJ_NEW)=X*ZSPHERMOYN
00809           ZSNOWGRAN2N(JJ_NEW)=ZDIAM
00810         ELSE
00811 ! taille entre 3.E-4 et 4E-4 et dendricite  <0   
00812 ! on preserve d'abord sphericite. Si impossible on met dendit a 0 et on 
00813 ! preserve sphericite
00814           ZSNOWGRAN1N(JJ_NEW)=-X*ZDENTMOYN
00815           ZSNOWGRAN2N(JJ_NEW)=X*((ZDIAM*10000.+ZSNOWGRAN1N(JJ_NEW)*D1/X) &
00816                  / (1.+ZSNOWGRAN1N(JJ_NEW)/X)-D3)/(D2-D3)  
00817           IF ( ZSNOWGRAN2N(JJ_NEW)<0..OR. ZSNOWGRAN2N(JJ_NEW)> X) THEN
00818 ! incompatible avec ZDIAM on met dendicite a 0 et on preserve sphericite 
00819             IF ( ZSNOWGRAN2N(JJ_NEW)<-0.1.OR. ZSNOWGRAN2N(JJ_NEW)>99.1)  &
00820                  write(*,*) 'pb av2', ZDIAM, ZDENTMOYN, ZSPHERMOYN, &
00821               ZSNOWGRAN1N(JJ_NEW),ZSNOWGRAN2N(JJ_NEW)  
00822   
00823             ZSNOWGRAN1N(JJ_NEW)=X*ZSPHERMOYN
00824             ZSNOWGRAN2N(JJ_NEW)=ZDIAM
00825           ENDIF
00826         ENDIF
00827         ZSNOWHISTN(JJ_NEW)=NINT(ZHISTMOYN/ZMASTOTN)
00828 !              ZSNOWGRAN2N(JJ_NEW)=X*ZSPHERMOYN
00829 !              ZSNOWGRAN1N(JJ_NEW)=X*(ZDIAM*10000.-(ZSNOWGRAN2N(JJ_NEW)*D2/X+&
00830 !              (1.-ZSNOWGRAN2N(JJ_NEW)/X)*D3))/&
00831 !              (ZSNOWGRAN2N(JJ_NEW)*D2/X+(1.-ZSNOWGRAN2N(JJ_NEW)/X)*D3)
00832 ENDDO        
00833 !
00834 !verifs
00835 write (*,*) 'verifs chgt grille INLVLS=',INLVLS
00836     ZSNOWHEAN=0.
00837     ZMASTOTN=0.
00838 
00839 DO JJ=1,INLVLS
00840 ZSNOWHEAN=ZSNOWHEAN+PSNOWHEAT(JJ)- ZSNOWHEATN(JJ)
00841 ZMASTOTN=ZMASTOTN+PSNOWRHO(JJ)*PSNOWDZ(JJ)- ZSNOWRHON(JJ)*PSNOWDZN(JJ)
00842 write(*,*) JJ,'DZ', PSNOWDZ(JJ),PSNOWDZN(JJ)
00843 write (*,*) 'RHO', PSNOWRHO(JJ)   , ZSNOWRHON(JJ)
00844 write (*,*) 'HEAT',PSNOWHEAT(JJ)  , ZSNOWHEATN(JJ)
00845 write (*,*) 'GR1', PSNOWGRAN1(JJ) , ZSNOWGRAN1N(JJ)
00846 write (*,*) 'GR2',PSNOWGRAN2(JJ) , ZSNOWGRAN2N(JJ)
00847 write (*,*) 'HIST',PSNOWHIST(JJ) ,  ZSNOWHISTN(JJ)
00848 ENDDO
00849 write(*,*) 'diff', ZSNOWHEAN,ZMASTOTN
00850 
00851 
00852 
00853 !
00854 ! 5. Update mass (density and thickness) and heat:
00855 ! ------------------------------------------------
00856 !
00857 PSNOWRHO(:)   = ZSNOWRHON(:)
00858 PSNOWHEAT(:)  = ZSNOWHEATN(:)
00859 PSNOWGRAN1(:) = ZSNOWGRAN1N(:)
00860 PSNOWGRAN2(:) = ZSNOWGRAN2N(:)
00861 PSNOWHIST(:) =  ZSNOWHISTN(:)
00862         IF (LHOOK) CALL DR_HOOK('SNOWNLTRANSFGRID_1D',1,ZHOOK_HANDLE)
00863 !
00864 !
00865 !-------------------------------------------------------------------------------
00866 !
00867         END SUBROUTINE SNOWNLTRANSFGRID_1D
00868 
00869 !####################################################################
00870 !############################################################################
00871 END SUBROUTINE SNOWCROUPGRID