SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/modd_diag_flaken.F90
Go to the documentation of this file.
00001 !     ######################
00002 MODULE MODD_DIAG_FLAKE_n
00003 !     ######################
00004 !
00005 !!****  *MODD_DIAG_FLAKE - declaration of diagnostics for FLake model
00006 !!
00007 !!    PURPOSE
00008 !!    -------
00009 !
00010 !!
00011 !!**  IMPLICIT ARGUMENTS
00012 !!    ------------------
00013 !!      None 
00014 !!
00015 !!    REFERENCE
00016 !!    ---------
00017 !!
00018 !!    AUTHOR
00019 !!    ------
00020 !!      V. Masson   *Meteo France*
00021 !!
00022 !!    MODIFICATIONS
00023 !!    -------------
00024 !!      Original       01/2004
00025 !!      Modified    01/2006 : sea flux parameterization.
00026 !
00027 !*       0.   DECLARATIONS
00028 !             ------------
00029 !
00030 !
00031 !
00032 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00033 USE PARKIND1  ,ONLY : JPRB
00034 !
00035 IMPLICIT NONE
00036 
00037 TYPE DIAG_FLAKE_t
00038 !------------------------------------------------------------------------------
00039 !
00040   REAL    :: XDIAG_TSTEP  ! time step for diagnostics writing
00041 !
00042   INTEGER :: N2M          ! flag for 2 meters (and 10 meters) quantities
00043   LOGICAL :: L2M_MIN_ZS   ! flag for 2 meters quantities evaluated on
00044 !                         ! the minimum orographyy of the grid      
00045   LOGICAL :: LSURF_BUDGET ! flag for surface energy budget
00046   LOGICAL :: LRAD_BUDGET  ! flag for radiative energy budget      
00047   LOGICAL :: LCOEF        ! flag for transfer coefficients
00048   LOGICAL :: LSURF_VARS   ! flag for surface variables
00049   LOGICAL :: LSURF_BUDGETC       ! flag for surface cumulated energy budget
00050   LOGICAL :: LRESET_BUDGETC      ! flag for surface cumulated energy budget
00051 !
00052 !* averaged variables
00053 !
00054   REAL, POINTER, DIMENSION(:)   :: XRI      ! Bulk-Richardson number           (-)
00055   REAL, POINTER, DIMENSION(:)   :: XCD      ! drag coefficient for wind        (W/s2)
00056   REAL, POINTER, DIMENSION(:)   :: XCH      ! drag coefficient for heat        (W/s)
00057   REAL, POINTER, DIMENSION(:)   :: XCE      ! drag coefficient for vapor       (W/s/K)
00058   REAL, POINTER, DIMENSION(:)   :: XZ0      ! roughness length for momentum    (m)
00059   REAL, POINTER, DIMENSION(:)   :: XZ0H     ! roughness length for heat        (m)      
00060   REAL, POINTER, DIMENSION(:)   :: XRN      ! net radiation at surface         (W/m2)
00061   REAL, POINTER, DIMENSION(:)   :: XH       ! sensible heat flux               (W/m2)
00062   REAL, POINTER, DIMENSION(:)   :: XLE      ! total latent heat flux           (W/m2) 
00063   REAL, POINTER, DIMENSION(:)   :: XLEI     ! sublimation latent heat flux     (W/m2) 
00064   REAL, POINTER, DIMENSION(:)   :: XGFLUX   ! net soil-vegetation flux         (W/m2)
00065   REAL, POINTER, DIMENSION(:)   :: XT2M     ! air temperature at 2 meters      (K)
00066   REAL, POINTER, DIMENSION(:)   :: XQ2M     ! air humidity at 2 meters         (kg/kg)
00067   REAL, POINTER, DIMENSION(:)   :: XHU2M    ! air relative humidity at 2 meters(-)
00068   REAL, POINTER, DIMENSION(:)   :: XQS      ! air humidity at surface          (kg/kg)
00069   REAL, POINTER, DIMENSION(:)   :: XZON10M  ! zonal wind at 10 meters          (m/s)
00070   REAL, POINTER, DIMENSION(:)   :: XMER10M  ! meridian wind at 10 meters       (m/s)
00071   REAL, POINTER, DIMENSION(:)   :: XLWD     ! downward long wave radiation     (W/m2)
00072   REAL, POINTER, DIMENSION(:)   :: XLWU     ! upward long wave radiation       (W/m2)
00073   REAL, POINTER, DIMENSION(:)   :: XSWD     ! downward short wave radiation    (W/m2)
00074   REAL, POINTER, DIMENSION(:)   :: XSWU     ! upward short wave radiation      (W/m2)
00075   REAL, POINTER, DIMENSION(:,:) :: XSWBD    ! downward short wave radiation by spectral band   (W/m2)
00076   REAL, POINTER, DIMENSION(:,:) :: XSWBU    ! upward short wave radiation by spectral band (W/m2)
00077   REAL, POINTER, DIMENSION(:)   :: XFMU     ! horizontal momentum flux zonal   (m2/s2)
00078   REAL, POINTER, DIMENSION(:)   :: XFMV     ! horizontal momentum flux meridian (m2/s2)
00079 !------------------------------------------------------------------------------
00080 !
00081 
00082 END TYPE DIAG_FLAKE_t
00083 
00084 TYPE(DIAG_FLAKE_t), ALLOCATABLE, TARGET, SAVE :: DIAG_FLAKE_MODEL(:)
00085 
00086 REAL, POINTER :: XDIAG_TSTEP=>NULL()
00087 !$OMP THREADPRIVATE(XDIAG_TSTEP)
00088 INTEGER, POINTER :: N2M=>NULL()
00089 !$OMP THREADPRIVATE(N2M)
00090 LOGICAL, POINTER :: L2M_MIN_ZS=>NULL()
00091 !$OMP THREADPRIVATE(L2M_MIN_ZS)
00092 LOGICAL, POINTER :: LSURF_BUDGET=>NULL()
00093 !$OMP THREADPRIVATE(LSURF_BUDGET)
00094 LOGICAL, POINTER :: LRAD_BUDGET=>NULL()
00095 !$OMP THREADPRIVATE(LRAD_BUDGET)
00096 LOGICAL, POINTER :: LCOEF=>NULL()
00097 !$OMP THREADPRIVATE(LCOEF)
00098 LOGICAL, POINTER :: LSURF_VARS=>NULL()
00099 !$OMP THREADPRIVATE(LSURF_VARS)
00100 LOGICAL, POINTER :: LSURF_BUDGETC=>NULL()
00101 !$OMP THREADPRIVATE(LSURF_BUDGETC)
00102 LOGICAL, POINTER :: LRESET_BUDGETC=>NULL()
00103 !$OMP THREADPRIVATE(LRESET_BUDGETC)
00104 REAL, POINTER, DIMENSION(:)   :: XRI=>NULL()
00105 !$OMP THREADPRIVATE(XRI)
00106 REAL, POINTER, DIMENSION(:)   :: XCD=>NULL()
00107 !$OMP THREADPRIVATE(XCD)
00108 REAL, POINTER, DIMENSION(:)   :: XCH=>NULL()
00109 !$OMP THREADPRIVATE(XCH)
00110 REAL, POINTER, DIMENSION(:)   :: XCE=>NULL()
00111 !$OMP THREADPRIVATE(XCE)
00112 REAL, POINTER, DIMENSION(:)   :: XZ0=>NULL()
00113 !$OMP THREADPRIVATE(XZ0)
00114 REAL, POINTER, DIMENSION(:)   :: XZ0H=>NULL()
00115 !$OMP THREADPRIVATE(XZ0H)
00116 REAL, POINTER, DIMENSION(:)   :: XRN=>NULL()
00117 !$OMP THREADPRIVATE(XRN)
00118 REAL, POINTER, DIMENSION(:)   :: XH=>NULL()
00119 !$OMP THREADPRIVATE(XH)
00120 REAL, POINTER, DIMENSION(:)   :: XLE=>NULL()
00121 !$OMP THREADPRIVATE(XLE)
00122 REAL, POINTER, DIMENSION(:)   :: XLEI=>NULL()
00123 !$OMP THREADPRIVATE(XLEI)
00124 REAL, POINTER, DIMENSION(:)   :: XGFLUX=>NULL()
00125 !$OMP THREADPRIVATE(XGFLUX)
00126 REAL, POINTER, DIMENSION(:)   :: XT2M=>NULL()
00127 !$OMP THREADPRIVATE(XT2M)
00128 REAL, POINTER, DIMENSION(:)   :: XQ2M=>NULL()
00129 !$OMP THREADPRIVATE(XQ2M)
00130 REAL, POINTER, DIMENSION(:)   :: XHU2M=>NULL()
00131 !$OMP THREADPRIVATE(XHU2M)
00132 REAL, POINTER, DIMENSION(:)   :: XQS=>NULL()
00133 !$OMP THREADPRIVATE(XQS)
00134 REAL, POINTER, DIMENSION(:)   :: XZON10M=>NULL()
00135 !$OMP THREADPRIVATE(XZON10M)
00136 REAL, POINTER, DIMENSION(:)   :: XMER10M=>NULL()
00137 !$OMP THREADPRIVATE(XMER10M)
00138 REAL, POINTER, DIMENSION(:)   :: XLWD=>NULL()
00139 !$OMP THREADPRIVATE(XLWD)
00140 REAL, POINTER, DIMENSION(:)   :: XLWU=>NULL()
00141 !$OMP THREADPRIVATE(XLWU)
00142 REAL, POINTER, DIMENSION(:)   :: XSWD=>NULL()
00143 !$OMP THREADPRIVATE(XSWD)
00144 REAL, POINTER, DIMENSION(:)   :: XSWU=>NULL()
00145 !$OMP THREADPRIVATE(XSWU)
00146 REAL, POINTER, DIMENSION(:,:) :: XSWBD=>NULL()
00147 !$OMP THREADPRIVATE(XSWBD)
00148 REAL, POINTER, DIMENSION(:,:) :: XSWBU=>NULL()
00149 !$OMP THREADPRIVATE(XSWBU)
00150 REAL, POINTER, DIMENSION(:)   :: XFMU=>NULL()
00151 !$OMP THREADPRIVATE(XFMU)
00152 REAL, POINTER, DIMENSION(:)   :: XFMV=>NULL()
00153 !$OMP THREADPRIVATE(XFMV)
00154 
00155 CONTAINS
00156 
00157 SUBROUTINE DIAG_FLAKE_GOTO_MODEL(KFROM, KTO, LKFROM)
00158 LOGICAL, INTENT(IN) :: LKFROM
00159 INTEGER, INTENT(IN) :: KFROM, KTO
00160 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00161 !
00162 ! Save current state for allocated arrays
00163 IF (LKFROM) THEN
00164 DIAG_FLAKE_MODEL(KFROM)%XRI=>XRI
00165 DIAG_FLAKE_MODEL(KFROM)%XCD=>XCD
00166 DIAG_FLAKE_MODEL(KFROM)%XCH=>XCH
00167 DIAG_FLAKE_MODEL(KFROM)%XCE=>XCE
00168 DIAG_FLAKE_MODEL(KFROM)%XZ0=>XZ0
00169 DIAG_FLAKE_MODEL(KFROM)%XZ0H=>XZ0H
00170 DIAG_FLAKE_MODEL(KFROM)%XRN=>XRN
00171 DIAG_FLAKE_MODEL(KFROM)%XH=>XH
00172 DIAG_FLAKE_MODEL(KFROM)%XLE=>XLE
00173 DIAG_FLAKE_MODEL(KFROM)%XLEI=>XLEI
00174 DIAG_FLAKE_MODEL(KFROM)%XGFLUX=>XGFLUX
00175 DIAG_FLAKE_MODEL(KFROM)%XT2M=>XT2M
00176 DIAG_FLAKE_MODEL(KFROM)%XQ2M=>XQ2M
00177 DIAG_FLAKE_MODEL(KFROM)%XHU2M=>XHU2M
00178 DIAG_FLAKE_MODEL(KFROM)%XQS=>XQS
00179 DIAG_FLAKE_MODEL(KFROM)%XZON10M=>XZON10M
00180 DIAG_FLAKE_MODEL(KFROM)%XMER10M=>XMER10M
00181 DIAG_FLAKE_MODEL(KFROM)%XLWD=>XLWD
00182 DIAG_FLAKE_MODEL(KFROM)%XLWU=>XLWU
00183 DIAG_FLAKE_MODEL(KFROM)%XSWD=>XSWD
00184 DIAG_FLAKE_MODEL(KFROM)%XSWU=>XSWU
00185 DIAG_FLAKE_MODEL(KFROM)%XSWBD=>XSWBD
00186 DIAG_FLAKE_MODEL(KFROM)%XSWBU=>XSWBU
00187 DIAG_FLAKE_MODEL(KFROM)%XFMU=>XFMU
00188 DIAG_FLAKE_MODEL(KFROM)%XFMV=>XFMV
00189 ENDIF
00190 !
00191 ! Current model is set to model KTO
00192 IF (LHOOK) CALL DR_HOOK('MODD_DIAG_FLAKE_N:DIAG_FLAKE_GOTO_MODEL',0,ZHOOK_HANDLE)
00193 
00194 XDIAG_TSTEP=>DIAG_FLAKE_MODEL(KTO)%XDIAG_TSTEP
00195 N2M=>DIAG_FLAKE_MODEL(KTO)%N2M
00196 L2M_MIN_ZS=>DIAG_FLAKE_MODEL(KTO)%L2M_MIN_ZS
00197 LSURF_BUDGET=>DIAG_FLAKE_MODEL(KTO)%LSURF_BUDGET
00198 LRAD_BUDGET=>DIAG_FLAKE_MODEL(KTO)%LRAD_BUDGET
00199 LCOEF=>DIAG_FLAKE_MODEL(KTO)%LCOEF
00200 LSURF_VARS=>DIAG_FLAKE_MODEL(KTO)%LSURF_VARS
00201 LSURF_BUDGETC=>DIAG_FLAKE_MODEL(KTO)%LSURF_BUDGETC
00202 LRESET_BUDGETC=>DIAG_FLAKE_MODEL(KTO)%LRESET_BUDGETC
00203 XRI=>DIAG_FLAKE_MODEL(KTO)%XRI
00204 XCD=>DIAG_FLAKE_MODEL(KTO)%XCD
00205 XCH=>DIAG_FLAKE_MODEL(KTO)%XCH
00206 XCE=>DIAG_FLAKE_MODEL(KTO)%XCE
00207 XZ0=>DIAG_FLAKE_MODEL(KTO)%XZ0
00208 XZ0H=>DIAG_FLAKE_MODEL(KTO)%XZ0H
00209 XRN=>DIAG_FLAKE_MODEL(KTO)%XRN
00210 XH=>DIAG_FLAKE_MODEL(KTO)%XH
00211 XLE=>DIAG_FLAKE_MODEL(KTO)%XLE
00212 XLEI=>DIAG_FLAKE_MODEL(KTO)%XLEI
00213 XGFLUX=>DIAG_FLAKE_MODEL(KTO)%XGFLUX
00214 XT2M=>DIAG_FLAKE_MODEL(KTO)%XT2M
00215 XQ2M=>DIAG_FLAKE_MODEL(KTO)%XQ2M
00216 XHU2M=>DIAG_FLAKE_MODEL(KTO)%XHU2M
00217 XQS=>DIAG_FLAKE_MODEL(KTO)%XQS
00218 XZON10M=>DIAG_FLAKE_MODEL(KTO)%XZON10M
00219 XMER10M=>DIAG_FLAKE_MODEL(KTO)%XMER10M
00220 XLWD=>DIAG_FLAKE_MODEL(KTO)%XLWD
00221 XLWU=>DIAG_FLAKE_MODEL(KTO)%XLWU
00222 XSWD=>DIAG_FLAKE_MODEL(KTO)%XSWD
00223 XSWU=>DIAG_FLAKE_MODEL(KTO)%XSWU
00224 XSWBD=>DIAG_FLAKE_MODEL(KTO)%XSWBD
00225 XSWBU=>DIAG_FLAKE_MODEL(KTO)%XSWBU
00226 XFMU=>DIAG_FLAKE_MODEL(KTO)%XFMU
00227 XFMV=>DIAG_FLAKE_MODEL(KTO)%XFMV
00228 
00229 IF (LHOOK) CALL DR_HOOK('MODD_DIAG_FLAKE_N:DIAG_FLAKE_GOTO_MODEL',1,ZHOOK_HANDLE)
00230 
00231 END SUBROUTINE DIAG_FLAKE_GOTO_MODEL
00232 
00233 SUBROUTINE DIAG_FLAKE_ALLOC(KMODEL)
00234 INTEGER, INTENT(IN) :: KMODEL
00235 INTEGER :: J
00236 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00237 IF (LHOOK) CALL DR_HOOK("MODD_DIAG_FLAKE_N:DIAG_FLAKE_ALLOC",0,ZHOOK_HANDLE)
00238 ALLOCATE(DIAG_FLAKE_MODEL(KMODEL))
00239 DO J=1,KMODEL
00240   NULLIFY(DIAG_FLAKE_MODEL(J)%XRI)
00241   NULLIFY(DIAG_FLAKE_MODEL(J)%XCD)
00242   NULLIFY(DIAG_FLAKE_MODEL(J)%XCH)
00243   NULLIFY(DIAG_FLAKE_MODEL(J)%XCE)
00244   NULLIFY(DIAG_FLAKE_MODEL(J)%XZ0)
00245   NULLIFY(DIAG_FLAKE_MODEL(J)%XZ0H)
00246   NULLIFY(DIAG_FLAKE_MODEL(J)%XRN)
00247   NULLIFY(DIAG_FLAKE_MODEL(J)%XH)
00248   NULLIFY(DIAG_FLAKE_MODEL(J)%XLE)
00249   NULLIFY(DIAG_FLAKE_MODEL(J)%XLEI)
00250   NULLIFY(DIAG_FLAKE_MODEL(J)%XGFLUX)
00251   NULLIFY(DIAG_FLAKE_MODEL(J)%XT2M)
00252   NULLIFY(DIAG_FLAKE_MODEL(J)%XQ2M)
00253   NULLIFY(DIAG_FLAKE_MODEL(J)%XHU2M)
00254   NULLIFY(DIAG_FLAKE_MODEL(J)%XQS)
00255   NULLIFY(DIAG_FLAKE_MODEL(J)%XZON10M)
00256   NULLIFY(DIAG_FLAKE_MODEL(J)%XMER10M)
00257   NULLIFY(DIAG_FLAKE_MODEL(J)%XLWD)
00258   NULLIFY(DIAG_FLAKE_MODEL(J)%XLWU)
00259   NULLIFY(DIAG_FLAKE_MODEL(J)%XSWD)
00260   NULLIFY(DIAG_FLAKE_MODEL(J)%XSWU)
00261   NULLIFY(DIAG_FLAKE_MODEL(J)%XSWBD)
00262   NULLIFY(DIAG_FLAKE_MODEL(J)%XSWBU)
00263   NULLIFY(DIAG_FLAKE_MODEL(J)%XFMU)
00264   NULLIFY(DIAG_FLAKE_MODEL(J)%XFMV)
00265 ENDDO
00266 DIAG_FLAKE_MODEL(:)%XDIAG_TSTEP=0.
00267 DIAG_FLAKE_MODEL(:)%N2M=0
00268 DIAG_FLAKE_MODEL(:)%L2M_MIN_ZS=.FALSE.
00269 DIAG_FLAKE_MODEL(:)%LSURF_BUDGET=.FALSE.
00270 DIAG_FLAKE_MODEL(:)%LRAD_BUDGET=.FALSE.
00271 DIAG_FLAKE_MODEL(:)%LCOEF=.FALSE.
00272 DIAG_FLAKE_MODEL(:)%LSURF_VARS=.FALSE.
00273 DIAG_FLAKE_MODEL(:)%LSURF_BUDGETC=.FALSE.
00274 DIAG_FLAKE_MODEL(:)%LRESET_BUDGETC=.FALSE.
00275 IF (LHOOK) CALL DR_HOOK("MODD_DIAG_FLAKE_N:DIAG_FLAKE_ALLOC",1,ZHOOK_HANDLE)
00276 END SUBROUTINE DIAG_FLAKE_ALLOC
00277 
00278 SUBROUTINE DIAG_FLAKE_DEALLO
00279 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00280 IF (LHOOK) CALL DR_HOOK("MODD_DIAG_FLAKE_N:DIAG_FLAKE_DEALLO",0,ZHOOK_HANDLE)
00281 IF (ALLOCATED(DIAG_FLAKE_MODEL)) DEALLOCATE(DIAG_FLAKE_MODEL)
00282 IF (LHOOK) CALL DR_HOOK("MODD_DIAG_FLAKE_N:DIAG_FLAKE_DEALLO",1,ZHOOK_HANDLE)
00283 END SUBROUTINE DIAG_FLAKE_DEALLO
00284 
00285 END MODULE MODD_DIAG_FLAKE_n