SURFEX v7.3
General documentation of Surfex
|
00001 ! ######### 00002 SUBROUTINE OL_READ_ATM_CONF_ASCII (HSURF_FILETYPE, HFORCING_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 !================================================================== 00039 USE MODD_TYPE_DATE_SURF 00040 ! 00041 USE MODD_SURFEX_MPI, ONLY : NRANK, NPIO, NCOMM, NPROC, XTIME_COMM_READ, XTIME_NPIO_READ 00042 ! 00043 USE MODD_ARCH, ONLY : LITTLE_ENDIAN_ARCH 00044 USE MODD_IO_SURF_ASC, ONLY : NNI_FORC 00045 ! 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_READ_AND_SEND_MPI 00052 USE MODI_ABOR1_SFX 00053 ! 00054 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00055 USE PARKIND1 ,ONLY : JPRB 00056 ! 00057 IMPLICIT NONE 00058 ! 00059 #ifndef NOMPI 00060 INCLUDE 'mpif.h' 00061 #endif 00062 ! 00063 CHARACTER(LEN=6), INTENT(IN) :: HSURF_FILETYPE 00064 CHARACTER(LEN=6), INTENT(IN) :: HFORCING_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 REAL, DIMENSION(:), ALLOCATABLE :: ZWORK 00074 REAL :: ZWORK0 00075 REAL :: ZTIME 00076 CHARACTER(LEN=1) :: YSWAP 00077 TYPE (DATE_TIME) :: TTIME 00078 INTEGER :: INI, IDIM_FULL 00079 INTEGER :: IYEAR, IMONTH, IDAY 00080 INTEGER :: ILUOUT 00081 INTEGER :: IRET, INB_FORC 00082 INTEGER :: INFOMPI 00083 DOUBLE PRECISION :: XTIME0 00084 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00085 ! 00086 !================================================================== 00087 ! 00088 IF (LHOOK) CALL DR_HOOK('OL_READ_ATM_CONF_ASCII',0,ZHOOK_HANDLE) 00089 ! 00090 IF (NRANK==NPIO) THEN 00091 ! 00092 CALL GET_LUOUT(HSURF_FILETYPE,ILUOUT) 00093 ! 00094 #ifndef NOMPI 00095 XTIME0 = MPI_WTIME() 00096 #endif 00097 ! 00098 !* 1. Define configuration parameters 00099 ! 00100 !$OMP SINGLE 00101 ! 00102 IF (HFORCING_FILETYPE == 'BINARY') READ(21,*) YSWAP 00103 IF (YSWAP.EQ.'Y') THEN 00104 LITTLE_ENDIAN_ARCH=.NOT.LITTLE_ENDIAN_ARCH 00105 WRITE(ILUOUT,*) '*******************************************************************' 00106 WRITE(ILUOUT,*) 'Architecture of the machine needs to swap LITTLE_ENDIAN_ARCH to ', & 00107 LITTLE_ENDIAN_ARCH 00108 WRITE(ILUOUT,*) '*******************************************************************' 00109 ENDIF 00110 ! 00111 READ(21,*) INI 00112 NNI_FORC = INI 00113 ! 00114 READ(21,*) INB_FORC 00115 READ(21,*) PTSTEP_FORC 00116 PDURATION = ( INB_FORC - 1 ) * PTSTEP_FORC 00117 ! 00118 READ(21,*) IYEAR 00119 READ(21,*) IMONTH 00120 READ(21,*) IDAY 00121 READ(21,*) ZTIME 00122 ! 00123 !$OMP END SINGLE COPYPRIVATE(NNI_FORC) 00124 ! 00125 #ifndef NOMPI 00126 XTIME_NPIO_READ = XTIME_NPIO_READ + (MPI_WTIME() - XTIME0) 00127 #endif 00128 ! 00129 ENDIF 00130 ! 00131 IF (NPROC>1) THEN 00132 #ifndef NOMPI 00133 XTIME0 = MPI_WTIME() 00134 !$OMP SINGLE 00135 CALL MPI_BCAST(PTSTEP_FORC,KIND(PTSTEP_FORC)/4,MPI_REAL,NPIO,NCOMM,INFOMPI) 00136 CALL MPI_BCAST(PDURATION,KIND(PDURATION)/4,MPI_REAL,NPIO,NCOMM,INFOMPI) 00137 !$OMP END SINGLE COPYPRIVATE(PTSTEP_FORC,PDURATION) 00138 XTIME_COMM_READ = XTIME_COMM_READ + (MPI_WTIME() - XTIME0) 00139 #endif 00140 ENDIF 00141 ! 00142 !* 2. Read full grid dimension and date 00143 ! 00144 CALL SET_SURFEX_FILEIN(HSURF_FILETYPE,'PREP') 00145 CALL INIT_IO_SURF_n(HSURF_FILETYPE,'FULL ','SURF ','READ ') 00146 ! 00147 CALL READ_SURF(HSURF_FILETYPE,'DIM_FULL',IDIM_FULL,IRET) 00148 CALL READ_SURF(HSURF_FILETYPE,'DTCUR',TTIME,IRET) 00149 ! 00150 CALL END_IO_SURF_n(HSURF_FILETYPE) 00151 ! 00152 KYEAR = TTIME%TDATE%YEAR 00153 KMONTH = TTIME%TDATE%MONTH 00154 KDAY = TTIME%TDATE%DAY 00155 PTIME = TTIME%TIME 00156 ! 00157 !* 4. Geographical initialization 00158 ! 00159 CALL GET_SIZE_FULL_n('OFFLIN ',IDIM_FULL,KNI) 00160 ! 00161 ALLOCATE(PLON (KNI)) 00162 ALLOCATE(PLAT (KNI)) 00163 ALLOCATE(PZS (KNI)) 00164 ALLOCATE(PZREF(KNI)) 00165 ALLOCATE(PUREF(KNI)) 00166 ! 00167 IF (NRANK==NPIO) THEN 00168 ALLOCATE(ZWORK(IDIM_FULL)) 00169 ELSE 00170 ALLOCATE(ZWORK(0)) 00171 ENDIF 00172 ! 00173 IF (NRANK==NPIO) THEN 00174 ! 00175 #ifndef NOMPI 00176 XTIME0 = MPI_WTIME() 00177 #endif 00178 ! 00179 !$OMP SINGLE 00180 ! 00181 IF (INI==1) THEN 00182 READ(UNIT=21,FMT='(F15.8)') ZWORK0 00183 ZWORK(:) = ZWORK0 00184 ELSE 00185 READ(UNIT=21,FMT='(50(F15.8))') ZWORK 00186 END IF 00187 ! 00188 !$OMP END SINGLE COPYPRIVATE(ZWORK) 00189 ! 00190 #ifndef NOMPI 00191 XTIME_NPIO_READ = XTIME_NPIO_READ + (MPI_WTIME() - XTIME0) 00192 #endif 00193 ENDIF 00194 CALL READ_AND_SEND_MPI(ZWORK,PLON) 00195 ! 00196 IF (NRANK==NPIO) THEN 00197 ! 00198 #ifndef NOMPI 00199 XTIME0 = MPI_WTIME() 00200 #endif 00201 ! 00202 !$OMP SINGLE 00203 ! 00204 IF (INI==1) THEN 00205 READ(UNIT=21,FMT='(F15.8)') ZWORK0 00206 ZWORK(:) = ZWORK0 00207 ELSE 00208 READ(UNIT=21,FMT='(50(F15.8))') ZWORK 00209 END IF 00210 ! 00211 !$OMP END SINGLE COPYPRIVATE(ZWORK) 00212 ! 00213 #ifndef NOMPI 00214 XTIME_NPIO_READ = XTIME_NPIO_READ + (MPI_WTIME() - XTIME0) 00215 #endif 00216 ENDIF 00217 CALL READ_AND_SEND_MPI(ZWORK,PLAT) 00218 ! 00219 IF (NRANK==NPIO) THEN 00220 ! 00221 #ifndef NOMPI 00222 XTIME0 = MPI_WTIME() 00223 #endif 00224 ! 00225 !$OMP SINGLE 00226 ! 00227 IF (INI==1) THEN 00228 READ(UNIT=21,FMT='(F15.8)') ZWORK0 00229 ZWORK(:) = ZWORK0 00230 ELSE 00231 READ(UNIT=21,FMT='(50(F15.8))') ZWORK 00232 END IF 00233 ! 00234 !$OMP END SINGLE COPYPRIVATE(ZWORK) 00235 ! 00236 #ifndef NOMPI 00237 XTIME_NPIO_READ = XTIME_NPIO_READ + (MPI_WTIME() - XTIME0) 00238 #endif 00239 ENDIF 00240 CALL READ_AND_SEND_MPI(ZWORK,PZS) 00241 ! 00242 IF (NRANK==NPIO) THEN 00243 ! 00244 #ifndef NOMPI 00245 XTIME0 = MPI_WTIME() 00246 #endif 00247 ! 00248 !$OMP SINGLE 00249 ! 00250 IF (INI==1) THEN 00251 READ(UNIT=21,FMT='(F15.8)') ZWORK0 00252 ZWORK(:) = ZWORK0 00253 ELSE 00254 READ(UNIT=21,FMT='(50(F15.8))') ZWORK 00255 END IF 00256 ! 00257 !$OMP END SINGLE COPYPRIVATE(ZWORK) 00258 ! 00259 #ifndef NOMPI 00260 XTIME_NPIO_READ = XTIME_NPIO_READ + (MPI_WTIME() - XTIME0) 00261 #endif 00262 ENDIF 00263 CALL READ_AND_SEND_MPI(ZWORK,PZREF) 00264 ! 00265 IF (NRANK==NPIO) THEN 00266 ! 00267 #ifndef NOMPI 00268 XTIME0 = MPI_WTIME() 00269 #endif 00270 ! 00271 !$OMP SINGLE 00272 ! 00273 IF (INI==1) THEN 00274 READ(UNIT=21,FMT='(F15.8)') ZWORK0 00275 ZWORK(:) = ZWORK0 00276 ELSE 00277 READ(UNIT=21,FMT='(50(F15.8))') ZWORK 00278 END IF 00279 ! 00280 !$OMP END SINGLE COPYPRIVATE(ZWORK) 00281 ! 00282 #ifndef NOMPI 00283 XTIME_NPIO_READ = XTIME_NPIO_READ + (MPI_WTIME() - XTIME0) 00284 #endif 00285 ENDIF 00286 CALL READ_AND_SEND_MPI(ZWORK,PUREF) 00287 ! 00288 DEALLOCATE(ZWORK) 00289 ! 00290 !* 3. Check the consistency 00291 ! 00292 IF (NRANK==NPIO) THEN 00293 ! 00294 !$OMP SINGLE 00295 ! 00296 IF (IDIM_FULL /= INI .AND. INI/=1) THEN 00297 WRITE(ILUOUT,*)' NUMBER OF GRID POINTS INCONSISTENCY: ',KNI,'/',INI 00298 CALL ABOR1_SFX('OL_READ_ATM_CONF_ASCII: NUMBER OF GRID POINTS INCONSISTENCY') 00299 ENDIF 00300 ! 00301 ! check date and time 00302 ! 00303 IF ( (KYEAR /= IYEAR) .OR. (KMONTH /= IMONTH) .OR. (KDAY /= IDAY) ) THEN 00304 WRITE(ILUOUT,*)' DATE INCONSISTANCY: ',KYEAR,KMONTH,KDAY,'/',IYEAR,IMONTH,IDAY 00305 CALL ABOR1_SFX('OL_READ_ATM_CONF_ASCII: DATE INCONSISTENCY') 00306 ENDIF 00307 ! 00308 IF ( PTIME /= ZTIME ) THEN 00309 WRITE(ILUOUT,*)' TIME INCONSISTANCY: ',PTIME,'/',ZTIME 00310 CALL ABOR1_SFX('OL_READ_ATM_CONF_ASCII: TIME INCONSISTENCY') 00311 ENDIF 00312 ! 00313 !$OMP END SINGLE 00314 ! 00315 ENDIF 00316 ! 00317 IF (LHOOK) CALL DR_HOOK('OL_READ_ATM_CONF_ASCII',1,ZHOOK_HANDLE) 00318 ! 00319 END SUBROUTINE OL_READ_ATM_CONF_ASCII