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