91 NO,RLAT,RLON,IBO,LO,GO,IRET)
92 class(ip_grid),
intent(in) :: grid_in, grid_out
93 INTEGER,
INTENT(IN ) :: IBI(KM), IPOPT(20)
94 INTEGER,
INTENT(IN ) :: KM, MI, MO
95 INTEGER,
INTENT( OUT) :: IBO(KM), IRET, NO
97 LOGICAL*1,
INTENT(IN ) :: LI(MI,KM)
98 LOGICAL*1,
INTENT( OUT) :: LO(MO,KM)
100 REAL,
INTENT(IN ) :: GI(MI,KM)
101 REAL,
INTENT(INOUT) :: RLAT(MO), RLON(MO)
102 REAL,
INTENT( OUT) :: GO(MO,KM)
104 REAL,
PARAMETER :: FILL=-9999.
106 INTEGER :: IJKGDS1, I1, J1, I2, J2, IB, JB
107 INTEGER :: IJKGDSA(20), IX, JX, IXS, JXS
108 INTEGER :: K, KXS, KXT, IGDTNUMO2
109 INTEGER :: LB, LSW, MP, MSPIRAL, MX
110 INTEGER :: N, NB, NB1, NB2, NB3, NB4, NV, NX
111 INTEGER :: N11(MO),N21(MO),N12(MO),N22(MO)
113 REAL :: GB, LAT(1), LON(1)
114 REAL :: PMP, RB2, RLOB(MO), RLAB(MO), WB
115 REAL :: W11(MO), W21(MO), W12(MO), W22(MO)
116 REAL :: WO(MO,KM), XF, YF, XI, YI, XX, YY
117 REAL :: XPTS(MO),YPTS(MO),XPTB(MO),YPTB(MO)
118 REAL :: XXX(1), YYY(1)
119 class(ip_grid),
allocatable :: grid_out2
127 select type(grid_out)
128 type is(ip_station_points_grid)
129 allocate(grid_desc_out2, source = grid_out%descriptor)
130 grid_desc_out2%grid_num = 255 + grid_out%descriptor%grid_num
131 call init_grid(grid_out2, grid_desc_out2)
133 CALL gdswzd(grid_out2,-1,mo,fill,xpts,ypts,rlon,rlat,no)
138 allocate(grid_out2, source = grid_out)
139 CALL gdswzd(grid_out2, 0,mo,fill,xpts,ypts,rlon,rlat,no)
145 IF(ipopt(1).GT.16) iret=32
146 mspiral=max(ipopt(20),1)
149 IF(iret.EQ.0.AND.nb1.LT.0) iret=32
151 IF(ipopt(2).EQ.-2) lsw=2
152 IF(ipopt(1).EQ.-1.OR.ipopt(2).EQ.-1) lsw=0
153 IF(iret.EQ.0.AND.lsw.EQ.1.AND.nb1.GT.15) iret=32
155 IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
156 IF(mp.LT.0.OR.mp.GT.100) iret=32
166 ELSEIF(lsw.EQ.1)
THEN
169 nb4=nb4+8*ib*ipopt(2+ib)
187 ib=nb-(jb+nb1)*nb2-nb1-1
188 lb=max(abs(ib),abs(jb))
191 wb=(nb1+1-abs(ib))*(nb1+1-abs(jb))
192 ELSEIF(lsw.EQ.1)
THEN
198 xptb(n)=xpts(n)+ib*rb2
199 yptb(n)=ypts(n)+jb*rb2
202 CALL gdswzd(grid_out2, 1,no,fill,xptb,yptb,rlob,rlab,nv)
203 CALL gdswzd(grid_in,-1,no,fill,xptb,yptb,rlob,rlab,nv)
204 IF(iret.EQ.0.AND.nv.EQ.0.AND.lb.EQ.0) iret=2
209 IF(xi.NE.fill.AND.yi.NE.fill)
THEN
216 n11(n)=grid_in%field_pos(i1, j1)
217 n21(n)=grid_in%field_pos(i2, j1)
218 n12(n)=grid_in%field_pos(i1, j2)
219 n22(n)=grid_in%field_pos(i2, j2)
220 IF(min(n11(n),n21(n),n12(n),n22(n)).GT.0)
THEN
246 gb=w11(n)*gi(n11(n),k)+w21(n)*gi(n21(n),k) &
247 +w12(n)*gi(n12(n),k)+w22(n)*gi(n22(n),k)
248 go(n,k)=go(n,k)+wb*gb
251 IF(li(n11(n),k))
THEN
252 go(n,k)=go(n,k)+wb*w11(n)*gi(n11(n),k)
253 wo(n,k)=wo(n,k)+wb*w11(n)
255 IF(li(n21(n),k))
THEN
256 go(n,k)=go(n,k)+wb*w21(n)*gi(n21(n),k)
257 wo(n,k)=wo(n,k)+wb*w21(n)
259 IF(li(n12(n),k))
THEN
260 go(n,k)=go(n,k)+wb*w12(n)*gi(n12(n),k)
261 wo(n,k)=wo(n,k)+wb*w12(n)
263 IF(li(n22(n),k))
THEN
264 go(n,k)=go(n,k)+wb*w22(n)*gi(n22(n),k)
265 wo(n,k)=wo(n,k)+wb*w22(n)
281 lo(n,k)=wo(n,k).GE.pmp*nb4
283 go(n,k)=go(n,k)/wo(n,k)
284 ELSEIF (mspiral.GT.1)
THEN
287 CALL gdswzd(grid_in,-1,1,fill,xxx,yyy,lon,lat,nv)
295 spiral_loop :
DO mx=2,mspiral**2
298 SELECT CASE(mod(kxs,4))
300 ix=i1-ixs*(kxs/4-kxt)
304 jx=j1-jxs*(kxs/4-kxt)
306 ix=i1+ixs*(1+kxs/4-kxt)
310 jx=j1+jxs*(kxs/4-kxt)
312 nx=grid_in%field_pos(ix, jx)
314 IF(li(nx,k).OR.ibi(k).EQ.0)
THEN
335 select type(grid_out2)
336 type is(ip_equid_cylind_grid)
337 CALL polfixs(no,mo,km,rlat,ibo,lo,go)
410 MI,MO,KM,IBI,LI,UI,VI, &
411 NO,RLAT,RLON,CROT,SROT,IBO,LO,UO,VO,IRET)
412 class(ip_grid),
intent(in) :: grid_in, grid_out
413 INTEGER,
INTENT(IN ) :: IPOPT(20), IBI(KM)
414 INTEGER,
INTENT(IN ) :: KM, MI, MO
415 INTEGER,
INTENT( OUT) :: IRET, NO, IBO(KM)
417 LOGICAL*1,
INTENT(IN ) :: LI(MI,KM)
418 LOGICAL*1,
INTENT( OUT) :: LO(MO,KM)
420 REAL,
INTENT(IN ) :: UI(MI,KM),VI(MI,KM)
421 REAL,
INTENT(INOUT) :: RLAT(MO),RLON(MO)
422 REAL,
INTENT( OUT) :: UO(MO,KM),VO(MO,KM)
423 REAL,
INTENT( OUT) :: CROT(MO),SROT(MO)
425 REAL,
PARAMETER :: FILL=-9999.
428 INTEGER :: I1,I2,J1,J2,IB,JB,LSW,MP
429 INTEGER :: K,LB,N,NB,NB1,NB2,NB3,NB4,NV
430 INTEGER :: N11(MO),N21(MO),N12(MO),N22(MO)
434 REAL :: CM11,SM11,CM12,SM12
435 REAL :: CM21,SM21,CM22,SM22
437 REAL :: C11(MO),C21(MO),C12(MO),C22(MO)
438 REAL :: S11(MO),S21(MO),S12(MO),S22(MO)
439 REAL :: W11(MO),W21(MO),W12(MO),W22(MO)
440 REAL :: UB,VB,WB,UROT,VROT
441 REAL :: U11,V11,U21,V21,U12,V12,U22,V22
442 REAL :: WI1,WJ1,WI2,WJ2
443 REAL :: WO(MO,KM),XI,YI
444 REAL :: XPTS(MO),YPTS(MO)
445 REAL :: XPTB(MO),YPTB(MO),RLOB(MO),RLAB(MO)
448 class(ip_grid),
allocatable :: grid_out2
451 INTEGER,
SAVE :: MIX=-1
452 REAL,
ALLOCATABLE,
SAVE :: CROI(:),SROI(:)
453 REAL,
ALLOCATABLE,
SAVE :: XPTI(:),YPTI(:),RLOI(:),RLAI(:)
455 class(ip_grid),
allocatable,
save :: prev_grid_in
461 select type(grid_out)
462 type is(ip_station_points_grid)
463 allocate(desc_out_subgrid, source = grid_out%descriptor)
464 desc_out_subgrid%grid_num = 255 + grid_out%descriptor%grid_num
466 call init_grid(grid_out2, desc_out_subgrid)
467 CALL gdswzd(grid_out2,-1,mo,fill,xpts,ypts, &
468 rlon,rlat,no,crot,srot)
471 allocate(grid_out2, source = grid_out)
472 CALL gdswzd(grid_out2, 0,mo,fill,xpts,ypts, &
473 rlon,rlat,no,crot,srot)
476 if (.not.
allocated(prev_grid_in))
then
477 allocate(prev_grid_in, source = grid_in)
481 same_grid = grid_in == prev_grid_in
483 if (.not. same_grid)
then
484 deallocate(prev_grid_in)
485 allocate(prev_grid_in, source = grid_in)
489 IF(.NOT.same_grid)
THEN
491 IF(mix.GE.0)
DEALLOCATE(xpti,ypti,rloi,rlai,croi,sroi)
492 ALLOCATE(xpti(mi),ypti(mi),rloi(mi),rlai(mi),croi(mi),sroi(mi))
495 CALL gdswzd(grid_in, 0,mi,fill,xpti,ypti, &
496 rloi,rlai,nv,croi,sroi)
503 IF(iret.EQ.0.AND.nb1.LT.0) iret=32
505 IF(ipopt(2).EQ.-2) lsw=2
506 IF(ipopt(1).EQ.-1.OR.ipopt(2).EQ.-1) lsw=0
507 IF(iret.EQ.0.AND.lsw.EQ.1.AND.nb1.GT.15) iret=32
509 IF(mp.EQ.-1.OR.mp.EQ.0) mp=50
510 IF(mp.LT.0.OR.mp.GT.100) iret=32
520 ELSEIF(lsw.EQ.1)
THEN
523 nb4=nb4+8*ib*ipopt(2+ib)
542 ib=nb-(jb+nb1)*nb2-nb1-1
543 lb=max(abs(ib),abs(jb))
545 IF(ipopt(2).EQ.-2)
THEN
546 wb=(nb1+1-abs(ib))*(nb1+1-abs(jb))
547 ELSEIF(ipopt(2).NE.-1)
THEN
553 xptb(n)=xpts(n)+ib*rb2
554 yptb(n)=ypts(n)+jb*rb2
557 CALL gdswzd(grid_out2, 1,no,fill,xptb,yptb, &
559 CALL gdswzd(grid_in,-1,no,fill,xptb,yptb, &
561 IF(iret.EQ.0.AND.nv.EQ.0.AND.lb.EQ.0) iret=2
567 IF(xi.NE.fill.AND.yi.NE.fill)
THEN
576 n11(n) = grid_in%field_pos(i1,j1)
577 n21(n) = grid_in%field_pos(i2, j1)
578 n12(n) = grid_in%field_pos(i1, j2)
579 n22(n) = grid_in%field_pos(i2, j2)
580 IF(min(n11(n),n21(n),n12(n),n22(n)).GT.0)
THEN
585 CALL movect(rlai(n11(n)),rloi(n11(n)),rlat(n),rlon(n),cm11,sm11)
586 CALL movect(rlai(n21(n)),rloi(n21(n)),rlat(n),rlon(n),cm21,sm21)
587 CALL movect(rlai(n12(n)),rloi(n12(n)),rlat(n),rlon(n),cm12,sm12)
588 CALL movect(rlai(n22(n)),rloi(n22(n)),rlat(n),rlon(n),cm22,sm22)
589 c11(n)=cm11*croi(n11(n))+sm11*sroi(n11(n))
590 s11(n)=sm11*croi(n11(n))-cm11*sroi(n11(n))
591 c21(n)=cm21*croi(n21(n))+sm21*sroi(n21(n))
592 s21(n)=sm21*croi(n21(n))-cm21*sroi(n21(n))
593 c12(n)=cm12*croi(n12(n))+sm12*sroi(n12(n))
594 s12(n)=sm12*croi(n12(n))-cm12*sroi(n12(n))
595 c22(n)=cm22*croi(n22(n))+sm22*sroi(n22(n))
596 s22(n)=sm22*croi(n22(n))-cm22*sroi(n22(n))
619 u11=c11(n)*ui(n11(n),k)-s11(n)*vi(n11(n),k)
620 v11=s11(n)*ui(n11(n),k)+c11(n)*vi(n11(n),k)
621 u21=c21(n)*ui(n21(n),k)-s21(n)*vi(n21(n),k)
622 v21=s21(n)*ui(n21(n),k)+c21(n)*vi(n21(n),k)
623 u12=c12(n)*ui(n12(n),k)-s12(n)*vi(n12(n),k)
624 v12=s12(n)*ui(n12(n),k)+c12(n)*vi(n12(n),k)
625 u22=c22(n)*ui(n22(n),k)-s22(n)*vi(n22(n),k)
626 v22=s22(n)*ui(n22(n),k)+c22(n)*vi(n22(n),k)
627 ub=w11(n)*u11+w21(n)*u21+w12(n)*u12+w22(n)*u22
628 vb=w11(n)*v11+w21(n)*v21+w12(n)*v12+w22(n)*v22
629 uo(n,k)=uo(n,k)+wb*ub
630 vo(n,k)=vo(n,k)+wb*vb
633 IF(li(n11(n),k))
THEN
634 u11=c11(n)*ui(n11(n),k)-s11(n)*vi(n11(n),k)
635 v11=s11(n)*ui(n11(n),k)+c11(n)*vi(n11(n),k)
636 uo(n,k)=uo(n,k)+wb*w11(n)*u11
637 vo(n,k)=vo(n,k)+wb*w11(n)*v11
638 wo(n,k)=wo(n,k)+wb*w11(n)
640 IF(li(n21(n),k))
THEN
641 u21=c21(n)*ui(n21(n),k)-s21(n)*vi(n21(n),k)
642 v21=s21(n)*ui(n21(n),k)+c21(n)*vi(n21(n),k)
643 uo(n,k)=uo(n,k)+wb*w21(n)*u21
644 vo(n,k)=vo(n,k)+wb*w21(n)*v21
645 wo(n,k)=wo(n,k)+wb*w21(n)
647 IF(li(n12(n),k))
THEN
648 u12=c12(n)*ui(n12(n),k)-s12(n)*vi(n12(n),k)
649 v12=s12(n)*ui(n12(n),k)+c12(n)*vi(n12(n),k)
650 uo(n,k)=uo(n,k)+wb*w12(n)*u12
651 vo(n,k)=vo(n,k)+wb*w12(n)*v12
652 wo(n,k)=wo(n,k)+wb*w12(n)
654 IF(li(n22(n),k))
THEN
655 u22=c22(n)*ui(n22(n),k)-s22(n)*vi(n22(n),k)
656 v22=s22(n)*ui(n22(n),k)+c22(n)*vi(n22(n),k)
657 uo(n,k)=uo(n,k)+wb*w22(n)*u22
658 vo(n,k)=vo(n,k)+wb*w22(n)*v22
659 wo(n,k)=wo(n,k)+wb*w22(n)
675 lo(n,k)=wo(n,k).GE.pmp*nb4
677 uo(n,k)=uo(n,k)/wo(n,k)
678 vo(n,k)=vo(n,k)/wo(n,k)
679 urot=crot(n)*uo(n,k)-srot(n)*vo(n,k)
680 vrot=srot(n)*uo(n,k)+crot(n)*vo(n,k)
692 select type(grid_out2)
693 type is(ip_equid_cylind_grid)
694 CALL polfixv(no,mo,km,rlat,rlon,ibo,lo,uo,vo)
Budget interpolation routines for scalars and vectors.
subroutine interpolate_budget_scalar(IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, GI, NO, RLAT, RLON, IBO, LO, GO, IRET)
Performs budget interpolation from any grid to any grid (or to random station points) for scalar fiel...
subroutine interpolate_budget_vector(IPOPT, grid_in, grid_out, MI, MO, KM, IBI, LI, UI, VI, NO, RLAT, RLON, CROT, SROT, IBO, LO, UO, VO, IRET)
This subprogram performs budget interpolation from any grid to any grid (or to random station points)...
Driver module for gdswzd routines.
Uses derived type grid descriptor objects to abstract away the raw Grib-1 and Grib-2 grid definitions...
Routines for creating an ip_grid given a Grib descriptor.
Abstract descriptor object which represents a grib1 or grib2 descriptor.