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