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