SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
ol_time_interp_atm.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! ######spl
6 SUBROUTINE ol_time_interp_atm (KSURF_STEP,KNB_ATM,KSIZE_OMP, &
7  pta1,pta2,pqa1,pqa2,pwind1,pwind2, &
8  pdir_sw1,pdir_sw2,psca_sw1,psca_sw2, &
9  plw1,plw2,psnow2,prain2, &
10  pps1,pps2,pco21,pco22,pdir1,pdir2 )
11 !**************************************************************************
12 !
13 !! PURPOSE
14 !! -------
15 ! Time interpolation of the atmospheric forcing
16 ! So far, it is a simple linear interpolation.
17 ! More complex interpolation may be added, especially for the atmospheric
18 ! radiation (Option to use).
19 ! Output are in the module
20 !!
21 !!** METHOD
22 !! ------
23 !!
24 !! EXTERNAL
25 !! --------
26 !!
27 !! IMPLICIT ARGUMENTS
28 !! ------------------
29 !!
30 !! REFERENCE
31 !! ---------
32 !!
33 !!
34 !! AUTHOR
35 !! ------
36 !! F. Habets *Meteo France*
37 !!
38 !! MODIFICATIONS
39 !! -------------
40 !! Original 06/2003
41 !
42 USE modd_csts, ONLY : xpi, xrd, xrv, xg
43 USE modd_surf_par, ONLY : xundef
44 USE modd_forc_atm, ONLY: xta ,&! air temperature forcing (K)
45  xqa ,&! air specific humidity forcing (kg/m3)
46  xrhoa ,&! air density forcing (kg/m3)
47  xzs ,&! orography (m)
48  xu ,&! zonal wind (m/s)
49  xv ,&! meridian wind (m/s)
50  xdir_sw ,&! direct solar radiation (on horizontal surf.)
51  xsca_sw ,&! diffuse solar radiation (on horizontal surf.)
52  xlw ,&! longwave radiation (on horizontal surf.)
53  xps ,&! pressure at atmospheric model surface (Pa)
54  xpa ,&! pressure at forcing level (Pa)
55  xrhoa ,&! density at forcing level (kg/m3)
56  xco2 ,&! CO2 concentration in the air (kg/kg)
57  xsnow ,&! snow precipitation (kg/m2/s)
58  xrain ,&! liquid precipitation (kg/m2/s)
59  xzref ! height of T,q forcing (m)
60 USE modd_surfex_omp, ONLY : nindx1sfx,nindx2sfx,nblock,nblocktot, init_dim, reset_dim
61 !
62 USE modi_get_luout
63 USE modi_abor1_sfx
64 !
65 USE yomhook ,ONLY : lhook, dr_hook
66 USE parkind1 ,ONLY : jprb
67 !
68 #ifdef AIX64
69 !$ USE OMP_LIB
70 #endif
71 !
72 IMPLICIT NONE
73 !
74 !
75 #ifndef AIX64
76 !$ INCLUDE 'omp_lib.h'
77 #endif
78 !
79 ! global variables
80 INTEGER,INTENT(IN) :: ksurf_step, knb_atm
81 INTEGER, DIMENSION(:), INTENT(IN) :: ksize_omp
82 REAL, DIMENSION(:),INTENT(IN) :: pta1,pta2,pqa1,pqa2,pwind1,pwind2
83 REAL, DIMENSION(:),INTENT(IN) :: pdir_sw1,pdir_sw2,psca_sw1,psca_sw2,plw1,plw2
84 REAL, DIMENSION(:),INTENT(IN) :: psnow2,prain2,pps1,pps2,pco21,pco22,pdir1,pdir2
85 
86 ! local variables
87 REAL :: zdta, zdqa, zddir_sw, zdsca_sw, zdlw, &
88  zdps, zdco2, zdu, zdv, zu1, zv1, zu2, zv2
89 REAL :: zpi, znb_atm, zsurf_step, zcoef
90 INTEGER :: j, inkproma
91 INTEGER :: iluout
92 REAL(KIND=JPRB) :: zhook_handle
93 !========================================================================
94 !
95 IF (lhook) CALL dr_hook('OL_TIME_INTERP_ATM',0,zhook_handle)
96 !
97  CALL get_luout('OFFLIN',iluout)
98 !
99 zpi = xpi/180.
100 znb_atm = knb_atm*1.
101 zsurf_step = ksurf_step*1.-1.
102 zcoef = zsurf_step / znb_atm
103 !
104 !$OMP PARALLEL PRIVATE(INKPROMA,J,ZU1,ZU2,ZV1,ZV2,ZDU,ZDV,ZDTA, &
105 !$OMP ZDQA,ZDLW,ZDPS,ZDCO2,ZDDIR_SW,ZDSCA_SW)
106 !
107 !$ NBLOCK = OMP_GET_THREAD_NUM()
108 !
109 IF (nblock==nblocktot) THEN
110  CALL init_dim(ksize_omp,0,inkproma,nindx1sfx,nindx2sfx)
111 ELSE
112  CALL init_dim(ksize_omp,nblock,inkproma,nindx1sfx,nindx2sfx)
113 ENDIF
114 !
115 DO j = nindx1sfx,nindx2sfx
116  !
117  IF (pta1(j)/=xundef) THEN
118  !
119  ! Compute wind components
120  !
121  ! zonal wind
122  zu1 = pwind1(j) * sin(pdir1(j)*zpi)
123  zu2 = pwind2(j) * sin(pdir2(j)*zpi)
124  zdu = (zu2-zu1)*zcoef
125  xu(j) = zu1 + zdu
126  !
127  zv1 = pwind1(j) * cos(pdir1(j)*zpi)
128  zv2 = pwind2(j) * cos(pdir2(j)*zpi)
129  zdv = (zv2-zv1)*zcoef
130  xv(j) = zv1 + zdv
131  !
132  ! Compute variation from atmospheric time step J and J+1
133  !
134  zdta = (pta2(j)-pta1(j))*zcoef
135  xta(j) = pta1(j) + zdta
136  !
137  zdqa = (pqa2(j)-pqa1(j))*zcoef
138  xqa(j) = pqa1(j) + zdqa
139  !
140  zdlw = (plw2(j)-plw1(j))*zcoef
141  xlw(j) = plw1(j) + zdlw
142  !
143  zdps = (pps2(j)-pps1(j))*zcoef
144  xps(j) = pps1(j) + zdps
145  !
146  zdco2 = (pco22(j)-pco21(j))*zcoef
147  xco2(j) = pco21(j) + zdco2
148  !
149  zddir_sw = (pdir_sw2(j)-pdir_sw1(j))*zcoef
150  xdir_sw(j,1) = pdir_sw1(j)+zddir_sw
151  !
152  zdsca_sw = (psca_sw2(j)-psca_sw1(j))*zcoef
153  xsca_sw(j,1) = psca_sw1(j)+zdsca_sw
154  !
155  !
156  xrain(j)= prain2(j)
157  xsnow(j)= psnow2(j)
158  !
159  !
160  xrhoa(j) = xps(j) / ( xta(j)*xrd * ( 1.+((xrv/xrd)-1.)*xqa(j) ) + xzref(j)*xg )
161  !
162  ! humidity in kg/m3
163  xqa(j) = xqa(j) * xrhoa(j)
164  !
165  ENDIF
166  !
167 ENDDO
168 !
169  CALL reset_dim(SIZE(pta1),inkproma,nindx1sfx,nindx2sfx)
170 !
171 !$OMP END PARALLEL
172 !
173 !
174 ! air density
175 !
176 ! Check No value data
177 !---------------------
178 ! Error cases
179 !
180 IF ((minval(xta) .EQ.xundef).OR.(minval(xqa).EQ.xundef).OR.&
181  (minval(xu).EQ.xundef).OR.(minval(xrain).EQ.xundef).OR.&
182  (minval(xsnow).EQ.xundef)) THEN
183  WRITE(iluout,*)'MINVAL(XTA),MINVAL(XQA),MINVAL(XU),MINVAL(XRAIN),MINVAL(XSNOW)'
184  WRITE(iluout,*)minval(xta),minval(xqa),minval(xu),minval(xrain),minval(xsnow)
185  CALL abor1_sfx('OL_TIME_INTERP_ATM: UNDEFINED VALUE IN ATMOSPHERIC FORCING')
186 ENDIF
187 !
188 IF ((minval(xdir_sw).EQ.xundef).AND.(minval(xsca_sw).EQ.xundef)) THEN
189  WRITE(iluout,*)'MINVAL(XSCA_SW),MINVAL(XDIR_SW)'
190  WRITE(iluout,*)minval(xsca_sw),minval(xdir_sw)
191  CALL abor1_sfx('OL_TIME_INTERP_ATM: UNDEFINED VALUE IN ATMOSPHERIC FORCING')
192 ENDIF
193 !
194 IF ((minval(xps).EQ.xundef).AND.(minval(xzs).EQ.xundef)) THEN
195  WRITE(iluout,*)'MINVAL(XPS),MINVAL(XZS)'
196  WRITE(iluout,*)minval(xps),minval(xzs)
197  CALL abor1_sfx('OL_TIME_INTERP_ATM: UNDEFINED VALUE IN ATMOSPHERIC FORCING')
198 ENDIF
199 !
200 IF (minval(xdir_sw).EQ.xundef) xdir_sw(:,:)=0. ! No direct solar radiation
201 IF (minval(xsca_sw).EQ.xundef) xsca_sw(:,:)=0. ! No diffuse solar radiation
202 IF (minval(xps) .EQ.xundef) THEN ! No surface Pressure
203  WRITE(iluout,*)' OL_TIME_INTERP_ATM: SURFACE PRESSURE COMPUTED FROM ZS'
204  xps(:) = 101325*(1-0.0065 * xzs(:)/288.15)**5.31
205 ENDIF
206 !
207 !* forcing level pressure from hydrostatism
208 WHERE(xps(:)/=xundef)
209  xpa(:) = xps(:) - xrhoa(:) * xzref(:) * xg
210 ENDWHERE
211 !
212 IF (lhook) CALL dr_hook('OL_TIME_INTERP_ATM',1,zhook_handle)
213 !
214 END SUBROUTINE ol_time_interp_atm
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:6
subroutine init_dim(KSIZE_OMP, KBLOCK, KKPROMA, KINDX1, KINDX2)
subroutine reset_dim(KNI, KKPROMA, KINDX1, KINDX2)
subroutine ol_time_interp_atm(KSURF_STEP, KNB_ATM, KSIZE_OMP, PTA1, PTA2, PQA1, PQA2, PWIND1, PWIND2, PDIR_SW1, PDIR_SW2, PSCA_SW1, PSCA_SW2, PLW1, PLW2, PSNOW2, PRAIN2, PPS1, PPS2, PCO21, PCO22, PDIR1, PDIR2)