SURFEX v7.3
General documentation of Surfex
|
00001 ! ###################### 00002 MODULE MODD_DIAG_TEB_n 00003 ! ###################### 00004 ! 00005 !!**** *MODD_DIAG_TEB - declaration of diagnostics for TEB scheme 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_TEB_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 ! 00050 LOGICAL :: LPGD ! flag for writing of PGD files 00051 LOGICAL :: LPGD_FIX ! flag for writing of PGD files for time 00052 ! invariant field 00053 ! 00054 !* averaged variables 00055 ! 00056 REAL, POINTER, DIMENSION(:) :: XRI ! Bulk-Richardson number (-) 00057 REAL, POINTER, DIMENSION(:) :: XCD ! drag coefficient for wind (W/s2) 00058 REAL, POINTER, DIMENSION(:) :: XCH ! drag coefficient for heat (W/s) 00059 REAL, POINTER, DIMENSION(:) :: XCE ! drag coefficient for vapor (W/s/K) 00060 REAL, POINTER, DIMENSION(:) :: XZ0 ! roughness length for momentum (m) 00061 REAL, POINTER, DIMENSION(:) :: XZ0H ! roughness length for heat (m) 00062 REAL, POINTER, DIMENSION(:) :: XRN ! net radiation at surface (W/m2) 00063 REAL, POINTER, DIMENSION(:) :: XH ! sensible heat flux (W/m2) 00064 REAL, POINTER, DIMENSION(:) :: XLE ! latent heat flux (W/m2) 00065 REAL, POINTER, DIMENSION(:) :: XGFLUX ! net soil-vegetation flux (W/m2) 00066 REAL, POINTER, DIMENSION(:) :: XT2M ! air temperature at 2 meters (K) 00067 REAL, POINTER, DIMENSION(:) :: XQ2M ! air humidity at 2 meters (kg/kg) 00068 REAL, POINTER, DIMENSION(:) :: XHU2M ! air relative humidity at 2 meters(-) 00069 REAL, POINTER, DIMENSION(:) :: XQS ! air humidity at surface (kg/kg) 00070 REAL, POINTER, DIMENSION(:) :: XZON10M ! zonal wind at 10 meters (m/s) 00071 REAL, POINTER, DIMENSION(:) :: XMER10M ! meridian wind at 10 meters (m/s) 00072 REAL, POINTER, DIMENSION(:) :: XSFCO2 ! CO2 flux (kg/m2/s) 00073 REAL, POINTER, DIMENSION(:) :: XLWD ! downward long wave radiation (W/m2) 00074 REAL, POINTER, DIMENSION(:) :: XLWU ! upward long wave radiation (W/m2) 00075 REAL, POINTER, DIMENSION(:) :: XSWD ! downward short wave radiation (W/m2) 00076 REAL, POINTER, DIMENSION(:) :: XSWU ! upward short wave radiation (W/m2) 00077 REAL, POINTER, DIMENSION(:,:) :: XSWBD ! downward short wave radiation by spectral band (W/m2) 00078 REAL, POINTER, DIMENSION(:,:) :: XSWBU ! upward short wave radiation by spectral band (W/m2) 00079 REAL, POINTER, DIMENSION(:) :: XFMU ! horizontal momentum flux zonal (m2/s2) 00080 REAL, POINTER, DIMENSION(:) :: XFMV ! horizontal momentum flux meridian (m2/s2) 00081 !------------------------------------------------------------------------------ 00082 ! 00083 00084 END TYPE DIAG_TEB_t 00085 00086 TYPE(DIAG_TEB_t), ALLOCATABLE, TARGET, SAVE :: DIAG_TEB_MODEL(:) 00087 00088 REAL, POINTER :: XDIAG_TSTEP=>NULL() 00089 !$OMP THREADPRIVATE(XDIAG_TSTEP) 00090 INTEGER, POINTER :: N2M=>NULL() 00091 !$OMP THREADPRIVATE(N2M) 00092 LOGICAL, POINTER :: L2M_MIN_ZS=>NULL() 00093 !$OMP THREADPRIVATE(L2M_MIN_ZS) 00094 LOGICAL, POINTER :: LSURF_BUDGET=>NULL() 00095 !$OMP THREADPRIVATE(LSURF_BUDGET) 00096 LOGICAL, POINTER :: LRAD_BUDGET=>NULL() 00097 !$OMP THREADPRIVATE(LRAD_BUDGET) 00098 LOGICAL, POINTER :: LCOEF=>NULL() 00099 !$OMP THREADPRIVATE(LCOEF) 00100 LOGICAL, POINTER :: LSURF_VARS=>NULL() 00101 !$OMP THREADPRIVATE(LSURF_VARS) 00102 LOGICAL, POINTER :: LPGD=>NULL() 00103 !$OMP THREADPRIVATE(LPGD) 00104 LOGICAL, POINTER :: LPGD_FIX=>NULL() 00105 !$OMP THREADPRIVATE(LPGD_FIX) 00106 REAL, POINTER, DIMENSION(:) :: XRI=>NULL() 00107 !$OMP THREADPRIVATE(XRI) 00108 REAL, POINTER, DIMENSION(:) :: XCD=>NULL() 00109 !$OMP THREADPRIVATE(XCD) 00110 REAL, POINTER, DIMENSION(:) :: XCH=>NULL() 00111 !$OMP THREADPRIVATE(XCH) 00112 REAL, POINTER, DIMENSION(:) :: XCE=>NULL() 00113 !$OMP THREADPRIVATE(XCE) 00114 REAL, POINTER, DIMENSION(:) :: XZ0=>NULL() 00115 !$OMP THREADPRIVATE(XZ0) 00116 REAL, POINTER, DIMENSION(:) :: XZ0H=>NULL() 00117 !$OMP THREADPRIVATE(XZ0H) 00118 REAL, POINTER, DIMENSION(:) :: XRN=>NULL() 00119 !$OMP THREADPRIVATE(XRN) 00120 REAL, POINTER, DIMENSION(:) :: XH=>NULL() 00121 !$OMP THREADPRIVATE(XH) 00122 REAL, POINTER, DIMENSION(:) :: XLE=>NULL() 00123 !$OMP THREADPRIVATE(XLE) 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(:) :: XSFCO2=>NULL() 00139 !$OMP THREADPRIVATE(XSFCO2) 00140 REAL, POINTER, DIMENSION(:) :: XLWD=>NULL() 00141 !$OMP THREADPRIVATE(XLWD) 00142 REAL, POINTER, DIMENSION(:) :: XLWU=>NULL() 00143 !$OMP THREADPRIVATE(XLWU) 00144 REAL, POINTER, DIMENSION(:) :: XSWD=>NULL() 00145 !$OMP THREADPRIVATE(XSWD) 00146 REAL, POINTER, DIMENSION(:) :: XSWU=>NULL() 00147 !$OMP THREADPRIVATE(XSWU) 00148 REAL, POINTER, DIMENSION(:,:) :: XSWBD=>NULL() 00149 !$OMP THREADPRIVATE(XSWBD) 00150 REAL, POINTER, DIMENSION(:,:) :: XSWBU=>NULL() 00151 !$OMP THREADPRIVATE(XSWBU) 00152 REAL, POINTER, DIMENSION(:) :: XFMU=>NULL() 00153 !$OMP THREADPRIVATE(XFMU) 00154 REAL, POINTER, DIMENSION(:) :: XFMV=>NULL() 00155 !$OMP THREADPRIVATE(XFMV) 00156 00157 CONTAINS 00158 00159 SUBROUTINE DIAG_TEB_GOTO_MODEL(KFROM, KTO, LKFROM) 00160 LOGICAL, INTENT(IN) :: LKFROM 00161 INTEGER, INTENT(IN) :: KFROM, KTO 00162 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00163 ! 00164 ! Save current state for allocated arrays 00165 IF (LKFROM) THEN 00166 DIAG_TEB_MODEL(KFROM)%XRI=>XRI 00167 DIAG_TEB_MODEL(KFROM)%XCD=>XCD 00168 DIAG_TEB_MODEL(KFROM)%XCH=>XCH 00169 DIAG_TEB_MODEL(KFROM)%XCE=>XCE 00170 DIAG_TEB_MODEL(KFROM)%XZ0=>XZ0 00171 DIAG_TEB_MODEL(KFROM)%XZ0H=>XZ0H 00172 DIAG_TEB_MODEL(KFROM)%XRN=>XRN 00173 DIAG_TEB_MODEL(KFROM)%XH=>XH 00174 DIAG_TEB_MODEL(KFROM)%XLE=>XLE 00175 DIAG_TEB_MODEL(KFROM)%XGFLUX=>XGFLUX 00176 DIAG_TEB_MODEL(KFROM)%XT2M=>XT2M 00177 DIAG_TEB_MODEL(KFROM)%XQ2M=>XQ2M 00178 DIAG_TEB_MODEL(KFROM)%XHU2M=>XHU2M 00179 DIAG_TEB_MODEL(KFROM)%XQS=>XQS 00180 DIAG_TEB_MODEL(KFROM)%XZON10M=>XZON10M 00181 DIAG_TEB_MODEL(KFROM)%XMER10M=>XMER10M 00182 DIAG_TEB_MODEL(KFROM)%XSFCO2=>XSFCO2 00183 DIAG_TEB_MODEL(KFROM)%XLWD=>XLWD 00184 DIAG_TEB_MODEL(KFROM)%XLWU=>XLWU 00185 DIAG_TEB_MODEL(KFROM)%XSWD=>XSWD 00186 DIAG_TEB_MODEL(KFROM)%XSWU=>XSWU 00187 DIAG_TEB_MODEL(KFROM)%XSWBD=>XSWBD 00188 DIAG_TEB_MODEL(KFROM)%XSWBU=>XSWBU 00189 DIAG_TEB_MODEL(KFROM)%XFMU=>XFMU 00190 DIAG_TEB_MODEL(KFROM)%XFMV=>XFMV 00191 ENDIF 00192 ! 00193 ! Current model is set to model KTO 00194 IF (LHOOK) CALL DR_HOOK('MODD_DIAG_TEB_N:DIAG_TEB_GOTO_MODEL',0,ZHOOK_HANDLE) 00195 XDIAG_TSTEP=>DIAG_TEB_MODEL(KTO)%XDIAG_TSTEP 00196 N2M=>DIAG_TEB_MODEL(KTO)%N2M 00197 L2M_MIN_ZS=>DIAG_TEB_MODEL(KTO)%L2M_MIN_ZS 00198 LSURF_BUDGET=>DIAG_TEB_MODEL(KTO)%LSURF_BUDGET 00199 LRAD_BUDGET=>DIAG_TEB_MODEL(KTO)%LRAD_BUDGET 00200 LCOEF=>DIAG_TEB_MODEL(KTO)%LCOEF 00201 LSURF_VARS=>DIAG_TEB_MODEL(KTO)%LSURF_VARS 00202 LPGD=>DIAG_TEB_MODEL(KTO)%LPGD 00203 LPGD_FIX=>DIAG_TEB_MODEL(KTO)%LPGD_FIX 00204 XRI=>DIAG_TEB_MODEL(KTO)%XRI 00205 XCD=>DIAG_TEB_MODEL(KTO)%XCD 00206 XCH=>DIAG_TEB_MODEL(KTO)%XCH 00207 XCE=>DIAG_TEB_MODEL(KTO)%XCE 00208 XZ0=>DIAG_TEB_MODEL(KTO)%XZ0 00209 XZ0H=>DIAG_TEB_MODEL(KTO)%XZ0H 00210 XRN=>DIAG_TEB_MODEL(KTO)%XRN 00211 XH=>DIAG_TEB_MODEL(KTO)%XH 00212 XLE=>DIAG_TEB_MODEL(KTO)%XLE 00213 XGFLUX=>DIAG_TEB_MODEL(KTO)%XGFLUX 00214 XT2M=>DIAG_TEB_MODEL(KTO)%XT2M 00215 XQ2M=>DIAG_TEB_MODEL(KTO)%XQ2M 00216 XHU2M=>DIAG_TEB_MODEL(KTO)%XHU2M 00217 XQS=>DIAG_TEB_MODEL(KTO)%XQS 00218 XZON10M=>DIAG_TEB_MODEL(KTO)%XZON10M 00219 XMER10M=>DIAG_TEB_MODEL(KTO)%XMER10M 00220 XSFCO2=>DIAG_TEB_MODEL(KTO)%XSFCO2 00221 XLWD=>DIAG_TEB_MODEL(KTO)%XLWD 00222 XLWU=>DIAG_TEB_MODEL(KTO)%XLWU 00223 XSWD=>DIAG_TEB_MODEL(KTO)%XSWD 00224 XSWU=>DIAG_TEB_MODEL(KTO)%XSWU 00225 XSWBD=>DIAG_TEB_MODEL(KTO)%XSWBD 00226 XSWBU=>DIAG_TEB_MODEL(KTO)%XSWBU 00227 XFMU=>DIAG_TEB_MODEL(KTO)%XFMU 00228 XFMV=>DIAG_TEB_MODEL(KTO)%XFMV 00229 IF (LHOOK) CALL DR_HOOK('MODD_DIAG_TEB_N:DIAG_TEB_GOTO_MODEL',1,ZHOOK_HANDLE) 00230 00231 END SUBROUTINE DIAG_TEB_GOTO_MODEL 00232 00233 SUBROUTINE DIAG_TEB_ALLOC(KMODEL) 00234 INTEGER, INTENT(IN) :: KMODEL 00235 INTEGER :: J 00236 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00237 IF (LHOOK) CALL DR_HOOK("MODD_DIAG_TEB_N:DIAG_TEB_ALLOC",0,ZHOOK_HANDLE) 00238 ALLOCATE(DIAG_TEB_MODEL(KMODEL)) 00239 DO J=1,KMODEL 00240 NULLIFY(DIAG_TEB_MODEL(J)%XRI) 00241 NULLIFY(DIAG_TEB_MODEL(J)%XCD) 00242 NULLIFY(DIAG_TEB_MODEL(J)%XCH) 00243 NULLIFY(DIAG_TEB_MODEL(J)%XCE) 00244 NULLIFY(DIAG_TEB_MODEL(J)%XZ0) 00245 NULLIFY(DIAG_TEB_MODEL(J)%XZ0H) 00246 NULLIFY(DIAG_TEB_MODEL(J)%XRN) 00247 NULLIFY(DIAG_TEB_MODEL(J)%XH) 00248 NULLIFY(DIAG_TEB_MODEL(J)%XLE) 00249 NULLIFY(DIAG_TEB_MODEL(J)%XGFLUX) 00250 NULLIFY(DIAG_TEB_MODEL(J)%XT2M) 00251 NULLIFY(DIAG_TEB_MODEL(J)%XQ2M) 00252 NULLIFY(DIAG_TEB_MODEL(J)%XHU2M) 00253 NULLIFY(DIAG_TEB_MODEL(J)%XQS) 00254 NULLIFY(DIAG_TEB_MODEL(J)%XZON10M) 00255 NULLIFY(DIAG_TEB_MODEL(J)%XMER10M) 00256 NULLIFY(DIAG_TEB_MODEL(J)%XSFCO2) 00257 NULLIFY(DIAG_TEB_MODEL(J)%XLWD) 00258 NULLIFY(DIAG_TEB_MODEL(J)%XLWU) 00259 NULLIFY(DIAG_TEB_MODEL(J)%XSWD) 00260 NULLIFY(DIAG_TEB_MODEL(J)%XSWU) 00261 NULLIFY(DIAG_TEB_MODEL(J)%XSWBD) 00262 NULLIFY(DIAG_TEB_MODEL(J)%XSWBU) 00263 NULLIFY(DIAG_TEB_MODEL(J)%XFMU) 00264 NULLIFY(DIAG_TEB_MODEL(J)%XFMV) 00265 ENDDO 00266 DIAG_TEB_MODEL(:)%XDIAG_TSTEP=0. 00267 DIAG_TEB_MODEL(:)%N2M=0 00268 DIAG_TEB_MODEL(:)%L2M_MIN_ZS=.FALSE. 00269 DIAG_TEB_MODEL(:)%LSURF_BUDGET=.FALSE. 00270 DIAG_TEB_MODEL(:)%LRAD_BUDGET=.FALSE. 00271 DIAG_TEB_MODEL(:)%LCOEF=.FALSE. 00272 DIAG_TEB_MODEL(:)%LSURF_VARS=.FALSE. 00273 DIAG_TEB_MODEL(:)%LPGD=.FALSE. 00274 DIAG_TEB_MODEL(:)%LPGD_FIX=.FALSE. 00275 IF (LHOOK) CALL DR_HOOK("MODD_DIAG_TEB_N:DIAG_TEB_ALLOC",1,ZHOOK_HANDLE) 00276 END SUBROUTINE DIAG_TEB_ALLOC 00277 00278 SUBROUTINE DIAG_TEB_DEALLO 00279 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00280 IF (LHOOK) CALL DR_HOOK("MODD_DIAG_TEB_N:DIAG_TEB_DEALLO",0,ZHOOK_HANDLE) 00281 IF (ALLOCATED(DIAG_TEB_MODEL)) DEALLOCATE(DIAG_TEB_MODEL) 00282 IF (LHOOK) CALL DR_HOOK("MODD_DIAG_TEB_N:DIAG_TEB_DEALLO",1,ZHOOK_HANDLE) 00283 END SUBROUTINE DIAG_TEB_DEALLO 00284 00285 END MODULE MODD_DIAG_TEB_n