135 INTEGER,
PRIVATE :: ISTAT
151 SUBROUTINE wmglow ( FLRBPI )
256 LOGICAL,
INTENT(OUT),
OPTIONAL :: FLRBPI(NRGRD)
261 INTEGER :: I, IBI, IX, IY, JS, J, &
264 INTEGER :: NXYG, IERR_MPI
267 INTEGER,
SAVE :: IENT = 0
269 INTEGER,
ALLOCATABLE :: TSTORE(:,:)
275 LOGICAL :: GRIDD(NRGRD,NRGRD)
277 LOGICAL :: RFILE(NRGRD), FLAGOK
280 INTEGER :: IVER(4),JVER(4)
286 REAL :: DX_MIN_GRIDI,DY_MIN_GRIDI,DX_MAX_GRIDI, &
288 REAL :: DX_MIN_GRIDJ,DY_MIN_GRIDJ,DX_MAX_GRIDJ, &
290 INTEGER :: ITRI, IM1, IM2, IT, JT, ISFIRST, ITOUT, NBRELEVANT
291 REAL :: DIST_MIN, DIST_MAX, EDIST
295 CHARACTER(LEN=1),
ALLOCATABLE :: TMAP(:,:)
299 CALL strace (ient,
'WMGLOW')
311 IF ( .NOT.
grids(i)%GINIT )
THEN
320 flbarr = flbarr .OR.
mdatas(i)%FBCAST
321 IF (
mdatas(i)%FBCAST .AND. &
322 mdatas(i)%MPI_COMM_BCT.NE.mpi_comm_null )
THEN
324 CALL mpi_bcast (
grids(i)%MAPSTA(1,1), nxyg, &
326 mdatas(i)%MPI_COMM_BCT, ierr_mpi )
327 CALL mpi_bcast (
grids(i)%MAPST2(1,1), nxyg, &
329 mdatas(i)%MPI_COMM_BCT, ierr_mpi )
330 CALL mpi_bcast (
grids(i)%MAPFS (1,1), nxyg, &
332 mdatas(i)%MPI_COMM_BCT, ierr_mpi )
333 nxyg = 3*
grids(i)%NSEA
334 CALL mpi_bcast (
grids(i)%MAPSF (1,1), nxyg, &
336 mdatas(i)%MPI_COMM_BCT, ierr_mpi )
337 CALL mpi_bcast (
grids(i)%CLATIS(1),
nsea, mpi_real, 0,&
338 mdatas(i)%MPI_COMM_BCT, ierr_mpi )
339 CALL mpi_bcast (
sgrds(i)%SIG(0),
nk+2, mpi_real, 0,&
340 mdatas(i)%MPI_COMM_BCT, ierr_mpi )
357 (
grids(i)%GTYPE, i=1, nrgrd )
372 IF ( .NOT.
ALLOCATED(
nbi2g) )
THEN
373 ALLOCATE (
nbi2g(nrgrd,nrgrd), stat=istat )
374 check_alloc_status( istat )
390 IF (
outpts(i)%OUT5%NBI .EQ. 0 )
THEN
392 WRITE (
mdst,9022)
'NO INPUT BOUNDARY POINTS, SKIPPING'
399 IF (
grank(i) .EQ. 1 )
THEN
402 WRITE (
mdst,9022)
'RANK = 1, DATA FROM FILE'
419 WRITE (
mdst,9022)
'SEARCHING FOR ACTIVE BOUNDARY POINTS'
428 ALLOCATE ( tstore(
nbi,0:4), stat=istat )
429 check_alloc_status( istat )
437 IF ( abs(
mapsta(iy,ix)) .EQ. 2 )
THEN
438 xa = real(
xgrd(iy,ix))
439 ya = real(
ygrd(iy,ix))
454 ' WMGLOW skip SMC grid', j
474 CALL is_in_ungrid(j, dble(xa), dble(ya), itout, iver, jver, rw)
479 flagok =( abs(
grids(j)%MAPSTA(jver(1),iver(1))).GE.1 .OR. &
480 rw(1).LT.0.05 ) .AND. &
481 ( abs(
grids(j)%MAPSTA(jver(2),iver(2))).GE.1 .OR. &
482 rw(2).LT.0.05 ) .AND. &
483 ( abs(
grids(j)%MAPSTA(jver(3),iver(3))).GE.1 .OR. &
488 ingrid = w3grmp(
grids(j)%GSU, xa, ya, iver , jver, rw )
496 flagok =( abs(
grids(j)%MAPSTA(jver(1),iver(1))).GE.1 .OR. &
497 rw(1).LT.0.05 ) .AND. &
498 ( abs(
grids(j)%MAPSTA(jver(2),iver(2))).GE.1 .OR. &
499 rw(2).LT.0.05 ) .AND. &
500 ( abs(
grids(j)%MAPSTA(jver(4),iver(4))).GE.1 .OR. &
501 rw(4) .LT.0.05 ) .AND. &
502 ( abs(
grids(j)%MAPSTA(jver(3),iver(3))).GE.1 .OR. &
521 IF ( .NOT.ingrid )
THEN
525 WRITE (
ndse,2000) xa, ya
527 WRITE (
ndse,2001) xa, ya
555 flagok = ( abs(
grids(j)%MAPSTA(jver(1),iver(1))).GE.1 .OR. &
556 rw(1).LT.0.05 ) .AND. &
558 ( abs(
grids(j)%MAPSTA(jver(2),iver(2))).GE.1 .OR. &
559 rw(2).LT.0.05 ) .AND. &
561 ( abs(
grids(j)%MAPSTA(jver(4),iver(4))).GE.1 .OR. &
562 rw(4) .LT.0.05 ) .AND. &
564 ( abs(
grids(j)%MAPSTA(jver(3),iver(3))).GE.1 .OR. &
567 IF ( .NOT.flagok ) cycle
594 IF (kver .LE. nbrelevant)
THEN
595 IF ( abs(
grids(j)%MAPSTA(jver(kver),iver(kver))).GE.1 &
596 .AND. rw(kver) .GT.0.05 )
THEN
597 rdbpi(ibi,kver) = rw(kver)
598 tstore(ibi,kver) =
grids(j)%MAPFS(jver(kver),iver(kver))
619 WRITE (
mdse,1020) i, ix, iy, xa, ya
629 IF ( ibi .EQ. 0 )
THEN
632 DEALLOCATE (
outpts(i)%OUT5%IPBPI,
outpts(i)%OUT5%ISBPI, &
634 outpts(i)%OUT5%RDBPI, stat=istat )
635 check_dealloc_status( istat )
637 ELSE IF ( ibi .NE.
outpts(i)%OUT5%NBI )
THEN
649 IF ( tstore(i1,0) .NE. j ) cycle
651 IF ( tstore(i1,j1).NE.0 .AND.
ipbpi(i1,j1).EQ.0 )
THEN
655 IF ( tstore(i2,0) .NE. j ) cycle
657 IF ( tstore(i2,j2) .EQ. tstore(i1,j1) ) &
670 ALLOCATE (
mdatas(i)%NBI2S(
nbi2,2), stat=istat )
671 check_alloc_status( istat )
676 IF (
ipbpi(i1,j1) .NE. 0 )
THEN
705 ALLOCATE ( tmap(
nx,
ny), stat=istat )
706 check_alloc_status( istat )
712 IF ( abs(
mapsta(iy,ix)) .EQ. 0 )
then
714 ELSE IF ( abs(
mapsta(iy,ix)) .EQ. 1 )
then
716 ELSE IF ( abs(
mapsta(iy,ix)) .EQ. 2 )
then
727 WRITE (tmap(ix,iy),
'(I1)') tstore(j,0)
733 WRITE (
mdst,9029) i, j
736 i2 = min(
nx , j*130 )
737 WRITE (
mdst,
'(1X,130A1)') tmap(i1:i2,iy)
743 DEALLOCATE ( tmap, stat=istat )
744 check_dealloc_status( istat )
747 DEALLOCATE ( tstore, stat=istat )
748 check_dealloc_status( istat )
774 IF ( gridd(i,j) ) js = js + 1
776 jtot = max( jtot , js )
779 IF (
ALLOCATED(
grdlow) )
THEN
780 DEALLOCATE (
grdlow, stat=istat )
781 check_dealloc_status( istat )
783 ALLOCATE (
grdlow(nrgrd,0:jtot), stat=istat )
784 check_alloc_status( istat )
788 WRITE (
mdst,9030) jtot
798 IF ( gridd(i,j) )
THEN
833 dx_min_gridi=minval(
grids(i)%HPFAC)
834 dy_min_gridi=minval(
grids(i)%HQFAC)
835 dx_max_gridi=maxval(
grids(i)%HPFAC)
836 dy_max_gridi=maxval(
grids(i)%HQFAC)
840 dx_min_gridi=
grids(i)%SX
841 dy_min_gridi=
grids(i)%SY
842 dx_max_gridi=
grids(i)%SX
843 dy_max_gridi=
grids(i)%SY
848 DO itri=1,
grids(i)%NTRI
855 im1=
grids(i)%TRIGP(it,itri)
856 im2=
grids(i)%TRIGP(jt,itri)
858 REAL(GRIDS(I)%YGRD(1,IM1)),
REAL(GRIDS(I)%XGRD(1,IM2)), &
859 REAL(GRIDS(I)%YGRD(1,IM2)))
860 IF (isfirst.EQ.1)
THEN
865 IF (edist.GT.dist_max)
THEN
868 IF (edist.LT.dist_min)
THEN
874 dx_min_gridi=dist_min
875 dy_min_gridi=dist_min
876 dx_max_gridi=dist_max
877 dy_max_gridi=dist_max
882 IF ( grids(j)%GTYPE .EQ.
clgtype )
THEN
883 dx_min_gridj=minval(grids(j)%HPFAC)
884 dy_min_gridj=minval(grids(j)%HQFAC)
885 dx_max_gridj=maxval(grids(j)%HPFAC)
886 dy_max_gridj=maxval(grids(j)%HQFAC)
887 ELSEIF ( grids(j)%GTYPE .EQ.
rlgtype .OR. &
888 grids(j)%GTYPE .EQ.
smctype )
THEN
890 dx_min_gridj=grids(j)%SX
891 dy_min_gridj=grids(j)%SY
892 dx_max_gridj=grids(j)%SX
893 dy_max_gridj=grids(j)%SY
894 ELSEIF ( grids(j)%GTYPE .EQ.
ungtype )
THEN
898 DO itri=1,grids(j)%NTRI
905 im1=grids(j)%TRIGP(it,itri)
906 im2=grids(j)%TRIGP(jt,itri)
907 edist=w3dist(
flagll, real(grids(j)%XGRD(1,im1)), &
908 REAL(GRIDS(J)%YGRD(1,IM1)),
REAL(GRIDS(J)%XGRD(1,IM2)), &
909 REAL(GRIDS(J)%YGRD(1,IM2)))
910 IF (isfirst.EQ.1)
THEN
915 IF (edist.GT.dist_max)
THEN
918 IF (edist.LT.dist_min)
THEN
924 dx_min_gridj=dist_min
925 dy_min_gridj=dist_min
926 dx_max_gridj=dist_max
927 dy_max_gridj=dist_max
936 IF (resol_check)
THEN
937 IF ( dx_min_gridj .LT. 0.99*dx_min_gridi .OR. &
938 dy_min_gridj .LT. 0.99*dy_min_gridi .OR. &
939 dx_max_gridj .LT. 0.99*dx_max_gridi .OR. &
940 dy_max_gridj .LT. 0.99*dy_max_gridi )
THEN
941 print *,
'DX_MIN_GRID I=', dx_min_gridi,
' J=', dx_min_gridj
942 print *,
'DX_MAX_GRID I=', dx_max_gridi,
' J=', dx_max_gridj
944 j,
grank(j), dx_min_gridj, dy_min_gridj, &
945 dx_max_gridj, dy_max_gridj, &
946 i,
grank(i), dx_min_gridi, dy_min_gridi, &
947 dx_max_gridi, dy_max_gridi
965 IF ( .NOT. flagok )
CALL extcde ( 1030 )
975 IF ( gridd(j,i) ) js = js + 1
977 jtot = max( jtot , js )
980 IF (
ALLOCATED(
grdhgh) )
THEN
981 DEALLOCATE (
grdhgh, stat=istat )
982 check_dealloc_status( istat )
984 ALLOCATE (
grdhgh(nrgrd,0:jtot), stat=istat )
985 check_alloc_status( istat )
989 WRITE (
mdst,9040) jtot
997 IF ( gridd(j,i) )
THEN
1017 IF (
PRESENT(flrbpi) ) flrbpi = rfile
1023 1000
FORMAT (/
' *** WAVEWATCH III ERROR IN WMGLOW : *** '/ &
1024 ' GRID NOT INITIALIZED, GRID NR',i4 /)
1026 1020
FORMAT (/
' *** WAVEWATCH III ERROR IN WMGLOW : *** '/ &
1027 ' CANNOT FIND SOURCE FOR BOUNDARY DATA '/ &
1028 ' GRID, IX, IY, X, Y:',3i6,2e12.4/)
1030 1021
FORMAT (/
' *** WAVEWATCH III ERROR IN WMGLOW : *** '/ &
1031 ' NONE OF BOUNDARY POINTS CAN BE MAPPED'/ &
1032 ' READING FROM FILE INSTEAD'/)
1034 1030
FORMAT (/
' *** WAVEWATCH III ERROR IN WMGLOW : *** '/ &
1035 ' RANKS AND RESOLUTIONS INCONSISTENT'/ &
1036 ' GRID',i4,
' RANK',i4,
' RESOLUTION :',4e10.3/ &
1037 ' GRID',i4,
' RANK',i4,
' RESOLUTION :',4e10.3/)
1039 2000
FORMAT (/
' *** WAVEWATCH-III WARNING : BOUNDARY POINT'/ &
1040 ' NOT FOUND IN LOWER RANK GRID : ',2f10.3/ &
1043 2001
FORMAT (/
' *** WAVEWATCH-III WARNING : BOUNDARY POINT'/ &
1044 ' NOT FOUND IN LOWER RANK GRID : ',2e10.3/ &
1048 9010
FORMAT (
' TEST WMGLOW : ALL GRIDS INITIALIZED')
1052 9020
FORMAT (
' TEST WMGLOW : STARTING LOOP OVER GRIDS')
1053 9021
FORMAT (
' TEST WMGLOW : I, RANK, NBI :',2i4,i6)
1054 9022
FORMAT (
' ',a)
1057 9023
FORMAT (
' TEST WMGLOW : POINT DATA ')
1058 9024
FORMAT (i5,i8,2f6.1,4i5,4f5.2,i3,4i8)
1061 9025
FORMAT (
' TEST WMGLOW : NBI2S ')
1062 9026
FORMAT (
' ',2i4,2x,i8)
1065 9027
FORMAT (
' TEST WMGLOW : NBI, NBI2, RFILE, NBI2G ')
1066 9028
FORMAT (
' ',2i5,l2,
' : ',20i5)
1069 9029
FORMAT (
' TEST WMGLOW : SOURCE MAP GRID',i3,
' PART',i3)
1073 9030
FORMAT (
' TEST WMGLOW : GRDLOW DIMENSIONED AT ',i2)
1074 9031
FORMAT (
' TEST WMGLOW : GRDLOW :')
1075 9032
FORMAT (
' ',2i4,
' : ',20i3)
1079 9040
FORMAT (
' TEST WMGLOW : GRDHGH DIMENSIONED AT ',i2)
1080 9041
FORMAT (
' TEST WMGLOW : GRDHGH :')
1081 9042
FORMAT (
' ',2i4,
' : ',20i3)
1270 INTEGER :: GDST, IJ, IDST, JDST, GSRC, JJ, IB, ISEA, &
1271 JSEA, IDSTLA, IDSTHA, JDSTLA, JDSTHA, &
1272 ISRC, JSRC, ISRCL, ISRCH, JSRCL, JSRCH, NIT, &
1273 NRTOT, NROK, JF, JR, NLMAX, ISPROC, ISPRO2, &
1274 IREC, ISND, ITMP,ILOC
1276 INTEGER :: NLMAX_SCRIP
1286 INTEGER,
SAVE :: IENT = 0
1289 INTEGER,
ALLOCATABLE :: IDSTL(:), IDSTH(:), JDSTL(:), JDSTH(:), &
1291 I1(:,:), I2(:,:), I3(:), I4(:), &
1293 INTEGER,
ALLOCATABLE :: NX_BEG(:), NX_END(:)
1295 INTEGER,
ALLOCATABLE :: NX_SIZE(:), IRQ(:), MSTAT(:,:)
1298 INTEGER :: IM, NX_REM, TAG, NRQ
1301 INTEGER,
ALLOCATABLE :: TMPINT_OM(:,:),TMPINT(:,:)
1302 REAL,
ALLOCATABLE :: TMPRL_OM(:,:) ,TMPRL(:,:)
1303 REAL,
ALLOCATABLE :: BDIST_OM(:) ,BDIST(:)
1304 INTEGER :: NR0 , NR1 , NR2 , NRL , NLOC
1305 INTEGER :: NR0_OM, NR1_OM, NR2_OM, NRL_OM, NLOC_OM
1308 INTEGER,
ALLOCATABLE :: LTAG(:)
1311 REAL :: FACTOR, STX, STY, STXY, NEWVAL, &
1312 XL, XH, YL, YH, XA, YA, DXC, JD, &
1317 LOGICAL,
ALLOCATABLE :: GRIDOK(:), &
1318 STMASK(:,:), MASKI(:,:), TMPLOG(:)
1320 INTEGER :: JBND,IBND
1326 INTEGER :: NJDST,NIDST,KDST
1327 INTEGER :: NJSRC,NISRC,KSRC
1328 INTEGER :: IPNT,ICOUNT,IPNT2
1329 INTEGER :: DST_GRID_SIZE,ISTOP,JTMP
1331 REAL :: DX_MAX_GDST,DY_MAX_GDST
1332 REAL :: DX_MIN_GSRC,DY_MIN_GSRC
1338 TYPE(allwgt),
ALLOCATABLE :: ALLWGTS(:)
1339 LOGICAL :: L_MASTER = .true.
1340 LOGICAL :: L_READ = .false.
1341 LOGICAL :: L_WRITE = .false.
1344 INTEGER :: IMPROC_ASSIGN
1345 CHARACTER(LEN=80) :: interp_file1, interp_file_test
1346 CHARACTER(LEN=3) :: cdst, csrc
1347 LOGICAL,
ALLOCATABLE :: LGRDREAD(:,:)
1348 LOGICAL,
ALLOCATABLE :: LGRDWRITE(:,:)
1349 INTEGER :: NGRDRANK(2)
1352 LOGICAL :: LSCRIP=.false.
1355 LOGICAL :: LSCRIPNC=.false.
1359 LOGICAL :: L_STOP = .false.
1361 LOGICAL :: T38=.false.
1366 LOGICAL :: ALL_REGULAR=.true.
1368 LOGICAL :: DO_CHECKING=.false.
1373 LOGICAL :: OLD_METHOD=.false.
1378 LOGICAL :: LMPIBDI=.false.
1379 LOGICAL :: CALLED_SCRIP=.false.
1383 INTEGER :: ITRI, IM1, IM2, IT, JT, IsFirst
1384 REAL :: DIST_MIN, DIST_MAX, eDist
1387 CHARACTER(LEN=1),
ALLOCATABLE :: MAPST(:,:)
1391 CHARACTER (LEN=10) :: CDATE_TIME(3)
1392 INTEGER :: DATE_TIME(8)
1393 INTEGER :: ELAPSED_TIME, BEG_TIME(10), END_TIME
1394 INTEGER :: NMYOUT=42
1395 CHARACTER (LEN=14) :: CMYOUT=
"myout00000.lis"
1396 CHARACTER (LEN=5) :: CRANK
1400 WRITE(crank,
"(I5.5)")
improc-1
1401 cmyout(6:10) = crank(1:5)
1402 OPEN (nmyout,
file=cmyout, status=
"REPLACE")
1405 CALL strace (ient,
'WMGHGH')
1412 CALL date_and_time ( cdate_time(1), cdate_time(2), cdate_time(3), date_time)
1413 beg_time(1) = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
1414 WRITE(nmyout,*)
"WMGHGH: START: 0 MSEC"
1421 IF ( .NOT.
ALLOCATED(
grdhgh) )
THEN
1439 INQUIRE(
file=
"SCRIP_STOP", exist=l_stop)
1444 ALLOCATE ( nx_beg(
nmproc), nx_end(
nmproc), stat=istat )
1445 check_alloc_status( istat )
1448 mstat(mpi_status_size,2*
nmproc), stat=istat )
1449 check_alloc_status( istat )
1456 CALL date_and_time ( cdate_time(1), cdate_time(2), cdate_time(3), date_time)
1457 beg_time(2) = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
1461 IF (
hgstge(gdst,gsrc)%INIT )
THEN
1462 IF (
hgstge(gdst,gsrc)%NREC .NE. 0 )
THEN
1468 check_dealloc_status( istat )
1470 IF (
hgstge(gdst,gsrc)%NSND .NE. 0 )
THEN
1472 hgstge(gdst,gsrc)%ISEND , &
1474 check_dealloc_status( istat )
1476 hgstge(gdst,gsrc)%NTOT = 0
1477 hgstge(gdst,gsrc)%NREC = 0
1478 hgstge(gdst,gsrc)%NRC1 = 0
1479 hgstge(gdst,gsrc)%NSND = 0
1480 hgstge(gdst,gsrc)%NSN1 = 0
1481 hgstge(gdst,gsrc)%NSMX = 0
1482 hgstge(gdst,gsrc)%INIT = .false.
1490 CALL date_and_time (cdate_time(1), cdate_time(2), cdate_time(3), date_time)
1491 end_time = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
1492 elapsed_time = end_time - beg_time(2)
1493 WRITE(nmyout,*)
"WMGHGH, LOOP 1 TOOK ", elapsed_time,
" MSEC"
1522 IF ( (.NOT.
flagll) .AND. all_regular .AND. lscrip )
THEN
1524 WRITE (
mdse,
'(/2A)')
'We will check SCRIP calculations ', &
1525 'against old method of calculating weights.'
1529 IF (do_checking .OR. (.NOT.lscrip)) old_method=.true.
1534 IF ( (.NOT.lscrip) .AND. (.NOT.all_regular) .AND. &
1537 WRITE (
mdse,
'(/3A)')
' *** ERROR WMGHGH: ', &
1538 'IRREGULAR or UNSTRUCTURED grid detected: this requires ', &
1558 IF (.NOT. l_stop)
THEN
1576 CALL date_and_time ( cdate_time(1), cdate_time(2), cdate_time(3), date_time)
1577 beg_time(3) = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
1578 elapsed_time = beg_time(3) - beg_time(1)
1579 WRITE(nmyout,*)
"WMGHGH, BEGINNING BOTTLENECK LOOP AT ", elapsed_time,
" MSEC"
1606 IF ( (
grank(gdst).NE.1) .AND. (
nbi.EQ.0) )
THEN
1608 WRITE (
mdse,
'(/2A)')
' WARNING in WMGHGH: ', &
1609 'NBI=0 AND RANK > 1 '
1615 IF ( (
nbi.EQ.0) .OR. (
grank(gdst).EQ.1) )
THEN
1633 ' Generating map with distances to boundary.'
1635 ALLOCATE (
mdatas(gdst)%MAPBDI(
ny,
nx), stat=istat )
1636 check_alloc_status( istat )
1644 IF (
nmproc .EQ. 1 )
THEN
1650 IF (nx_rem .GT. 0) nx_size(1) = nx_size(1) + 1
1651 nx_end(1) = nx_beg(1) + nx_size(1) - 1
1653 nx_beg(im) = nx_end(im-1) + 1
1655 IF (im .LE. nx_rem) nx_size(im) = nx_size(im) + 1
1656 nx_end(im) = nx_beg(im) + nx_size(im) - 1
1657 nx_size(im-1) = nx_size(im-1) *
ny
1669 'Starting MAPBDI 1st loop.'
1672 IF(mod(idst,250).EQ.0)
THEN
1674 WRITE(
mdse,
'(4x,3(A,I5))')&
1675 'processing column ',idst,
' out of ',
nx, &
1678 WRITE(
mdse,
'(4x,2(A,I5))')&
1679 'processing column ',idst,
' out of ',
nx
1683 IF (
mapsta(jdst,idst) .EQ. 0 )
THEN
1685 ELSE IF ( abs(
mapsta(jdst,idst)) .EQ. 2 )
THEN
1689 mapbdi(jdst,idst) = 1.0e+10
1697 'Starting MAPBDI 2nd loop.'
1700 IF ( (mod(ibnd,25).EQ.0) .AND. &
1702 WRITE(
mdse,
'(4x,2(A,I5))') &
1703 'bnd. point ',ibnd,
' out of ',
nx
1706 IF ( abs(
mapsta(jbnd,ibnd)) .EQ. 2 )
THEN
1713 IF (abs(
mapsta(jdst,idst)) .EQ. 1)
THEN
1715 dd=factor*w3dist(
flagll,real(
xgrd(jdst,idst)), &
1716 REAL(YGRD(JDST,IDST)),
REAL(XGRD(JBND,IBND)), &
1717 REAL(YGRD(JBND,IBND)))
1725 dd=dd/ ( 0.58 *
grav )
1739 'Finished MAPBDI 2nd loop.'
1749 IF ( im .NE.
improc )
THEN
1753 irq(nrq), ierr_mpi )
1757 IF ( im .NE.
improc )
THEN
1761 irq(nrq), ierr_mpi )
1764 CALL mpi_waitall( nrq, irq, mpi_status_ignore, ierr_mpi )
1769 ' Finished generating map with distances to boundary.'
1827 check_alloc_status( istat )
1837 ALLOCATE( lgrdread(ngrdrank(1)-1, ngrdrank(2)), stat=istat )
1838 check_alloc_status( istat )
1839 ALLOCATE(lgrdwrite(ngrdrank(1)-1, ngrdrank(2)), stat=istat )
1840 check_alloc_status( istat )
1842 DO jj = 1,
grdhgh(gdst,0)
1843 IF (
grdhgh(gdst,0) .EQ. 0 )
THEN
1845 lgrdread(gdst,jj) = .false.
1846 lgrdwrite(gdst,jj) = .false.
1849 interp_file1 =
"rmp_src_to_dst_conserv_xxx_xxx.nc"
1850 WRITE(cdst,
"(I3.3)") gdst
1851 WRITE(csrc,
"(I3.3)") gsrc
1852 interp_file1(24:26) = csrc
1853 interp_file1(28:30) = cdst
1854 INQUIRE(
file=interp_file1, exist=l_read)
1856 lgrdread(gdst,jj) = l_read
1857 lgrdwrite(gdst,jj) = .NOT. l_read
1866 lowrank_grid :
DO gdst=1,
nrgrd
1869 CALL date_and_time ( cdate_time(1), cdate_time(2), cdate_time(3), date_time)
1870 beg_time(2) = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
1871 elapsed_time = beg_time(2) - beg_time(1)
1872 WRITE(nmyout,*)
"WMGHGH, LOOP LOWRANK_GRID, GDST= ", gdst,
" START: ", elapsed_time,
" MSEC"
1884 IF (
grdhgh(gdst,0) .EQ. 0 )
THEN
1909 WRITE(
mdse,*)
'SUBROUTINE WMGHGH IS'// &
1910 ' NOT YET ADAPTED FOR TRIPOLE GRIDS. STOPPING NOW.'
1914 ALLOCATE ( maptst(
ny,
nx), inflnd(
ny,
nx), stat=istat )
1915 check_alloc_status( istat )
1954 ALLOCATE ( allwgts(maxval(
grdhgh)), stat=istat )
1955 check_alloc_status( istat )
1963 CALL date_and_time ( cdate_time(1), cdate_time(2), cdate_time(3), date_time)
1964 beg_time(3) = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
1965 elapsed_time = beg_time(3) - beg_time(1)
1966 WRITE(nmyout,*)
"WMGHGH, LOOP JJ= ", jj,
" START: ", elapsed_time,
" MSEC"
1971 nisrc=
grids(gsrc)%NX
1972 njsrc=
grids(gsrc)%NY
1987 interp_file1 =
"rmp_src_to_dst_conserv_xxx_xxx.nc"
1988 WRITE(cdst,
"(I3.3)") gdst
1989 WRITE(csrc,
"(I3.3)") gsrc
1990 interp_file1(24:26) = csrc
1991 interp_file1(28:30) = cdst
1992 l_read = lgrdread(gdst, jj)
1995 CALL date_and_time ( cdate_time(1), cdate_time(2), cdate_time(3), date_time)
1996 beg_time(4) = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
1997 elapsed_time = beg_time(3) - beg_time(1)
1998 WRITE(nmyout,*)
"WMGHGH, SCRIP WRAPPER START: ", elapsed_time,
" MSEC"
2001 IF (l_stop) l_write = (
improc .EQ. improc_assign)
2005 IF(l_stop.AND.l_read)
THEN
2007 WRITE(
mdse,
'(A)')
'ERROR: You should either have SCRIP_STOP '// &
2008 'or remapping (.nc) files. Not both. We will exit now.'
2014 called_scrip=.false.
2018 IF ((.NOT. l_stop) .OR. ((.NOT. l_read) .AND. l_write))
THEN
2022 WRITE(
mdse,
'(A,2(I5),A,I5)')
'Calling SCRIP for GSRC,GDST = ', &
2023 gsrc,gdst,
' on processor ',
improc
2025 WRITE(
mdse,
'(A,2(I5))')
'Calling SCRIP interface for GSRC,GDST = ', &
2030 grids(gsrc)%GRIDSHIFT,l_write,l_read,t38)
2041 IF (.NOT. l_read)
THEN
2042 improc_assign = improc_assign + 1
2043 IF (improc_assign .GT.
nmproc) improc_assign = 1
2044 IF(called_scrip)
THEN
2046 dst_grid_size=nidst*njdst
2047 DO kdst=1,dst_grid_size
2048 DEALLOCATE(
wgtdata(kdst)%W, stat=istat )
2049 check_dealloc_status( istat )
2050 DEALLOCATE(
wgtdata(kdst)%K, stat=istat )
2051 check_dealloc_status( istat )
2053 DEALLOCATE(
wgtdata, stat=istat )
2054 check_dealloc_status( istat )
2061 CALL date_and_time (cdate_time(1), cdate_time(2), cdate_time(3), date_time)
2062 end_time = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
2063 elapsed_time = end_time - beg_time(4)
2064 WRITE(nmyout,*)
"WMGHGH, SCRIP WRAPPER, GSRC= ", gsrc,
" TOOK ", elapsed_time,
" MSEC"
2068 IF(.NOT.called_scrip)
THEN
2071 'should have cycled out by now. We will exit now.'
2083 dst_grid_size=nidst*njdst
2084 ALLOCATE(allwgts(gsrc)%WGTDATA(dst_grid_size),stat=istat)
2085 check_alloc_status( istat )
2086 DO kdst=1,dst_grid_size
2087 ALLOCATE(allwgts(gsrc)%WGTDATA(kdst) &
2088 %W(
wgtdata(kdst)%N),stat=istat)
2089 check_alloc_status( istat )
2090 ALLOCATE(allwgts(gsrc)%WGTDATA(kdst) &
2091 %K(
wgtdata(kdst)%N),stat=istat)
2092 check_alloc_status( istat )
2107 DO kdst=1,dst_grid_size
2108 allwgts(gsrc)%WGTDATA(kdst)%N=
wgtdata(kdst)%N
2109 allwgts(gsrc)%WGTDATA(kdst)%NR0=
wgtdata(kdst)%NR0
2110 allwgts(gsrc)%WGTDATA(kdst)%NR2=
wgtdata(kdst)%NR2
2111 allwgts(gsrc)%WGTDATA(kdst)%NRL=
wgtdata(kdst)%NRL
2113 allwgts(gsrc)%WGTDATA(kdst)%W(ipnt) &
2115 allwgts(gsrc)%WGTDATA(kdst)%K(ipnt) &
2127 DO kdst=1,dst_grid_size
2128 DEALLOCATE(
wgtdata(kdst)%W, stat=istat )
2129 check_dealloc_status( istat )
2130 DEALLOCATE(
wgtdata(kdst)%K, stat=istat )
2131 check_dealloc_status( istat )
2133 DEALLOCATE(
wgtdata, stat=istat )
2134 check_dealloc_status( istat )
2143 WRITE(
mdst,
'(/2A)')
' XDST YDST ', &
2147 kdst=(jdst-1)*nidst+idst
2148 xdst=real(
grids(gdst)%XGRD(jdst,idst))
2149 ydst=real(
grids(gdst)%YGRD(jdst,idst))
2150 DO ipnt=1,allwgts(gsrc)%WGTDATA(kdst)%N
2151 ksrc=allwgts(gsrc)%WGTDATA(kdst)%K(ipnt)
2152 jsrc=int((ksrc-1)/nisrc)+1
2153 isrc=ksrc-(jsrc-1)*nisrc
2154 xsrc=real(
grids(gsrc)%XGRD(jsrc,isrc))
2155 ysrc=real(
grids(gsrc)%YGRD(jsrc,isrc))
2156 wxwy=allwgts(gsrc)%WGTDATA(kdst)%W(ipnt)
2157 WRITE(
mdst,
'(5(1X,F12.5))')xdst,ydst,xsrc, &
2166 CALL date_and_time (cdate_time(1), cdate_time(2), cdate_time(3), date_time)
2167 end_time = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
2168 elapsed_time = end_time - beg_time(3)
2169 WRITE(nmyout,*)
"WMGHGH, LOOP JJ, GSRC= ", gsrc,
" TOOK ", elapsed_time,
" MSEC"
2182 IF (
ALLOCATED(maptst) )
THEN
2183 DEALLOCATE ( maptst, stat=istat )
2184 check_dealloc_status( istat )
2186 IF (
ALLOCATED(inflnd) )
THEN
2187 DEALLOCATE ( inflnd, stat=istat )
2188 check_dealloc_status( istat )
2190 IF (
ALLOCATED(allwgts) )
THEN
2193 IF (
ASSOCIATED(allwgts(gsrc)%WGTDATA) )
THEN
2194 DO kdst=1, dst_grid_size
2198 IF (
ALLOCATED(allwgts(gsrc)%WGTDATA(kdst)%W) )
THEN
2199 DEALLOCATE ( allwgts(gsrc)%WGTDATA(kdst)%W, stat=istat )
2200 check_dealloc_status( istat )
2202 IF (
ALLOCATED(allwgts(gsrc)%WGTDATA(kdst)%K) )
THEN
2203 DEALLOCATE ( allwgts(gsrc)%WGTDATA(kdst)%K, stat=istat )
2204 check_dealloc_status( istat )
2208 DEALLOCATE ( allwgts(gsrc)%WGTDATA, stat=istat )
2209 check_dealloc_status( istat )
2210 NULLIFY ( allwgts(gsrc)%WGTDATA )
2213 DEALLOCATE ( allwgts, stat=istat )
2214 check_dealloc_status( istat )
2254 DO ib=1,
SIZE(
mdatas(gsrc)%NBI2S(:,1))
2255 IF (
mdatas(gsrc)%NBI2S(ib,1) .EQ. gdst )
THEN
2258 maptst(jdst,idst) = - gsrc
2271 ALLOCATE ( idstl(
grdhgh(gdst,0)), idsth(
grdhgh(gdst,0)), &
2275 check_alloc_status( istat )
2277 IF (old_method)
THEN
2278 ALLOCATE (bdist_om(
grdhgh(gdst,0)), stat=istat )
2279 check_alloc_status( istat )
2328 xl=real(minval(
grids(gsrc)%XGRD))
2329 yl=real(minval(
grids(gsrc)%YGRD))
2330 xh=real(maxval(
grids(gsrc)%XGRD))
2331 yh=real(maxval(
grids(gsrc)%YGRD))
2336 xh =
grids(gsrc)%X0 + ( real(
grids(gsrc)%NX) - 1.5 ) &
2339 yh =
grids(gsrc)%Y0 + ( real(
grids(gsrc)%NY) - 1.5 ) &
2355 idstl(jj) = 2 + int( (xl-
x0)/
sx + 0.49 )
2356 idsth(jj) = 1 + int( (xh-
x0)/
sx - 0.49 )
2359 jdstl(jj) = 2 + int( (yl-
y0)/
sy + 0.49 )
2360 jdsth(jj) = 1 + int( (yh-
y0)/
sy - 0.49 )
2362 idstl(jj) = max( 1 , idstl(jj) )
2363 idsth(jj) = min(
nx , idsth(jj) )
2364 jdstl(jj) = max( 1 , jdstl(jj) )
2365 jdsth(jj) = min(
ny , jdsth(jj) )
2368 WRITE (
mdst,9022) gsrc, idstl(jj),idsth(jj), &
2377 idstla = minval(idstl)
2378 idstha = maxval(idsth)
2379 jdstla = minval(jdstl)
2380 jdstha = maxval(jdsth)
2411 dx_max_gdst=maxval(
grids(gdst)%HPFAC)
2412 dy_max_gdst=maxval(
grids(gdst)%HQFAC)
2414 dx_max_gdst=
grids(gdst)%SX
2415 dy_max_gdst=
grids(gdst)%SY
2420 DO itri=1,
grids(gdst)%NTRI
2427 im1=
grids(gdst)%TRIGP(it,itri)
2428 im2=
grids(gdst)%TRIGP(jt,itri)
2429 edist=w3dist(
flagll, real(
grids(gdst)%XGRD(1,im1)), &
2430 REAL(GRIDS(GDST)%YGRD(1,IM1)), &
2431 REAL(GRIDS(GDST)%XGRD(1,IM2)),
REAL(GRIDS(GDST)%YGRD(1,IM2)))
2432 IF (isfirst.eq.1)
THEN
2437 IF (edist.gt.dist_max)
THEN
2440 IF (edist.lt.dist_min)
THEN
2446 dx_max_gdst=dist_max
2447 dy_max_gdst=dist_max
2450 IF ( grids(gsrc)%GTYPE .EQ.
clgtype )
THEN
2451 dx_min_gsrc=minval(grids(gsrc)%HPFAC)
2452 dy_min_gsrc=minval(grids(gsrc)%HQFAC)
2453 ELSEIF ( grids(gsrc)%GTYPE .EQ.
rlgtype )
THEN
2454 dx_min_gsrc=grids(gsrc)%SX
2455 dy_min_gsrc=grids(gsrc)%SY
2460 DO itri=1,grids(gsrc)%NTRI
2467 im1=grids(gsrc)%TRIGP(it,itri)
2468 im2=grids(gsrc)%TRIGP(jt,itri)
2469 edist=w3dist(
flagll, real(grids(gsrc)%XGRD(1,im1)), &
2470 REAL(GRIDS(GSRC)%YGRD(1,IM1)), &
2471 REAL(GRIDS(GSRC)%XGRD(1,IM2)),
REAL(GRIDS(GSRC)%YGRD(1,IM2)))
2472 IF (isfirst.eq.1)
THEN
2477 IF (edist.gt.dist_max)
THEN
2480 IF (edist.lt.dist_min)
THEN
2486 dx_min_gsrc=dist_min
2487 dy_min_gsrc=dist_min
2494 nlmax = max( nlmax , &
2495 (2+int(dx_max_gdst/dx_min_gsrc+0.001)) * &
2496 (2+int(dy_max_gdst/dy_min_gsrc+0.001)) )
2499 WRITE(
mdst,*)
'ratio 1 = ',(dx_max_gdst/dx_min_gsrc), &
2500 dx_max_gdst,dx_min_gsrc
2501 WRITE(
mdst,*)
'ratio 2 = ',(dy_max_gdst/dy_min_gsrc), &
2502 dy_max_gdst,dy_min_gsrc
2503 WRITE(
mdse,*)
'GSRC, NLMAX = ',gsrc,nlmax
2509 kdst=(jdst-1)*nidst+idst
2510 nloc=allwgts(gsrc)%WGTDATA(kdst)%N
2511 nlmax_scrip=max(nlmax_scrip,nloc)
2539 WRITE(
mdse,*)
'NLMAX,NLMAX_SCRIP=',nlmax,nlmax_scrip
2541 nlmax = max(nlmax, nlmax_scrip)
2546 WRITE(
mdse,*)
'NEW NLMAX:',nlmax
2549 IF(nlmax.GT.100)
THEN
2550 WRITE(
mdse,
'(/A,I8)') &
2551 'WARNING: unusually large value for NLMAX : ',nlmax
2556 ALLOCATE ( tmpint_om(
nx*
ny,-4:nlmax), stat=istat )
2557 check_alloc_status( istat )
2558 ALLOCATE ( tmprl_om(
nx*
ny,0:nlmax), stat=istat )
2559 check_alloc_status( istat )
2561 ALLOCATE ( tmpint(
nx*
ny,-4:nlmax), stat=istat )
2562 check_alloc_status( istat )
2563 ALLOCATE ( tmprl(
nx*
ny,0:nlmax), stat=istat )
2564 check_alloc_status( istat )
2565 ALLOCATE ( tmplog(
nx*
ny), stat=istat )
2566 check_alloc_status( istat )
2569 ALLOCATE ( ltag(nlmax), stat=istat )
2570 check_alloc_status( istat )
2572 ltag(jj) = jj + ltag0
2588 lowrank_j :
DO jdst=1,
ny
2589 IF ( jdst.LT.jdstla .OR. jdst.GT.jdstha ) cycle
2591 lowrank_i :
DO idst=1,
nx
2592 IF ( idst.LT.idstla .OR. idst.GT.idstha ) cycle
2594 IF ( abs(
mapsta(jdst,idst)) .NE. 1 ) cycle
2596 IF ( maptst(jdst,idst) .LT. 0 ) cycle
2597 xa = real(
xgrd(jdst,idst))
2598 ya = real(ygrd(jdst,idst))
2635 dxc = mod( 1080.+xa-grids(gsrc)%X0 , 360. )
2636 xl = 1. + (dxc-0.5*
sx)/grids(gsrc)%SX
2637 xh = 1. + (dxc+0.5*
sx)/grids(gsrc)%SX
2639 xl = 1. + (xa-grids(gsrc)%X0-0.5*
sx)/grids(gsrc)%SX
2640 xh = 1. + (xa-grids(gsrc)%X0+0.5*
sx)/grids(gsrc)%SX
2642 yl = 1. + (ya-grids(gsrc)%Y0-0.5*
sy)/grids(gsrc)%SY
2643 yh = 1. + (ya-grids(gsrc)%Y0+0.5*
sy)/grids(gsrc)%SY
2645 isrcl = nint(xl+0.01)
2646 isrch = nint(xh-0.01)
2647 jsrcl = nint(yl+0.01)
2648 jsrch = nint(yh-0.01)
2650 IF ( isrcl.LT.1 .OR. isrch.GT.grids(gsrc)%NX .OR. &
2651 jsrcl.LT.1 .OR. jsrch.GT.grids(gsrc)%NY )
THEN
2653 gridok(jj) = .false.
2677 bdist_om(jj) = 9.99e33
2679 DO isrc=isrcl, isrch
2680 DO jsrc=jsrcl, jsrch
2681 IF (grids(gsrc)%MAPSTA(jsrc,isrc).EQ.0)
THEN
2692 IF (grids(gsrc)%MAPST2(jsrc,isrc).EQ.0) &
2694 ELSE IF (abs(grids(gsrc)%MAPSTA(jsrc,isrc)) &
2702 bdist_om(jj) = min( bdist_om(jj) , &
2703 mdatas(gsrc)%MAPBDI(jsrc,isrc) )
2704 ELSE IF (abs(grids(gsrc)%MAPSTA(jsrc,isrc)) &
2731 nisrc=grids(gsrc)%NX
2732 kdst=(jdst-1)*nidst+idst
2736 DO ipnt=1,allwgts(gsrc)%WGTDATA(kdst)%N
2737 ksrc=allwgts(gsrc)%WGTDATA(kdst)%K(ipnt)
2738 jsrc=int((ksrc-1)/nisrc)+1
2739 isrc=ksrc-(jsrc-1)*nisrc
2740 IF (abs(grids(gsrc)%MAPSTA(jsrc,isrc)).EQ.1)
THEN
2744 bdist(jj) = min( bdist(jj) , &
2745 mdatas(gsrc)%MAPBDI(jsrc,isrc) )
2749 'we masked non-sea points. (coding error)'
2757 nr0 = allwgts(gsrc)%WGTDATA(kdst)%NR0
2761 nrl = allwgts(gsrc)%WGTDATA(kdst)%NRL
2766 nr1 = allwgts(gsrc)%WGTDATA(kdst)%N
2770 nr2 = allwgts(gsrc)%WGTDATA(kdst)%NR2
2782 WRITE(
mdst,*)
'STARTING TEST 1'
2784 IF(nr0_om.NE.nr0)
THEN
2786 ' *** ERROR WMGHGH: NR0_OM,NR0 = ',nr0_om,nr0
2789 IF(nr1_om.NE.nr1)
THEN
2791 ' *** ERROR WMGHGH: NR1_OM,NR1 = ',nr1_om,nr1
2794 IF(nr2_om.NE.nr2)
THEN
2796 ' *** ERROR WMGHGH: NR2_OM,NR2 = ',nr2_om,nr2
2799 IF(nrl_om.NE.nrl)
THEN
2801 ' *** ERROR WMGHGH: NRL_OM,NRL = ',nrl_om,nrl
2804 IF(bdist_om(jj).NE.bdist(jj))
THEN
2806 WRITE (
mdse,
'(/2A,2(F12.5))') &
2807 ' *** ERROR WMGHGH: ', &
2808 ' BDIST_OM(JJ),BDIST(JJ) = ', &
2809 bdist_om(jj),bdist(jj)
2813 WRITE(
mdst,*)
'PASSED TEST 1'
2838 IF ( nrl .GT. (nr0+nr1+nr2)/2 )
THEN
2843 inflnd(jdst,idst) = 1
2845 gridok(jj) = nr1.GT.0 .AND. nr2.EQ.0
2850 IF ( gridok(jj) ) nrok = nrok + 1
2856 IF ( nrok .EQ. 0 )
THEN
2870 inflnd(jdst,idst) = 0
2914 DO jj=
grdhgh(gdst,0),1,-1
2919 IF ( gridok(jj) )
THEN
2920 IF ( jf .EQ. 0 )
THEN
2927 IF (
grank(gsrc) .NE. jr )
EXIT
2929 IF ( bdist(jj) .GT. jd )
THEN
2939 WRITE(
mdst,
'(A,2(I8),A,I8)')
'For grid point IDST,JDST = ',idst,jdst,
', we selected GSRC = ',gsrc
2945 maptst(jdst,idst) = gsrc
2953 tmpint(nrtot,-4) = idst
2954 tmpint(nrtot,-3) = jdst
2955 tmpint(nrtot,-2) =
mapfs(jdst,idst)
2956 tmpint(nrtot,-1) = gsrc
2957 tmprl(nrtot, 0) = jd *
sig(1) /
dtmax
2971 tmpint_om(nrtot,itmp)=tmpint(nrtot,itmp)
2973 tmprl_om(nrtot,0)=tmprl(nrtot,0)
2976 dxc = mod( 1080.+xa-grids(gsrc)%X0 , 360. )
2977 xl = 1. + (dxc-0.5*
sx)/grids(gsrc)%SX
2978 xh = 1. + (dxc+0.5*
sx)/grids(gsrc)%SX
2980 xl = 1. + (xa-grids(gsrc)%X0-0.5*
sx)/grids(gsrc)%SX
2981 xh = 1. + (xa-grids(gsrc)%X0+0.5*
sx)/grids(gsrc)%SX
2983 yl = 1. + (ya-grids(gsrc)%Y0-0.5*
sy)/grids(gsrc)%SY
2984 yh = 1. + (ya-grids(gsrc)%Y0+0.5*
sy)/grids(gsrc)%SY
2990 isrcl = nint(xl+0.01)
2991 isrch = nint(xh-0.01)
2992 jsrcl = nint(yl+0.01)
2993 jsrch = nint(yh-0.01)
2997 DO isrc=isrcl, isrch
2998 wx = min(xh,real(isrc)+0.5) - max(xl,real(isrc)-0.5)
2999 DO jsrc=jsrcl, jsrch
3000 IF (abs(grids(gsrc)%MAPSTA(jsrc,isrc)).EQ.1)
THEN
3002 wy = min(yh,real(jsrc)+0.5) - &
3003 max(yl,real(jsrc)-0.5)
3005 nloc_om = nloc_om + 1
3007 IF ( nloc_om .GT. nlmax )
THEN
3011 tmpint_om(nrtot,nloc_om) = &
3012 grids(gsrc)%MAPFS(jsrc,isrc)
3013 tmprl_om(nrtot,nloc_om) = wx*wy
3017 tmpint_om(nrtot,0) = nloc_om
3018 tmprl_om(nrtot,1:nloc_om) = tmprl_om(nrtot,1:nloc_om) &
3035 kdst=(jdst-1)*nidst+idst
3036 nloc=allwgts(gsrc)%WGTDATA(kdst)%N
3037 tmpint(nrtot,0) = nloc
3038 nisrc=grids(gsrc)%NX
3044 WRITE(
mdst,*)
'GSRC,KDST,NLOC = ',gsrc,kdst,nloc
3051 IF ( nloc .GT. nlmax )
THEN
3053 WRITE (
mdse,
'(/2A,4(1x,I8))') &
3054 ' *** ERROR WMGHGH: ', &
3055 ' IDST,JDST,NLOC,NLMAX = ', &
3056 idst,jdst,nloc,nlmax
3062 ksrc=allwgts(gsrc)%WGTDATA(kdst)%K(ipnt)
3063 jsrc=int((ksrc-1)/nisrc)+1
3064 isrc=ksrc-(jsrc-1)*nisrc
3065 tmpint(nrtot,ipnt) = grids(gsrc)%MAPFS(jsrc,isrc)
3066 tmprl(nrtot,ipnt)= &
3067 allwgts(gsrc)%WGTDATA(kdst)%W(ipnt)
3079 IF (do_checking)
THEN
3082 WRITE(
mdst,*)
'STARTING TEST 2'
3084 if (nloc.NE.nloc_om)
THEN
3086 ' *** ERROR WMGHGH: NLOC,NLOC_OM = ',nloc,nloc_om
3093 IF (tmpint_om(nrtot,ipnt).EQ.tmpint(nrtot,ipnt2))
THEN
3096 IF(abs(tmprl_om(nrtot,ipnt)-tmprl(nrtot,ipnt2)) &
3099 (
mdse,
'(/2A,2(F12.5))') &
3100 ' *** ERROR WMGHGH: ', &
3101 ' *** TMPRL_OM(NRTOT,IPNT),TMPRL(NRTOT,IPNT2) = ', &
3102 tmprl_om(nrtot,ipnt),tmprl(nrtot,ipnt2)
3108 IF(icount.NE.nloc)
THEN
3110 ' *** ERROR WMGHGH: ICOUNT,NLOC = ',icount,nloc
3117 WRITE(
mdst,*)
'PASSED TEST 2'
3132 WRITE(
mdst,*)
'WMGHGH Section 2.b.6 completed.'
3144 WRITE (
mdst,9023) gdst, nrtot
3168 ALLOCATE ( stmask(
ny,0:
nx+1), maski(
ny,
nx), stat=istat )
3169 check_alloc_status( istat )
3170 IF (
mdatas(gdst)%MSKINI )
THEN
3171 DEALLOCATE (
mdatas(gdst)%MAPMSK, stat=istat )
3172 check_dealloc_status( istat )
3174 ALLOCATE (
mdatas(gdst)%MAPMSK(
ny,
nx), stat=istat )
3175 check_alloc_status( istat )
3177 mdatas(gdst)%MSKINI = .true.
3191 stmask(:,1:
nx) = maptst .LT. 0
3192 stmask(:,0) = stmask(:,
nx)
3193 stmask(:,
nx+1) = stmask(:,1)
3227 DO idst=idstla,idstha
3229 IF ( .NOT. stmask(jdst,idst) .AND. ( &
3230 stmask(jdst+1,idst+1) .OR. stmask(jdst+1,idst ) .OR. &
3231 stmask(jdst+1,idst-1) .OR. stmask(jdst ,idst-1) .OR. &
3232 stmask(jdst-1,idst-1) .OR. stmask(jdst-1,idst ) .OR. &
3233 stmask(jdst-1,idst+1) .OR. stmask(jdst ,idst+1) ) ) &
3234 maski(jdst,idst) = .true.
3237 stmask(:,1:
nx) = stmask(:,1:
nx) .OR. maski
3238 stmask(:,0) = stmask(:,
nx)
3239 stmask(:,
nx+1) = stmask(:,1)
3249 idst = tmpint(iloc,-4)
3250 jdst = tmpint(iloc,-3)
3251 tmplog(iloc) = stmask(jdst,idst)
3252 IF ( .NOT. stmask(jdst,idst) )
THEN
3255 maptst(jdst,idst) = 99
3261 DEALLOCATE ( stmask, maski, stat=istat )
3262 check_dealloc_status( istat )
3285 jj = tmpint(iloc,-1)
3287 isea = tmpint(iloc,-2)
3290 isproc = isproc +
croot - 1
3293 i1(jj,isproc) = i1(jj,isproc) + 1
3294 IF ( tmplog(iloc) ) i2(jj,isproc) = i2(jj,isproc) + 1
3295 IF (
improc .EQ. isproc )
THEN
3296 hgstge(gdst,jj)%NSMX = max(
hgstge(gdst,jj)%NSMX,tmpint(iloc,0))
3299 DO jr=1, tmpint(iloc,0)
3300 isea = tmpint(iloc,jr)
3302 IF ( ispro2 .EQ.
improc )
THEN
3304 IF ( tmplog(iloc) )
hgstge(gdst,jj)%NSN1 = &
3317 IF (
hgstge(gdst,gsrc)%NREC .GT. 0 )
THEN
3322 hgstge(gdst,gsrc)%NSMX), &
3324 hgstge(gdst,gsrc)%NSMX), &
3326 hgstge(gdst,gsrc)%NSMX), &
3328 hgstge(gdst,gsrc)%NSMX, &
3329 hgstge(gdst,gsrc)%NREC), stat=istat )
3330 check_alloc_status( istat )
3332 hgstge(gdst,gsrc)%LJSEA = -1
3333 hgstge(gdst,gsrc)%NRAVG = -1
3334 hgstge(gdst,gsrc)%IMPSRC = -1
3335 hgstge(gdst,gsrc)%ITAG = -1
3336 hgstge(gdst,gsrc)%WGTH = -1.
3339 IF (
hgstge(gdst,gsrc)%NSND .GT. 0 )
THEN
3340 ALLOCATE (
hgstge(gdst,gsrc)%ISEND (
hgstge(gdst,gsrc)%NSND,5), &
3342 check_alloc_status( istat )
3344 hgstge(gdst,gsrc)%ISEND = -1
3347 hgstge(gdst,gsrc)%INIT = .true.
3355 i4 =
hgstge(gdst,:)%NSND + 1
3360 isea = tmpint(iloc,-2)
3361 jj = tmpint(iloc,-1)
3362 nr0 = tmpint(iloc, 0)
3365 isproc = isproc +
croot - 1
3366 flgrec = isproc .EQ.
improc
3369 IF ( tmplog(iloc) )
THEN
3370 i1(jj,isproc) = i1(jj,isproc) + 1
3371 irec = i1(jj,isproc)
3373 i2(jj,isproc) = i2(jj,isproc) - 1
3374 irec = i2(jj,isproc)
3378 hgstge(gdst,jj)%LJSEA(irec) = jsea
3379 hgstge(gdst,jj)%NRAVG(irec) = nr0
3380 hgstge(gdst,jj)%WGTH(irec,:nr0) = tmprl(iloc,1:nr0)
3382 hgstge(gdst,jj)%ITAG(irec,:nr0) = ltag(:nr0)
3388 isea = tmpint(iloc,ij)
3390 IF ( flgrec )
hgstge(gdst,jj)%IMPSRC(irec,ij) = ispro2
3392 IF ( ispro2 .EQ.
improc )
THEN
3393 IF ( tmplog(iloc) )
THEN
3400 hgstge(gdst,jj)%ISEND(isnd,1) = jsea
3402 hgstge(gdst,jj)%ISEND(isnd,2) = isproc
3404 hgstge(gdst,jj)%ISEND(isnd,3) = irec
3405 hgstge(gdst,jj)%ISEND(isnd,4) = ij
3407 hgstge(gdst,jj)%ISEND(isnd,5) = ltag(ij)
3423 ALLOCATE ( mapst(
ny,
nx), stat=istat )
3424 check_alloc_status( istat )
3429 idst =
mapsf(isea,1)
3430 jdst =
mapsf(isea,2)
3431 IF ( maptst(jdst,idst) .GT. 0 )
flagst(isea) = .NOT.
flghg1
3434 mapst(jdst,idst) =
'O'
3436 mapst(jdst,idst) =
'X'
3444 WRITE (
mdst,9025)
'MAPTST'
3446 WRITE (
mdst,9026) maptst(jdst,:) + 88*inflnd(jdst,:)
3451 WRITE (
mdst,9025)
'MAPSTA'
3458 WRITE (
mdst,9025)
'MAPST2'
3465 WRITE (
mdst,9025)
'FLAGST'
3467 WRITE (
mdst,9027) mapst(jdst,:)
3471 DEALLOCATE ( maptst, inflnd, stat=istat )
3472 check_dealloc_status( istat )
3474 DEALLOCATE ( mapst, stat=istat )
3475 check_dealloc_status( istat )
3482 nr0 =
hgstge(gdst,gsrc)%NREC
3483 IF ( nr0 .EQ. 0 )
THEN
3484 WRITE (
mdst,9030) gsrc
3486 WRITE (
mdst,9031) gsrc, nr0
3488 jsea =
hgstge(gdst,gsrc)%LJSEA(irec)
3489 nrtot =
hgstge(gdst,gsrc)%NRAVG(irec)
3490 IF ( nrtot .LE. 15 )
THEN
3491 WRITE (
mdst,9032) jsea, nrtot, &
3492 hgstge(gdst,gsrc)%WGTH(irec,:nrtot)
3494 WRITE (
mdst,9032) jsea, nrtot, &
3495 hgstge(gdst,gsrc)%WGTH(irec,1:15)
3497 hgstge(gdst,gsrc)%WGTH(irec,16:nrtot)
3500 hgstge(gdst,gsrc)%IMPSRC(irec,1:nrtot)
3502 hgstge(gdst,gsrc)%ITAG(irec,1:nrtot)
3512 nr0 =
hgstge(gdst,gsrc)%NSND
3513 IF ( nr0 .EQ. 0 )
THEN
3514 WRITE (
mdst,9040) gsrc
3516 WRITE (
mdst,9041) gsrc, nr0
3518 WRITE (
mdst,9042)
hgstge(gdst,gsrc)%ISEND(isnd,:)
3526 DEALLOCATE ( idstl, idsth, jdstl, jdsth, gridok, bdist, &
3527 tmpint, tmprl, tmplog, stat=istat )
3528 check_dealloc_status( istat )
3530 IF (old_method)
THEN
3531 DEALLOCATE ( bdist_om, tmpint_om, tmprl_om, stat=istat )
3532 check_dealloc_status( istat )
3536 DEALLOCATE ( ltag, stat=istat )
3537 check_dealloc_status( istat )
3548 DO kdst=1,dst_grid_size
3549 DEALLOCATE ( allwgts(gsrc)%WGTDATA(kdst)%W, stat=istat )
3550 check_dealloc_status( istat )
3551 DEALLOCATE ( allwgts(gsrc)%WGTDATA(kdst)%K, stat=istat )
3552 check_dealloc_status( istat )
3554 DEALLOCATE ( allwgts(gsrc)%WGTDATA, stat=istat )
3555 check_dealloc_status( istat )
3557 DEALLOCATE ( allwgts, stat=istat )
3558 check_dealloc_status( istat )
3563 CALL date_and_time (cdate_time(1), cdate_time(2), cdate_time(3), date_time)
3564 end_time = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
3565 elapsed_time = end_time - beg_time(2)
3566 WRITE(nmyout,*)
"WMGHGH, LOOP LOWRANK_GRID, GDST= ", gdst,
" TOOK ", elapsed_time,
" MSEC"
3571 IF ( lscripnc .AND. l_stop )
THEN
3577 WRITE(
mdse,
'(A,I4.4,A)' )
'IMPROC=',
improc, &
3578 ': STOP_SCRIP option invoked: '// &
3579 'non-error exit after writing remap netcdf files'
3583 DEALLOCATE ( i1, i2, i3, i4, stat=istat )
3584 check_dealloc_status( istat )
3586 DEALLOCATE ( nx_size, irq, mstat, stat=istat )
3587 check_dealloc_status( istat )
3589 DEALLOCATE ( nx_beg, nx_end, stat=istat )
3590 check_dealloc_status( istat )
3596 WRITE (
mdst,9028)
'NTOT'
3603 WRITE (
mdst,9028)
'NREC'
3610 WRITE (
mdst,9028)
'NRC1'
3617 WRITE (
mdst,9028)
'NSND'
3624 WRITE (
mdst,9028)
'NSN1'
3631 WRITE (
mdst,9028)
'NSMX'
3638 CALL date_and_time (cdate_time(1), cdate_time(2), cdate_time(3), date_time)
3639 end_time = ((date_time(5)*60 + date_time(6))*60 + date_time(7))*1000 + date_time(8)
3640 elapsed_time = end_time - beg_time(1)
3641 WRITE(nmyout,*)
"WMGHGH, ALL TOOK ", elapsed_time,
" MSEC"
3648 1000
FORMAT (/
' *** WAVEWATCH III ERROR IN WMGHGH : *** '/ &
3649 ' GRDHGH NOT YET ALLOCATED, CALL WMGLOW FIRST'/)
3650 1020
FORMAT (/
' *** WAVEWATCH III ERROR IN WMGHGH : *** '/ &
3651 ' TMPINT AND TMPRL TOO SMALL (w/out SCRIP)'/)
3653 1021
FORMAT (/
' *** WAVEWATCH III ERROR IN WMGHGH : *** '/ &
3654 ' TMPINT AND TMPRL TOO SMALL (w/SCRIP) '/)
3658 9010
FORMAT (
' TEST WMGHGH : INITIALIZE BOUNDARY DISTANCE MAPS')
3659 9011
FORMAT (
' GRID = ',i3,
' RANK = ',i3, &
3661 9012
FORMAT (
' *** MAP NOT NEEDED ***')
3662 9013
FORMAT (
' TEST WMGHGH : FINAL MAP ')
3663 9014
FORMAT (2x,65i2)
3667 9020
FORMAT (
' TEST WMGHGH : GRID',i3,
' HAS',i3,
' DATA SOURCES')
3668 9021
FORMAT (
' NO PROCESSING REQUIRED')
3669 9022
FORMAT (
' TEST WMGHGH : GRID',i3,
' COVERS ',4i8)
3670 9023
FORMAT (
' TEST WMGHGH : GRID',i3, &
3671 ', NR OF POINTS TO PROCESS:',i5)
3672 9025
FORMAT (
' TEST WMGHGH : FINAL ',a)
3673 9026
FORMAT (2x,65i2)
3674 9027
FORMAT (2x,65a2)
3678 9028
FORMAT (
' TEST WMGHGH : COUNTERS ',a)
3679 9029
FORMAT (2x,20i6)
3683 9030
FORMAT (
' TEST WMGHG : FROM GRID',i3,
', NO DATA TO RECEIVE')
3684 9031
FORMAT (
' TEST WMGHG : FROM GRID',i3,
', RECEIVING ',i6)
3685 9032
FORMAT ( 2x,i10,i6,15f6.2)
3686 9033
FORMAT ( 18x,15f6.2)
3687 9034
FORMAT ( 18x,15i6)
3691 9040
FORMAT (
' TEST WMGHG : FROM GRID',i3,
', NO DATA TO SEND')
3692 9041
FORMAT (
' TEST WMGHG : FROM GRID',i3,
', SENDING ',i6)
3693 9042
FORMAT ( 12x,i10,4i6)
3814 INTEGER :: I, J, IX, IXL, IXH, IY, IYL, IYH, &
3815 JX, JXL, JXH, JXL2, JXH2, &
3816 JY, JYL, JYH, JYL2, JYH2, &
3817 NR, NT, NA, NTL, JJ, NIT, NG, NOUT, &
3818 ISEA, JSEA, ISPROC, ITAG, TGRP, &
3824 INTEGER,
SAVE :: IENT = 0
3826 INTEGER,
ALLOCATABLE :: MAP3D(:,:,:), NREC(:), NSND(:), &
3827 NTPP(:), MAPOUT(:,:)
3828 REAL :: FACTOR, XSL, XSH, YSL, YSH, XA, YA, &
3829 XR, YR, RX(2), RY(2), STX, STY, &
3831 REAL,
PARAMETER :: TODO = -9.99e25
3832 REAL,
PARAMETER :: ODIMAX = 25.
3833 REAL,
PARAMETER :: FACMAX = 2.001
3834 REAL,
ALLOCATABLE :: WGT3D(:,:,:)
3835 LOGICAL :: CHANGE, XEXPND, YEXPND
3836 LOGICAL,
ALLOCATABLE :: SHRANK(:,:), DOGRID(:), &
3837 MASKA(:,:), MASKI(:,:)
3839 CHARACTER(LEN=18),
ALLOCATABLE :: TSTR(:)
3840 CHARACTER(LEN=18) :: DSTR
3844 INTEGER :: NTOT, NFIN
3845 INTEGER,
POINTER :: IX(:), IY(:), NAV(:), ISS(:,:), &
3846 JSS(:,:), IPS(:,:), ITG(:,:)
3847 REAL,
POINTER :: AWG(:,:)
3848 LOGICAL,
POINTER :: FLA(:)
3852 TYPE(store),
ALLOCATABLE :: STORES(:,:)
3855 CALL strace (ient,
'WMGEQL')
3863 dogrid(
nrgrd), stat=istat )
3864 check_alloc_status( istat )
3871 stores(i,j)%INIT = .false.
3872 stores(i,j)%NTOT = 0
3873 stores(i,j)%NFIN = 0
3917 IF (
grank(i).NE.
grank(j) .OR. i.EQ.j ) cycle
3926 shrank(i,j) = .true.
3932 dogrid(i) = nr .GT. 0
3937 IF ( nr .EQ. 0 )
WRITE (
mdst,9013)
'NO GRIDS WITH SAME RANK'
3939 IF ( nr .EQ. 0 ) cycle
3945 ' NOT YET ADAPTED FOR TRIPOLE GRIDS. STOPPING NOW.'
3959 'WMGEQL: UNSTRUCTURED GRID SUPPORT NOT YET ', &
3965 'WMGEQL: CURVILINEAR GRID SUPPORT NOT IMPLEMENTED ', &
3977 IF ( .NOT. shrank(i,j) ) cycle
3992 ixl = max( 1+nint(xsl) , 1 )
3993 ixh = min( 1+nint(xsh) ,
nx )
3999 iyl = max( 1+nint(ysl) , 1 )
4000 iyh = min( 1+nint(ysh) ,
ny )
4002 nt = (1+ixh-ixl) * (1+iyh-iyl)
4003 IF ( nt .EQ. 0 ) cycle
4005 stores(i,j)%INIT = .true.
4006 ALLOCATE ( stores(i,j)%IX(nt) , stores(i,j)%IY(nt) , &
4007 stores(i,j)%NAV(nt) , stores(i,j)%FLA(nt) , &
4008 stores(i,j)%ISS(nt,4), stores(i,j)%JSS(nt,4), &
4009 stores(i,j)%IPS(nt,4), stores(i,j)%ITG(nt,4), &
4010 stores(i,j)%AWG(nt,4), stat=istat )
4011 check_alloc_status( istat )
4013 stores(i,j)%FLA = .false.
4018 stores(i,j)%AWG = 0.
4028 xa =
x0 + real(ix-1)*
sx
4030 xr = 1. + mod(1080. + xa -
grids(j)%X0 , 360. ) &
4037 rx(1) = 1. - mod(xr,1.)
4038 IF ( rx(1).GT.0.99 .OR. jxh.EQ.
grids(j)%NX+1 )
THEN
4042 IF ( rx(1).LT.0.01 .OR. jxl.EQ.0 )
THEN
4048 IF ( jxl.LT.1 .OR. jxh.GT.
grids(j)%NX ) cycle
4051 jxl2 = max( 1 , jxl-1 )
4052 jxh2 = min(
grids(j)%NX , jxh+1 )
4059 ya =
y0 + real(iy-1)*
sy
4063 ry(1) = 1. - mod(yr,1.)
4064 IF ( ry(1).GT.0.99 .OR. jyh.EQ.
grids(j)%NY+1 )
THEN
4068 IF ( ry(1).LT.0.01 .OR. jyl.EQ.0 )
THEN
4072 IF ( ry(1) .GT. 0.99 ) jyh = jyl
4075 IF ( jyl.LT.1 .OR. jyh.GT.
grids(j)%NY ) cycle
4078 jyl2 = max( 1 , jyl-1 )
4079 jyh2 = min(
grids(j)%NY , jyh+1 )
4092 stores(i,j)%IX(nt) = ix
4093 stores(i,j)%IY(nt) = iy
4097 IF (
grids(j)%MAPSTA(jy,jx) .NE. 0 )
THEN
4100 wgth = rx(1+jx-jxl) * ry(1+jy-jyl)
4101 isea =
grids(j)%MAPFS(jy,jx)
4102 IF ( isea .EQ. 0 )
THEN
4110 stores(i,j)%AWG(nt,na) = wgth
4111 stores(i,j)%ISS(nt,na) = isea
4112 stores(i,j)%JSS(nt,na) = jsea
4113 stores(i,j)%IPS(nt,na) = isproc
4114 stores(i,j)%ITG(nt,na) = itag
4121 IF ( abs(
grids(j)%MAPSTA(jy,jx)) .EQ. 2 ) &
4122 stores(i,j)%FLA(nt) = .true.
4126 wgth = sum( stores(i,j)%AWG(nt,1:na) )
4127 IF ( wgth .LT. 0.499 )
THEN
4130 stores(i,j)%AWG(nt,:) = stores(i,j)%AWG(nt,:) / wgth
4133 stores(i,j)%NAV(nt) = na
4140 stores(i,j)%NTOT = nt
4152 ALLOCATE (
mdatas(i)%MAPODI(
ny,
nx), stat=istat )
4153 check_alloc_status( istat )
4159 IF ( abs(
mapsta(iy,ix)) .EQ. 1 )
THEN
4161 ELSE IF ( abs(
mapsta(iy,ix)) .EQ. 2 )
THEN
4171 ALLOCATE ( maska(
ny,
nx), stat=istat )
4172 check_alloc_status( istat )
4176 IF ( .NOT. shrank(i,j) ) cycle
4177 DO jj=1, stores(i,j)%NTOT
4178 ix = stores(i,j)%IX(jj)
4179 iy = stores(i,j)%IY(jj)
4180 IF ( ix.EQ.1 .OR. ix.EQ.
nx .OR. iy.EQ.1 .OR. iy.EQ.
ny )
THEN
4181 maska(iy,ix) = stores(i,j)%FLA(jj) .OR. &
4182 stores(i,j)%NAV(jj).EQ.0
4183 IF ( abs(
mapsta(iy,ix)).EQ.2 .AND. &
4184 .NOT.stores(i,j)%FLA(jj) .AND. &
4185 stores(i,j)%NAV(jj).GT.0 )
THEN
4189 WRITE (
mdse,1020) i, ix, 1
4193 maska(iy,ix) = stores(i,j)%FLA(jj)
4195 IF (
mapsta(iy,ix).EQ.0 .AND.
mapst2(iy,ix) .EQ.1 .AND. &
4196 stores(i,j)%NAV(jj).GT.0 )
mapodi(iy,ix) = 0.
4202 ALLOCATE ( maski(
ny,
nx), stat=istat )
4203 check_alloc_status( istat )
4208 IF ( abs(
mapsta(iy,ix)) .EQ. 2 .AND. &
4209 .NOT. maska(iy,ix) .AND. ( &
4210 mapodi(iy-1,ix ) .GE. 0. .OR. &
4211 mapodi(iy+1,ix ) .GE. 0. .OR. &
4212 mapodi(iy ,ix-1) .GE. 0. .OR. &
4213 mapodi(iy ,ix+1) .GE. 0. ) )
THEN
4214 maski(iy,ix) = .true.
4222 DEALLOCATE ( maska, stat=istat )
4223 check_dealloc_status( istat )
4227 IF ( maski(iy,ix) )
mapodi(iy,ix) = 0.
4259 IF ( ix .EQ. 1 )
THEN
4262 ELSE IF ( ix .EQ.
nx )
THEN
4271 IF (
mapodi(iy,ix) .EQ. todo .AND. ( &
4272 mapodi(iy+1,ix ) .GE. 0. .OR. &
4273 mapodi(iy ,jxl) .GE. 0. .OR. &
4274 mapodi(iy-1,ix ) .GE. 0. .OR. &
4275 mapodi(iy ,jxh) .GE. 0. .OR. &
4276 (
mapodi(iy+1,jxh) .GE. 0. .AND. .NOT. &
4277 (
mapsta(iy+1,ix ) .NE. 1 .AND. &
4278 mapsta(iy ,jxh) .NE. 1 ) ) .OR. &
4279 (
mapodi(iy+1,jxl) .GE. 0. .AND. .NOT. &
4280 (
mapsta(iy+1,ix ) .NE. 1 .AND. &
4281 mapsta(iy ,jxl) .NE. 1 ) ) .OR. &
4282 (
mapodi(iy-1,jxl) .GE. 0. .AND. .NOT. &
4283 (
mapsta(iy-1,ix ) .NE. 1 .AND. &
4284 mapsta(iy ,jxl) .NE. 1 ) ) .OR. &
4285 (
mapodi(iy-1,jxh) .GE. 0. .AND. .NOT. &
4286 (
mapsta(iy-1,ix ) .NE. 1 .AND. &
4287 mapsta(iy ,jxh) .NE. 1 ) ) ) ) &
4288 maski(iy,ix) = .true.
4295 IF ( maski(iy,ix) )
mapodi(iy,ix) = 0.
4307 IF ( ix .EQ. 1 )
THEN
4310 ELSE IF ( ix .EQ.
nx )
THEN
4318 IF (
mapodi(iy,ix) .EQ. todo .AND. ( &
4319 mapodi(iy+1,ix ) .GE. 0. .OR. &
4320 mapodi(iy-1,ix ) .GE. 0. .OR. &
4321 mapodi(iy ,jxh) .GE. 0. .OR. &
4322 mapodi(iy ,jxl) .GE. 0. .OR. &
4323 (
mapodi(iy+1,jxh) .GE. 0. .AND. .NOT. &
4324 (
mapsta(iy+1,ix ) .NE. 1 .AND. &
4325 mapsta(iy ,jxh) .NE. 1 ) ) .OR. &
4326 (
mapodi(iy+1,jxl) .GE. 0. .AND. .NOT. &
4327 (
mapsta(iy+1,ix ) .NE. 1 .AND. &
4328 mapsta(iy ,jxl) .NE. 1 ) ) .OR. &
4329 (
mapodi(iy-1,jxl) .GE. 0. .AND. .NOT. &
4330 (
mapsta(iy-1,ix ) .NE. 1 .AND. &
4331 mapsta(iy ,jxl) .NE. 1 ) ) .OR. &
4332 (
mapodi(iy-1,jxh) .GE. 0. .AND. .NOT. &
4333 (
mapsta(iy-1,ix ) .NE. 1 .AND. &
4334 mapsta(iy ,jxh) .NE. 1 ) ) ) ) &
4335 maski(iy,ix) = .true.
4342 IF ( ix .EQ. 1 )
THEN
4345 ELSE IF ( ix .EQ.
nx )
THEN
4353 sty = factor *
hqfac(iy,ix) / ( 0.58 *
grav )
4354 stx = factor *
hpfac(iy,ix) &
4356 stxy = sqrt( stx**2 + sty**2 )
4357 IF ( maski(iy,ix) )
THEN
4359 IF (
mapodi(iy+1,ix ).GE.0. .AND. .NOT. &
4360 maski(iy+1,ix ) ) newval = min( &
4361 newval ,
mapodi(iy+1,ix )+sty )
4362 IF (
mapodi(iy-1,ix ).GE.0. .AND. .NOT. &
4363 maski(iy-1,ix ) ) newval = min( &
4364 newval ,
mapodi(iy-1,ix )+sty )
4365 IF (
mapodi(iy ,jxh).GE.0. .AND. .NOT. &
4366 maski(iy ,jxh) ) newval = min( &
4367 newval ,
mapodi(iy ,jxh)+stx)
4368 IF (
mapodi(iy ,jxl).GE.0. .AND. .NOT. &
4369 maski(iy ,jxl) ) newval = min( &
4370 newval ,
mapodi(iy ,jxl)+stx)
4371 IF (
mapodi(iy+1,jxh).GE.0. .AND. .NOT. &
4372 (
mapsta(iy+1,ix ) .NE. 1 .AND. &
4373 mapsta(iy ,jxh) .NE. 1 ) ) newval = &
4374 min( newval ,
mapodi(iy+1,jxh)+stxy)
4375 IF (
mapodi(iy+1,jxl).GE.0. .AND. .NOT. &
4376 (
mapsta(iy+1,ix ) .NE. 1 .AND. &
4377 mapsta(iy ,jxl) .NE. 1 ) ) newval = &
4378 min( newval ,
mapodi(iy+1,jxl)+stxy)
4379 IF (
mapodi(iy-1,jxl).GE.0. .AND. .NOT. &
4380 (
mapsta(iy-1,ix ) .NE. 1 .AND. &
4381 mapsta(iy ,jxl) .NE. 1 ) ) newval = &
4382 min( newval ,
mapodi(iy-1,jxl)+stxy)
4383 IF (
mapodi(iy-1,jxh).GE.0. .AND. .NOT. &
4384 (
mapsta(iy-1,ix ) .NE. 1 .AND. &
4385 mapsta(iy ,jxh) .NE. 1 ) ) newval = &
4386 min( newval ,
mapodi(iy-1,jxh)+stxy)
4393 IF ( .NOT. change )
EXIT
4398 IF (
mapodi(iy,ix) .EQ. todo ) &
4403 DEALLOCATE ( maski, stat=istat )
4404 check_dealloc_status( istat )
4420 ixh = min(
nx, ip*65 )
4421 WRITE (
mdst,9024) ixl, ixh
4437 check_alloc_status( istat )
4440 IF ( .NOT. dogrid(i) ) cycle
4450 check_alloc_status( istat )
4459 IF ( .NOT. shrank(i,j) ) cycle
4465 DO jj=1, stores(i,j)%NTOT
4466 ix = stores(i,j)%IX(jj)
4467 iy = stores(i,j)%IY(jj)
4468 wgt3d(iy,ix,0) =
mdatas(i)%MAPODI(iy,ix)
4469 map3d(iy,ix,-2) =
mapfs(iy,ix)
4470 IF ( map3d(iy,ix,-2) .NE. 0 )
THEN
4471 map3d(iy,ix,-3) = 1 + (map3d(iy,ix,-2)-1)/
naproc
4476 map3d(iy,ix,-4) = map3d(iy,ix,-2) - &
4480 IF ( wgt3d(iy,ix,0).GE.0. .AND.
mapsta(iy,ix).NE.0. .AND. &
4481 stores(i,j)%NAV(jj).GT.0 )
THEN
4482 wgt3d(iy,ix,j) = odimax /
sig(1) *
dtmax
4483 DO na=1, stores(i,j)%NAV(jj)
4484 jx =
grids(j)%MAPSF(stores(i,j)%ISS(jj,na),1)
4485 jy =
grids(j)%MAPSF(stores(i,j)%ISS(jj,na),2)
4486 IF (
mapodi(jy,jx) .GE. 0. ) wgt3d(iy,ix,j) = &
4487 min( wgt3d(iy,ix,j) ,
mapodi(jy,jx) )
4489 IF ( wgt3d(iy,ix,j) .GT. 0. ) map3d(iy,ix,j) = 1
4493 stores(i,j)%NFIN = sum(map3d(:,:,j))
4495 WRITE (
mdst,9032) stores(i,j)%NFIN, stores(i,j)%NTOT
4503 map3d(iy,ix, 0) = maxval(map3d(iy,ix,1:))
4504 map3d(iy,ix,-1) = sum(map3d(iy,ix,1:))
4505 IF ( map3d(iy,ix,-1) .GT. 0 )
THEN
4507 wgt3d(iy,ix, 0:) = 0.
4508 map3d(iy,ix,-1:) = 0
4510 wgth = sum(wgt3d(iy,ix,:))
4511 IF ( wgth .GT. 1.e-25 )
THEN
4512 wgt3d(iy,ix,:) = wgt3d(iy,ix,:) / wgth
4516 IF ( map3d(iy,ix,-4) .EQ.
improc )
THEN
4517 nrec(i) = nrec(i) + 1
4519 IF ( map3d(iy,ix,jj) .GT. 0 ) &
4520 nrec(jj) = nrec(jj) + 1
4529 IF ( .NOT. shrank(i,j) ) cycle
4530 DO jj=1, stores(i,j)%NTOT
4531 ix = stores(i,j)%IX(jj)
4532 iy = stores(i,j)%IY(jj)
4533 IF ( map3d(iy,ix,j) .NE. 0 )
THEN
4534 DO na=1, stores(i,j)%NAV(jj)
4535 IF ( stores(i,j)%IPS(jj,na) .EQ.
improc ) &
4536 nsnd(j) = nsnd(j) + 1
4542 ng = maxval(map3d(:,:,-1))
4543 ntl = sum(map3d(:,:,0))
4555 ALLOCATE ( mapout(
ny,
nx), stat=istat )
4556 check_alloc_status( istat )
4561 IF ( abs(
mapsta(iy,ix)).EQ. 1 .AND. &
4562 mapodi(iy,ix) .EQ. 0. .AND. &
4563 map3d(iy,ix,-1) .EQ. 0 )
THEN
4568 WRITE(
mdse,1001) i, ix, iy
4571 jxl = min( ix, jxl )
4572 jxh = max( ix, jxh )
4573 jyl = min( iy, jyl )
4574 jyh = max( iy, jyh )
4583 WRITE (
mdst,9033) ntl, ng, nout
4584 WRITE (
mdst,9034) nrec
4585 WRITE (
mdst,9035) nsnd
4588 WRITE (
mdst,9037) map3d(iy,:,-1)
4592 IF ( nout .GT. 0 )
THEN
4594 WRITE(
mdse,1000) i, nout
4596 jxl = max( 1, jxl - extra )
4597 jxh = min(
nx, jxh + extra )
4598 jyl = max( 1, jyl - extra )
4599 jyh = min(
ny, jyh + extra )
4600 WRITE (
mdse,1002) jxl, jxh, jyl, jyh
4601 np = 1 + (jxh-jxl)/65
4603 ixl = jxl + (ip-1)*65
4604 ixh = min(
nx, ixl+64 )
4605 WRITE (
mdse,1005) ixl, ixh
4606 WRITE (
mdse,1003)
'STATUS MAP MAPSTA'
4610 WRITE (
mdse,1003)
'MISSING POINTS IN MAPSTA (**)'
4612 WRITE (
mdse,1004) mapout(iy,ixl:ixh)
4614 WRITE (
mdse,1003)
'OPEN BOUND. DISTANCE MAP MAPODI'
4619 WRITE (
mdse,1003)
'GRID COVERAGE MAP MAP3D'
4621 WRITE (
mdse,1004) map3d(iy,ixl:ixh,-1)
4629 DEALLOCATE ( mapout, stat=istat )
4630 check_dealloc_status( istat )
4635 IF ( .NOT. shrank(i,j) )
THEN
4636 IF ( i .NE. j )
WRITE (
mdst,9331) j
4639 WRITE (
mdst,9332) j, stores(i,j)%NFIN, i, j
4640 IF ( stores(i,j)%NFIN .EQ. 0 ) cycle
4642 DO jj=1, stores(i,j)%NTOT
4643 ix = stores(i,j)%IX(jj)
4644 iy = stores(i,j)%IY(jj)
4645 IF ( map3d(iy,ix,j) .EQ. 0 ) cycle
4647 na = stores(i,j)%NAV(jj)
4648 WRITE (
mdst,9333) ntl, ix, iy, map3d(iy,ix,-2), &
4649 map3d(iy,ix,-3), map3d(iy,ix,-4), &
4650 wgt3d(iy,ix,0), wgt3d(iy,ix,j), na, &
4651 stores(i,j)%ISS(jj,1), &
4652 stores(i,j)%JSS(jj,1), &
4653 stores(i,j)%IPS(jj,1), &
4654 stores(i,j)%AWG(jj,1), &
4655 stores(i,j)%ITG(jj,1)
4657 WRITE (
mdst,9334) stores(i,j)%ISS(jj,ia), &
4658 stores(i,j)%JSS(jj,ia), &
4659 stores(i,j)%IPS(jj,ia), &
4660 stores(i,j)%AWG(jj,ia), &
4661 stores(i,j)%ITG(jj,ia)
4673 IF (
eqstge(i,i)%NREC .NE. 0 )
THEN
4675 eqstge(i,i)%WGHT, stat=istat )
4676 check_dealloc_status( istat )
4679 WRITE (
mdst,9040) i, i
4683 IF ( nrec(i) .GT. 0 )
THEN
4684 ALLOCATE (
eqstge(i,i)%ISEA(nrec(i)) , &
4685 eqstge(i,i)%JSEA(nrec(i)) , &
4686 eqstge(i,i)%WGHT(nrec(i)), stat=istat )
4687 check_alloc_status( istat )
4688 eqstge(i,i)%NREC = nrec(i)
4690 WRITE (
mdst,9041) i, i, nrec(i)
4697 IF ( i .EQ. j ) cycle
4698 eqstge(i,i)%NTOT = stores(i,j)%NFIN
4700 IF (
eqstge(i,j)%NREC .NE. 0 )
THEN
4705 check_dealloc_status( istat )
4709 WRITE (
mdst,9042) i, j
4713 IF ( nrec(j) .GT. 0 )
THEN
4714 na = maxval( stores(i,j)%NAV(1:stores(i,j)%NTOT) )
4716 ALLOCATE (
eqstge(i,j)%ISEA(nrec(j)) , &
4717 eqstge(i,j)%JSEA(nrec(j)) , &
4718 eqstge(i,j)%WGHT(nrec(j)) , &
4720 eqstge(i,j)%NAVG(nrec(j)) , &
4721 eqstge(i,j)%WAVG(nrec(j),na), &
4722 eqstge(i,j)%RIP(nrec(j),na), &
4723 eqstge(i,j)%RTG(nrec(j),na), stat=istat )
4724 check_alloc_status( istat )
4725 eqstge(i,j)%NREC = nrec(j)
4727 WRITE (
mdst,9043) i, j, nrec(j), na
4731 IF (
eqstge(i,j)%NSND .NE. 0 )
THEN
4735 check_dealloc_status( istat )
4738 WRITE (
mdst,9044) i, j
4742 IF ( nsnd(j) .GT. 0 )
THEN
4743 ALLOCATE (
eqstge(i,j)%SIS(nsnd(j)) , &
4744 eqstge(i,j)%SJS(nsnd(j)) , &
4745 eqstge(i,j)%SI1(nsnd(j)) , &
4746 eqstge(i,j)%SI2(nsnd(j)) , &
4747 eqstge(i,j)%SIP(nsnd(j)) , &
4748 eqstge(i,j)%STG(nsnd(j)), stat=istat )
4749 check_alloc_status( istat )
4750 eqstge(i,j)%NSND = nsnd(j)
4752 WRITE (
mdst,9045) i, j, nsnd(j)
4761 IF (
eqstge(i,i)%NREC .GT. 0 )
THEN
4765 IF ( map3d(iy,ix,0) .EQ. 0 ) cycle
4766 IF ( map3d(iy,ix,-4) .NE.
improc ) cycle
4768 eqstge(i,i)%ISEA(ntl) = map3d(iy,ix,-2)
4769 eqstge(i,i)%JSEA(ntl) = map3d(iy,ix,-3)
4770 eqstge(i,i)%WGHT(ntl) = wgt3d(iy,ix,0)
4778 IF ( .NOT. shrank(i,j) ) cycle
4779 IF (
eqstge(i,j)%NREC .EQ. 0 ) cycle
4782 DO jj=1, stores(i,j)%NTOT
4783 ix = stores(i,j)%IX(jj)
4784 iy = stores(i,j)%IY(jj)
4785 IF ( map3d(iy,ix,j) .EQ. 0 ) cycle
4786 IF ( map3d(iy,ix,-4) .NE.
improc ) cycle
4788 eqstge(i,j)%ISEA(ntl) = map3d(iy,ix,-2)
4789 eqstge(i,j)%JSEA(ntl) = map3d(iy,ix,-3)
4790 eqstge(i,j)%WGHT(ntl) = wgt3d(iy,ix,j)
4791 na = stores(i,j)%NAV(jj)
4792 eqstge(i,j)%NAVG(ntl) = na
4793 eqstge(i,j)%WAVG(ntl,1:na) = stores(i,j)%AWG(jj,1:na)
4794 eqstge(i,j)%RIP (ntl,1:na) = stores(i,j)%IPS(jj,1:na)
4795 eqstge(i,j)%RTG (ntl,1:na) = stores(i,j)%ITG(jj,1:na)
4803 IF ( .NOT. shrank(i,j) ) cycle
4804 IF (
eqstge(i,j)%NSND .EQ. 0 ) cycle
4808 DO jj=1, stores(i,j)%NTOT
4809 ix = stores(i,j)%IX(jj)
4810 iy = stores(i,j)%IY(jj)
4811 IF ( map3d(iy,ix,j) .NE. 0 )
THEN
4812 ntpp(map3d(iy,ix,-4)) = ntpp(map3d(iy,ix,-4)) + 1
4813 DO na=1, stores(i,j)%NAV(jj)
4814 IF ( stores(i,j)%IPS(jj,na) .EQ.
improc )
THEN
4816 eqstge(i,j)%SIS(ntl) = stores(i,j)%ISS(jj,na)
4817 eqstge(i,j)%SJS(ntl) = stores(i,j)%JSS(jj,na)
4818 eqstge(i,j)%SI1(ntl) = ntpp(map3d(iy,ix,-4))
4819 eqstge(i,j)%SI2(ntl) = na
4820 eqstge(i,j)%SIP(ntl) = map3d(iy,ix,-4)
4821 eqstge(i,j)%STG(ntl) = stores(i,j)%ITG(jj,na)
4836 IF (
eqstge(i,i)%NREC .EQ. 0 )
THEN
4842 IF ( i.EQ.j .OR.
eqstge(i,j)%NREC.EQ.0 ) cycle
4846 WRITE (
mdst,9142) nsnd(1:na)
4848 ALLOCATE ( tstr(na), stat=istat )
4849 check_alloc_status( istat )
4850 DO jj=1,
eqstge(i,i)%NREC
4854 DO ntl=1,
eqstge(i,j)%NREC
4855 IF (
eqstge(i,i)%ISEA(jj) .EQ. &
4856 eqstge(i,j)%ISEA(ntl) )
THEN
4857 WRITE (tstr(ng),9144) ntl, &
4864 WRITE (
mdst,9145) jj,
eqstge(i,i)%ISEA(jj), &
4869 DEALLOCATE ( tstr, stat=istat )
4870 check_dealloc_status( istat )
4876 IF ( i.EQ.j .OR.
eqstge(i,j)%NREC.EQ.0 ) cycle
4878 DO jj=1,
eqstge(i,j)%NREC
4879 WRITE (
mdst,9147) jj,
eqstge(i,j)%NAVG(jj), &
4880 (
eqstge(i,j)%WAVG(jj,na), &
4881 eqstge(i,j)%RIP (jj,na), &
4882 eqstge(i,j)%RTG (jj,na), &
4883 na=1,
eqstge(i,j)%NAVG(jj) )
4890 IF ( i .EQ. j ) cycle
4891 IF (
eqstge(i,j)%NSND .EQ. 0 )
THEN
4895 DO jj=1,
eqstge(i,j)%NSND
4909 DEALLOCATE ( map3d, wgt3d, stat=istat )
4910 check_dealloc_status( istat )
4921 IF ( i.EQ.j .OR. stores(i,j)%NFIN.EQ.0 ) cycle
4922 nrec(i) = nrec(i) + 1
4928 check_alloc_status( istat )
4932 WRITE (
mdst,9050) na
4941 IF ( i.EQ.j .OR. stores(i,j)%NFIN.EQ.0 ) cycle
4976 IF (
sx/
grids(j)%SX .GT. facmax .OR. &
4977 sx/
grids(j)%SX .LT. 1./facmax .OR. &
4978 sy/
grids(j)%SY .GT. facmax .OR. &
4979 sy/
grids(j)%SY .LT. 1./facmax )
THEN
4982 CALL extcde ( 1050 )
4992 IF (
grdeql(i,0) .GE. 2 )
THEN
4999 CALL extcde ( 1051 )
5010 IF ( stores(i,j)%INIT )
THEN
5011 DEALLOCATE ( stores(i,j)%IX , stores(i,j)%IY , &
5012 stores(i,j)%NAV , stores(i,j)%FLA , &
5013 stores(i,j)%ISS , stores(i,j)%JSS , &
5014 stores(i,j)%IPS , stores(i,j)%ITG , &
5015 stores(i,j)%AWG , stat=istat )
5016 check_dealloc_status( istat )
5021 DEALLOCATE ( shrank, stores, nrec, nsnd, ntpp, stat=istat )
5022 check_dealloc_status( istat )
5028 1000
FORMAT (/
' *** WAVEWATCH III ERROR IN WMGEQL : *** '/ &
5029 ' UNCOVERED EDGE POINTS FOR GRID',i4,
' (',i6,
')'/)
5030 1001
FORMAT (
' GRID',i4,
' POINT',2i5,
' NOT COVERED (WMGEQL)')
5031 1002
FORMAT (
' DIAGNOSTICS IX AND IY RANGE:',4i6)
5032 1003
FORMAT (/
' SHOWING ',a/)
5033 1004
FORMAT (2x,65i2)
5034 1005
FORMAT (/
' SHOWING IX RANGE ',2i6)
5035 1006
FORMAT (
' (WILL NOT PRINT ANY MORE UNCOVERED POINTS)')
5037 1020
FORMAT (/
' *** WAVEWATCH III WARNING WMGEQL : *** '/ &
5038 ' REMOVED BOUNDARY POINT FROM OPEN EDGE DISTANCE MAP'/ &
5039 ' GRID, IX, IY :',3i6)
5041 1050
FORMAT (/
' *** WAVEWATCH III ERROR IN WMGEQL : *** '/ &
5042 ' GRID INCREMENTS TOO DIFFERENT '/ &
5043 ' GRID',i4,
' INCREMENTS ',2f8.2/ &
5044 ' GRID',i4,
' INCREMENTS ',2f8.2/)
5045 1051
FORMAT (/
' *** WAVEWATCH III ERROR IN WMGEQL : *** '/ &
5046 ' OVERLAPPING GRIDS NEED TO BE IN SAME GROUP '/ &
5047 ' GRID',i4,
' IN GROUP',i4/ &
5048 ' GRID',i4,
' IN GROUP',i4/)
5051 9010
FORMAT (
' TEST WMGEQL : STARTING LOOP OVER GRIDS')
5052 9011
FORMAT (
' TEST WMGEQL : I, RANK :',2i4)
5053 9012
FORMAT (
' GRID ',i3,
' HAS SAME RANK')
5054 9013
FORMAT (
' ',a)
5058 9020
FORMAT (
' TEST WMGEQL : GENERATING DISTANCE MAP GRID ',i3)
5059 9024
FORMAT (
' TEST WMGEQL : FINAL MAP FOR X RANGE ',2i6)
5060 9025
FORMAT (2x,65i2)
5064 9030
FORMAT (
' TEST WMGEQL : DEPENDENCE INFORMATION GRID ',i3)
5065 9031
FORMAT (
' CHECKING GRID ',i3)
5066 9032
FORMAT (
' POINTS USED/AVAIL :',2i6)
5067 9033
FORMAT (
' TOTAL/GRIDS/OUT :',3i6)
5068 9034
FORMAT (
' LOCAL PER GRID :',15i6)
5069 9035
FORMAT (
' SENDING PER GRID :',15i6)
5070 9036
FORMAT (
' TEST WMGEQL : NUMBER OF CONTRIBUTING GRIDS MAP')
5071 9037
FORMAT (2x,65i2)
5075 9040
FORMAT (
' TEST WMGEQL : GRID ',i2,
'-',i2,
' CLEAR STORAGE')
5076 9041
FORMAT (
' TEST WMGEQL : GRID ',i2,
'-',i2,
' STORAGE SIZE',i6)
5077 9042
FORMAT (
' RECV ',i2,
'-',i2,
' CLEAR STORAGE')
5078 9043
FORMAT (
' RECV ',i2,
'-',i2,
' STORAGE SIZE',2i6)
5079 9044
FORMAT (
' SEND ',i2,
'-',i2,
' CLEAR STORAGE')
5080 9045
FORMAT (
' SEND ',i2,
'-',i2,
' STORAGE SIZE',i6)
5084 9050
FORMAT (
' TEST WMGEQL : GRDEQL DIMENSIONED AT ',i2)
5085 9051
FORMAT (
' TEST WMGEQL : GRDEQL :')
5086 9052
FORMAT (
' ',2i4,
' : ',20i3)
5090 9140
FORMAT (
' TEST WMGEQL : NO RECEIVING DATA FOR GRID ',i3, &
5091 ' <=====================================')
5092 9141
FORMAT (
' TEST WMGEQL : RECEIVING DATA GRID ',i3, &
5093 ' <=====================================')
5094 9142
FORMAT (
' RECEIVING FROM GRID(S) ',10i3)
5095 9143
FORMAT (16x,
'COUNT, ISEA, JSEA, WEIGHT / ', &
5096 'COUNT WEIGHT NR PER GRID')
5097 9144
FORMAT (i6,f6.2,i6)
5098 9145
FORMAT (12x,3i6,f6.2,10(
' - ',a))
5099 9146
FORMAT (
' TEST WMGEQL : RECEIVING DATA AVG. GRID ',i3)
5100 9147
FORMAT (12x,i6,i2,4(f8.2,i4,i6))
5104 9240
FORMAT (
' TEST WMGEQL : NO SENDING DATA FOR GRID ',i3, &
5105 ' <=====================================')
5106 9241
FORMAT (
' TEST WMGEQL : SENDING DATA GRID ',i3, &
5107 ' <====================================='/ &
5108 11x,
'COUNT, ISEA, JSEA, ARRAY IND., PROC, TAG')
5109 9242
FORMAT (
' ',4i8,i4,2i8)
5113 9330
FORMAT (
' TEST WMGEQL : FULL SOURCE INFO GRID ',i3, &
5114 ' <=====================================')
5115 9331
FORMAT (
' GRID ',i3,
' IS NOT OF SAME RANK')
5116 9332
FORMAT (
' GRID ',i3,
' CONTRIBUTES TO',i6, &
5118 18x,
'<---------- GRID',i6,
' ---------->', &
5119 4x,
'<----------- GRID',i6,
' ----------->'/ &
5120 18x,
'NR IX IY ISEA JSEA IP WGTH', &
5121 2x,
' WGTH NA ISEA JSEA IP WGTH TAG' )
5122 9333
FORMAT (15x,3i5,2i6,i4,f6.2,2x,f6.2,i4,2i6,i4,f6.2,i6)
5123 9334
FORMAT (64x,2i6,i4,f6.2,i6)
5213 INTEGER :: I, J, LOW
5215 INTEGER,
SAVE :: IENT = 0
5219 CALL strace (ient,
'WMRSPC')
5230 IF ( .NOT.
ALLOCATED(
respec) )
THEN
5232 check_alloc_status( istat )
5265 9000
FORMAT (
'TEST WMRSPC : MAP RESPEC FILLED ')
5266 9001
FORMAT (
' ',i4,
' : ',20l2)
5379 INTEGER :: I, J, IX, IY, IXY, JX, JY, NPJ, &
5380 NR, NT, NA, NTL, JJ, NIT, NG, NOUT, &
5381 ISEA, JSEA, IPRC, ITAG, TGRP, NPMX, &
5382 IP, NP, ICROOT, JCROOT, IEER
5385 INTEGER,
Dimension(MPI_STATUS_SIZE):: MPIState
5389 INTEGER,
SAVE :: IENT = 0
5391 INTEGER,
ALLOCATABLE :: NREC(:), NSND(:), NTPP(:), &
5392 IBPTS(:), JBPTS(:), IPBPT(:)
5393 REAL,
PARAMETER :: ODIMAX = 25.
5394 REAL,
ALLOCATABLE :: XLon(:), YLat(:)
5396 LOGICAL,
ALLOCATABLE :: SHRANK(:,:), DOGRID(:)
5398 CHARACTER(LEN=18),
ALLOCATABLE :: TSTR(:)
5399 CHARACTER(LEN=18) :: DSTR
5403 INTEGER :: NTOT, NFIN
5404 INTEGER,
POINTER :: ICVBP(:), MSDBP(:), ISS(:), JSS(:), &
5405 JCVBP(:), IPCVB(:), IPS(:), ITG(:)
5406 LOGICAL,
POINTER :: FLA(:)
5410 TYPE(store),
ALLOCATABLE :: STORES(:,:)
5413 CALL strace (ient,
'WMSMCEQL ')
5420 dogrid(
nrgrd), stat=istat )
5421 check_alloc_status( istat )
5428 stores(i,j)%INIT = .false.
5429 stores(i,j)%NTOT = 0
5430 stores(i,j)%NFIN = 0
5455 IF( (
grank(i).NE.
grank(j)) .OR. (i.EQ.j) ) cycle
5456 shrank(i,j) = .true.
5460 dogrid(i) = nr .GT. 0
5462 IF( nr .EQ. 0 ) cycle
5482 IF(
improc .EQ. icroot )
THEN
5484 WRITE(
mdse,*)
"ICROOT, NT are", icroot, nt
5495 IF(
improc .EQ. icroot )
THEN
5500 WRITE(
mdse,*)
"ICROOT, NT are", icroot, nt
5510 CALL mpi_bcast( nt, 1, mpi_integer, &
5524 IF( nt .EQ. 0 ) cycle
5527 ALLOCATE( ibpts(nt), jbpts(nt), ipbpt(nt), &
5528 xlon(nt), ylat(nt), stat=istat )
5529 check_alloc_status( istat )
5533 IF(
improc .EQ. icroot )
THEN
5541 IF( abs(
mapsta(iy,ix)) .EQ. 2 )
THEN
5543 xlon(ixy) = real(
xgrd(iy,ix))
5544 ylat(ixy) = real(
ygrd(iy,ix))
5546 jbpts(ixy) = 1 + (isea - 1)/np
5547 ipbpt(ixy) = icroot-1 + isea-(jbpts(ixy)-1)*np
5554 ibpts =
grids(i)%ISMCBP(1:nt)
5555 CALL w3smcell( i, nt, ibpts, xlon, ylat )
5561 jsea = 1 + (isea - 1)/np
5562 ipbpt(ix) = icroot - 1 + isea - (jsea - 1)*np
5579 CALL mpi_bcast( ibpts(1), nt, mpi_integer, &
5581 CALL mpi_bcast( jbpts(1), nt, mpi_integer, &
5583 CALL mpi_bcast( ipbpt(1), nt, mpi_integer, &
5585 CALL mpi_bcast( xlon(1), nt, mpi_real, &
5587 CALL mpi_bcast( ylat(1), nt, mpi_real, &
5595 IF( .NOT. shrank(i,j) ) cycle
5610 stores(i,j)%INIT = .true.
5611 ALLOCATE( stores(i,j)%ICVBP(nt), stores(i,j)%MSDBP(nt), &
5612 stores(i,j)%JCVBP(nt), stores(i,j)%IPCVB(nt), &
5613 stores(i,j)%ISS(nt), stores(i,j)%JSS(nt), &
5614 stores(i,j)%IPS(nt), stores(i,j)%ITG(nt), &
5615 stores(i,j)%FLA(nt), stat=istat )
5616 check_alloc_status( istat )
5617 stores(i,j)%ICVBP = 0
5618 stores(i,j)%JCVBP = 0
5619 stores(i,j)%IPCVB = 0
5620 stores(i,j)%MSDBP = 0
5625 stores(i,j)%FLA = .false.
5630 IF(
improc .EQ. jcroot )
THEN
5634 CALL w3smcgmp( j, nt, xlon, ylat, stores(i,j)%MSDBP )
5645 CALL mpi_bcast( stores(i,j)%MSDBP(1), nt, mpi_integer, &
5658 stores(i,j)%ICVBP = ibpts
5659 stores(i,j)%JCVBP = jbpts
5660 stores(i,j)%IPCVB = ipbpt
5666 IF( stores(i,j)%MSDBP(jx) .EQ. 0 ) cycle
5671 isea = stores(i,j)%MSDBP(jx)
5673 jsea = 1 + (isea - 1)/npj
5674 iprc = jcroot - 1 + isea - (jsea - 1)*npj
5676 stores(i,j)%ISS(jx) = isea
5677 stores(i,j)%JSS(jx) = jsea
5678 stores(i,j)%IPS(jx) = iprc
5679 stores(i,j)%ITG(jx) = itag
5680 stores(i,j)%FLA(jx) = .true.
5686 stores(i,j)%NTOT = nt
5687 stores(i,j)%NFIN = ntl
5695 WRITE(
mdse,1060) i, nt, j, ntl
5702 DEALLOCATE( ibpts, jbpts, ipbpt, xlon, ylat, stat=istat )
5703 check_dealloc_status( istat )
5715 check_alloc_status( istat )
5718 IF ( .NOT. dogrid(i) ) cycle
5737 npmx =
outpts(i)%NAPROC + icroot - 1
5744 IF( .NOT. shrank(i,j) ) cycle
5745 IF( stores(i,j)%NFIN > 0 )
THEN
5746 DO ix = 1, stores(i,j)%NTOT
5747 IF( stores(i,j)%MSDBP(ix) > 0 .AND. &
5748 stores(i,j)%IPCVB(ix) .EQ.
improc )
THEN
5749 nrec(i) = nrec(i) + 1
5750 nrec(j) = nrec(j) + 1
5759 IF( .NOT. shrank(j,i) ) cycle
5760 IF( stores(j,i)%NFIN > 0 )
THEN
5761 DO iy=1, stores(j,i)%NTOT
5762 IF( stores(j,i)%MSDBP(iy) > 0 .AND. &
5763 stores(j,i)%IPS( iy) .EQ.
improc )
THEN
5764 nsnd(j) = nsnd(j) + 1
5776 IF(
eqstge(i,i)%NREC .NE. 0 )
THEN
5778 eqstge(i,i)%WGHT, stat=istat )
5779 check_dealloc_status( istat )
5782 WRITE (
mdst,9040) i, i
5786 IF( nrec(i) .GT. 0 )
THEN
5787 ALLOCATE(
eqstge(i,i)%ISEA(nrec(i)), &
5788 eqstge(i,i)%JSEA(nrec(i)), &
5789 eqstge(i,i)%WGHT(nrec(i)), stat=istat )
5790 check_alloc_status( istat )
5791 eqstge(i,i)%NREC = nrec(i)
5793 WRITE (
mdst,9041) i, i, nrec(i)
5803 IF( i .EQ. j ) cycle
5812 IF(
eqstge(i,j)%NREC .NE. 0 )
THEN
5818 check_dealloc_status( istat )
5823 IF( nrec(j) .GT. 0 )
THEN
5826 ALLOCATE(
eqstge(i,j)%ISEA(nrec(j)), &
5827 eqstge(i,j)%JSEA(nrec(j)), &
5828 eqstge(i,j)%WGHT(nrec(j)), &
5830 eqstge(i,j)%NAVG(nrec(j)), &
5831 eqstge(i,j)%WAVG(nrec(j),na), &
5832 eqstge(i,j)%RIP( nrec(j),na), &
5833 eqstge(i,j)%RTG( nrec(j),na), stat=istat )
5834 check_alloc_status( istat )
5835 eqstge(i,j)%NREC = nrec(j)
5838 IF(
eqstge(j,i)%NSND .NE. 0 )
THEN
5842 check_dealloc_status( istat )
5846 IF( nsnd(j) .GT. 0 )
THEN
5847 ALLOCATE(
eqstge(j,i)%SIS(nsnd(j)), &
5848 eqstge(j,i)%SJS(nsnd(j)), &
5849 eqstge(j,i)%SI1(nsnd(j)), &
5850 eqstge(j,i)%SI2(nsnd(j)), &
5851 eqstge(j,i)%SIP(nsnd(j)), &
5852 eqstge(j,i)%STG(nsnd(j)), stat=istat )
5853 check_alloc_status( istat )
5854 eqstge(j,i)%NSND = nsnd(j)
5866 IF( .NOT. shrank(i,j) ) cycle
5867 IF(
eqstge(i,j)%NREC .EQ. 0 ) cycle
5869 DO ix=1, stores(i,j)%NTOT
5870 IF( stores(i,j)%MSDBP(ix) > 0 .AND. &
5871 stores(i,j)%IPCVB(ix) .EQ.
improc )
THEN
5874 eqstge(i,i)%ISEA(nt) = stores(i,j)%ICVBP(ix)
5875 eqstge(i,i)%JSEA(nt) = stores(i,j)%JCVBP(ix)
5877 eqstge(i,i)%WGHT(nt) = 1.0
5881 eqstge(i,j)%ISEA(ntl) = stores(i,j)%ICVBP(ix)
5882 eqstge(i,j)%JSEA(ntl) = stores(i,j)%JCVBP(ix)
5884 eqstge(i,j)%WGHT(ntl) = 1.0
5885 eqstge(i,j)%NAVG(ntl) = 1
5886 eqstge(i,j)%WAVG(ntl,1) = 1.0
5887 eqstge(i,j)%RIP (ntl,1) = stores(i,j)%IPS(ix)
5888 eqstge(i,j)%RTG (ntl,1) = stores(i,j)%ITG(ix)
5897 IF ( .NOT. shrank(j,i) ) cycle
5898 IF (
eqstge(j,i)%NSND .EQ. 0 ) cycle
5901 DO iy =1, stores(j,i)%NTOT
5902 IF( stores(j,i)%MSDBP(iy) > 0 )
THEN
5903 iprc=stores(j,i)%IPS( iy)
5904 ntpp(iprc) = ntpp(iprc) + 1
5905 IF( iprc .EQ.
improc )
THEN
5907 eqstge(j,i)%SIS(ntl) = stores(j,i)%ISS(iy)
5908 eqstge(j,i)%SJS(ntl) = stores(j,i)%JSS(iy)
5909 eqstge(j,i)%SI1(ntl) = ntpp(iprc)
5911 eqstge(j,i)%SIP(ntl) = stores(j,i)%IPCVB(iy)
5912 eqstge(j,i)%STG(ntl) = stores(j,i)%ITG(iy)
5930 IF ( i.EQ.j .OR. stores(i,j)%NFIN.EQ.0 ) cycle
5931 nrec(i) = nrec(i) + 1
5937 check_alloc_status( istat )
5941 WRITE (
mdst,9050) na
5950 IF ( i.EQ.j .OR. stores(i,j)%NFIN.EQ.0 ) cycle
5966 IF(
grdeql(i,0) .GE. 2 )
THEN
5973 CALL extcde ( 1051 )
5990 IF( stores(i,j)%INIT )
THEN
5991 DEALLOCATE( stores(i,j)%ICVBP, stores(i,j)%MSDBP, &
5992 stores(i,j)%JCVBP, stores(i,j)%IPCVB, &
5993 stores(i,j)%ISS , stores(i,j)%JSS , &
5994 stores(i,j)%IPS , stores(i,j)%ITG , &
5995 stores(i,j)%FLA , stat=istat )
5996 check_dealloc_status( istat )
6001 DEALLOCATE( shrank, stores, nrec, nsnd, ntpp, stat=istat )
6002 check_dealloc_status( istat )
6010 WRITE(
mdse,*)
" *** WMSMCEQL completed from PE ",
improc
6017 1000
FORMAT (/
' *** WAVEWATCH III ERROR IN WMSMCEQL : *** '/ &
6018 ' UNCOVERED EDGE POINTS FOR GRID',i4,
' (',i6,
')'/)
6019 1001
FORMAT (
' GRID',i4,
' POINT',2i5,
' NOT COVERED (WMGEQL)')
6020 1002
FORMAT (
' DIAGNOSTICS IX AND IY RANGE:',4i6)
6021 1003
FORMAT (/
' SHOWING ',a/)
6022 1004
FORMAT (2x,65i2)
6023 1005
FORMAT (/
' SHOWING IX RANGE ',2i6)
6024 1006
FORMAT (
' (WILL NOT PRINT ANY MORE UNCOVERED POINTS)')
6026 1020
FORMAT (/
' *** WAVEWATCH III WARNING WMSMCEQL : *** '/ &
6027 ' REMOVED BOUNDARY POINT FROM OPEN EDGE DISTANCE MAP'/ &
6028 ' GRID, IX, IY :',3i6)
6030 1050
FORMAT (/
' *** WAVEWATCH III ERROR IN WMSMCEQL : *** '/ &
6031 ' GRID INCREMENTS TOO DIFFERENT '/ &
6032 ' GRID',i4,
' INCREMENTS ',2f8.2/ &
6033 ' GRID',i4,
' INCREMENTS ',2f8.2/)
6034 1051
FORMAT (/
' *** WAVEWATCH III ERROR IN WMSMCEQL : *** '/ &
6035 ' OVERLAPPING GRIDS NEED TO BE IN SAME GROUP '/ &
6036 ' GRID',i4,
' IN GROUP',i4/ &
6037 ' GRID',i4,
' IN GROUP',i4/)
6038 1060
FORMAT (
' Grid NBPI from',2i6,
' found in',2i6)
6042 9010
FORMAT (
' TEST WMSMCEQL : STARTING LOOP OVER GRIDS')
6043 9011
FORMAT (
' TEST WMSMCEQL : I, RANK :',2i4)
6044 9012
FORMAT (
' GRID ',i3,
' HAS SAME RANK')
6045 9013
FORMAT (
' ',a)
6049 9020
FORMAT (
' TEST WMSMCEQL : GENERATING DISTANCE MAP GRID ',i3)
6050 9024
FORMAT (
' TEST WMSMCEQL : FINAL MAP FOR X RANGE ',2i6)
6051 9025
FORMAT (2x,65i2)
6055 9030
FORMAT (
' TEST WMSMCEQL : DEPENDENCE INFORMATION GRID ',i3)
6056 9031
FORMAT (
' CHECKING GRID ',i3)
6057 9032
FORMAT (
' POINTS USED/AVAIL :',2i6)
6058 9033
FORMAT (
' TOTAL/GRIDS/OUT :',3i6)
6059 9034
FORMAT (
' LOCAL PER GRID :',15i6)
6060 9035
FORMAT (
' SENDING PER GRID :',15i6)
6061 9036
FORMAT (
' TEST WMSMCEQL : NUMBER OF CONTRIBUTING GRIDS MAP')
6062 9037
FORMAT (2x,65i2)
6066 9040
FORMAT (
' TEST WMSMCEQL : GRID ',i2,
'-',i2,
' CLEAR STORAGE')
6067 9041
FORMAT (
' TEST WMSMCEQL : GRID ',i2,
'-',i2,
' STORAGE SIZE',i6)
6068 9042
FORMAT (
' RECV ',i2,
'-',i2,
' CLEAR STORAGE')
6069 9043
FORMAT (
' RECV ',i2,
'-',i2,
' STORAGE SIZE',2i6)
6070 9044
FORMAT (
' SEND ',i2,
'-',i2,
' CLEAR STORAGE')
6071 9045
FORMAT (
' SEND ',i2,
'-',i2,
' STORAGE SIZE',i6)
6075 9050
FORMAT (
' TEST WMSMCEQL : GRDEQL DIMENSIONED AT ',i2)
6076 9051
FORMAT (
' TEST WMSMCEQL : GRDEQL :')
6077 9052
FORMAT (
' ',2i4,
' : ',20i3)