90 INTEGER,
PRIVATE :: ISTAT
113 MAPSTA_SRC,MAPST2_SRC,FLAGLL,GRIDSHIFT,L_MASTER, &
180 INTEGER(SCRIP_I4),
INTENT(IN) :: ID_SRC, ID_DST
181 INTEGER(SCRIP_I4),
INTENT(IN) :: MAPSTA_SRC(:,:)
182 INTEGER(SCRIP_I4),
INTENT(IN) :: MAPST2_SRC(:,:)
183 LOGICAL(SCRIP_LOGICAL),
INTENT(IN) :: FLAGLL
184 REAL (SCRIP_R8),
INTENT(IN) :: GRIDSHIFT
185 LOGICAL(SCRIP_LOGICAL),
INTENT(IN) :: L_MASTER
186 LOGICAL(SCRIP_LOGICAL),
INTENT(IN) :: L_READ
187 LOGICAL(SCRIP_LOGICAL),
INTENT(IN) :: L_TEST
192 INTEGER(SCRIP_I4) :: IREC,I,J,NI,NJ,IDUM,NK,K, &
193 ILINK,IW,ICORNER,NGOODPNTS, &
195 INTEGER(SCRIP_I4) :: ISRC,JSRC,KSRC,IPNT,KDST, &
197 REAL (SCRIP_R8) :: LAT_CONVERSION,OFFSET
198 REAL (SCRIP_R8) :: CONV_DX,CONV_DY,WEIGHT
199 REAL (SCRIP_R8) :: WTSUM
201 CHARACTER (LEN=10) :: CDATE_TIME(3)
202 INTEGER :: DATE_TIME(8)
203 INTEGER :: ELAPSED_TIME, BEG_TIME, &
210 if(l_master)
write(*,*)
'flagll = ',flagll
211 if(l_master)
write(*,*)
'gridshift = ',gridshift
263 conv_dy=1.0e+6_scrip_r8
264 conv_dx=cos(lat_conversion)*conv_dy
273 write(*,*)
'l_master = ',l_master
275 write(*,*)
'conv_dx=', conv_dx
276 write(*,*)
'conv_dy=', conv_dy
277 write(*,*)
'offset = ',offset
280 write(*,*)
'l_read = ',l_read
296 & conv_dx, conv_dy, offset, gridshift)
301 & conv_dx, conv_dy, offset,
zero)
310 call date_and_time (cdate_time(1), cdate_time(2), cdate_time(3), date_time)
311 beg_time = ((date_time(5)*60 + date_time(6))*60 +date_time(7))*1000 + date_time(8)
313 CALL scrip(id_src, id_dst, l_master, l_read, l_test)
315 call date_and_time (cdate_time(1), cdate_time(2), cdate_time(3), date_time)
316 end_time = ((date_time(5)*60 + date_time(6))*60 +date_time(7))*1000 + date_time(8)
317 elapsed_time = end_time - beg_time
318 write(0,*)
"SCRIP: ", elapsed_time,
" MSEC"
322 if(l_master)
write(*,*)
'new minval(grid1_center_lon) = ',minval(
grid1_center_lon)
323 if(l_master)
write(*,*)
'new maxval(grid1_center_lon) = ',maxval(
grid1_center_lon)
368 check_alloc_status( istat )
393 jsrc=int((ksrc-1)/ni_src)+1
394 isrc=ksrc-(jsrc-1)*ni_src
396 IF (mapsta_src(jsrc,isrc).EQ.0)
THEN
399 IF (mapst2_src(jsrc,isrc).EQ.0)
THEN
403 ELSE IF (abs(mapsta_src(jsrc,isrc)).EQ.1)
THEN
407 ELSE IF (abs(mapsta_src(jsrc,isrc)).EQ.2)
THEN
412 ngoodpnts=ngoodpnts+1
421 IF((nbadpnts.LT.5).AND.l_master)
THEN
422 WRITE(*,
'(A)')
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'
423 WRITE(*,
'(A)')
'WARNING: SCRIP weight problem '
424 WRITE(*,
'(4x,A,I7,A,I7)')
'ilink = ',ilink,
' out of ',&
426 WRITE(*,
'(4x,A,I7)')
'grid1_add_map1(ilink) = ', &
428 WRITE(*,
'(4x,A,I7)')
'grid2_add_map1(ilink) = ', &
430 WRITE(*,
'(4x,A,E12.4)')
'wts_map1(1,ilink) = ', &
432 WRITE(*,
'(4x,A,F10.5)') &
433 'grid1_frac(grid1_add_map1(ilink)) = ', &
435 WRITE(*,
'(4x,A,F10.5)') &
436 'grid2_frac(grid2_add_map1(ilink)) = ', &
438 WRITE(*,
'(4x,A,F10.5)')
'grid1_center_lat = ', &
440 WRITE(*,
'(4x,A,F10.5)')
'grid1_center_lon = ', &
442 WRITE(*,
'(4x,A,F10.5)')
'grid2_center_lat = ', &
444 WRITE(*,
'(4x,A,F10.5)')
'grid2_center_lon = ', &
446 WRITE(*,
'(A)')
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'
451 IF((nbadpnts.GT.0).AND.l_master)
THEN
452 WRITE(*,
'(4x,A,I5,A)')
'We had problems in ',nbadpnts, &
454 WRITE(*,
'(4x,I8,A)')ngoodpnts,
' points appear to be OK.'
456 IF( (nbadpnts.GT.(ngoodpnts/30)) .AND.l_master )
THEN
457 WRITE(*,
'(4x,A)')
'Error: excessive SCRIP failure. Stopping.'
458 stop
'wmscrpmd, case 1'
464 check_alloc_status( istat )
466 check_alloc_status( istat )
474 jsrc=int((ksrc-1)/ni_src)+1
475 isrc=ksrc-(jsrc-1)*ni_src
483 IF (abs(mapsta_src(jsrc,isrc)).EQ.1)
THEN
501 wtsum=wtsum+
wgtdata(kdst)%W(ipnt)
548 & GRID_CENTER_LON, GRID_CENTER_LAT, &
549 & GRID_CORNER_LON, GRID_CORNER_LAT, GRID_MASK, &
550 & GRID_DIMS, GRID_SIZE, GRID_CORNERS, GRID_RANK)
612 INTEGER,
INTENT(IN) :: ID_GRD
613 real*8,
INTENT(OUT),
ALLOCATABLE :: grid_center_lon(:)
614 real*8,
INTENT(OUT),
ALLOCATABLE :: grid_center_lat(:)
615 LOGICAL,
INTENT(OUT),
ALLOCATABLE :: GRID_MASK(:)
616 real*8,
INTENT(OUT),
ALLOCATABLE :: grid_corner_lon(:,:)
617 real*8,
INTENT(OUT),
ALLOCATABLE :: grid_corner_lat(:,:)
618 INTEGER,
INTENT(OUT),
ALLOCATABLE :: GRID_DIMS(:)
619 INTEGER,
INTENT(OUT) :: GRID_SIZE, GRID_CORNERS, GRID_RANK
621 INTEGER DIRAPPROACH, DUALAPPROACH, THEAPPROACH
622 INTEGER MNE, MNP, IE, IP, I
623 INTEGER NBPLUS, NBMINUS
625 real*8 :: elon1, elon2, elon3, elon, elonc
626 real*8 :: elat1, elat2, elat3, elat, elatc
627 REAL *8 :: DELTALON12, DELTALON13, DELTALAT12, DELTALAT13
630 INTEGER,
POINTER :: IOBP(:), TRIGINCD(:)
631 INTEGER,
POINTER :: NEIGHBOR_PREV(:), NEIGHBOR_NEXT(:)
632 INTEGER,
POINTER :: NBASSIGNEDCORNER(:), LISTNBCORNER(:)
633 INTEGER,
POINTER :: STATUS(:), NEXTVERT(:), PREVVERT(:), FINALVERT(:)
634 INTEGER :: MAXCORNER, NBCORNER
635 INTEGER :: IDX, IPNEXT, IPPREV, NB, INEXT, IPREV
636 real*8,
POINTER :: lon_cent_trig(:), lat_cent_trig(:)
637 real*8 :: elonip, elonnext, elonprev, elonn, elonp
638 real*8 :: elatip, elatnext, elatprev, elatn, elatp
639 INTEGER :: ISFINISHED, ZPREV
644 theapproach=dualapproach
645 mne=
grids(id_grd)%NTRI
647 IF (theapproach .EQ. dirapproach)
THEN
648 ALLOCATE(grid_center_lon(mne), stat=istat)
649 check_alloc_status( istat )
650 ALLOCATE(grid_center_lat(mne), stat=istat)
651 check_alloc_status( istat )
652 ALLOCATE(grid_corner_lon(3,mne), stat=istat)
653 check_alloc_status( istat )
654 ALLOCATE(grid_corner_lat(3,mne), stat=istat)
655 check_alloc_status( istat )
656 ALLOCATE(grid_mask(mne), stat=istat)
657 check_alloc_status( istat )
659 i1=
grids(id_grd)%TRIGP(1,ie)
660 i2=
grids(id_grd)%TRIGP(2,ie)
661 i3=
grids(id_grd)%TRIGP(3,ie)
662 elon1=
grids(id_grd)%XGRD(1,i1)
663 elon2=
grids(id_grd)%XGRD(1,i2)
664 elon3=
grids(id_grd)%XGRD(1,i3)
665 elat1=
grids(id_grd)%YGRD(1,i1)
666 elat2=
grids(id_grd)%YGRD(1,i2)
667 elat3=
grids(id_grd)%YGRD(1,i3)
668 elon=(elon1 + elon2 + elon3)/3
669 elat=(elat1 + elat2 + elat3)/3
670 grid_center_lon(ie)=elon
671 grid_center_lat(ie)=elat
672 grid_corner_lon(1,ie)=elon1
673 grid_corner_lon(2,ie)=elon2
674 grid_corner_lon(3,ie)=elon3
675 grid_corner_lat(1,ie)=elat1
676 grid_corner_lat(2,ie)=elat2
677 grid_corner_lat(3,ie)=elat3
682 IF (theapproach .EQ. dualapproach)
THEN
683 ALLOCATE(trigincd(mnp), stat=istat)
684 check_alloc_status( istat )
685 ALLOCATE(iobp(mnp), stat=istat)
686 check_alloc_status( istat )
687 ALLOCATE(neighbor_next(mnp), stat=istat)
688 check_alloc_status( istat )
689 ALLOCATE(neighbor_prev(mnp), stat=istat)
690 check_alloc_status( istat )
691 ALLOCATE(nbassignedcorner(mnp), stat=istat)
692 check_alloc_status( istat )
693 ALLOCATE(listnbcorner(mnp), stat=istat)
694 check_alloc_status( istat )
696 ALLOCATE(status(mnp), stat=istat)
697 check_alloc_status( istat )
698 ALLOCATE(nextvert(mnp), stat=istat)
699 check_alloc_status( istat )
700 ALLOCATE(prevvert(mnp), stat=istat)
701 check_alloc_status( istat )
702 ALLOCATE(finalvert(mnp), stat=istat)
703 check_alloc_status( istat )
704 ALLOCATE(lon_cent_trig(mne), stat=istat)
705 check_alloc_status( istat )
706 ALLOCATE(lat_cent_trig(mne), stat=istat)
707 check_alloc_status( istat )
710 grids(id_grd)%TRIGP, trigincd)
712 neighbor_prev, neighbor_next)
717 IF (neighbor_next(ip) .EQ. 0)
THEN
718 nbcorner=trigincd(ip)
720 nbcorner=trigincd(ip) + 3
722 listnbcorner(ip)=nbcorner
723 IF (nbcorner .GT. maxcorner)
THEN
727 grid_corners=maxcorner
729 ALLOCATE(grid_center_lon(mnp), stat=istat)
730 check_alloc_status( istat )
731 ALLOCATE(grid_center_lat(mnp), stat=istat)
732 check_alloc_status( istat )
733 ALLOCATE(grid_corner_lon(maxcorner,mnp), stat=istat)
734 check_alloc_status( istat )
735 ALLOCATE(grid_corner_lat(maxcorner,mnp), stat=istat)
736 check_alloc_status( istat )
737 ALLOCATE(grid_mask(mnp), stat=istat)
738 check_alloc_status( istat )
741 nbassignedcorner(:)=0
744 IF (neighbor_next(ip) .GT. 0)
THEN
745 ipnext=neighbor_next(ip)
746 ipprev=neighbor_prev(ip)
747 elonip=dble(
grids(id_grd)%XGRD(1,ip))
748 elatip=dble(
grids(id_grd)%YGRD(1,ip))
749 elonnext=dble(
grids(id_grd)%XGRD(1,ipnext))
750 elatnext=dble(
grids(id_grd)%YGRD(1,ipnext))
751 elonprev=dble(
grids(id_grd)%XGRD(1,ipprev))
752 elatprev=dble(
grids(id_grd)%YGRD(1,ipprev))
755 IF ( abs(elonip - elonnext) .GT. 180.0 )
THEN
756 elonnext = elonnext -sign(360.0d0,(elonip - elonnext))
758 IF ( abs(elonip - elonprev) .GT. 180.0 )
THEN
759 elonprev = elonprev -sign(360.0d0,(elonip - elonprev))
762 elonn=(elonip+elonnext)/2.0
763 elatn=(elatip+elatnext)/2.0
764 elonp=(elonip+elonprev)/2.0
765 elatp=(elatip+elatprev)/2.0
768 grid_corner_lon(1,ip)=elonn
769 grid_corner_lat(1,ip)=elatn
770 grid_corner_lon(2,ip)=elonip
771 grid_corner_lat(2,ip)=elatip
772 grid_corner_lon(3,ip)=elonp
773 grid_corner_lat(3,ip)=elatp
774 nbassignedcorner(ip)=3
780 grid_center_lon(ip)=dble(
grids(id_grd)%XGRD(1,ip))
781 grid_center_lat(ip)=dble(
grids(id_grd)%YGRD(1,ip))
789 i1=
grids(id_grd)%TRIGP(1,ie)
790 i2=
grids(id_grd)%TRIGP(2,ie)
791 i3=
grids(id_grd)%TRIGP(3,ie)
792 pt(1,1)=dble(
grids(id_grd)%XGRD(1,i1))
793 pt(2,1)=dble(
grids(id_grd)%XGRD(1,i2))
794 pt(3,1)=dble(
grids(id_grd)%XGRD(1,i3))
795 pt(1,2)=dble(
grids(id_grd)%YGRD(1,i1))
796 pt(2,2)=dble(
grids(id_grd)%YGRD(1,i2))
797 pt(3,2)=dble(
grids(id_grd)%YGRD(1,i3))
808 deltalon12=elon2 - elon1
809 deltalon13=elon3 - elon1
810 deltalat12=elat2 - elat1
811 deltalat13=elat3 - elat1
812 thedet=deltalon12*deltalat13 - deltalon13*deltalat12
813 IF (thedet.GT.0)
THEN
816 IF (thedet.LT.0)
THEN
819 elon=(elon1 + elon2 + elon3)/3.0
820 elat=(elat1 + elat2 + elat3)/3.0
823 lon_cent_trig(ie)=elon
824 lat_cent_trig(ie)=elat
828 IF (dodebug.EQ.1)
THEN
829 print *,
'nbplus=', nbplus,
' nbminus=', nbminus
838 ip=
grids(id_grd)%TRIGP(i,ie)
839 ipnext=
grids(id_grd)%TRIGP(inext,ie)
840 ipprev=
grids(id_grd)%TRIGP(iprev,ie)
841 IF (status(ip).EQ.0)
THEN
842 IF (neighbor_next(ip).EQ.0)
THEN
848 IF (neighbor_prev(ip).EQ.ipprev)
THEN
852 finalvert(ip)=neighbor_next(ip)
862 elon=lon_cent_trig(ie)
863 elat=lat_cent_trig(ie)
866 ip=
grids(id_grd)%TRIGP(i,ie)
867 ipnext=
grids(id_grd)%TRIGP(inext,ie)
868 ipprev=
grids(id_grd)%TRIGP(iprev,ie)
869 IF (status(ip).EQ.0)
THEN
872 IF (zprev.EQ.ipprev)
THEN
873 idx=nbassignedcorner(ip)
875 grid_corner_lon(idx,ip)=elon
876 grid_corner_lat(idx,ip)=elat
877 nbassignedcorner(ip)=idx
879 IF (ipnext.EQ.finalvert(ip))
THEN
886 IF (isfinished.EQ.1)
THEN
891 IF (nbassignedcorner(ip).NE.listnbcorner(ip))
THEN
892 WRITE(*,*)
'Incoherent number at IP=', ip
893 WRITE(*,*)
' NbAssignedCorner(IP)=', nbassignedcorner(ip)
894 WRITE(*,*)
' ListNbCorner(IP)=', listnbcorner(ip)
895 WRITE(*,*)
' N_N=', neighbor_next(ip),
'N_P=', neighbor_prev(ip)
896 WRITE(*,*)
' TrigIncd=', trigincd(ip)
897 stop
'wmscrpmd, case 2'
904 nb=nbassignedcorner(ip)
905 IF (nb .LT. maxcorner)
THEN
906 elon=grid_corner_lon(nb,ip)
907 elat=grid_corner_lat(nb,ip)
908 DO idx=nb+1,maxcorner
909 grid_corner_lon(idx,ip)=elon
910 grid_corner_lat(idx,ip)=elat
914 DEALLOCATE(nbassignedcorner, stat=istat)
915 check_dealloc_status( istat )
916 DEALLOCATE(listnbcorner, stat=istat)
917 check_dealloc_status( istat )
918 DEALLOCATE(trigincd, stat=istat)
919 check_dealloc_status( istat )
920 DEALLOCATE(iobp, stat=istat)
921 check_dealloc_status( istat )
922 DEALLOCATE(neighbor_prev, stat=istat)
923 check_dealloc_status( istat )
924 DEALLOCATE(neighbor_next, stat=istat)
925 check_dealloc_status( istat )
926 DEALLOCATE(status, stat=istat)
927 check_dealloc_status( istat )
928 DEALLOCATE(nextvert, stat=istat)
929 check_dealloc_status( istat )
930 DEALLOCATE(prevvert, stat=istat)
931 check_dealloc_status( istat )
932 DEALLOCATE(finalvert, stat=istat)
933 check_dealloc_status( istat )
934 DEALLOCATE(lon_cent_trig, stat=istat)
935 check_dealloc_status( istat )
936 DEALLOCATE(lat_cent_trig, stat=istat)
937 check_dealloc_status( istat )
939 ALLOCATE(grid_dims(2), stat=istat)
940 check_alloc_status( istat )
971 & GRID_CENTER_LON, GRID_CENTER_LAT, &
972 & GRID_CORNER_LON, GRID_CORNER_LAT, GRID_MASK, &
973 & GRID_DIMS, GRID_SIZE, GRID_CORNERS, GRID_RANK)
1026 INTEGER,
INTENT(IN) :: ID_GRD
1027 real*8,
INTENT(OUT),
ALLOCATABLE :: grid_center_lon(:)
1028 real*8,
INTENT(OUT),
ALLOCATABLE :: grid_center_lat(:)
1029 LOGICAL,
INTENT(OUT),
ALLOCATABLE :: GRID_MASK(:)
1030 real*8,
INTENT(OUT),
ALLOCATABLE :: grid_corner_lon(:,:)
1031 real*8,
INTENT(OUT),
ALLOCATABLE :: grid_corner_lat(:,:)
1032 INTEGER,
INTENT(OUT),
ALLOCATABLE :: GRID_DIMS(:)
1033 INTEGER,
INTENT(OUT) :: GRID_SIZE, GRID_CORNERS, GRID_RANK
1035 real*8,
ALLOCATABLE :: xin_grd(:,:), yin_grd(:,:)
1036 real*8,
ALLOCATABLE :: dxdp_grd(:,:), dxdq_grd(:,:)
1037 real*8,
ALLOCATABLE :: dydp_grd(:,:), dydq_grd(:,:)
1038 INTEGER :: N1, N2, NI, NJ
1039 INTEGER :: IREC, J, I
1041 n1=
SIZE(
grids(id_grd)%XGRD,1)
1042 n2=
SIZE(
grids(id_grd)%XGRD,2)
1043 ALLOCATE(xin_grd(n1,n2), stat=istat)
1044 check_alloc_status( istat )
1045 ALLOCATE(yin_grd(n1,n2), stat=istat)
1046 check_alloc_status( istat )
1047 ALLOCATE(dxdp_grd(n1,n2), stat=istat)
1048 check_alloc_status( istat )
1049 ALLOCATE(dxdq_grd(n1,n2), stat=istat)
1050 check_alloc_status( istat )
1051 ALLOCATE(dydp_grd(n1,n2), stat=istat)
1052 check_alloc_status( istat )
1053 ALLOCATE(dydq_grd(n1,n2), stat=istat)
1054 check_alloc_status( istat )
1056 xin_grd=dble(
grids(id_grd)%XGRD)
1057 yin_grd=dble(
grids(id_grd)%YGRD)
1058 dxdp_grd=dble(
grids(id_grd)%DXDP)
1059 dxdq_grd=dble(
grids(id_grd)%DXDQ)
1060 dydp_grd=dble(
grids(id_grd)%DYDP)
1061 dydq_grd=dble(
grids(id_grd)%DYDQ)
1063 ALLOCATE(grid_dims(grid_rank), stat=istat)
1064 check_alloc_status( istat )
1078 ALLOCATE(grid_center_lon(ni*nj), stat=istat)
1079 check_alloc_status( istat )
1080 ALLOCATE(grid_center_lat(ni*nj), stat=istat)
1081 check_alloc_status( istat )
1082 ALLOCATE(grid_corner_lon(4,ni*nj), stat=istat)
1083 check_alloc_status( istat )
1084 ALLOCATE(grid_corner_lat(4,ni*nj), stat=istat)
1085 check_alloc_status( istat )
1086 ALLOCATE(grid_mask(ni*nj), stat=istat)
1087 check_alloc_status( istat )
1099 grid_center_lon(irec)=xin_grd(j,i)
1100 grid_center_lat(irec)=yin_grd(j,i)
1101 grid_mask(irec)=.true.
1114 grid_corner_lon(1,irec)=grid_center_lon(irec)- &
1115 &
half*dxdp_grd(j,i)-
half*dxdq_grd(j,i)
1116 grid_corner_lat(1,irec)=grid_center_lat(irec)- &
1117 &
half*dydp_grd(j,i)-
half*dydq_grd(j,i)
1120 grid_corner_lon(2,irec)=grid_center_lon(irec)+ &
1121 &
half*dxdp_grd(j,i)-
half*dxdq_grd(j,i)
1122 grid_corner_lat(2,irec)=grid_center_lat(irec)+ &
1123 &
half*dydp_grd(j,i)-
half*dydq_grd(j,i)
1126 grid_corner_lon(3,irec)=grid_center_lon(irec)+ &
1127 &
half*dxdp_grd(j,i)+
half*dxdq_grd(j,i)
1128 grid_corner_lat(3,irec)=grid_center_lat(irec)+ &
1129 &
half*dydp_grd(j,i)+
half*dydq_grd(j,i)
1132 grid_corner_lon(4,irec)=grid_center_lon(irec)- &
1133 &
half*dxdp_grd(j,i)+
half*dxdq_grd(j,i)
1134 grid_corner_lat(4,irec)=grid_center_lat(irec)- &
1135 &
half*dydp_grd(j,i)+
half*dydq_grd(j,i)
1162 & GRID_CENTER_LON, GRID_CENTER_LAT, &
1163 & GRID_CORNER_LON, GRID_CORNER_LAT, GRID_MASK, &
1164 & GRID_DIMS, GRID_SIZE, GRID_CORNERS, GRID_RANK)
1207 INTEGER,
INTENT(IN) :: ID_GRD
1208 real*8,
INTENT(OUT),
ALLOCATABLE :: grid_center_lon(:)
1209 real*8,
INTENT(OUT),
ALLOCATABLE :: grid_center_lat(:)
1210 LOGICAL,
INTENT(OUT),
ALLOCATABLE :: GRID_MASK(:)
1211 real*8,
INTENT(OUT),
ALLOCATABLE :: grid_corner_lon(:,:)
1212 real*8,
INTENT(OUT),
ALLOCATABLE :: grid_corner_lat(:,:)
1213 INTEGER,
INTENT(OUT),
ALLOCATABLE :: GRID_DIMS(:)
1214 INTEGER,
INTENT(OUT) :: GRID_SIZE, GRID_CORNERS, GRID_RANK
1215 real*8 :: dlon1, dlat1, dlon2, dlat2, thedet
1217 INTEGER :: IC, JC, IP, CHECKSIGNS, NBPLUS, NBMINUS, NBZERO
1218 INTEGER :: PRINTDATA, PRINTMINMAX
1219 real*8 :: minlon, minlat, maxlon, maxlat
1220 real*8 :: minloncorner, maxloncorner, minlatcorner, maxlatcorner
1224 & grid_center_lon, grid_center_lat, &
1225 & grid_corner_lon, grid_corner_lat, grid_mask, &
1226 & grid_dims, grid_size, grid_corners, grid_rank)
1229 & grid_center_lon, grid_center_lat, &
1230 & grid_corner_lon, grid_corner_lat, grid_mask, &
1231 & grid_dims, grid_size, grid_corners, grid_rank)
1234 IF (checksigns.EQ.1)
THEN
1239 DO ic=1,grid_corners
1240 IF (ic.EQ.grid_corners)
THEN
1246 pt(1,1) = grid_center_lon(ip)
1247 pt(1,2) = grid_center_lat(ip)
1248 pt(2,1) = grid_corner_lon(ic,ip)
1249 pt(2,2) = grid_corner_lat(ic,ip)
1250 pt(3,1) = grid_corner_lon(jc,ip)
1251 pt(3,2) = grid_corner_lat(jc,ip)
1255 dlon1=pt(2,1)-pt(1,1)
1256 dlon2=pt(3,1)-pt(1,1)
1257 dlat1=pt(2,2)-pt(1,2)
1258 dlat2=pt(3,2)-pt(1,2)
1260 thedet=dlon1*dlat2 - dlon2*dlat1
1261 IF (thedet.GT.1d-8)
THEN
1263 ELSE IF (thedet.LT.-1d-8)
THEN
1271 WRITE(*,*)
'SI nbPlus=', nbplus,
' nbMinus=', nbminus,
' nbZero=', nbzero
1309 & GRID_CENTER_LON, GRID_CENTER_LAT, &
1310 & GRID_CORNER_LON, GRID_CORNER_LAT, GRID_MASK, &
1311 & GRID_DIMS, GRID_SIZE, GRID_CORNERS, GRID_RANK, &
1312 & CONV_DX, CONV_DY, OFFSET, GRIDSHIFT)
1359 real*8,
INTENT(INOUT) :: grid_center_lon(:)
1360 real*8,
INTENT(INOUT) :: grid_center_lat(:)
1361 LOGICAL,
INTENT(IN) :: GRID_MASK(:)
1362 real*8,
INTENT(INOUT) :: grid_corner_lon(:,:)
1363 real*8,
INTENT(INOUT) :: grid_corner_lat(:,:)
1364 INTEGER,
INTENT(IN) :: GRID_DIMS(:)
1365 INTEGER,
INTENT(IN) :: GRID_SIZE, GRID_CORNERS, GRID_RANK
1366 real*8 :: conv_dx, conv_dy, offset, gridshift
1370 real*8 :: minlon, minlat, maxlon, maxlat, hlon, hlat
1371 real*8 :: minloncorner, maxloncorner, minlatcorner, maxlatcorner
1374 grid_center_lon(i)=(grid_center_lon(i)+offset)/conv_dx + &
1376 grid_center_lat(i)=grid_center_lat(i)/conv_dy + &
1378 IF(grid_center_lon(i)>360.0)
THEN
1379 grid_center_lon(i)=grid_center_lon(i)-360.0
1381 IF(grid_center_lon(i)<000.0)
THEN
1382 grid_center_lon(i)=grid_center_lon(i)+360.0
1385 grid_corner_lon(j, i)=(grid_corner_lon(j, i)+offset)/conv_dx+ &
1387 grid_corner_lat(j, i)=grid_corner_lat(j, i)/conv_dy + &
1389 IF(grid_corner_lon(j,i)>360.0)
THEN
1390 grid_corner_lon(j,i)=grid_corner_lon(j,i)-360.0
1392 IF(grid_corner_lon(j,i)<000.0)
THEN
1393 grid_corner_lon(j,i)=grid_corner_lon(j,i)+360.0
1417 INTEGER,
INTENT(IN) :: I
1418 INTEGER,
INTENT(OUT) :: INEXT, IPREV
1468 INTEGER,
INTENT(IN) :: MNP, MNE
1469 INTEGER,
INTENT(IN) :: TRIGP(:,:)
1470 INTEGER,
INTENT(OUT) :: TRIGINCD(:)
1471 INTEGER :: IP, IE, I
1476 trigincd(ip)=trigincd(ip) + 1
1500 SUBROUTINE get_boundary(MNP, MNE, TRIGP, IOBP, NEIGHBOR_PREV, &
1534 INTEGER,
INTENT(IN) :: MNP, MNE, TRIGP(3,MNE)
1535 INTEGER,
INTENT(INOUT) :: IOBP(MNP)
1536 INTEGER,
INTENT(INOUT) :: NEIGHBOR_PREV(MNP)
1537 INTEGER,
INTENT(INOUT) :: NEIGHBOR_NEXT(MNP)
1539 INTEGER,
POINTER :: STATUS(:)
1540 INTEGER,
POINTER :: COLLECTED(:)
1541 INTEGER,
POINTER :: NEXTVERT(:)
1542 INTEGER,
POINTER :: PREVVERT(:)
1544 INTEGER :: IE, I, IP, IP2, IP3
1545 INTEGER :: ISFINISHED, INEXT, IPREV
1546 INTEGER :: IPNEXT, IPPREV, ZNEXT, ZPREV
1548 ALLOCATE(status(mnp), stat=istat)
1549 check_alloc_status( istat )
1550 ALLOCATE(collected(mnp), stat=istat)
1551 check_alloc_status( istat )
1552 ALLOCATE(prevvert(mnp), stat=istat)
1553 check_alloc_status( istat )
1554 ALLOCATE(nextvert(mnp), stat=istat)
1555 check_alloc_status( istat )
1568 ipnext=trigp(inext,ie)
1569 ipprev=trigp(iprev,ie)
1570 IF (status(ip).EQ.0)
THEN
1584 ipnext=trigp(inext,ie)
1585 ipprev=trigp(iprev,ie)
1586 IF (status(ip).EQ.0)
THEN
1588 IF (znext.EQ.ipprev)
THEN
1591 IF (nextvert(ip).EQ.prevvert(ip))
THEN
1601 IF ((collected(ip).EQ.0).AND.(status(ip).EQ.0))
THEN
1603 neighbor_next(ip)=nextvert(ip)
1605 IF (status(ip).EQ.0)
THEN
1609 IF (isfinished.EQ.1)
THEN
1622 ipnext=trigp(inext,ie)
1623 ipprev=trigp(iprev,ie)
1624 IF (status(ip).EQ.0)
THEN
1638 ipnext=trigp(inext,ie)
1639 ipprev=trigp(iprev,ie)
1640 IF (status(ip).EQ.0)
THEN
1642 IF (zprev.EQ.ipnext)
THEN
1645 IF (prevvert(ip).EQ.nextvert(ip))
THEN
1655 IF ((collected(ip).EQ.0).AND.(status(ip).EQ.0))
THEN
1657 neighbor_prev(ip)=prevvert(ip)
1659 IF (status(ip).EQ.0)
THEN
1663 IF (isfinished.EQ.1)
THEN
1669 ip2=neighbor_next(ip)
1671 ip3=neighbor_prev(ip2)
1672 IF (abs(ip3 - ip).GT.0)
THEN
1673 WRITE(*,*)
'IP=', ip,
' IP2=', ip2,
' IP3=', ip3
1674 WRITE(*,*)
'We have a dramatic inconsistency'
1675 stop
'wmscrpmd, case 3'
1681 IF (status(ip).EQ.-1 .AND. iobp(ip) .EQ. 0)
THEN
1686 DEALLOCATE(status, stat=istat)
1687 check_dealloc_status( istat )
1688 DEALLOCATE(collected, stat=istat)
1689 check_dealloc_status( istat )
1690 DEALLOCATE(nextvert, stat=istat)
1691 check_dealloc_status( istat )
1692 DEALLOCATE(prevvert, stat=istat)
1693 check_dealloc_status( istat )
1739 real*8,
INTENT(INOUT) :: pt(3,2)
1745 INTEGER :: R1GT180, R2GT180, R3GT180
1772 r1gt180 = merge(1, 0, abs(pt(3,1)-pt(2,1)).GT.180)
1773 r2gt180 = merge(1, 0, abs(pt(1,1)-pt(3,1)).GT.180)
1774 r3gt180 = merge(1, 0, abs(pt(2,1)-pt(1,1)).GT.180)
1780 IF ( r1gt180 + r2gt180 == 2 )
THEN
1781 pt(3,1)=pt(3,1)-sign(360.0d0,(pt(3,1)-pt(2,1)))
1782 ELSE IF ( r2gt180 + r3gt180 == 2 )
THEN
1783 pt(1,1)=pt(1,1)-sign(360.0d0,(pt(1,1)-pt(2,1)))
1784 ELSE IF ( r1gt180 + r3gt180 == 2 )
THEN
1785 pt(2,1)=pt(2,1)-sign(360.0d0,(pt(2,1)-pt(3,1)))