6 SUBROUTINE tridiag_surf(PVARM,PF,PDFDDTDZ,PEXT,PDEXTDV,PTSTEP, &
7 pdzz,pdzm,pvarp,oimpl,palfa,pbeta )
127 USE yomhook
,ONLY : lhook, dr_hook
128 USE parkind1
,ONLY : jprb
135 REAL,
DIMENSION(:,:),
INTENT(IN) :: pvarm
136 REAL,
DIMENSION(:,:),
INTENT(IN) :: pf
137 REAL,
DIMENSION(:,:),
INTENT(IN) :: pdfddtdz
138 REAL,
DIMENSION(:,:),
INTENT(IN) :: pext
140 REAL,
DIMENSION(:,:),
INTENT(IN) :: pdextdv
142 REAL,
INTENT(IN) :: ptstep
143 REAL,
DIMENSION(:,:),
INTENT(IN) :: pdzz
144 REAL,
DIMENSION(:,:),
INTENT(IN) :: pdzm
146 REAL,
DIMENSION(:,:),
INTENT(OUT):: pvarp
147 LOGICAL,
OPTIONAL,
INTENT(IN) :: oimpl
151 REAL,
DIMENSION(:),
INTENT(OUT),
OPTIONAL :: palfa
152 REAL,
DIMENSION(:),
INTENT(OUT),
OPTIONAL :: pbeta
157 REAL,
DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: zvarp
158 REAL,
DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: zdz_dfddtdz_o_dz2
159 REAL,
DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: za, zb, zc
160 REAL,
DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: zy ,zgam
162 REAL,
DIMENSION(SIZE(PVARM,1)) :: zbet
169 REAL(KIND=JPRB) :: zhook_handle
176 IF (lhook) CALL dr_hook(
'TRIDIAG_SURF',0,zhook_handle)
181 zdz_dfddtdz_o_dz2 = pdfddtdz/pdzz
188 IF (present(oimpl))
THEN
197 zy(:,1) = pdzm(:,1)*pvarm(:,1)/ptstep &
200 - zdz_dfddtdz_o_dz2(:,1) * zimpl * pvarm(:,1)&
201 + zdz_dfddtdz_o_dz2(:,2) * zimpl * pvarm(:,2)&
202 - zdz_dfddtdz_o_dz2(:,2) * zimpl * pvarm(:,1)&
203 + pdzm(:,1)*pext(:,1) &
204 - pdzm(:,1)*pdextdv(:,1) * zimpl * pvarm(:,1)
207 zy(:,jk) = pdzm(:,jk)*pvarm(:,jk)/ptstep &
210 + zdz_dfddtdz_o_dz2(:,jk+1) * zimpl * pvarm(:,jk+1) &
211 - zdz_dfddtdz_o_dz2(:,jk+1) * zimpl * pvarm(:,jk ) &
212 - zdz_dfddtdz_o_dz2(:,jk ) * zimpl * pvarm(:,jk ) &
213 + zdz_dfddtdz_o_dz2(:,jk ) * zimpl * pvarm(:,jk-1) &
214 + pdzm(:,jk)*pext(:,jk) &
215 - pdzm(:,jk)*pdextdv(:,jk) * zimpl * pvarm(:,jk)
222 zy(:,ik) = pdzm(:,ik)*pvarm(:,ik)/ptstep &
223 + pdzm(:,ik)*pext(:,ik) &
224 - pdzm(:,ik)*pdextdv(:,ik) * zimpl * pvarm(:,ik)
234 zb(:,1) = pdzm(:,1)/ptstep &
235 - zdz_dfddtdz_o_dz2(:,1) * zimpl &
236 - zdz_dfddtdz_o_dz2(:,2) * zimpl &
237 - pdzm(:,1)*pdextdv(:,1)
238 zc(:,1) = zdz_dfddtdz_o_dz2(:,2) * zimpl
241 za(:,jk) = zdz_dfddtdz_o_dz2(:,jk ) * zimpl
242 zb(:,jk) = pdzm(:,jk)/ptstep &
243 - zdz_dfddtdz_o_dz2(:,jk+1) * zimpl &
244 - zdz_dfddtdz_o_dz2(:,jk ) * zimpl &
245 - pdzm(:,jk)*pdextdv(:,jk)
246 zc(:,jk) = zdz_dfddtdz_o_dz2(:,jk+1) * zimpl
253 zb(:,ik) = pdzm(:,ik)/ptstep &
254 - pdzm(:,ik)*pdextdv(:,ik)
260 zvarp(:,ik) = zy(:,ik) / zbet(:)
264 zgam(:,jk) = za(:,jk+1) / zbet(:)
266 zbet(:) = zb(:,jk) - zc(:,jk) * zgam(:,jk)
268 zvarp(:,jk)= ( zy(:,jk) - zc(:,jk) * zvarp(:,jk+1) ) / zbet(:)
272 zgam(:,1) = za(:,2) / zbet(:)
274 zbet(:) = zb(:,1) - zc(:,1) * zgam(:,1)
276 zvarp(:,1)= ( zy(:,1) - zc(:,1) * zvarp(:,2) ) / zbet(:)
284 zvarp(:,jk) = zvarp(:,jk) - zgam(:,jk-1) * zvarp(:,jk-1)
292 IF (.NOT. gimpl)
THEN
299 IF (lhook) CALL dr_hook(
'TRIDIAG_SURF',1,zhook_handle)
subroutine tridiag_surf(PVARM, PF, PDFDDTDZ, PEXT, PDEXTDV, PTSTEP, PDZZ, PDZM, PVARP, OIMPL, PALFA, PBETA)