copyright (C) 2001 MSC-RPN COMM %%%MC2%%%
***s/r casc_hvi
*
subroutine casc_hvi (trname,trname_a, 4,27
$ xpqd,ypqd,xpud,ypvd,xpqs,ypqs,xpus,ypvs,
$ qq1,qq2,uu1,uu2,vv1,vv2,ww1,ww2,tt1,tt2,hm1,hm2,cl1,cl2,
$ mxn,uun,vvn,wzn,bun,prn,hun,cln,n1,n2,n3,n4,d1,d2,d3,d4,
$ lnk,nid,njd,nis,njs,nka,ntra,b1,b2)
implicit none
*
character*8 trname(*),trname_a(*)
logical b1,b2
integer n1,n2,n3,n4,d1,d2,d3,d4,lnk,nid,njd,nis,njs,nka,ntra
real*8 xpqd(*),ypqd(*),xpud(*),ypvd(*)
real*8 xpqs(*),ypqs(*),xpus(*),ypvs(*)
real mxn(*),uun(*),vvn(*),wzn(*),bun(*),prn(*),hun(*),cln(*),
$ qq1(n1:n2,n3:n4,0:lnk), qq2(n1:n2,n3:n4,0:lnk),
$ uu1(n1:n2,n3:n4,*),uu2(n1:n2,n3:n4,*),
$ vv1(n1:n2,n3:n4,*),vv2(n1:n2,n3:n4,*),
$ ww1(n1:n2,n3:n4,*),ww2(n1:n2,n3:n4,*),
$ tt1(n1:n2,n3:n4,*),tt2(n1:n2,n3:n4,*),
$ hm1(n1:n2,n3:n4,*),hm2(n1:n2,n3:n4,*),
$ cl1(n1:n2,n3:n4,lnk,*),cl2(n1:n2,n3:n4,lnk,*)
*
#include "dynmem.cdk"
#include "bcsgrds.cdk"
#include "hinterpo.cdk"
#include "vinterpo.cdk"
*
integer i,j,k,n,iuv,itt,iwz,ngd,nga,err
integer, dimension (:), allocatable :: ktop,kbot,idx,idu,idy
real, dimension (:,:), allocatable :: mxr,uur,vvr,wzr,bur,
$ hur,hgeow,hgeot,hgeom,hgeow_anal,hgeot_anal,hgeom_anal
real, dimension (:,:,:), allocatable :: prr,clr,w1,w2,w3,w4,w5,w6
real*8, dimension (: ), allocatable ::
$ cxa,cxb,cxc,cxd,cua,cub,cuc,cud,cya,cyb,cyc,cyd
*
*-----------------------------------------------------------------------
*
ngd = nid * njd
nga = nis * njs
if (ngd.le.0) return
*
allocate ( idx(nid), idu(max(nid,njd)), idy(njd) )
allocate ( cxa(nid),cxb(nid),cxc(nid),cxd(nid),
$ cua(max(nid,njd)),cub(max(nid,njd)),
$ cuc(max(nid,njd)),cud(max(nid,njd)),
$ cya(njd),cyb(njd),cyc(njd),cyd(njd))
*
call grid_to_grid_coef
(xpqd,nid,xpqs,nis,idx,cxa,cxb,cxc,cxd,
$ hint_model)
call grid_to_grid_coef
(ypqd,njd,ypqs,njs,idy,cya,cyb,cyc,cyd,
$ hint_model)
*
allocate (mxr(ngd,2),uur(ngd,nka+1),vvr(ngd,nka+1),wzr(ngd,nka),
$ bur(ngd,nka),prr(n1:d1+n2,n3:d2+n4,nka+1),hur(ngd,nka),
$ clr(ngd,nka,ntra))
*
* Perform horizontal interpolations
*
call hinterpo
(mxr,nid,njd,mxn,nis,njs,2,
$ idx,idy,cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd,hint_model)
call hinterpo
(wzr,nid,njd,wzn,nis,njs,nka,
$ idx,idy,cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd,hint_model)
call hinterpo
(bur,nid,njd,bun,nis,njs,nka,
$ idx,idy,cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd,hint_model)
call hinterpo
(prr,nid,njd,prn,nis,njs,nka+1,
$ idx,idy,cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd,hint_model)
call hinterpo
(hur,nid,njd,hun,nis,njs,nka,
$ idx,idy,cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd,hint_model)
*
do k=1,ntra
if (trname_a(k).ne.'!@@NOT@@')
$ call hinterpo
(clr(1,1,k),nid,njd,cln((k-1)*nga*nka+1),nis,njs,
$ nka,idx,idy,cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd,hint_model)
end do
*
call grid_to_grid_coef
(xpud,nid,xpus,nis,idu,cua,cub,cuc,cud,
$ hint_model)
call hinterpo
(uur(1,2),nid,njd,uun,nis,njs,nka,
$ idu,idy,cua,cub,cuc,cud,cya,cyb,cyc,cyd,hint_model)
call grid_to_grid_coef
(ypvd,njd,ypvs,njs,idu,cua,cub,cuc,cud,
$ hint_model)
call hinterpo
(vvr(1,2),nid,njd,vvn,nis,njs,nka,
$ idx,idu,cxa,cxb,cxc,cxd,cua,cub,cuc,cud,hint_model)
deallocate (idx,idy,idu,cxa,cxb,cxc,cxd,cua,cub,cuc,cud,
$ cya,cyb,cyc,cyd)
*
uur(:,1) = uur(:,2)
vvr(:,1) = vvr(:,2)
*
* Preparation for vertical interpolation
*
iuv = 1
itt = ngd*lnk*2 + 1
iwz = ngd*lnk*4 + 1
call hpalloc (paposit,ngd*lnk*6 , err,1)
call hpalloc (pahuv ,ngd*(nka+4) , err,1)
call hpalloc (pahtt ,ngd*(nka+4) , err,1)
call hpalloc (pahww ,ngd*(nka+4) , err,1)
*
allocate (hgeow(ngd,lnk),hgeot(ngd,lnk),hgeom(ngd,0:lnk),
$ hgeow_anal(ngd,nka),hgeot_anal(ngd,nka),hgeom_anal(ngd, nka+1))
*
* Compute target heights in hgeow, hgeot and hgeom
*
call hauteur
(hgeow ,'HW',mxr,ngd,1,lnk)
call hauteur
(hgeot ,'HT',mxr,ngd,1,lnk)
call hauteur
(hgeom(1,1),'HM',mxr,ngd,1,lnk)
do i=1,ngd
hgeom(i,0) = mxr(i,1)
enddo
*
* Compute reference (input data) heights in hgeow_anal,
* hgeot_anal and hgeom_anal.
*
call ref_h2
( hgeow_anal,hgeot_anal,hgeom_anal,mxr,zta,ngd,nka )
*
* Precompute vertical interpolation positions
*
allocate (ktop(ngd*lnk), kbot(ngd*lnk))
call posiz3
(posit(iuv),huv,hgeom_anal,hgeom(1,1),ktop,kbot,
$ ngd,lnk,nka+1)
call posiz3
(posit(itt),htt,hgeot_anal,hgeot ,ktop,kbot,
$ ngd,lnk,nka )
call posiz3
(posit(iwz),hww,hgeow_anal,hgeow ,ktop,kbot,
$ ngd,lnk,nka )
deallocate ( ktop,kbot,hgeow,hgeow_anal, hgeom_anal )
*
* Perform vertical interpolations and transfer into model space
*
allocate ( w1(n1:d1+n2,n3:d2+n4,(lnk+1)),
$ w2(n1:d1+n2,n3:d2+n4,(lnk+1)),
$ w3(n1:d1+n2,n3:d2+n4,(lnk+1)),
$ w4(n1:d1+n2,n3:d2+n4,(lnk+1)),
$ w5(n1:d1+n2,n3:d2+n4,(lnk+1)),
$ w6(n1:d1+n2,n3:d2+n4,(lnk+1)) )
*
call vertint3
( w1,uur,posit(iuv),huv,ngd,lnk,nka+1)
call vertint3
( w2,vvr,posit(iuv),huv,ngd,lnk,nka+1)
call vertint3
( w3,wzr,posit(iwz),hww,ngd,lnk,nka )
call vertint3
( w4,hur,posit(itt),htt,ngd,lnk,nka )
call vertint3
( w5,bur,posit(itt),htt,ngd,lnk,nka )
call vertint3
( w6,prr,posit(iuv),huv,ngd,lnk,nka+1)
call corbusfc
( w5,hgeot,hgeom,hgeot_anal,ngd,lnk)
if (b1) then
do k=1,lnk
do j=n3,n4
do i=n1,n2
uu1(i,j,k) = w1(i,j,k) / sqrt(sby(i,j))
vv1(i,j,k) = w2(i,j,k) / sqrt(sbx(i,j))
ww1(i,j,k) = w3(i,j,k)
hm1(i,j,k) = w4(i,j,k)
tt1(i,j,k) = w5(i,j,k)
qq1(i,j,k) = w6(i,j,k)
end do
end do
end do
do j=n3,n4
do i=n1,n2
uu1(i,j,lnk) = uu1(i,j,lnk-1)
vv1(i,j,lnk) = vv1(i,j,lnk-1)
qq1(i,j,0 ) = prr(i,j,1)
end do
end do
endif
*
if (b2) then
do k=1,lnk
do j=n3,n4
do i=n1,n2
uu2(i,j,k) = w1(i+d1,j+d2,k) / sqrt(sby(i+d3,j+d4))
vv2(i,j,k) = w2(i+d1,j+d2,k) / sqrt(sbx(i+d3,j+d4))
ww2(i,j,k) = w3(i+d1,j+d2,k)
hm2(i,j,k) = w4(i+d1,j+d2,k)
tt2(i,j,k) = w5(i+d1,j+d2,k)
qq2(i,j,k) = w6(i+d1,j+d2,k)
end do
end do
end do
do j=n3,n4
do i=n1,n2
uu2(i,j,lnk) = uu2(i,j,lnk-1)
vv2(i,j,lnk) = vv2(i,j,lnk-1)
qq2(i,j,0 ) = prr(i+d1,j+d2,1)
end do
end do
endif
*
do n=1,ntr
j=-1
do k=1,ntra
if (trname(n).eq.trname_a(k)) j=k
end do
if (j.gt.0) then
call vertint3
(w1,clr(1,1,j),posit(itt),htt,ngd,lnk,nka)
if (b1) then
do k=1,lnk
do j=n3,n4
do i=n1,n2
cl1(i,j,k,n) = w1(i,j,k)
end do
end do
end do
endif
if (b2) then
do k=1,lnk
do j=n3,n4
do i=n1,n2
cl2(i,j,k,n) = w1(i+d1,j+d2,k)
end do
end do
end do
endif
else
if (b1) cl1(:,:,:,n) = 0.
if (b2) cl2(:,:,:,n) = 0.
endif
end do
*
deallocate (mxr,uur,vvr,wzr,bur,prr,hur,clr,hgeot,hgeom,
$ hgeot_anal,w1,w2,w3,w4,w5,w6)
call hpdeallc (paposit,err,1)
call hpdeallc (pahuv ,err,1)
call hpdeallc (pahtt ,err,1)
call hpdeallc (pahww ,err,1)
paposit = 0
pahuv = 0
pahtt = 0
pahww = 0
*
*-----------------------------------------------------------------------
return
end
*