63 & LBi, UBi, LBj, UBj, Ascl, A, &
64 & Npos, Xpos, Ypos, Apos)
80 logical,
intent(in) :: Cgrid
82 integer,
intent(in) :: ng, model, ifield, gtype, Npos
83 integer,
intent(in) :: LBi, UBi, LBj, UBj
84 real(dp),
intent(in) :: Ascl
87 real(r8),
intent(in) :: A(LBi:,LBj:)
88 real(r8),
intent(in) :: Xpos(:), Ypos(:)
89 real(r8),
intent(out) :: Apos(Npos)
91 real(r8),
intent(in) :: A(LBi:UBi,LBj:UBj)
92 real(r8),
intent(in) :: Xpos(Npos), Ypos(Npos)
93 real(r8),
intent(out) :: Apos(Npos)
98 integer :: i1, i2, j1, j2, np
100 real(r8),
parameter :: Aspv = 0.0_r8
102 real(r8) :: Xmin, Xmax, Ymin, Ymax
103 real(r8) :: Xgrd, Xoff, Ygrd, Yoff
104 real(r8) :: p1, p2, q1, q2, r1, r2, wsum
105 real(r8) :: w111, w211, w121, w221
107 real(r8),
dimension(Npos) :: bounded
122 IF (((xmin.le.xgrd).and.(xgrd.lt.xmax)).and. &
123 & ((ymin.le.ygrd).and.(ygrd.lt.ymax)))
THEN
128 IF (i2.gt.
lm(ng)+1)
THEN
131 IF (j2.gt.
mm(ng)+1)
THEN
135 p2=real(i2-i1,r8)*(xgrd-real(i1,r8))
136 q2=real(j2-j1,r8)*(ygrd-real(j1,r8))
144 w111=w111*
grid(ng)%rmask(i1,j1)
145 w211=w211*
grid(ng)%rmask(i2,j1)
146 w121=w121*
grid(ng)%rmask(i1,j2)
147 w221=w221*
grid(ng)%rmask(i2,j2)
148 wsum=w111+w211+w121+w221
149 IF (wsum.gt.0.0_r8)
THEN
159 apos(np)=ascl*(w111*a(i1,j1)+ &
163 IF (abs(apos(np)).eq.0.0_r8) apos(np)=0.0_r8
173 ELSE IF (gtype.eq.
u2dvar)
THEN
175 xmin=
uxmin(ng)+0.5_r8
176 xmax=
uxmax(ng)+0.5_r8
191 IF (((xmin.le.xgrd).and.(xgrd.lt.xmax)).and. &
192 & ((ymin.le.ygrd).and.(ygrd.lt.ymax)))
THEN
197 IF (i2.gt.
lm(ng)+1)
THEN
200 IF (j2.gt.
mm(ng)+1)
THEN
204 p2=real(i2-i1,r8)*(xgrd-real(i1,r8))
205 q2=real(j2-j1,r8)*(ygrd-real(j1,r8))
213 w111=w111*
grid(ng)%umask(i1,j1)
214 w211=w211*
grid(ng)%umask(i2,j1)
215 w121=w121*
grid(ng)%umask(i1,j2)
216 w221=w221*
grid(ng)%umask(i2,j2)
217 wsum=w111+w211+w121+w221
218 IF (wsum.gt.0.0_r8)
THEN
228 apos(np)=ascl*(w111*a(i1,j1)+ &
232 IF (abs(apos(np)).eq.0.0_r8) apos(np)=0.0_r8
242 ELSE IF (gtype.eq.
v2dvar)
THEN
246 ymin=
vymin(ng)+0.5_r8
247 ymax=
vymax(ng)+0.5_r8
260 IF (((xmin.le.xgrd).and.(xgrd.lt.xmax)).and. &
261 & ((ymin.le.ygrd).and.(ygrd.lt.ymax)))
THEN
266 IF (i2.gt.
lm(ng)+1)
THEN
269 IF (j2.gt.
mm(ng)+1)
THEN
273 p2=real(i2-i1,r8)*(xgrd-real(i1,r8))
274 q2=real(j2-j1,r8)*(ygrd-real(j1,r8))
282 w111=w111*
grid(ng)%vmask(i1,j1)
283 w211=w211*
grid(ng)%vmask(i2,j1)
284 w121=w121*
grid(ng)%vmask(i1,j2)
285 w221=w221*
grid(ng)%vmask(i2,j2)
286 wsum=w111+w211+w121+w221
287 IF (wsum.gt.0.0_r8)
THEN
297 apos(np)=ascl*(w111*a(i1,j1)+ &
301 IF (abs(apos(np)).eq.0.0_r8) apos(np)=0.0_r8
314 CALL mp_collect (ng, model, npos, 0.0_r8, bounded)
322 IF (bounded(np).lt.1.0_r8)
THEN
333 & LBi, UBi, LBj, UBj, LBk, UBk, Ascl, A, &
334 & Npos, Xpos, Ypos, Zpos, Apos)
350 logical,
intent(in) :: Cgrid
352 integer,
intent(in) :: ng, model, ifield, gtype, Npos
353 integer,
intent(in) :: LBi, UBi, LBj, UBj, LBk, UBk
354 real(dp),
intent(in) :: Ascl
357 real(r8),
intent(in) :: A(LBi:,LBj:,LBk:)
358 real(r8),
intent(in) :: Xpos(:), Ypos(:), Zpos(:)
359 real(r8),
intent(out) :: Apos(:)
361 real(r8),
intent(in) :: A(LBi:UBi,LBj:UBj,LBk:UBk)
362 real(r8),
intent(in) :: Xpos(Npos), Ypos(Npos), Zpos(Npos)
363 real(r8),
intent(out) :: Apos(Npos)
368 integer :: i1, i2, j1, j2, k, k1, k2, np
370 real(r8),
parameter :: Aspv = 0.0_r8
372 real(r8) :: Xmin, Xmax, Ymin, Ymax
373 real(r8) :: Xgrd, Xoff, Ygrd, Yoff, Zgrd, Zbot, Ztop
374 real(r8) :: dz, p1, p2, q1, q2, r1, r2, wsum
375 real(r8) :: w111, w211, w121, w221, w112, w212, w122, w222
377 real(r8),
dimension(Npos) :: bounded
393 IF (((xmin.le.xgrd).and.(xgrd.lt.xmax)).and. &
394 & ((ymin.le.ygrd).and.(ygrd.lt.ymax)))
THEN
399 IF (i2.gt.
lm(ng)+1)
THEN
402 IF (j2.gt.
mm(ng)+1)
THEN
406 p2=real(i2-i1,r8)*(xgrd-real(i1,r8))
407 q2=real(j2-j1,r8)*(ygrd-real(j1,r8))
418 IF (zgrd.ge.0.0_r8)
THEN
424 ztop=
grid(ng)%z_r(i1,j1,
n(ng))
425 zbot=
grid(ng)%z_r(i1,j1,1)
426 IF (zgrd.ge.ztop)
THEN
431 ELSE IF (zbot.ge.zgrd)
THEN
438 ztop=
grid(ng)%z_r(i1,j1,k)
439 zbot=
grid(ng)%z_r(i1,j1,k-1)
440 IF ((ztop.gt.zgrd).and.(zgrd.ge.zbot))
THEN
445 dz=
grid(ng)%z_r(i1,j1,k2)-
grid(ng)%z_r(i1,j1,k1)
446 r2=(zgrd-
grid(ng)%z_r(i1,j1,k1))/dz
459 w111=w111*
grid(ng)%rmask(i1,j1)
460 w211=w211*
grid(ng)%rmask(i2,j1)
461 w121=w121*
grid(ng)%rmask(i1,j2)
462 w221=w221*
grid(ng)%rmask(i2,j2)
463 w112=w112*
grid(ng)%rmask(i1,j1)
464 w212=w212*
grid(ng)%rmask(i2,j1)
465 w122=w122*
grid(ng)%rmask(i1,j2)
466 w222=w222*
grid(ng)%rmask(i2,j2)
467 wsum=w111+w211+w121+w221+w112+w212+w122+w222
468 IF (wsum.gt.0.0_r8)
THEN
482 apos(np)=ascl*(w111*a(i1,j1,k1)+ &
483 & w211*a(i2,j1,k1)+ &
484 & w121*a(i1,j2,k1)+ &
485 & w221*a(i2,j2,k1)+ &
486 & w112*a(i1,j1,k2)+ &
487 & w212*a(i2,j1,k2)+ &
488 & w122*a(i1,j2,k2)+ &
490 IF (abs(apos(np)).eq.0.0_r8) apos(np)=0.0_r8
500 ELSE IF (gtype.eq.
u3dvar)
THEN
502 xmin=
uxmin(ng)+0.5_r8
503 xmax=
uxmax(ng)+0.5_r8
519 IF (((xmin.le.xgrd).and.(xgrd.lt.xmax)).and. &
520 & ((ymin.le.ygrd).and.(ygrd.lt.ymax)))
THEN
525 IF (i2.gt.
lm(ng)+1)
THEN
528 IF (j2.gt.
mm(ng)+1)
THEN
532 p2=real(i2-i1,r8)*(xgrd-real(i1,r8))
533 q2=real(j2-j1,r8)*(ygrd-real(j1,r8))
544 IF (zgrd.ge.0.0_r8)
THEN
550 ztop=0.5_r8*(
grid(ng)%z_r(i1-1,j1,
n(ng))+ &
551 &
grid(ng)%z_r(i1 ,j1,
n(ng)))
552 zbot=0.5_r8*(
grid(ng)%z_r(i1-1,j1,1)+ &
553 &
grid(ng)%z_r(i1 ,j1,1))
554 IF (zgrd.ge.ztop)
THEN
559 ELSE IF (zbot.ge.zgrd)
THEN
566 ztop=0.5_r8*(
grid(ng)%z_r(i1-1,j1,k)+ &
567 &
grid(ng)%z_r(i1 ,j1,k))
568 zbot=0.5_r8*(
grid(ng)%z_r(i1-1,j1,k-1)+ &
569 &
grid(ng)%z_r(i1 ,j1,k-1))
570 IF ((ztop.gt.zgrd).and.(zgrd.ge.zbot))
THEN
575 dz=0.5_r8*((
grid(ng)%z_r(i1-1,j1,k2)+ &
576 &
grid(ng)%z_r(i1 ,j1,k2))- &
577 & (
grid(ng)%z_r(i1-1,j1,k1)+ &
578 &
grid(ng)%z_r(i1 ,j1,k1)))
579 r2=(zgrd-0.5_r8*(
grid(ng)%z_r(i1-1,j1,k1)+ &
580 &
grid(ng)%z_r(i1 ,j1,k1)))/dz
593 w111=w111*
grid(ng)%umask(i1,j1)
594 w211=w211*
grid(ng)%umask(i2,j1)
595 w121=w121*
grid(ng)%umask(i1,j2)
596 w221=w221*
grid(ng)%umask(i2,j2)
597 w112=w112*
grid(ng)%umask(i1,j1)
598 w212=w212*
grid(ng)%umask(i2,j1)
599 w122=w122*
grid(ng)%umask(i1,j2)
600 w222=w222*
grid(ng)%umask(i2,j2)
601 wsum=w111+w211+w121+w221+w112+w212+w122+w222
602 IF (wsum.gt.0.0_r8)
THEN
616 apos(np)=ascl*(w111*a(i1,j1,k1)+ &
617 & w211*a(i2,j1,k1)+ &
618 & w121*a(i1,j2,k1)+ &
619 & w221*a(i2,j2,k1)+ &
620 & w112*a(i1,j1,k2)+ &
621 & w212*a(i2,j1,k2)+ &
622 & w122*a(i1,j2,k2)+ &
624 IF (abs(apos(np)).eq.0.0_r8) apos(np)=0.0_r8
634 ELSE IF (gtype.eq.
v3dvar)
THEN
638 ymin=
vymin(ng)+0.5_r8
639 ymax=
vymax(ng)+0.5_r8
653 IF (((xmin.le.xgrd).and.(xgrd.lt.xmax)).and. &
654 & ((ymin.le.ygrd).and.(ygrd.lt.ymax)))
THEN
659 IF (i2.gt.
lm(ng)+1)
THEN
662 IF (j2.gt.
mm(ng)+1)
THEN
666 p2=real(i2-i1,r8)*(xgrd-real(i1,r8))
667 q2=real(j2-j1,r8)*(ygrd-real(j1,r8))
678 IF (zgrd.ge.0.0_r8)
THEN
684 ztop=0.5_r8*(
grid(ng)%z_r(i1,j1-1,
n(ng))+ &
685 &
grid(ng)%z_r(i1,j1,
n(ng)))
686 zbot=0.5_r8*(
grid(ng)%z_r(i1,j1-1,1)+ &
687 &
grid(ng)%z_r(i1,j1 ,1))
688 IF (zgrd.ge.ztop)
THEN
693 ELSE IF (zbot.ge.zgrd)
THEN
700 ztop=0.5_r8*(
grid(ng)%z_r(i1,j1-1,k)+ &
701 &
grid(ng)%z_r(i1,j1 ,k))
702 zbot=0.5_r8*(
grid(ng)%z_r(i1,j1-1,k-1)+ &
703 &
grid(ng)%z_r(i1,j1 ,k-1))
704 IF ((ztop.gt.zgrd).and.(zgrd.ge.zbot))
THEN
709 dz=0.5_r8*((
grid(ng)%z_r(i1,j1-1,k2)+ &
710 &
grid(ng)%z_r(i1,j1 ,k2))- &
711 & (
grid(ng)%z_r(i1,j1-1,k1)+ &
712 &
grid(ng)%z_r(i1,j1 ,k1)))
713 r2=(zgrd-0.5_r8*(
grid(ng)%z_r(i1,j1-1,k1)+ &
714 &
grid(ng)%z_r(i1,j1 ,k1)))/dz
727 w111=w111*
grid(ng)%vmask(i1,j1)
728 w211=w211*
grid(ng)%vmask(i2,j1)
729 w121=w121*
grid(ng)%vmask(i1,j2)
730 w221=w221*
grid(ng)%vmask(i2,j2)
731 w112=w112*
grid(ng)%vmask(i1,j1)
732 w212=w212*
grid(ng)%vmask(i2,j1)
733 w122=w122*
grid(ng)%vmask(i1,j2)
734 w222=w222*
grid(ng)%vmask(i2,j2)
735 wsum=w111+w211+w121+w221+w112+w212+w122+w222
736 IF (wsum.gt.0.0_r8)
THEN
750 apos(np)=ascl*(w111*a(i1,j1,k1)+ &
751 & w211*a(i2,j1,k1)+ &
752 & w121*a(i1,j2,k1)+ &
753 & w221*a(i2,j2,k1)+ &
754 & w112*a(i1,j1,k2)+ &
755 & w212*a(i2,j1,k2)+ &
756 & w122*a(i1,j2,k2)+ &
758 IF (abs(apos(np)).eq.0.0_r8) apos(np)=0.0_r8
768 ELSE IF (gtype.eq.
w3dvar)
THEN
778 IF (((xmin.le.xgrd).and.(xgrd.lt.xmax)).and. &
779 & ((ymin.le.ygrd).and.(ygrd.lt.ymax)))
THEN
784 IF (i2.gt.
lm(ng)+1)
THEN
787 IF (j2.gt.
mm(ng)+1)
THEN
791 p2=real(i2-i1,r8)*(xgrd-real(i1,r8))
792 q2=real(j2-j1,r8)*(ygrd-real(j1,r8))
803 IF (zgrd.ge.0.0_r8)
THEN
809 ztop=
grid(ng)%z_w(i1,j1,
n(ng))
810 zbot=
grid(ng)%z_w(i1,j1,0)
811 IF (zgrd.ge.ztop)
THEN
816 ELSE IF (zbot.ge.zgrd)
THEN
823 ztop=
grid(ng)%z_w(i1,j1,k)
824 zbot=
grid(ng)%z_w(i1,j1,k-1)
825 IF ((ztop.gt.zgrd).and.(zgrd.ge.zbot))
THEN
830 dz=
grid(ng)%z_w(i1,j1,k2)-
grid(ng)%z_w(i1,j1,k1)
831 r2=(zgrd-
grid(ng)%z_w(i1,j1,k1))/dz
844 w111=w111*
grid(ng)%rmask(i1,j1)
845 w211=w211*
grid(ng)%rmask(i2,j1)
846 w121=w121*
grid(ng)%rmask(i1,j2)
847 w221=w221*
grid(ng)%rmask(i2,j2)
848 w112=w112*
grid(ng)%rmask(i1,j1)
849 w212=w212*
grid(ng)%rmask(i2,j1)
850 w122=w122*
grid(ng)%rmask(i1,j2)
851 w222=w222*
grid(ng)%rmask(i2,j2)
852 wsum=w111+w211+w121+w221+w112+w212+w122+w222
853 IF (wsum.gt.0.0_r8)
THEN
867 apos(np)=ascl*(w111*a(i1,j1,k1)+ &
868 & w211*a(i2,j1,k1)+ &
869 & w121*a(i1,j2,k1)+ &
870 & w221*a(i2,j2,k1)+ &
871 & w112*a(i1,j1,k2)+ &
872 & w212*a(i2,j1,k2)+ &
873 & w122*a(i1,j2,k2)+ &
875 IF (abs(apos(np)).eq.0.0_r8) apos(np)=0.0_r8
888 CALL mp_collect (ng, model, npos, 0.0_r8, bounded)
896 IF (bounded(np).lt.1.0_r8)
THEN