SURFEX v7.3
General documentation of Surfex
|
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