subroutine geodata ( geobus,topo,lminx,lmaxx,lminy,lmaxy, 1,20
$ maxhh01,maxhh02,dimgx,dimgy,unf)
implicit none
*
integer dimgx,dimgy,lminx,lmaxx,lminy,lmaxy,unf
real geobus(*),topo(lminx-1:lmaxx,lminy-1:lmaxy,2),maxhh01,maxhh02
*
#include "lcldim.cdk"
#include "grd.cdk"
#include "rec.cdk"
#include "ifd.cdk"
#include "partopo.cdk"
#include "hinterpo.cdk"
#include "lesbus.cdk"
#include "filename.cdk"
#include "yomdyn.cdk"
#include "topo.cdk"
*
integer fnom,fstouv,fstinf,fstprm,fstluk,fstfrm,fclos,
$ fstopc,nav_3df
external fnom,fstouv,fstinf,fstprm,fstluk,fstfrm,fclos,
$ fstopc,nav_3df
*
character*1 typ, grd
character*2 var
character*8 lab, inttyp
character*256 fn
integer dte, det, ipas, p1, p2, p3, g1, g2, g3, g4, bit,
$ dty, swa, lng, dlf, ubc, ex1, ex2, ex3, longueur
*
integer unf2,errop,ier,ni1,nj1,nk1,key,ni,nj,n,nia,nja,
$ i,j,mgi,z0i,lhi,y7i,y8i,y9i,gai,vgi,vfi,gid,
$ lai,loi,mti,mfi,niext,njext,errrot
integer, dimension (:), allocatable :: idx,idy
real xlat1,xlon1,xlat2,xlon2,epsil
real , dimension (: ) , allocatable :: xps,yps
real , dimension (:,:) , allocatable :: meh
real*8, dimension (: ) , allocatable :: xpaq,ypaq,
$ cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd
real*8 xpxext(0:dimgx), ypxext(0:dimgy)
data epsil /1.0e-5/
*-----------------------------------------------------------------------
*
inttyp = 'LINEAR'
if (myproc.ne.0) ier = fstopc('MSGLVL','SYSTEM',.false.)
*
do i=1,dimgx
xpxext(i) = xpx(i)
end do
do i=1,dimgy
ypxext(i) = ypx(i)
end do
xpxext(0) = xpxext(1) - (xpxext(2)-xpxext(1))
ypxext(0) = ypxext(1) - (ypxext(2)-ypxext(1))
*
unf2 = 0
*
errrot = 0
c ier = nav_3df (unf,0,0,0.)
ier = nav_3df
(unf,hx,hy,1.2)
nia = ifd_niaf - ifd_niad + 1
nja = ifd_njaf - ifd_njad + 1
close (unf)
*
do n=1,ifd_nf
if (ifd_needit(n)) then
fn =
$ '../geophy/'//prefgeo(1:longueur(prefgeo))//'_'//ifd_fnext(n)
ier = fnom (unf2,fn,'RND+OLD+R/O',0)
ier = fstouv (unf2,'RND')
*
* Use first file to establish geo-references
*
allocate ( xpaq(nia), ypaq(nja) )
key = fstinf(unf2,ni1,nj1,nk1,-1,' ',-1,-1,-1,' ','>>')
allocate (xps(ni1))
ier = fstluk ( xps, key, ni,nj1,nk1 )
key = fstinf(unf2,ni1,nj1,nk1,-1,' ',-1,-1,-1,' ','^^')
allocate (yps(nj1))
ier = fstluk ( yps, key, ni1,nj,nk1 )
do i=1,nia
xpaq(i) = xps(ifd_niad+i-1)
end do
do j=1,nja
ypaq(j) = yps(ifd_njad+j-1)
end do
deallocate (xps,yps)
*
ier= fstprm (key, DTE, DET, IPAS, ni1, nj1, nk1, BIT, DTY,
$ P1, P2, P3, TYP, VAR, LAB, GRD, G1, G2, G3, G4,
$ SWA, LNG, DLF, UBC, EX1, EX2, EX3)
call cigaxg (GRD,xlat1,xlon1,xlat2,xlon2,g1,g2,g3,g4)
if ((abs(Grd_xlat1-xlat1)/(Grd_xlat1+91.).gt.epsil) .or.
$ (abs(Grd_xlat2-xlat2)/(Grd_xlat2+91.).gt.epsil) .or.
$ (abs(Grd_xlon1-xlon1)/(Grd_xlon1+ 1.).gt.epsil) .or.
$ (abs(Grd_xlon2-xlon2)/(Grd_xlon2+ 1.).gt.epsil) )
$ errrot = -1
ier = fstfrm (unf2)
ier = fclos (unf2)
goto 57
endif
enddo
*
57 if ((errrot.lt.0).and.(myproc.eq.0)) write (6,1001)
call mc2stop
(errrot)
*
niext = ldni+2*hx+1
njext = ldnj+2*hy+1
allocate (idx(niext), idy(njext))
allocate (cxa(niext),cxb(niext),cxc(niext),cxd(niext),
$ cya(njext),cyb(njext),cyc(njext),cyd(njext),
$ meh(niext,njext))
*
call grid_to_grid_coef
(xpxext(gc_ld(1,myproc)-1),niext,xpaq,
$ nia,idx,cxa,cxb,cxc,cxd,inttyp)
call grid_to_grid_coef
(ypxext(gc_ld(3,myproc)-1),njext,ypaq,
$ nja,idy,cya,cyb,cyc,cyd,inttyp)
*
call fstrhint
(meh,'ME',niext,njext,1,nia,nja,
$ idx,idy,cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd,inttyp)
*
call dc_topo2
( topo,meh,topo_flt_coef,minx,maxx,miny,maxy,
$ ldni,ldnj,hx,hy,period_x,period_y,
$ maxhh01,maxhh02,myproc.eq.0 )
*
deallocate (meh)
*
if (gnmaphy.gt.0) then
do gid=1,geotop
if (geonm(gid,2).eq.'MG') mgi = geopar(gid,1)
if (geonm(gid,2).eq.'Z0') z0i = geopar(gid,1)
if (geonm(gid,2).eq.'LH') lhi = geopar(gid,1)
if (geonm(gid,2).eq.'Y7') y7i = geopar(gid,1)
if (geonm(gid,2).eq.'Y8') y8i = geopar(gid,1)
if (geonm(gid,2).eq.'Y9') y9i = geopar(gid,1)
if (geonm(gid,2).eq.'GA') gai = geopar(gid,1)
if (geonm(gid,2).eq.'VG') vgi = geopar(gid,1)
if (geonm(gid,2).eq.'VF') vfi = geopar(gid,1)
if (geonm(gid,1).eq.'DLATEN') lai = geopar(gid,1)
if (geonm(gid,1).eq.'DLONEN') loi = geopar(gid,1)
if (geonm(gid,1).eq.'MT' ) mti = geopar(gid,1)
if (geonm(gid,1).eq.'MF' ) mfi = geopar(gid,1)
end do
*
do j=1,ldnj
do i=1,ldni
geobus(mti +(j-1)*ldni+i-1) = topo(i,j,1)
geobus(mfi +(j-1)*ldni+i-1) = topo(i,j,1)
end do
end do
*
call grid_to_grid_coef
(xpx(gc_ld(1,myproc)+hx),ldni,
$ xpaq,nia,idx,cxa,cxb,cxc,cxd,inttyp)
call grid_to_grid_coef
(ypx(gc_ld(3,myproc)+hy),ldnj,
$ ypaq,nja,idy,cya,cyb,cyc,cyd,inttyp)
*
call fstrhint
(geobus(mgi),'MG',ldni,ldnj,1,nia,nja,
$ idx,idy,cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd,inttyp)
call fstrhint
(geobus(z0i),'Z0',ldni,ldnj,1,nia,nja,
$ idx,idy,cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd,inttyp)
call fstrhint
(geobus(lhi),'LH',ldni,ldnj,1,nia,nja,
$ idx,idy,cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd,inttyp)
call fstrhint
(geobus(y7i),'Y7',ldni,ldnj,1,nia,nja,
$ idx,idy,cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd,inttyp)
call fstrhint
(geobus(y8i),'Y8',ldni,ldnj,1,nia,nja,
$ idx,idy,cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd,inttyp)
call fstrhint
(geobus(y9i),'Y9',ldni,ldnj,1,nia,nja,
$ idx,idy,cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd,inttyp)
call fstrhint
(geobus(gai),'GA',ldni,ldnj,1,nia,nja,
$ idx,idy,cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd,inttyp)
*
call grid_to_grid_coef
(xpx(gc_ld(1,myproc)+hx),ldni,
$ xpaq,nia,idx,cxa,cxb,cxc,cxd,'NEAREST')
call grid_to_grid_coef
(ypx(gc_ld(3,myproc)+hy),ldnj,
$ ypaq,nja,idy,cya,cyb,cyc,cyd,'NEAREST')
*
call fstrhint
(geobus(vgi),'VG',ldni,ldnj,1,nia,nja,
$ idx,idy,cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd,inttyp)
call fstrhint
(geobus(vfi),'VF',ldni,ldnj,26,nia,nja,
$ idx,idy,cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd,inttyp)
*
call latlon2
(geobus(lai),geobus(loi),
$ xpx(gc_ld(1,myproc)+hx),ypx(gc_ld(3,myproc)+hy),ldni,ldnj)
*
do i=1,ldni*ldnj
geobus(mgi +i-1) = min(max(0.,geobus(mgi +i-1)),1.)
geobus(gai +i-1) = min(max(0.,geobus(gai +i-1)),1.)
geobus(lhi +i-1) = max(0.,geobus(lhi+i-1))
geobus(z0i +i-1) = max(1.0e-30,geobus(z0i+i-1))
end do
*
endif
*
deallocate (idx,idy,cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd,xpaq,ypaq)
if (myproc.ne.0) ier = fstopc('MSGLVL','INFORM',.false.)
*
1001 format (/' INPUT DATA NOT ON SAME GRID ROTATION AS MODEL '
$ '- ABORT IN geodata -'/)
*-----------------------------------------------------------------------
return
end
*
subroutine fstrhint (f,nv,ni,nj,nk,nia,nja,idx,idy, 10,2
$ cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd,inttyp)
implicit none
*
character* (*) nv,inttyp
integer ni,nj,nk,nia,nja,idx(*),idy(*)
real f(ni*nj,*)
real*8 cxa(*),cxb(*),cxc(*),cxd(*),cya(*),cyb(*),cyc(*),cyd(*)
*
#include "filename.cdk"
#include "ifd.cdk"
*
integer fnom,fstouv,fstfrm,fclos,longueur
character*256 fn
integer k,n,ier,unf,ofi,ofj
real wk1(nia*nja)
*
unf = 0
*
do k=1,nk
*
do n=1,ifd_nf
if (ifd_needit(n)) then
fn =
$ '../geophy/'//prefgeo(1:longueur(prefgeo))//'_'//ifd_fnext(n)
ier = fnom (unf,fn,'RND+OLD+R/O',0)
ier = fstouv (unf,'RND')
ofi = ifd_minx(n)-1
ofj = ifd_miny(n)-1
call filsfc
(wk1,nv,ifd_niad,ifd_niaf,ifd_njad,ifd_njaf,k,nk,
$ unf,ofi,ofj)
ier = fstfrm (unf)
ier = fclos (unf)
endif
end do
*
call hinterpo
(f(1,k),ni,nj,wk1,nia,nja,1,
$ idx,idy,cxa,cxb,cxc,cxd,cya,cyb,cyc,cyd,inttyp)
*
end do
*
return
end
*
subroutine filsfc ( f,nv,n1,n2,n3,n4,ki,nk,unf,ofi,ofj ) 1
implicit none
*
character* (*) nv
integer n1,n2,n3,n4,ki,nk,unf,ofi,ofj,cumerr
real f(n1:n2,n3:n4)
*
integer fstinf,fstluk
external fstinf,fstluk
*
character*8 dum
integer key,ni1,nj1,nk1,ip1,ier,i,j
real, dimension (:,:), allocatable :: tr1
*
*-----------------------------------------------------------------------
*
ip1 = 0
if (nk.gt.1) call convip ( ip1, real(ki), 3, 1, dum, .false.)
key = fstinf(unf,ni1,nj1,nk1,-1,' ',ip1,-1,-1,' ',nv)
allocate (tr1(ni1,nj1))
*
ier = fstluk ( tr1, key, ni1,nj1,nk1 )
*
do j=1,nj1
do i=1,ni1
f(ofi+i,ofj+j) = tr1(i,j)
end do
end do
*
deallocate (tr1)
*-----------------------------------------------------------------------
return
end