SURFEX v7.3
General documentation of Surfex
|
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