SURFEX v7.3
General documentation of Surfex
|
00001 ! ######### 00002 SUBROUTINE OL_READ_ATM_CONF_NETCDF(HSURF_FILETYPE, & 00003 PDURATION, PTSTEP_FORC, KNI, & 00004 KYEAR, KMONTH, KDAY, PTIME, & 00005 PLAT, PLON, PZS, & 00006 PZREF, PUREF ) 00007 ! 00008 !================================================================== 00009 !!**** *OL_READ_ATM_CONF* - Initialization routine 00010 !! 00011 !! PURPOSE 00012 !! ------- 00013 !! 00014 !!** METHOD 00015 !! ------ 00016 !! 00017 !! EXTERNAL 00018 !! -------- 00019 !! 00020 !! 00021 !! IMPLICIT ARGUMENTS 00022 !! ------------------ 00023 !! 00024 !! REFERENCE 00025 !! --------- 00026 !! 00027 !! 00028 !! AUTHOR 00029 !! ------ 00030 !! F. Habets *Meteo France* 00031 !! 00032 !! MODIFICATIONS 00033 !! ------------- 00034 !! Original 01/2004 00035 !! Modified by P. Le Moigne (04/2005): cleaning and checking 00036 !! Modified by P. Le Moigne (04/2006): init_io_surf for nature 00037 !! with GTMSK to read dimensions. 00038 !! Modified by Matthieu Lafaysse 2012-11-12 00039 !================================================================== 00040 ! 00041 USE MODD_TYPE_DATE_SURF 00042 ! 00043 USE MODD_SURFEX_MPI, ONLY : NRANK, NPIO, NCOMM, NPROC, XTIME_COMM_READ, XTIME_NPIO_READ 00044 ! 00045 USE MODI_SET_SURFEX_FILEIN 00046 USE MODI_GET_LUOUT 00047 USE MODI_INIT_IO_SURF_n 00048 USE MODI_READ_SURF 00049 USE MODI_END_IO_SURF_n 00050 USE MODI_GET_SIZE_FULL_n 00051 USE MODI_ABOR1_SFX 00052 ! 00053 USE MODE_DATES_NETCDF, ONLY : NETCDF2DATE 00054 ! 00055 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00056 USE PARKIND1 ,ONLY : JPRB 00057 ! 00058 IMPLICIT NONE 00059 ! 00060 #ifndef NOMPI 00061 INCLUDE "mpif.h" 00062 #endif 00063 ! 00064 CHARACTER(LEN=6), INTENT(IN) :: HSURF_FILETYPE 00065 INTEGER, INTENT(OUT) :: KNI 00066 INTEGER, INTENT(OUT) :: KYEAR, KMONTH, KDAY 00067 REAL, INTENT(OUT) :: PDURATION,PTSTEP_FORC 00068 REAL, INTENT(OUT) :: PTIME 00069 REAL, DIMENSION(:), POINTER :: PLAT, PLON 00070 REAL, DIMENSION(:), POINTER :: PZS 00071 REAL, DIMENSION(:), POINTER :: PZREF, PUREF 00072 ! 00073 CHARACTER(LEN=100) :: YUNITS 00074 REAL :: ZTIME 00075 REAL :: ZFIRSTTIMEFILE 00076 INTEGER :: IYEAR, IMONTH, IDAY 00077 INTEGER :: IRET, INB_FORC 00078 INTEGER :: INI, IDIM_FULL 00079 INTEGER :: ILUOUT 00080 INTEGER :: INFOMPI 00081 TYPE (DATE_TIME) :: TTIME 00082 TYPE (DATE_TIME) ,DIMENSION(1):: TZ_FIRSTDATEFILE 00083 DOUBLE PRECISION :: XTIME0 00084 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00085 ! 00086 !================================================================== 00087 ! 00088 !* 0. IO initialization 00089 ! 00090 IF (LHOOK) CALL DR_HOOK('OL_READ_ATM_CONF_NETCDF',0,ZHOOK_HANDLE) 00091 ! 00092 IF (NRANK==NPIO) THEN 00093 ! 00094 #ifndef NOMPI 00095 XTIME0 = MPI_WTIME() 00096 #endif 00097 ! 00098 CALL GET_LUOUT(HSURF_FILETYPE,ILUOUT) 00099 ! 00100 !* 1. Read parameters from netcdf forcing file 00101 ! 00102 !$OMP SINGLE 00103 ! 00104 YUNITS = "" 00105 CALL READ_SURF_DIM_OL(YUNITS, INB_FORC, INI, ZFIRSTTIMEFILE, IRET) 00106 ! 00107 !$OMP END SINGLE COPYPRIVATE(YUNITS,INB_FORC,INI,IRET) 00108 ! 00109 #ifndef NOMPI 00110 XTIME_NPIO_READ = XTIME_NPIO_READ + (MPI_WTIME() - XTIME0) 00111 #endif 00112 ! 00113 ENDIF 00114 ! 00115 CALL READ_SURF('OFFLIN','FRC_TIME_STP' ,PTSTEP_FORC ,IRET) 00116 ! 00117 IF (NPROC>1) THEN 00118 #ifndef NOMPI 00119 XTIME0 = MPI_WTIME() 00120 !$OMP SINGLE 00121 CALL MPI_BCAST(INB_FORC,KIND(INB_FORC)/4,MPI_INTEGER,NPIO,NCOMM,INFOMPI) 00122 !$OMP END SINGLE COPYPRIVATE(INB_FORC) 00123 XTIME_COMM_READ = XTIME_COMM_READ + (MPI_WTIME() - XTIME0) 00124 #endif 00125 ENDIF 00126 ! 00127 PDURATION = ( INB_FORC - 1 ) * PTSTEP_FORC 00128 ! 00129 !* 2. Read full grid dimension and date 00130 ! 00131 CALL SET_SURFEX_FILEIN(HSURF_FILETYPE,'PREP') 00132 CALL INIT_IO_SURF_n(HSURF_FILETYPE,'FULL ','SURF ','READ ') 00133 ! 00134 CALL READ_SURF(HSURF_FILETYPE,'DIM_FULL',IDIM_FULL,IRET) 00135 CALL READ_SURF(HSURF_FILETYPE,'DTCUR',TTIME,IRET) 00136 ! 00137 KYEAR = TTIME%TDATE%YEAR 00138 KMONTH = TTIME%TDATE%MONTH 00139 KDAY = TTIME%TDATE%DAY 00140 PTIME = TTIME%TIME 00141 ! 00142 CALL END_IO_SURF_n(HSURF_FILETYPE) 00143 ! 00144 !* 5. Geographical initialization 00145 ! 00146 CALL GET_SIZE_FULL_n('OFFLIN ',IDIM_FULL,KNI) 00147 ! 00148 ALLOCATE(PLON(KNI)) 00149 ALLOCATE(PLAT(KNI)) 00150 ALLOCATE(PZS(KNI)) 00151 ALLOCATE(PZREF(KNI)) 00152 ALLOCATE(PUREF(KNI)) 00153 ! 00154 CALL READ_SURF('OFFLIN','LAT',PLAT,IRET) 00155 CALL READ_SURF('OFFLIN','LON',PLON,IRET) 00156 CALL READ_SURF('OFFLIN','ZS',PZS,IRET) 00157 CALL READ_SURF('OFFLIN','ZREF',PZREF,IRET) 00158 CALL READ_SURF('OFFLIN','UREF',PUREF,IRET) 00159 ! 00160 !* 6. Check the consistency 00161 ! 00162 IF (NRANK == NPIO) THEN 00163 ! 00164 IF (IDIM_FULL /= INI) THEN 00165 WRITE(ILUOUT,*)' NUMBER OF GRID POINTS INCONSISTENCY: ',KNI,'/',INI 00166 CALL ABOR1_SFX('OL_READ_ATM_CONF_NETCDF: NUMBER OF GRID POINTS INCONSISTENCY') 00167 ENDIF 00168 ! 00169 !$OMP SINGLE 00170 ! 00171 CALL NETCDF2DATE((/ZFIRSTTIMEFILE/),YUNITS,TZ_FIRSTDATEFILE) 00172 IYEAR = TZ_FIRSTDATEFILE(1)%TDATE%YEAR 00173 IMONTH = TZ_FIRSTDATEFILE(1)%TDATE%MONTH 00174 IDAY = TZ_FIRSTDATEFILE(1)%TDATE%DAY 00175 ZTIME = TZ_FIRSTDATEFILE(1)%TIME* 3600. 00176 ! 00177 IF ( (KYEAR /= IYEAR) .OR. (KMONTH /= IMONTH) .OR. (KDAY /= IDAY) ) THEN 00178 WRITE(ILUOUT,*)' DATE INCONSISTENCY: ',KYEAR,KMONTH,KDAY,'/',IYEAR,IMONTH,IDAY 00179 CALL ABOR1_SFX('OL_READ_ATM_CONF_NETCDF: DATE INCONSISTENCY') 00180 ENDIF 00181 ! 00182 IF ( PTIME /= ZTIME ) THEN 00183 WRITE(ILUOUT,*)' TIME INCONSISTENCY: ',PTIME,'/',ZTIME 00184 CALL ABOR1_SFX('OL_READ_ATM_CONF_NETCDF: TIME INCONSISTENCY') 00185 ENDIF 00186 ! 00187 !$OMP END SINGLE 00188 ! 00189 ENDIF 00190 ! 00191 IF (LHOOK) CALL DR_HOOK('OL_READ_ATM_CONF_NETCDF',1,ZHOOK_HANDLE) 00192 !================================================================== 00193 CONTAINS 00194 ! 00195 ! ############################################################# 00196 SUBROUTINE READ_SURF_DIM_OL(HUNITS,KSIZE,KNI,PFIRSTTIMEFILE,KRESP) 00197 ! ############################################################# 00198 ! 00199 USE MODI_OL_FIND_FILE_READ 00200 ! 00201 IMPLICIT NONE 00202 INCLUDE "netcdf.inc" 00203 ! 00204 !* 0.1 Declarations of arguments 00205 ! 00206 CHARACTER(LEN=100), INTENT(OUT) :: HUNITS 00207 INTEGER, INTENT(OUT) :: KSIZE 00208 INTEGER, INTENT(OUT) :: KNI 00209 REAL, INTENT(OUT) :: PFIRSTTIMEFILE 00210 INTEGER, INTENT(OUT) :: KRESP 00211 ! 00212 !* 0.2 Declarations of local variables 00213 ! 00214 INTEGER :: IFILE_ID,IVAR_ID,INDIMS,JRET,JDIM,ITYPE 00215 INTEGER,DIMENSION(2) :: IDIMIDS,IDIMLEN 00216 INTEGER,DIMENSION(7) :: IRET 00217 00218 REAL*4,DIMENSION(:),ALLOCATABLE :: ZTIMEFILE4 00219 REAL,DIMENSION(:),ALLOCATABLE :: ZTIMEFILE 00220 INTEGER, DIMENSION(:), ALLOCATABLE :: ITIMEFILE 00221 ! 00222 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00223 !------------------------------------------------------------------------------- 00224 00225 IF (LHOOK) CALL DR_HOOK('OL_READ_ATM_CONF_NETCDF:READ_SURF_DIM_OL',0,ZHOOK_HANDLE) 00226 KRESP=0 00227 00228 ! 0. find filename 00229 ! ----------------- 00230 CALL OL_FIND_FILE_READ('time',IFILE_ID) 00231 00232 IF (IFILE_ID.NE.0) THEN 00233 00234 ! 1. Find id of the variable 00235 !---------------------------- 00236 IRET(1)=NF_INQ_VARID (IFILE_ID,'time',IVAR_ID) 00237 IRET(2)=NF_INQ_VARNDIMS(IFILE_ID,IVAR_ID,INDIMS) 00238 IRET(3)=NF_INQ_VARDIMID(IFILE_ID,IVAR_ID,IDIMIDS(1:1)) 00239 IRET(4)=NF_INQ_DIMLEN(IFILE_ID,IDIMIDS(1),KSIZE) 00240 IRET(5)=NF_GET_ATT_TEXT(IFILE_ID,IVAR_ID,'units',HUNITS) 00241 00242 IRET(6)=NF_INQ_VARTYPE(IFILE_ID,IVAR_ID,ITYPE) 00243 00244 SELECT CASE (ITYPE) 00245 CASE (NF_DOUBLE) 00246 ALLOCATE(ZTIMEFILE(KSIZE)) 00247 IRET(7)=NF_GET_VAR_DOUBLE(IFILE_ID,IVAR_ID,ZTIMEFILE) 00248 PFIRSTTIMEFILE=ZTIMEFILE(1) 00249 DEALLOCATE(ZTIMEFILE) 00250 CASE (NF_FLOAT) 00251 ALLOCATE(ZTIMEFILE4(KSIZE)) 00252 IRET(7)=REAL(NF_GET_VAR_REAL(IFILE_ID,IVAR_ID,ZTIMEFILE4)) 00253 PFIRSTTIMEFILE=ZTIMEFILE4(1) 00254 DEALLOCATE(ZTIMEFILE4) 00255 CASE (NF_INT) 00256 ALLOCATE(ITIMEFILE(KSIZE)) 00257 IRET(7)=REAL(NF_GET_VAR_INT(IFILE_ID,IVAR_ID,ITIMEFILE)) 00258 PFIRSTTIMEFILE=ITIMEFILE(1) 00259 DEALLOCATE(ITIMEFILE) 00260 CASE DEFAULT 00261 CALL ABOR1_SFX('OL_READ_ATM_CONF_NETCDF: TYPE OF TIME VARIABLE NOT KNOWN') 00262 END SELECT 00263 00264 ! 3. Check for errors 00265 !-------------------- 00266 DO JRET=1,7 00267 IF (IFILE_ID==0.OR.IRET(JRET).NE.NF_NOERR) KRESP=1 00268 ENDDO 00269 00270 ENDIF 00271 00272 CALL OL_FIND_FILE_READ('LON',IFILE_ID) 00273 00274 IF (IFILE_ID.NE.0) THEN 00275 00276 IRET(1)=NF_INQ_VARID (IFILE_ID,'LON',IVAR_ID) 00277 IRET(2)=NF_INQ_VARNDIMS(IFILE_ID,IVAR_ID,INDIMS) 00278 IRET(3)=NF_INQ_VARDIMID(IFILE_ID,IVAR_ID,IDIMIDS(:)) 00279 IDIMLEN(:)=1. 00280 DO JDIM=1,INDIMS 00281 IRET(4)=NF_INQ_DIMLEN(IFILE_ID,IDIMIDS(JDIM),IDIMLEN(JDIM)) 00282 ENDDO 00283 KNI = IDIMLEN(1) * IDIMLEN(2) 00284 00285 DO JRET=1,4 00286 IF (IFILE_ID==0.OR.IRET(JRET).NE.NF_NOERR) KRESP=1 00287 ENDDO 00288 00289 ENDIF 00290 ! 00291 IF (LHOOK) CALL DR_HOOK('OL_READ_ATM_CONF_NETCDF:READ_SURF_DIM_OL',1,ZHOOK_HANDLE) 00292 !------------------------------------------------------------------------------- 00293 END SUBROUTINE READ_SURF_DIM_OL 00294 ! 00295 END SUBROUTINE OL_READ_ATM_CONF_NETCDF