SURFEX v7.3
General documentation of Surfex
|
00001 ! #################### 00002 MODULE MODD_SURF_ATM_n 00003 ! ###################### 00004 ! 00005 !!**** *MODD_SURF_ATM - declaration of surface parameters 00006 !! 00007 !! PURPOSE 00008 !! ------- 00009 ! Declaration of surface parameters 00010 ! 00011 !! 00012 !!** IMPLICIT ARGUMENTS 00013 !! ------------------ 00014 !! None 00015 !! 00016 !! REFERENCE 00017 !! --------- 00018 !! 00019 !! AUTHOR 00020 !! ------ 00021 !! V. Masson and A. Boone *Meteo France* 00022 !! 00023 !! MODIFICATIONS 00024 !! ------------- 00025 !! Original 01/2004 00026 ! 00027 !* 0. DECLARATIONS 00028 ! ------------ 00029 ! 00030 USE MODD_TYPE_DATE_SURF 00031 ! 00032 ! 00033 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00034 USE PARKIND1 ,ONLY : JPRB 00035 ! 00036 IMPLICIT NONE 00037 00038 TYPE SURF_ATM_t 00039 ! 00040 !----------------------------------------------------------------------------------------------------- 00041 ! 00042 ! Type of each surface scheme 00043 ! 00044 CHARACTER(LEN=6) :: CTOWN ! name of the urban surface scheme 00045 CHARACTER(LEN=6) :: CNATURE ! name of the soil&vegetation surface scheme 00046 CHARACTER(LEN=6) :: CWATER ! name of the scheme for inland water 00047 CHARACTER(LEN=6) :: CSEA ! name for the ocean scheme 00048 ! 00049 !----------------------------------------------------------------------------------------------------- 00050 ! 00051 ! Surface/Tile Fractions: 00052 ! 00053 REAL, POINTER, DIMENSION(:) :: XTOWN ! urban surface fraction of the grid box (-) 00054 REAL, POINTER, DIMENSION(:) :: XNATURE ! natural surface fraction of the grid box (-) 00055 REAL, POINTER, DIMENSION(:) :: XWATER ! inland water fraction of the grid box (-) 00056 REAL, POINTER, DIMENSION(:) :: XSEA ! sea/ocean fraction of the grid box (-) 00057 ! 00058 !------------------------------------------------------------------------------- 00059 ! 00060 ! type of initialization of vegetation: from cover types (ecoclimap) or parameters prescribed 00061 ! 00062 LOGICAL :: LECOCLIMAP ! T: parameters computed from ecoclimap 00063 ! ! F: they are read in the file 00064 ! 00065 !------------------------------------------------------------------------------- 00066 ! 00067 ! change water (not lake) to nature and/or town to rock : arrange cover properly 00068 ! 00069 LOGICAL :: LWATER_TO_NATURE ! T: Change Wetland treated as inland water into nature 00070 LOGICAL :: LTOWN_TO_ROCK ! T: Change Town into Rock 00071 ! 00072 !------------------------------------------------------------------------------- 00073 ! 00074 ! include urban green areas for urbanized covers 00075 ! 00076 LOGICAL :: LGARDEN ! T: define urban green areas 00077 ! ! F: no urban green areas 00078 ! 00079 !----------------------------------------------------------------------------------------------------- 00080 ! 00081 ! Masks and number of grid elements for each tile surface 00082 ! 00083 ! Sea/Ocean: 00084 ! 00085 INTEGER :: NSIZE_SEA ! number of grid points by proc containing a 00086 ! ! sea surface (-) 00087 INTEGER :: NDIM_SEA ! total number of grid points containing a 00088 ! ! sea surface (-) 00089 INTEGER, POINTER, DIMENSION(:) :: NR_SEA ! sea/ocean surface mask (-) 00090 ! 00091 ! Inland Water: 00092 ! 00093 INTEGER :: NSIZE_WATER ! number of grid points containing an 00094 ! ! inland water surface (-) 00095 INTEGER :: NDIM_WATER ! total number of grid points by proc containing an 00096 ! ! inland surface 00097 INTEGER, POINTER, DIMENSION(:) :: NR_WATER 00098 ! 00099 ! Town: 00100 ! 00101 INTEGER :: NSIZE_TOWN ! number of grid points by proc containing an 00102 ! ! urban surface (-) 00103 INTEGER :: NDIM_TOWN ! total number of grid points containing an 00104 ! ! urban surface 00105 INTEGER, POINTER, DIMENSION(:) :: NR_TOWN ! urban surface mask (-) 00106 ! 00107 ! Natural surface: 00108 ! 00109 INTEGER :: NSIZE_NATURE ! number of grid points by proc containing a 00110 ! ! natural surface (-) 00111 INTEGER :: NDIM_NATURE ! total number of grid points containing a 00112 ! ! natural surface (-) 00113 INTEGER, POINTER, DIMENSION(:) :: NR_NATURE ! natural surface mask (-) 00114 ! 00115 ! All surfaces: 00116 ! 00117 INTEGER :: NSIZE_FULL ! total number of grid points by proc (-) 00118 INTEGER :: NDIM_FULL ! total number of grid points (-) 00119 ! 00120 !----------------------------------------------------------------------------------------------------- 00121 ! 00122 ! Surface fields (only 1 horizontal dimension) 00123 ! 00124 REAL, POINTER, DIMENSION(:,:) :: XCOVER ! fraction of each ecosystem for each grid box (-) 00125 LOGICAL, POINTER, DIMENSION(:):: LCOVER ! GCOVER(i)=T --> ith cover field is not 0. 00126 REAL, POINTER, DIMENSION(:) :: XZS ! orography (m) 00127 ! 00128 !------------------------------------------------------------------------------- 00129 ! 00130 TYPE (DATE_TIME) :: TTIME ! current date and time 00131 ! 00132 REAL :: XOUT_TSTEP ! output writing time step 00133 ! 00134 !----------------------------------------------------------------------------------------------------- 00135 ! 00136 ! flag used to Read/Write precipitation forcing from/into the restart file for ARPEGE/ALADIN run 00137 ! 00138 LOGICAL :: LINIT_PRECIP 00139 ! 00140 !----------------------------------------------------------------------------------------------------- 00141 ! 00142 ! 00143 00144 00145 END TYPE SURF_ATM_t 00146 00147 TYPE(SURF_ATM_t), ALLOCATABLE, TARGET, SAVE :: SURF_ATM_MODEL(:) 00148 00149 CHARACTER(LEN=6), POINTER :: CTOWN=>NULL() 00150 !$OMP THREADPRIVATE(CTOWN) 00151 CHARACTER(LEN=6), POINTER :: CNATURE=>NULL() 00152 !$OMP THREADPRIVATE(CNATURE) 00153 CHARACTER(LEN=6), POINTER :: CWATER=>NULL() 00154 !$OMP THREADPRIVATE(CWATER) 00155 CHARACTER(LEN=6), POINTER :: CSEA=>NULL() 00156 !$OMP THREADPRIVATE(CSEA) 00157 REAL, POINTER, DIMENSION(:) :: XTOWN=>NULL() 00158 !$OMP THREADPRIVATE(XTOWN) 00159 REAL, POINTER, DIMENSION(:) :: XNATURE=>NULL() 00160 !$OMP THREADPRIVATE(XNATURE) 00161 REAL, POINTER, DIMENSION(:) :: XWATER=>NULL() 00162 !$OMP THREADPRIVATE(XWATER) 00163 REAL, POINTER, DIMENSION(:) :: XSEA=>NULL() 00164 !$OMP THREADPRIVATE(XSEA) 00165 LOGICAL, POINTER :: LECOCLIMAP=>NULL() 00166 !$OMP THREADPRIVATE(LECOCLIMAP) 00167 LOGICAL, POINTER :: LWATER_TO_NATURE=>NULL() 00168 !$OMP THREADPRIVATE(LWATER_TO_NATURE) 00169 LOGICAL, POINTER :: LTOWN_TO_ROCK=>NULL() 00170 !$OMP THREADPRIVATE(LTOWN_TO_ROCK) 00171 LOGICAL, POINTER :: LGARDEN=>NULL() 00172 !$OMP THREADPRIVATE(LGARDEN) 00173 INTEGER, POINTER :: NSIZE_SEA=>NULL() 00174 !$OMP THREADPRIVATE(NSIZE_SEA) 00175 INTEGER, POINTER :: NDIM_SEA=>NULL() 00176 !$OMP THREADPRIVATE(NDIM_SEA) 00177 INTEGER, POINTER, DIMENSION(:) :: NR_SEA=>NULL() 00178 !$OMP THREADPRIVATE(NR_SEA) 00179 INTEGER, POINTER :: NSIZE_WATER=>NULL() 00180 !$OMP THREADPRIVATE(NSIZE_WATER) 00181 INTEGER, POINTER :: NDIM_WATER=>NULL() 00182 !$OMP THREADPRIVATE(NDIM_WATER) 00183 INTEGER, POINTER, DIMENSION(:) :: NR_WATER=>NULL() 00184 !$OMP THREADPRIVATE(NR_WATER) 00185 INTEGER, POINTER :: NSIZE_TOWN=>NULL() 00186 !$OMP THREADPRIVATE(NSIZE_TOWN) 00187 INTEGER, POINTER :: NDIM_TOWN=>NULL() 00188 !$OMP THREADPRIVATE(NDIM_TOWN) 00189 INTEGER, POINTER, DIMENSION(:) :: NR_TOWN=>NULL() 00190 !$OMP THREADPRIVATE(NR_TOWN) 00191 INTEGER, POINTER :: NSIZE_NATURE=>NULL() 00192 !$OMP THREADPRIVATE(NSIZE_NATURE) 00193 INTEGER, POINTER :: NDIM_NATURE=>NULL() 00194 !$OMP THREADPRIVATE(NDIM_NATURE) 00195 INTEGER, POINTER, DIMENSION(:) :: NR_NATURE=>NULL() 00196 !$OMP THREADPRIVATE(NR_NATURE) 00197 INTEGER, POINTER :: NSIZE_FULL=>NULL() 00198 !$OMP THREADPRIVATE(NSIZE_FULL) 00199 INTEGER, POINTER :: NDIM_FULL=>NULL() 00200 !$OMP THREADPRIVATE(NDIM_FULL) 00201 REAL, POINTER, DIMENSION(:,:) :: XCOVER=>NULL() 00202 !$OMP THREADPRIVATE(XCOVER) 00203 LOGICAL, POINTER, DIMENSION(:):: LCOVER=>NULL() 00204 !$OMP THREADPRIVATE(LCOVER) 00205 REAL, POINTER, DIMENSION(:) :: XZS=>NULL() 00206 !$OMP THREADPRIVATE(XZS) 00207 TYPE (DATE_TIME), POINTER :: TTIME=>NULL() 00208 !$OMP THREADPRIVATE(TTIME) 00209 REAL, POINTER :: XOUT_TSTEP=>NULL() 00210 !$OMP THREADPRIVATE(XOUT_TSTEP) 00211 LOGICAL, POINTER :: LINIT_PRECIP=>NULL() 00212 !$OMP THREADPRIVATE(LINIT_PRECIP) 00213 CONTAINS 00214 00215 SUBROUTINE SURF_ATM_GOTO_MODEL(KFROM, KTO, LKFROM) 00216 LOGICAL, INTENT(IN) :: LKFROM 00217 INTEGER, INTENT(IN) :: KFROM, KTO 00218 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00219 00220 ! 00221 ! Save current state for allocated arrays 00222 IF (LKFROM) THEN 00223 SURF_ATM_MODEL(KFROM)%XTOWN=>XTOWN 00224 SURF_ATM_MODEL(KFROM)%XNATURE=>XNATURE 00225 SURF_ATM_MODEL(KFROM)%XWATER=>XWATER 00226 SURF_ATM_MODEL(KFROM)%XSEA=>XSEA 00227 SURF_ATM_MODEL(KFROM)%NR_SEA=>NR_SEA 00228 SURF_ATM_MODEL(KFROM)%NR_WATER=>NR_WATER 00229 SURF_ATM_MODEL(KFROM)%NR_TOWN=>NR_TOWN 00230 SURF_ATM_MODEL(KFROM)%NR_NATURE=>NR_NATURE 00231 SURF_ATM_MODEL(KFROM)%XCOVER=>XCOVER 00232 SURF_ATM_MODEL(KFROM)%LCOVER=>LCOVER 00233 SURF_ATM_MODEL(KFROM)%XZS=>XZS 00234 ENDIF 00235 ! 00236 ! Current model is set to model KTO 00237 IF (LHOOK) CALL DR_HOOK('MODD_SURF_ATM_N:SURF_ATM_GOTO_MODEL',0,ZHOOK_HANDLE) 00238 00239 CTOWN=>SURF_ATM_MODEL(KTO)%CTOWN 00240 CNATURE=>SURF_ATM_MODEL(KTO)%CNATURE 00241 CWATER=>SURF_ATM_MODEL(KTO)%CWATER 00242 CSEA=>SURF_ATM_MODEL(KTO)%CSEA 00243 XTOWN=>SURF_ATM_MODEL(KTO)%XTOWN 00244 XNATURE=>SURF_ATM_MODEL(KTO)%XNATURE 00245 XWATER=>SURF_ATM_MODEL(KTO)%XWATER 00246 XSEA=>SURF_ATM_MODEL(KTO)%XSEA 00247 LECOCLIMAP=>SURF_ATM_MODEL(KTO)%LECOCLIMAP 00248 LWATER_TO_NATURE=>SURF_ATM_MODEL(KTO)%LWATER_TO_NATURE 00249 LTOWN_TO_ROCK=>SURF_ATM_MODEL(KTO)%LTOWN_TO_ROCK 00250 LGARDEN=>SURF_ATM_MODEL(KTO)%LGARDEN 00251 NSIZE_SEA=>SURF_ATM_MODEL(KTO)%NSIZE_SEA 00252 NDIM_SEA=>SURF_ATM_MODEL(KTO)%NDIM_SEA 00253 NR_SEA=>SURF_ATM_MODEL(KTO)%NR_SEA 00254 NSIZE_WATER=>SURF_ATM_MODEL(KTO)%NSIZE_WATER 00255 NDIM_WATER=>SURF_ATM_MODEL(KTO)%NDIM_WATER 00256 NR_WATER=>SURF_ATM_MODEL(KTO)%NR_WATER 00257 NSIZE_TOWN=>SURF_ATM_MODEL(KTO)%NSIZE_TOWN 00258 NDIM_TOWN=>SURF_ATM_MODEL(KTO)%NDIM_TOWN 00259 NR_TOWN=>SURF_ATM_MODEL(KTO)%NR_TOWN 00260 NSIZE_NATURE=>SURF_ATM_MODEL(KTO)%NSIZE_NATURE 00261 NDIM_NATURE=>SURF_ATM_MODEL(KTO)%NDIM_NATURE 00262 NR_NATURE=>SURF_ATM_MODEL(KTO)%NR_NATURE 00263 NSIZE_FULL=>SURF_ATM_MODEL(KTO)%NSIZE_FULL 00264 NDIM_FULL=>SURF_ATM_MODEL(KTO)%NDIM_FULL 00265 XCOVER=>SURF_ATM_MODEL(KTO)%XCOVER 00266 LCOVER=>SURF_ATM_MODEL(KTO)%LCOVER 00267 XZS=>SURF_ATM_MODEL(KTO)%XZS 00268 TTIME=>SURF_ATM_MODEL(KTO)%TTIME 00269 XOUT_TSTEP=>SURF_ATM_MODEL(KTO)%XOUT_TSTEP 00270 LINIT_PRECIP=>SURF_ATM_MODEL(KTO)%LINIT_PRECIP 00271 00272 IF (LHOOK) CALL DR_HOOK('MODD_SURF_ATM_N:SURF_ATM_GOTO_MODEL',1,ZHOOK_HANDLE) 00273 00274 END SUBROUTINE SURF_ATM_GOTO_MODEL 00275 00276 SUBROUTINE SURF_ATM_ALLOC(KMODEL) 00277 INTEGER, INTENT(IN) :: KMODEL 00278 INTEGER :: J 00279 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00280 IF (LHOOK) CALL DR_HOOK("MODD_SURF_ATM_N:SURF_ATM_ALLOC",0,ZHOOK_HANDLE) 00281 ALLOCATE(SURF_ATM_MODEL(KMODEL)) 00282 DO J=1,KMODEL 00283 NULLIFY(SURF_ATM_MODEL(J)%XTOWN) 00284 NULLIFY(SURF_ATM_MODEL(J)%XNATURE) 00285 NULLIFY(SURF_ATM_MODEL(J)%XWATER) 00286 NULLIFY(SURF_ATM_MODEL(J)%XSEA) 00287 NULLIFY(SURF_ATM_MODEL(J)%NR_SEA) 00288 NULLIFY(SURF_ATM_MODEL(J)%NR_WATER) 00289 NULLIFY(SURF_ATM_MODEL(J)%NR_TOWN) 00290 NULLIFY(SURF_ATM_MODEL(J)%NR_NATURE) 00291 NULLIFY(SURF_ATM_MODEL(J)%XCOVER) 00292 NULLIFY(SURF_ATM_MODEL(J)%LCOVER) 00293 NULLIFY(SURF_ATM_MODEL(J)%XZS) 00294 ENDDO 00295 SURF_ATM_MODEL(:)%CTOWN=' ' 00296 SURF_ATM_MODEL(:)%CNATURE=' ' 00297 SURF_ATM_MODEL(:)%CWATER=' ' 00298 SURF_ATM_MODEL(:)%CSEA=' ' 00299 SURF_ATM_MODEL(:)%LECOCLIMAP=.FALSE. 00300 SURF_ATM_MODEL(:)%LWATER_TO_NATURE=.FALSE. 00301 SURF_ATM_MODEL(:)%LTOWN_TO_ROCK=.FALSE. 00302 SURF_ATM_MODEL(:)%LGARDEN=.FALSE. 00303 SURF_ATM_MODEL(:)%NSIZE_SEA=0 00304 SURF_ATM_MODEL(:)%NDIM_SEA=0 00305 SURF_ATM_MODEL(:)%NSIZE_WATER=0 00306 SURF_ATM_MODEL(:)%NDIM_WATER=0 00307 SURF_ATM_MODEL(:)%NSIZE_TOWN=0 00308 SURF_ATM_MODEL(:)%NDIM_TOWN=0 00309 SURF_ATM_MODEL(:)%NSIZE_NATURE=0 00310 SURF_ATM_MODEL(:)%NDIM_NATURE=0 00311 SURF_ATM_MODEL(:)%NSIZE_FULL=0 00312 SURF_ATM_MODEL(:)%NDIM_FULL=0 00313 SURF_ATM_MODEL(:)%XOUT_TSTEP=0. 00314 SURF_ATM_MODEL(:)%LINIT_PRECIP=.FALSE. 00315 IF (LHOOK) CALL DR_HOOK("MODD_SURF_ATM_N:SURF_ATM_ALLOC",1,ZHOOK_HANDLE) 00316 END SUBROUTINE SURF_ATM_ALLOC 00317 00318 SUBROUTINE SURF_ATM_DEALLO 00319 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00320 IF (LHOOK) CALL DR_HOOK("MODD_SURF_ATM_N:SURF_ATM_DEALLO",0,ZHOOK_HANDLE) 00321 IF (ALLOCATED(SURF_ATM_MODEL)) DEALLOCATE(SURF_ATM_MODEL) 00322 IF (LHOOK) CALL DR_HOOK("MODD_SURF_ATM_N:SURF_ATM_DEALLO",1,ZHOOK_HANDLE) 00323 END SUBROUTINE SURF_ATM_DEALLO 00324 00325 END MODULE MODD_SURF_ATM_n 00326