SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/mode_sbls.F90
Go to the documentation of this file.
00001 !     ############### 
00002       MODULE MODE_SBLS 
00003 !     ###############
00004 !
00005 !!****  *MODE_SBLS * - contains Surface Boundary Layer characteristics functions
00006 !!
00007 !!    PURPOSE
00008 !!    -------
00009 !
00010 !!**  METHOD
00011 !!    ------
00012 !!    
00013 !!    
00014 !!
00015 !!    EXTERNAL
00016 !!    --------
00017 !!       
00018 !!    IMPLICIT ARGUMENTS
00019 !!    ------------------ 
00020 !!
00021 !!    REFERENCE
00022 !!    ---------
00023 !!
00024 !!    Businger et al 1971,   Wyngaard and Cote 1974
00025 !!      
00026 !!
00027 !!    AUTHOR
00028 !!    ------
00029 !!      V. Masson       * Meteo France *
00030 !!
00031 !!    MODIFICATIONS
00032 !!    -------------
00033 !!      Original        13/10/99
00034 !!      V. Masson       06/11/02 optimization and add Businger fonction for TKE
00035 !-----------------------------------------------------------------------------
00036 !
00037 !*       0.    DECLARATIONS
00038 !
00039 !
00040 !
00041 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00042 USE PARKIND1  ,ONLY : JPRB
00043 !
00044 INTERFACE BUSINGER_PHIM
00045   MODULE PROCEDURE BUSINGER_PHIM_0D
00046   MODULE PROCEDURE BUSINGER_PHIM_1D
00047   MODULE PROCEDURE BUSINGER_PHIM_2D
00048   MODULE PROCEDURE BUSINGER_PHIM_3D
00049 END INTERFACE
00050 INTERFACE BUSINGER_PHIH
00051   MODULE PROCEDURE BUSINGER_PHIH_0D
00052   MODULE PROCEDURE BUSINGER_PHIH_1D
00053   MODULE PROCEDURE BUSINGER_PHIH_2D
00054   MODULE PROCEDURE BUSINGER_PHIH_3D
00055 END INTERFACE
00056 INTERFACE BUSINGER_PHIE
00057   MODULE PROCEDURE BUSINGER_PHIE_0D
00058   MODULE PROCEDURE BUSINGER_PHIE_1D
00059   MODULE PROCEDURE BUSINGER_PHIE_2D
00060   MODULE PROCEDURE BUSINGER_PHIE_3D
00061 END INTERFACE
00062 INTERFACE PAULSON_PSIM
00063   MODULE PROCEDURE PAULSON_PSIM_0D
00064   MODULE PROCEDURE PAULSON_PSIM_1D
00065   MODULE PROCEDURE PAULSON_PSIM_2D
00066   MODULE PROCEDURE PAULSON_PSIM_3D
00067 END INTERFACE
00068 INTERFACE PAULSON_PSIH
00069   MODULE PROCEDURE PAULSON_PSIH_0D
00070   MODULE PROCEDURE PAULSON_PSIH_1D
00071   MODULE PROCEDURE PAULSON_PSIH_2D
00072   MODULE PROCEDURE PAULSON_PSIH_3D
00073 END INTERFACE
00074 INTERFACE LMO
00075   MODULE PROCEDURE LMO_0D
00076   MODULE PROCEDURE LMO_1D
00077   MODULE PROCEDURE LMO_2D
00078 END INTERFACE
00079 INTERFACE USTAR
00080   MODULE PROCEDURE USTAR_0D
00081   MODULE PROCEDURE USTAR_1D
00082   MODULE PROCEDURE USTAR_2D
00083 END INTERFACE
00084 !
00085 !-------------------------------------------------------------------------------
00086 CONTAINS
00087 !-------------------------------------------------------------------------------
00088 !
00089 FUNCTION BUSINGER_PHIM_3D(PZ_O_LMO)
00090   IMPLICIT NONE
00091   REAL, DIMENSION(:,:,:), INTENT(IN)                 :: PZ_O_LMO
00092   REAL, DIMENSION(SIZE(PZ_O_LMO,1), &
                    SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: BUSINGER_PHIM_3D  
00093   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00094 !
00095   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIM_3D',0,ZHOOK_HANDLE)
00096   WHERE ( PZ_O_LMO(:,:,:) < 0. )
00097     BUSINGER_PHIM_3D(:,:,:) = (1.-15.*PZ_O_LMO)**(-0.25)
00098   ELSEWHERE
00099     BUSINGER_PHIM_3D(:,:,:) = 1. + 4.7 * PZ_O_LMO
00100   END WHERE
00101 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIM_3D',1,ZHOOK_HANDLE)
00102 END FUNCTION BUSINGER_PHIM_3D
00103 !
00104 !-------------------------------------------------------------------------------
00105 !
00106 FUNCTION BUSINGER_PHIM_2D(PZ_O_LMO)
00107   IMPLICIT NONE
00108   REAL, DIMENSION(:,:), INTENT(IN)                   :: PZ_O_LMO
00109   REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: BUSINGER_PHIM_2D
00110   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00111 !
00112   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIM_2D',0,ZHOOK_HANDLE)
00113   WHERE ( PZ_O_LMO(:,:) < 0. )
00114     BUSINGER_PHIM_2D(:,:) = (1.-15.*PZ_O_LMO)**(-0.25)
00115   ELSEWHERE
00116     BUSINGER_PHIM_2D(:,:) = 1. + 4.7 * PZ_O_LMO
00117   END WHERE
00118 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIM_2D',1,ZHOOK_HANDLE)
00119 END FUNCTION BUSINGER_PHIM_2D
00120 !
00121 !-------------------------------------------------------------------------------
00122 !
00123 FUNCTION BUSINGER_PHIM_1D(PZ_O_LMO)
00124   IMPLICIT NONE
00125   REAL, DIMENSION(:), INTENT(IN)  :: PZ_O_LMO
00126   REAL, DIMENSION(SIZE(PZ_O_LMO)) :: BUSINGER_PHIM_1D
00127   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00128 !
00129   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIM_1D',0,ZHOOK_HANDLE)
00130   WHERE ( PZ_O_LMO(:) < 0. )
00131     BUSINGER_PHIM_1D(:) = (1.-15.*PZ_O_LMO)**(-0.25)
00132   ELSEWHERE
00133     BUSINGER_PHIM_1D(:) = 1. + 4.7 * PZ_O_LMO
00134   END WHERE
00135 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIM_1D',1,ZHOOK_HANDLE)
00136 END FUNCTION BUSINGER_PHIM_1D
00137 !
00138 !-------------------------------------------------------------------------------
00139 !
00140 FUNCTION BUSINGER_PHIM_0D(PZ_O_LMO)
00141   IMPLICIT NONE
00142   REAL, INTENT(IN)                   :: PZ_O_LMO
00143   REAL                               :: BUSINGER_PHIM_0D
00144   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00145 !
00146   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIM_0D',0,ZHOOK_HANDLE)
00147   IF ( PZ_O_LMO < 0. ) THEN
00148     BUSINGER_PHIM_0D = (1.-15.*PZ_O_LMO)**(-0.25)
00149   ELSE
00150     BUSINGER_PHIM_0D = 1. + 4.7 * PZ_O_LMO
00151   END IF
00152 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIM_0D',1,ZHOOK_HANDLE)
00153 END FUNCTION BUSINGER_PHIM_0D
00154 !
00155 !-------------------------------------------------------------------------------
00156 !-------------------------------------------------------------------------------
00157 !
00158 FUNCTION BUSINGER_PHIH_3D(PZ_O_LMO)
00159   IMPLICIT NONE
00160   REAL, DIMENSION(:,:,:), INTENT(IN)                 :: PZ_O_LMO
00161   REAL, DIMENSION(SIZE(PZ_O_LMO,1), &
                    SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: BUSINGER_PHIH_3D  
00162   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00163 !
00164   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIH_3D',0,ZHOOK_HANDLE)
00165   WHERE ( PZ_O_LMO(:,:,:) < 0. )
00166     BUSINGER_PHIH_3D(:,:,:) = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5)
00167   ELSEWHERE
00168     BUSINGER_PHIH_3D(:,:,:) = 0.74 + 4.7 * PZ_O_LMO
00169   END WHERE
00170 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIH_3D',1,ZHOOK_HANDLE)
00171 END FUNCTION BUSINGER_PHIH_3D
00172 !
00173 !-------------------------------------------------------------------------------
00174 !
00175 FUNCTION BUSINGER_PHIH_2D(PZ_O_LMO)
00176   IMPLICIT NONE
00177   REAL, DIMENSION(:,:), INTENT(IN)                   :: PZ_O_LMO
00178   REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: BUSINGER_PHIH_2D
00179   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00180 !
00181   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIH_2D',0,ZHOOK_HANDLE)
00182   WHERE ( PZ_O_LMO(:,:) < 0. )
00183     BUSINGER_PHIH_2D(:,:) = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5)
00184   ELSEWHERE
00185     BUSINGER_PHIH_2D(:,:) = 0.74 + 4.7 * PZ_O_LMO
00186   END WHERE
00187 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIH_2D',1,ZHOOK_HANDLE)
00188 END FUNCTION BUSINGER_PHIH_2D
00189 !
00190 !-------------------------------------------------------------------------------
00191 !
00192 FUNCTION BUSINGER_PHIH_1D(PZ_O_LMO)
00193   IMPLICIT NONE
00194   REAL, DIMENSION(:), INTENT(IN)  :: PZ_O_LMO
00195   REAL, DIMENSION(SIZE(PZ_O_LMO)) :: BUSINGER_PHIH_1D
00196   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00197 !
00198   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIH_1D',0,ZHOOK_HANDLE)
00199   WHERE ( PZ_O_LMO(:) < 0. )
00200     BUSINGER_PHIH_1D(:) = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5)
00201   ELSEWHERE
00202     BUSINGER_PHIH_1D(:) = 0.74 + 4.7 * PZ_O_LMO
00203   END WHERE
00204 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIH_1D',1,ZHOOK_HANDLE)
00205 END FUNCTION BUSINGER_PHIH_1D
00206 !
00207 !-------------------------------------------------------------------------------
00208 !
00209 FUNCTION BUSINGER_PHIH_0D(PZ_O_LMO)
00210   IMPLICIT NONE
00211   REAL, INTENT(IN)                   :: PZ_O_LMO
00212   REAL                               :: BUSINGER_PHIH_0D
00213   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00214 !
00215   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIH_0D',0,ZHOOK_HANDLE)
00216   IF ( PZ_O_LMO < 0. ) THEN
00217     BUSINGER_PHIH_0D = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5)
00218   ELSE
00219     BUSINGER_PHIH_0D = 0.74 + 4.7 * PZ_O_LMO
00220   END IF
00221 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIH_0D',1,ZHOOK_HANDLE)
00222 END FUNCTION BUSINGER_PHIH_0D
00223 !
00224 !-------------------------------------------------------------------------------
00225 !-------------------------------------------------------------------------------
00226 !
00227 FUNCTION BUSINGER_PHIE_3D(PZ_O_LMO)
00228   USE MODD_CANOPY_TURB, ONLY : XALPSBL
00229   IMPLICIT NONE  
00230   REAL, DIMENSION(:,:,:), INTENT(IN)                 :: PZ_O_LMO
00231   REAL, DIMENSION(SIZE(PZ_O_LMO,1), &
                    SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: BUSINGER_PHIE_3D  
00232   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00233 !
00234   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIE_3D',0,ZHOOK_HANDLE)
00235   WHERE ( PZ_O_LMO(:,:,:) < 0. )
00236     BUSINGER_PHIE_3D(:,:,:) =   (1.+(-PZ_O_LMO)**(2./3.)/XALPSBL) &
00237                                 * (1.-15.*PZ_O_LMO)**(0.5)  
00238   ELSEWHERE
00239     BUSINGER_PHIE_3D(:,:,:) = 1./(1. + 4.7 * PZ_O_LMO)**2
00240   END WHERE
00241 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIE_3D',1,ZHOOK_HANDLE)
00242 END FUNCTION BUSINGER_PHIE_3D
00243 
00244 !-------------------------------------------------------------------------------
00245 !
00246 FUNCTION BUSINGER_PHIE_2D(PZ_O_LMO)
00247   USE MODD_CANOPY_TURB, ONLY : XALPSBL
00248   IMPLICIT NONE  
00249   REAL, DIMENSION(:,:), INTENT(IN)                   :: PZ_O_LMO
00250   REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: BUSINGER_PHIE_2D
00251   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00252 !
00253   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIE_2D',0,ZHOOK_HANDLE)
00254   WHERE ( PZ_O_LMO(:,:) < 0. )
00255     BUSINGER_PHIE_2D(:,:) =   (1.+(-PZ_O_LMO)**(2./3.)/XALPSBL) &
00256                               * (1.-15.*PZ_O_LMO)**(0.5)  
00257   ELSEWHERE
00258     BUSINGER_PHIE_2D(:,:) = 1./(1. + 4.7 * PZ_O_LMO)**2
00259   END WHERE
00260 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIE_2D',1,ZHOOK_HANDLE)
00261 END FUNCTION BUSINGER_PHIE_2D
00262 
00263 !-------------------------------------------------------------------------------
00264 !
00265 FUNCTION BUSINGER_PHIE_1D(PZ_O_LMO)
00266   USE MODD_CANOPY_TURB, ONLY : XALPSBL
00267   IMPLICIT NONE  
00268   REAL, DIMENSION(:), INTENT(IN)    :: PZ_O_LMO
00269   REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: BUSINGER_PHIE_1D
00270   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00271 !
00272   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIE_1D',0,ZHOOK_HANDLE)
00273   WHERE ( PZ_O_LMO(:) < 0. )
00274     BUSINGER_PHIE_1D(:) =   (1.+(-PZ_O_LMO)**(2./3.)/XALPSBL) &
00275                             * (1.-15.*PZ_O_LMO)**(0.5)  
00276   ELSEWHERE
00277     BUSINGER_PHIE_1D(:) = 1./(1. + 4.7 * PZ_O_LMO)**2
00278   END WHERE
00279 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIE_1D',1,ZHOOK_HANDLE)
00280 END FUNCTION BUSINGER_PHIE_1D
00281 
00282 !-------------------------------------------------------------------------------
00283 !
00284 FUNCTION BUSINGER_PHIE_0D(PZ_O_LMO)
00285   USE MODD_CANOPY_TURB, ONLY : XALPSBL
00286   IMPLICIT NONE  
00287   REAL, INTENT(IN):: PZ_O_LMO
00288   REAL            :: BUSINGER_PHIE_0D
00289   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00290 !
00291   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIE_0D',0,ZHOOK_HANDLE)
00292   IF ( PZ_O_LMO < 0. ) THEN
00293     BUSINGER_PHIE_0D =   (1.+(-PZ_O_LMO)**(2./3.)/XALPSBL) &
00294                          * (1.-15.*PZ_O_LMO)**(0.5)  
00295   ELSE
00296     BUSINGER_PHIE_0D = 1./(1. + 4.7 * PZ_O_LMO)**2
00297   END IF
00298 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:BUSINGER_PHIE_0D',1,ZHOOK_HANDLE)
00299 END FUNCTION BUSINGER_PHIE_0D
00300 !
00301 !-------------------------------------------------------------------------------
00302 !-------------------------------------------------------------------------------
00303 !
00304 FUNCTION PAULSON_PSIM_3D(PZ_O_LMO)
00305   USE MODD_CSTS
00306   IMPLICIT NONE  
00307   REAL, DIMENSION(:,:,:), INTENT(IN)                 :: PZ_O_LMO
00308   REAL, DIMENSION(SIZE(PZ_O_LMO,1), &
                    SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: PAULSON_PSIM_3D  
00309 !
00310   REAL, DIMENSION(SIZE(PZ_O_LMO,1), &
                    SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: ZX  
00311   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00312 
00313   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIM_3D',0,ZHOOK_HANDLE)
00314   ZX=1.
00315   WHERE ( PZ_O_LMO(:,:,:) < 0. )
00316     ZX=(1.-15.*PZ_O_LMO)**(0.25)
00317     PAULSON_PSIM_3D(:,:,:) = LOG( (1.+ZX**2)*(1+ZX)**2/8. ) - 2.*ATAN(ZX) + XPI/2.
00318   ELSEWHERE
00319     PAULSON_PSIM_3D(:,:,:) = - 4.7 * PZ_O_LMO
00320   END WHERE
00321 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIM_3D',1,ZHOOK_HANDLE)
00322 END FUNCTION PAULSON_PSIM_3D
00323 !
00324 !-------------------------------------------------------------------------------
00325 !
00326 FUNCTION PAULSON_PSIM_2D(PZ_O_LMO)
00327   USE MODD_CSTS
00328   IMPLICIT NONE  
00329   REAL, DIMENSION(:,:), INTENT(IN)                   :: PZ_O_LMO
00330   REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: PAULSON_PSIM_2D
00331 !
00332   REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: ZX
00333   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00334 
00335   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIM_2D',0,ZHOOK_HANDLE)
00336   ZX=1.
00337   WHERE ( PZ_O_LMO(:,:) < 0. )
00338     ZX=(1.-15.*PZ_O_LMO)**(0.25)
00339     PAULSON_PSIM_2D(:,:) = LOG( (1.+ZX**2)*(1+ZX)**2/8. ) - 2.*ATAN(ZX) + XPI/2.
00340   ELSEWHERE
00341     PAULSON_PSIM_2D(:,:) = - 4.7 * PZ_O_LMO
00342   END WHERE
00343 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIM_2D',1,ZHOOK_HANDLE)
00344 END FUNCTION PAULSON_PSIM_2D
00345 !
00346 !-------------------------------------------------------------------------------
00347 !
00348 FUNCTION PAULSON_PSIM_1D(PZ_O_LMO)
00349   USE MODD_CSTS
00350   IMPLICIT NONE  
00351   REAL, DIMENSION(:), INTENT(IN)    :: PZ_O_LMO
00352   REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: PAULSON_PSIM_1D
00353 !
00354   REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: ZX
00355   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00356 
00357   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIM_1D',0,ZHOOK_HANDLE)
00358   ZX=1.
00359   WHERE ( PZ_O_LMO(:) < 0. )
00360     ZX=(1.-15.*PZ_O_LMO)**(0.25)
00361     PAULSON_PSIM_1D(:) = LOG( (1.+ZX**2)*(1+ZX)**2/8. ) - 2.*ATAN(ZX) + XPI/2.
00362   ELSEWHERE
00363     PAULSON_PSIM_1D(:) = - 4.7 * PZ_O_LMO
00364   END WHERE
00365 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIM_1D',1,ZHOOK_HANDLE)
00366 END FUNCTION PAULSON_PSIM_1D
00367 !
00368 !-------------------------------------------------------------------------------
00369 !
00370 FUNCTION PAULSON_PSIM_0D(PZ_O_LMO)
00371   USE MODD_CSTS
00372   IMPLICIT NONE  
00373   REAL, INTENT(IN)    :: PZ_O_LMO
00374   REAL                :: PAULSON_PSIM_0D
00375 !
00376   REAL                :: ZX
00377   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00378 
00379   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIM_0D',0,ZHOOK_HANDLE)
00380   ZX=1.
00381   IF ( PZ_O_LMO < 0. ) THEN
00382     ZX=(1.-15.*PZ_O_LMO)**(0.25)
00383     PAULSON_PSIM_0D = LOG( (1.+ZX**2)*(1+ZX)**2/8. ) - 2.*ATAN(ZX) + XPI/2.
00384   ELSE
00385     PAULSON_PSIM_0D = - 4.7 * PZ_O_LMO
00386   END IF
00387 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIM_0D',1,ZHOOK_HANDLE)
00388 END FUNCTION PAULSON_PSIM_0D
00389 !
00390 !-------------------------------------------------------------------------------
00391 !-------------------------------------------------------------------------------
00392 !
00393 FUNCTION PAULSON_PSIH_3D(PZ_O_LMO)
00394   IMPLICIT NONE
00395   REAL, DIMENSION(:,:,:), INTENT(IN)                 :: PZ_O_LMO
00396   REAL, DIMENSION(SIZE(PZ_O_LMO,1), &
                    SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: PAULSON_PSIH_3D  
00397 !
00398   REAL, DIMENSION(SIZE(PZ_O_LMO,1), &
                    SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: ZY  
00399   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00400 
00401   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIH_3D',0,ZHOOK_HANDLE)
00402   ZY=1.
00403   WHERE ( PZ_O_LMO(:,:,:) < 0. )
00404     ZY=(1.-9.*PZ_O_LMO)**(0.5)
00405     PAULSON_PSIH_3D(:,:,:) = LOG( (1.+ZY)/2. )
00406   ELSEWHERE
00407     PAULSON_PSIH_3D(:,:,:) = - 4.7 * PZ_O_LMO / 0.74
00408   END WHERE
00409 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIH_3D',1,ZHOOK_HANDLE)
00410 END FUNCTION PAULSON_PSIH_3D
00411 !
00412 !-------------------------------------------------------------------------------
00413 !
00414 FUNCTION PAULSON_PSIH_2D(PZ_O_LMO)
00415   IMPLICIT NONE
00416   REAL, DIMENSION(:,:), INTENT(IN)                   :: PZ_O_LMO
00417   REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: PAULSON_PSIH_2D
00418 !
00419   REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: ZY
00420   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00421 
00422   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIH_2D',0,ZHOOK_HANDLE)
00423   ZY=1.
00424   WHERE ( PZ_O_LMO(:,:) < 0. )
00425     ZY=(1.-9.*PZ_O_LMO)**(0.5)
00426     PAULSON_PSIH_2D(:,:) = LOG( (1.+ZY)/2. )
00427   ELSEWHERE
00428     PAULSON_PSIH_2D(:,:) = - 4.7 * PZ_O_LMO / 0.74
00429   END WHERE
00430 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIH_2D',1,ZHOOK_HANDLE)
00431 END FUNCTION PAULSON_PSIH_2D
00432 !
00433 !-------------------------------------------------------------------------------
00434 !
00435 FUNCTION PAULSON_PSIH_1D(PZ_O_LMO)
00436   IMPLICIT NONE
00437   REAL, DIMENSION(:), INTENT(IN)    :: PZ_O_LMO
00438   REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: PAULSON_PSIH_1D
00439 !
00440   REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: ZY
00441   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00442 
00443   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIH_1D',0,ZHOOK_HANDLE)
00444   ZY=1.
00445   WHERE ( PZ_O_LMO(:) < 0. )
00446     ZY=(1.-9.*PZ_O_LMO)**(0.5)
00447     PAULSON_PSIH_1D(:) = LOG( (1.+ZY)/2. )
00448   ELSEWHERE
00449     PAULSON_PSIH_1D(:) = - 4.7 * PZ_O_LMO / 0.74
00450   END WHERE
00451 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIH_1D',1,ZHOOK_HANDLE)
00452 END FUNCTION PAULSON_PSIH_1D
00453 !
00454 !-------------------------------------------------------------------------------
00455 !
00456 FUNCTION PAULSON_PSIH_0D(PZ_O_LMO)
00457   IMPLICIT NONE
00458   REAL, INTENT(IN)    :: PZ_O_LMO
00459   REAL                :: PAULSON_PSIH_0D
00460 !
00461   REAL                :: ZY
00462   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00463 
00464   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIH_0D',0,ZHOOK_HANDLE)
00465   ZY=1.
00466   IF ( PZ_O_LMO < 0. ) THEN
00467     ZY=(1.-9.*PZ_O_LMO)**(0.5)
00468     PAULSON_PSIH_0D = LOG( (1.+ZY)/2. )
00469   ELSE
00470     PAULSON_PSIH_0D = - 4.7 * PZ_O_LMO / 0.74
00471   END IF
00472 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:PAULSON_PSIH_0D',1,ZHOOK_HANDLE)
00473 END FUNCTION PAULSON_PSIH_0D
00474 !
00475 !-------------------------------------------------------------------------------
00476 !-------------------------------------------------------------------------------
00477 !
00478 !
00479 FUNCTION LMO_2D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV)
00480   USE MODD_CSTS
00481   USE MODD_SURF_PAR,   ONLY : XUNDEF
00482   IMPLICIT NONE  
00483   REAL, DIMENSION(:,:), INTENT(IN)               :: PUSTAR
00484   REAL, DIMENSION(:,:), INTENT(IN)               :: PTHETA
00485   REAL, DIMENSION(:,:), INTENT(IN)               :: PRV
00486   REAL, DIMENSION(:,:), INTENT(IN)               :: PSFTH
00487   REAL, DIMENSION(:,:), INTENT(IN)               :: PSFRV
00488   REAL, DIMENSION(SIZE(PUSTAR,1),SIZE(PUSTAR,2)) :: LMO_2D
00489 !
00490   REAL, DIMENSION(SIZE(PUSTAR,1),SIZE(PUSTAR,2)) :: ZTHETAV
00491   REAL, DIMENSION(SIZE(PUSTAR,1),SIZE(PUSTAR,2)) :: ZQ0
00492   REAL                                           :: ZEPS
00493   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00494 !
00495 !
00496   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:LMO_2D',0,ZHOOK_HANDLE)
00497   ZEPS=(XRV-XRD)/XRD
00498   ZTHETAV(:,:) = PTHETA(:,:) * ( 1. +ZEPS * PRV(:,:))
00499   ZQ0    (:,:) = PSFTH(:,:) + ZTHETAV(:,:) * ZEPS * PSFRV(:,:) 
00500 !
00501   LMO_2D(:,:) = XUNDEF
00502   WHERE ( ZQ0(:,:) /=0.  )                                   &
00503       LMO_2D(:,:) = - MAX(PUSTAR(:,:),1.E-6)**3                &
00504                     / ( XKARMAN * XG / ZTHETAV(:,:) *ZQ0(:,:) )  
00505 !
00506   WHERE(ABS(LMO_2D)>10000.) LMO_2D=XUNDEF
00507 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:LMO_2D',1,ZHOOK_HANDLE)
00508 
00509 END FUNCTION LMO_2D
00510 !
00511 !-------------------------------------------------------------------------------
00512 !
00513 FUNCTION LMO_1D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV)
00514   USE MODD_CSTS
00515   USE MODD_SURF_PAR,  ONLY : XUNDEF
00516   IMPLICIT NONE  
00517   REAL, DIMENSION(:), INTENT(IN)  :: PUSTAR
00518   REAL, DIMENSION(:), INTENT(IN)  :: PTHETA
00519   REAL, DIMENSION(:), INTENT(IN)  :: PRV
00520   REAL, DIMENSION(:), INTENT(IN)  :: PSFTH
00521   REAL, DIMENSION(:), INTENT(IN)  :: PSFRV
00522   REAL, DIMENSION(SIZE(PUSTAR))   :: LMO_1D
00523 !
00524   REAL, DIMENSION(SIZE(PUSTAR))   :: ZTHETAV
00525   REAL                                           :: ZEPS
00526   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00527 !
00528 !
00529   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:LMO_1D',0,ZHOOK_HANDLE)
00530   ZEPS=(XRV-XRD)/XRD
00531 !
00532   ZTHETAV(:) = PTHETA(:) * ( 1. +ZEPS * PRV(:))
00533 !
00534   LMO_1D(:) = XUNDEF
00535   WHERE ( PSFTH(:)/ZTHETAV(:)+ZEPS*PSFRV(:)/=0. )                  &
00536       LMO_1D(:) = - MAX(PUSTAR(:),1.E-6)**3                          &
00537                 / ( XKARMAN * (  XG / ZTHETAV(:)    * PSFTH(:)       &
00538                                + XG * ZEPS * PSFRV(:) )  )  
00539 
00540   WHERE(ABS(LMO_1D)>10000.) LMO_1D=XUNDEF
00541 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:LMO_1D',1,ZHOOK_HANDLE)
00542 
00543 END FUNCTION LMO_1D
00544 !
00545 !-------------------------------------------------------------------------------
00546 !
00547 FUNCTION LMO_0D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV)
00548   USE MODD_CSTS
00549   USE MODD_SURF_PAR,  ONLY : XUNDEF
00550   IMPLICIT NONE  
00551   REAL, INTENT(IN)  :: PUSTAR
00552   REAL, INTENT(IN)  :: PTHETA
00553   REAL, INTENT(IN)  :: PRV
00554   REAL, INTENT(IN)  :: PSFTH
00555   REAL, INTENT(IN)  :: PSFRV
00556   REAL              :: LMO_0D
00557 !
00558   REAL              :: ZTHETAV
00559   REAL              :: ZEPS
00560   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00561 !
00562 !
00563   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:LMO_0D',0,ZHOOK_HANDLE)
00564   ZEPS=(XRV-XRD)/XRD
00565 !
00566 !
00567   ZTHETAV = PTHETA * ( 1. +ZEPS * PRV)
00568 !
00569   LMO_0D = XUNDEF
00570   IF ( PSFTH/ZTHETAV+ZEPS*PSFRV/=0. )                      &
00571     LMO_0D = - MAX(PUSTAR,1.E-6)**3                          &
00572              / ( XKARMAN * (  XG / ZTHETAV       * PSFTH     &
00573                             + XG * ZEPS * PSFRV )  )  
00574 
00575   IF(ABS(LMO_0D)>10000.) LMO_0D=XUNDEF
00576 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:LMO_0D',1,ZHOOK_HANDLE)
00577 
00578 END FUNCTION LMO_0D
00579 !
00580 !-------------------------------------------------------------------------------
00581 !-------------------------------------------------------------------------------
00582 !
00583 FUNCTION USTAR_2D(PWIND,PZ,PZ0,PLMO)
00584   USE MODD_CSTS
00585   USE MODD_SURF_PAR,  ONLY : XUNDEF
00586   IMPLICIT NONE  
00587   REAL, DIMENSION(:,:), INTENT(IN)               :: PWIND
00588   REAL, DIMENSION(:,:), INTENT(IN)               :: PZ
00589   REAL, DIMENSION(:,:), INTENT(IN)               :: PZ0
00590   REAL, DIMENSION(:,:), INTENT(IN)               :: PLMO
00591   REAL, DIMENSION(SIZE(PZ,1),SIZE(PZ,2))         :: USTAR_2D
00592 
00593   REAL, DIMENSION(SIZE(PZ,1),SIZE(PZ,2))         :: ZZ_O_LMO
00594   REAL, DIMENSION(SIZE(PZ,1),SIZE(PZ,2))         :: ZZ0_O_LMO
00595   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00596 !
00597 !* purely unstable case
00598   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:USTAR_2D',0,ZHOOK_HANDLE)
00599   USTAR_2D (:,:) = 0.
00600   ZZ_O_LMO (:,:) = XUNDEF
00601   ZZ0_O_LMO(:,:) = XUNDEF
00602 !
00603 !* general case
00604   WHERE(ABS(PLMO) > 1.E-20 .AND. PLMO/=XUNDEF)
00605     ZZ_O_LMO  = PZ(:,:)  / PLMO(:,:)
00606     ZZ0_O_LMO = PZ0(:,:) / PLMO(:,:)
00607     USTAR_2D(:,:) = PWIND(:,:)                                &
00608                     * XKARMAN / ( LOG(PZ(:,:)/PZ0(:,:))         &
00609                                  - PAULSON_PSIM(ZZ_O_LMO(:,:))  &
00610                                  + PAULSON_PSIM(ZZ0_O_LMO(:,:)) )  
00611   END WHERE
00612 !
00613 !* purely neutral case
00614   WHERE(PLMO==XUNDEF)
00615     ZZ_O_LMO = 0.
00616     USTAR_2D(:,:) = PWIND(:,:)     &
00617                     * XKARMAN / LOG(PZ(:,:)/PZ0(:,:))  
00618   END WHERE
00619 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:USTAR_2D',1,ZHOOK_HANDLE)
00620 !
00621 END FUNCTION USTAR_2D
00622 !
00623 !-------------------------------------------------------------------------------
00624 !
00625 FUNCTION USTAR_1D(PWIND,PZ,PZ0,PLMO)
00626   USE MODD_CSTS
00627   USE MODD_SURF_PAR,  ONLY : XUNDEF
00628   IMPLICIT NONE  
00629   REAL, DIMENSION(:), INTENT(IN)               :: PWIND
00630   REAL, DIMENSION(:), INTENT(IN)               :: PZ
00631   REAL, DIMENSION(:), INTENT(IN)               :: PZ0
00632   REAL, DIMENSION(:), INTENT(IN)               :: PLMO
00633   REAL, DIMENSION(SIZE(PZ))                    :: USTAR_1D
00634 
00635   REAL, DIMENSION(SIZE(PZ))                    :: ZZ_O_LMO
00636   REAL, DIMENSION(SIZE(PZ))                    :: ZZ0_O_LMO
00637   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00638 !
00639 !* purely unstable case
00640   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:USTAR_1D',0,ZHOOK_HANDLE)
00641   USTAR_1D (:) = 0.
00642   ZZ_O_LMO (:) = XUNDEF
00643   ZZ0_O_LMO(:) = XUNDEF
00644 !
00645 !* general case
00646   WHERE(ABS(PLMO) > 1.E-20 .AND. PLMO/=XUNDEF)
00647     ZZ_O_LMO  = PZ(:)  / PLMO(:)
00648     ZZ0_O_LMO = PZ0(:) / PLMO(:)
00649     USTAR_1D(:) = PWIND                                   &
00650                   * XKARMAN / ( LOG(PZ(:)/PZ0(:))           &
00651                                - PAULSON_PSIM(ZZ_O_LMO(:))  &
00652                                + PAULSON_PSIM(ZZ0_O_LMO(:)) )  
00653   END WHERE
00654 !
00655 !* purely neutral case
00656   WHERE(PLMO==XUNDEF)
00657     ZZ_O_LMO = 0.
00658     USTAR_1D(:) = PWIND     &
00659                     * XKARMAN / LOG(PZ(:)/PZ0(:))  
00660   END WHERE
00661 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:USTAR_1D',1,ZHOOK_HANDLE)
00662 !
00663 END FUNCTION USTAR_1D
00664 !
00665 !-------------------------------------------------------------------------------
00666 !
00667 FUNCTION USTAR_0D(PWIND,PZ,PZ0,PLMO)
00668   USE MODD_CSTS
00669   USE MODD_SURF_PAR,  ONLY : XUNDEF
00670   IMPLICIT NONE  
00671   REAL, INTENT(IN)               :: PWIND
00672   REAL, INTENT(IN)               :: PZ
00673   REAL, INTENT(IN)               :: PZ0
00674   REAL, INTENT(IN)               :: PLMO
00675   REAL                           :: USTAR_0D
00676   REAL(KIND=JPRB) :: ZHOOK_HANDLE
00677 !
00678 !* purely unstable case
00679   IF (LHOOK) CALL DR_HOOK('MODE_SBLS:USTAR_0D',0,ZHOOK_HANDLE)
00680   USTAR_0D = 0.
00681 !
00682 !* general case
00683   IF ( ABS(PLMO) >= 1.E-20 .AND. PLMO/=XUNDEF)    &
00684     USTAR_0D = PWIND * XKARMAN / ( LOG(PZ/PZ0) - PAULSON_PSIM(PZ/PLMO) + PAULSON_PSIM(PZ0/PLMO) )  
00685 !
00686 !* purely neutral case
00687   IF (PLMO==XUNDEF)                  &
00688     USTAR_0D = PWIND * XKARMAN / LOG(PZ/PZ0)  
00689 IF (LHOOK) CALL DR_HOOK('MODE_SBLS:USTAR_0D',1,ZHOOK_HANDLE)
00690 
00691 END FUNCTION USTAR_0D
00692 !
00693 !-------------------------------------------------------------------------------
00694 !
00695 END MODULE MODE_SBLS
00696