SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/OFFLIN/ol_read_atm.F90
Go to the documentation of this file.
00001 !     #########
00002 SUBROUTINE OL_READ_ATM (HSURF_FILETYPE, HFORCING_FILETYPE, KFORC_STEP,    &
00003                           PTA,PQA,PWIND,PDIR_SW,PSCA_SW,PLW,PSNOW,PRAIN,PPS,&
00004                           PCO2,PDIR,OLIMIT_QAIR                             )  
00005 !**************************************************************************
00006 !
00007 !!    PURPOSE
00008 !!    -------
00009 !         Read in the netcdf file the atmospheric forcing for the actual time
00010 !         step KFORC_STEP, and for the next one.
00011 !         The two time step are needed for the time interpolation of the
00012 !         forcing.
00013 !         If the end of the file  is reached, set the two step to the last
00014 !         values.
00015 !         Return undef value if the variable is not present
00016 !!
00017 !!**  METHOD
00018 !!    ------
00019 !!
00020 !!    EXTERNAL
00021 !!    --------
00022 !!
00023 !!    IMPLICIT ARGUMENTS
00024 !!    ------------------
00025 !!
00026 !!    REFERENCE
00027 !!    ---------
00028 !!
00029 !!
00030 !!    AUTHOR
00031 !!    ------
00032 !!      F. Habets   *Meteo France*      
00033 !!
00034 !!    MODIFICATIONS
00035 !!    -------------
00036 !!      Original     06/2003
00037 !!      P. Le Moigne 10/2004: set XCOUNT to 2 because of revised temporal loop in offline.f90:
00038 !!                            time evolution is done at the end of isba time step so first 
00039 !!                            isba computation is done on first forcing time step
00040 !!      P. Le Moigne 10/2005: consistency checking between orographies read from forcing 
00041 !!                            file and from initial file
00042 !!      B. Decharme  01/2009: Optional, limitation of Qair (<= Qsat(tair))
00043 !
00044 USE MODD_SURF_PAR,   ONLY : XUNDEF
00045 USE MODD_IO_SURF_OL, ONLY : XSTART,XCOUNT,XSTRIDE,LPARTR
00046 !         
00047 USE MODI_OL_READ_ATM_NETCDF
00048 USE MODI_OL_READ_ATM_ASCII 
00049 USE MODI_OL_READ_ATM_BINARY
00050 !
00051 USE MODE_THERMOS
00052 !
00053 !
00054 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00055 USE PARKIND1  ,ONLY : JPRB
00056 !
00057 USE MODI_ABOR1_SFX
00058 !
00059 IMPLICIT NONE
00060 !
00061 ! global variables
00062 REAL, DIMENSION(:,:),INTENT(INOUT) :: PTA !K
00063 REAL, DIMENSION(:,:),INTENT(INOUT) :: PQA
00064 REAL, DIMENSION(:,:),INTENT(INOUT) :: PWIND
00065 REAL, DIMENSION(:,:),INTENT(INOUT) :: PDIR_SW
00066 REAL, DIMENSION(:,:),INTENT(INOUT) :: PSCA_SW
00067 REAL, DIMENSION(:,:),INTENT(INOUT) :: PLW
00068 REAL, DIMENSION(:,:),INTENT(INOUT) :: PSNOW
00069 REAL, DIMENSION(:,:),INTENT(INOUT) :: PRAIN
00070 REAL, DIMENSION(:,:),INTENT(INOUT) :: PPS
00071 REAL, DIMENSION(:,:),INTENT(INOUT) :: PCO2
00072 REAL, DIMENSION(:,:),INTENT(INOUT) :: PDIR
00073 INTEGER,INTENT(IN)               :: KFORC_STEP
00074  CHARACTER(LEN=6)    ,INTENT(IN)  :: HSURF_FILETYPE
00075  CHARACTER(LEN=6)    ,INTENT(IN)  :: HFORCING_FILETYPE
00076 LOGICAL             ,INTENT(IN)  :: OLIMIT_QAIR
00077 !
00078 REAL, PARAMETER :: ZTAIR  = 286.0
00079 REAL, PARAMETER :: ZPSURF = 101325.0
00080 !
00081 REAL, DIMENSION(SIZE(PTA,1),SIZE(PTA,2)) :: ZWORK1, ZWORK2, ZQSAT
00082 !
00083 INTEGER              :: JFRC, IFRC, JJ, INI, INB
00084 !
00085 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00086 !
00087 !
00088 !set time variables
00089 IF (LHOOK) CALL DR_HOOK('OL_READ_ATM',0,ZHOOK_HANDLE)
00090 XSTART =KFORC_STEP
00091 XCOUNT =SIZE(PTA,2)
00092 XSTRIDE=1
00093 LPARTR=.TRUE.
00094 !
00095 ! read data
00096 !
00097 IF      (HFORCING_FILETYPE == 'NETCDF') THEN
00098   CALL OL_READ_ATM_NETCDF (HSURF_FILETYPE,                                   &
00099                            PTA,PQA,PWIND,PDIR_SW,PSCA_SW,PLW,PSNOW,PRAIN,PPS,&
00100                            PCO2,PDIR                                         )  
00101 ELSE IF (HFORCING_FILETYPE == 'ASCII ') THEN
00102   CALL OL_READ_ATM_ASCII  (KFORC_STEP,                       &
00103                            PTA,PQA,PWIND,PDIR_SW,PSCA_SW,PLW,PSNOW,PRAIN,PPS,&
00104                            PCO2,PDIR                                         )  
00105 ELSE IF (HFORCING_FILETYPE == 'BINARY') THEN
00106   CALL OL_READ_ATM_BINARY (KFORC_STEP,                       &
00107                            PTA,PQA,PWIND,PDIR_SW,PSCA_SW,PLW,PSNOW,PRAIN,PPS,&
00108                            PCO2,PDIR                                         )  
00109 ENDIF
00110 !
00111 ! Assume Qair <= Qsat_air
00112 !
00113 IF(OLIMIT_QAIR)THEN
00114 !  
00115   INI  = SIZE(PTA,1)
00116   IFRC = SIZE(PTA,2)
00117   INB  = 0
00118 !
00119   DO JFRC=1,IFRC    
00120      DO JJ=1,INI     
00121         IF(PTA(JJ,JFRC)>0.0.AND.PTA(JJ,JFRC)/=XUNDEF)THEN
00122            INB             = INB+1
00123            ZWORK1(JJ,JFRC) = PTA(JJ,JFRC)
00124            ZWORK2(JJ,JFRC) = PPS(JJ,JFRC)
00125         ELSE
00126            ZWORK1(JJ,JFRC) = ZTAIR
00127            ZWORK2(JJ,JFRC) = ZPSURF
00128            PTA   (JJ,JFRC) = XUNDEF
00129            PQA   (JJ,JFRC) = 0.0
00130         ENDIF
00131      ENDDO
00132   ENDDO
00133 !  
00134   IF(INB==0 .AND. INI/=0)THEN
00135     CALL ABOR1_SFX('OL_READ_ATM: THE FORCING IS UNDEFINED')
00136   ENDIF
00137 !
00138   ZQSAT(:,:) = QSAT(ZWORK1(:,:),ZWORK2(:,:))
00139 !  
00140   PQA(:,:) = MIN(PQA(:,:),ZQSAT(:,:))
00141 !  
00142 ENDIF
00143 !
00144 IF (LHOOK) CALL DR_HOOK('OL_READ_ATM',1,ZHOOK_HANDLE)
00145 !
00146 END SUBROUTINE OL_READ_ATM