SURFEX v7.3
General documentation of Surfex
|
00001 ! ######spl 00002 SUBROUTINE OL_TIME_INTERP_ATM (KSURF_STEP,KNB_ATM,KSIZE_OMP, & 00003 PTA1,PTA2,PQA1,PQA2,PWIND1,PWIND2, & 00004 PDIR_SW1,PDIR_SW2,PSCA_SW1,PSCA_SW2, & 00005 PLW1,PLW2,PSNOW2,PRAIN2, & 00006 PPS1,PPS2,PCO21,PCO22,PDIR1,PDIR2 ) 00007 !************************************************************************** 00008 ! 00009 !! PURPOSE 00010 !! ------- 00011 ! Time interpolation of the atmospheric forcing 00012 ! So far, it is a simple linear interpolation. 00013 ! More complex interpolation may be added, especially for the atmospheric 00014 ! radiation (Option to use). 00015 ! Output are in the module 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 ! 00038 USE MODD_CSTS, ONLY : XPI, XRD, XRV, XG 00039 USE MODD_SURF_PAR, ONLY : XUNDEF 00040 USE MODD_FORC_ATM, ONLY: XTA ,&! air temperature forcing (K) 00041 XQA ,&! air specific humidity forcing (kg/m3) 00042 XRHOA ,&! air density forcing (kg/m3) 00043 XZS ,&! orography (m) 00044 XU ,&! zonal wind (m/s) 00045 XV ,&! meridian wind (m/s) 00046 XDIR_SW ,&! direct solar radiation (on horizontal surf.) 00047 XSCA_SW ,&! diffuse solar radiation (on horizontal surf.) 00048 XLW ,&! longwave radiation (on horizontal surf.) 00049 XPS ,&! pressure at atmospheric model surface (Pa) 00050 XPA ,&! pressure at forcing level (Pa) 00051 XRHOA ,&! density at forcing level (kg/m3) 00052 XCO2 ,&! CO2 concentration in the air (kg/kg) 00053 XSNOW ,&! snow precipitation (kg/m2/s) 00054 XRAIN ,&! liquid precipitation (kg/m2/s) 00055 XZREF ! height of T,q forcing (m) 00056 USE MODD_SURFEX_OMP, ONLY : NINDX1,NINDX2,NBLOCK,NBLOCKTOT, INIT_DIM, RESET_DIM 00057 ! 00058 USE MODI_GET_LUOUT 00059 USE MODI_ABOR1_SFX 00060 ! 00061 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00062 USE PARKIND1 ,ONLY : JPRB 00063 ! 00064 #ifdef AIX64 00065 USE OMP_LIB 00066 #endif 00067 ! 00068 IMPLICIT NONE 00069 ! 00070 INCLUDE "netcdf.inc" 00071 ! 00072 #ifndef AIX64 00073 INCLUDE 'omp_lib.h' 00074 #endif 00075 ! 00076 ! global variables 00077 INTEGER,INTENT(IN) :: KSURF_STEP, KNB_ATM 00078 INTEGER, DIMENSION(:), INTENT(IN) :: KSIZE_OMP 00079 REAL, DIMENSION(:),INTENT(IN) :: PTA1,PTA2,PQA1,PQA2,PWIND1,PWIND2 00080 REAL, DIMENSION(:),INTENT(IN) :: PDIR_SW1,PDIR_SW2,PSCA_SW1,PSCA_SW2,PLW1,PLW2 00081 REAL, DIMENSION(:),INTENT(IN) :: PSNOW2,PRAIN2,PPS1,PPS2,PCO21,PCO22,PDIR1,PDIR2 00082 00083 ! local variables 00084 REAL :: ZDTA, ZDQA, ZDDIR_SW, ZDSCA_SW, ZDLW, 00085 ZDPS, ZDCO2, ZDU, ZDV, ZU1, ZV1, ZU2, ZV2 00086 REAL :: ZPI, ZNB_ATM, ZSURF_STEP, ZCOEF 00087 INTEGER :: J, INKPROMA 00088 INTEGER :: ILUOUT 00089 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00090 !======================================================================== 00091 ! 00092 IF (LHOOK) CALL DR_HOOK('OL_TIME_INTERP_ATM',0,ZHOOK_HANDLE) 00093 ! 00094 CALL GET_LUOUT('OFFLIN',ILUOUT) 00095 ! 00096 ZPI = XPI/180. 00097 ZNB_ATM = KNB_ATM*1. 00098 ZSURF_STEP = KSURF_STEP*1.-1. 00099 ZCOEF = ZSURF_STEP / ZNB_ATM 00100 ! 00101 !$OMP PARALLEL PRIVATE(INKPROMA,J,ZU1,ZU2,ZV1,ZV2,ZDU,ZDV,ZDTA, & 00102 !$OMP ZDQA,ZDLW,ZDPS,ZDCO2,ZDDIR_SW,ZDSCA_SW) 00103 ! 00104 !$ NBLOCK = OMP_GET_THREAD_NUM() 00105 ! 00106 IF (NBLOCK==NBLOCKTOT) THEN 00107 CALL INIT_DIM(KSIZE_OMP,0,INKPROMA,NINDX1,NINDX2) 00108 ELSE 00109 CALL INIT_DIM(KSIZE_OMP,NBLOCK,INKPROMA,NINDX1,NINDX2) 00110 ENDIF 00111 ! 00112 DO J = NINDX1,NINDX2 00113 ! 00114 IF (PTA1(J)/=XUNDEF) THEN 00115 ! 00116 ! Compute wind components 00117 ! 00118 ! zonal wind 00119 ZU1 = PWIND1(J) * SIN(PDIR1(J)*ZPI) 00120 ZU2 = PWIND2(J) * SIN(PDIR2(J)*ZPI) 00121 ZDU = (ZU2-ZU1)*ZCOEF 00122 XU(J) = ZU1 + ZDU 00123 ! 00124 ZV1 = PWIND1(J) * COS(PDIR1(J)*ZPI) 00125 ZV2 = PWIND2(J) * COS(PDIR2(J)*ZPI) 00126 ZDV = (ZV2-ZV1)*ZCOEF 00127 XV(J) = ZV1 + ZDV 00128 ! 00129 ! Compute variation from atmospheric time step J and J+1 00130 ! 00131 ZDTA = (PTA2(J)-PTA1(J))*ZCOEF 00132 XTA(J) = PTA1(J) + ZDTA 00133 ! 00134 ZDQA = (PQA2(J)-PQA1(J))*ZCOEF 00135 XQA(J) = PQA1(J) + ZDQA 00136 ! 00137 ZDLW = (PLW2(J)-PLW1(J))*ZCOEF 00138 XLW(J) = PLW1(J) + ZDLW 00139 ! 00140 ZDPS = (PPS2(J)-PPS1(J))*ZCOEF 00141 XPS(J) = PPS1(J) + ZDPS 00142 ! 00143 ZDCO2 = (PCO22(J)-PCO21(J))*ZCOEF 00144 XCO2(J) = PCO21(J) + ZDCO2 00145 ! 00146 ZDDIR_SW = (PDIR_SW2(J)-PDIR_SW1(J))*ZCOEF 00147 XDIR_SW(J,1) = PDIR_SW1(J)+ZDDIR_SW 00148 ! 00149 ZDSCA_SW = (PSCA_SW2(J)-PSCA_SW1(J))*ZCOEF 00150 XSCA_SW(J,1) = PSCA_SW1(J)+ZDSCA_SW 00151 ! 00152 ! 00153 XRAIN (J)= PRAIN2(J) 00154 XSNOW (J)= PSNOW2(J) 00155 ! 00156 ! 00157 XRHOA(J) = XPS(J) / ( XTA(J)*XRD * ( 1.+((XRV/XRD)-1.)*XQA(J) ) + XZREF(J)*XG ) 00158 ! 00159 ! humidity in kg/m3 00160 XQA(J) = XQA(J) * XRHOA(J) 00161 ! 00162 ENDIF 00163 ! 00164 ENDDO 00165 ! 00166 CALL RESET_DIM(SIZE(PTA1),INKPROMA,NINDX1,NINDX2) 00167 ! 00168 !$OMP END PARALLEL 00169 ! 00170 ! 00171 ! air density 00172 ! 00173 ! Check No value data 00174 !--------------------- 00175 ! Error cases 00176 ! 00177 IF ((MINVAL(XTA) .EQ.XUNDEF).OR.(MINVAL(XQA).EQ.XUNDEF).OR.& 00178 (MINVAL(XU).EQ.XUNDEF).OR.(MINVAL(XRAIN).EQ.XUNDEF).OR.& 00179 (MINVAL(XSNOW).EQ.XUNDEF)) THEN 00180 WRITE(ILUOUT,*)'MINVAL(XTA),MINVAL(XQA),MINVAL(XU),MINVAL(XRAIN),MINVAL(XSNOW)' 00181 WRITE(ILUOUT,*)MINVAL(XTA),MINVAL(XQA),MINVAL(XU),MINVAL(XRAIN),MINVAL(XSNOW) 00182 CALL ABOR1_SFX('OL_TIME_INTERP_ATM: UNDEFINED VALUE IN ATMOSPHERIC FORCING') 00183 ENDIF 00184 ! 00185 IF ((MINVAL(XDIR_SW).EQ.XUNDEF).AND.(MINVAL(XSCA_SW).EQ.XUNDEF)) THEN 00186 WRITE(ILUOUT,*)'MINVAL(XSCA_SW),MINVAL(XDIR_SW)' 00187 WRITE(ILUOUT,*)MINVAL(XSCA_SW),MINVAL(XDIR_SW) 00188 CALL ABOR1_SFX('OL_TIME_INTERP_ATM: UNDEFINED VALUE IN ATMOSPHERIC FORCING') 00189 ENDIF 00190 ! 00191 IF ((MINVAL(XPS).EQ.XUNDEF).AND.(MINVAL(XZS).EQ.XUNDEF)) THEN 00192 WRITE(ILUOUT,*)'MINVAL(XPS),MINVAL(XZS)' 00193 WRITE(ILUOUT,*)MINVAL(XPS),MINVAL(XZS) 00194 CALL ABOR1_SFX('OL_TIME_INTERP_ATM: UNDEFINED VALUE IN ATMOSPHERIC FORCING') 00195 ENDIF 00196 ! 00197 IF (MINVAL(XDIR_SW).EQ.XUNDEF) XDIR_SW(:,:)=0. ! No direct solar radiation 00198 IF (MINVAL(XSCA_SW).EQ.XUNDEF) XSCA_SW(:,:)=0. ! No diffuse solar radiation 00199 IF (MINVAL(XPS) .EQ.XUNDEF) THEN ! No surface Pressure 00200 WRITE(ILUOUT,*)' OL_TIME_INTERP_ATM: SURFACE PRESSURE COMPUTED FROM ZS' 00201 XPS(:) = 101325*(1-0.0065 * XZS(:)/288.15)**5.31 00202 ENDIF 00203 ! 00204 !* forcing level pressure from hydrostatism 00205 WHERE(XPS(:)/=XUNDEF) 00206 XPA(:) = XPS(:) - XRHOA(:) * XZREF(:) * XG 00207 ENDWHERE 00208 ! 00209 IF (LHOOK) CALL DR_HOOK('OL_TIME_INTERP_ATM',1,ZHOOK_HANDLE) 00210 ! 00211 END SUBROUTINE OL_TIME_INTERP_ATM