SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/OFFLIN/ol_read_atm_conf_ascii.F90
Go to the documentation of this file.
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