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