200 INTEGER :: ndsi, ndsm, ndstrc, ntrace, j, ierr, &
201 ng, ix, iy, ngb, ngx, ngy, ig, igg, &
202 igx, igy, igy0, igyn, igx0, igxn, &
203 mingrd, minnr, minnxt, minnnr, &
204 nitmax, iit, ingmin, ingmax, &
205 ingmnc, ingmxc, inglag, jj, &
206 nstdlg, mstdlg = 5, nseat, j1, j2, &
207 j3, j4, j5, idfm1, idfm2, idfm3, &
208 idla1, idla2, idla3, vsc3, nhext
210 INTEGER,
SAVE :: ient = 0
213 INTEGER :: ndsg = 35, ntgrds = 0
215 INTEGER,
ALLOCATABLE :: msplit(:,:), mtemp(:,:), ingrd(:)
216 REAL :: ratio1, xmean, starg, stdmin, &
217 zbdum, zbmin, vsc1, vsc2, fracl, frach
218 LOGICAL :: global, ok, done, frflag
219 LOGICAL,
ALLOCATABLE :: isnext(:), sea(:,:)
220 CHARACTER(LEN=1) :: comstr
221 CHARACTER(LEN=3) :: g0id
222 CHARACTER(LEN=4) :: idgrid, idclse, ptclse
223 CHARACTER(LEN=6) :: nrfmt
224 CHARACTER(LEN=11) :: fext, aext
225 CHARACTER(LEN=16) :: rform1, rform2, rform3
226 CHARACTER(LEN=20) :: fname, iname
229 LOGICAL :: stradle, instat
230 INTEGER :: npts, nyl, nyh, nxl, nxh
234 INTEGER :: nmin, nmax
240 INTEGER,
POINTER :: mask(:,:)
242 REAL,
POINTER :: zbin(:,:), obsx(:,:), obsy(:,:)
246 TYPE(
stats_grid),
POINTER :: gstats(:), gstold(:)
259 CALL w3seto ( 1, 6, 6 )
271 CALL itrace ( ndstrc, ntrace )
274 OPEN ( ndsg,
file=
'./ww3.ww3_gspl', form=
'UNFORMATTED', convert=
file_endian)
281 CALL strace (ient,
'W3GSPL')
285 OPEN (ndsi,
file=
fnmpre(:j)//
'ww3_gspl.inp',status=
'OLD', &
288 READ (ndsi,
'(A)',
END=801,ERR=802,IOSTAT=IERR) comstr
289 IF (comstr.EQ.
' ') comstr =
'$'
290 WRITE (ndso,901) comstr
295 CALL nextln ( comstr , ndsi , ndse )
296 READ (ndsi,*,
END=801,ERR=802,IOSTAT=IERR) fext
298 CALL w3iogr (
'READ', ndsm, 1, fext )
301 WRITE (ndso,902) fext, gname
305 WRITE ( ndso,903)
'rectilinear'
308 WRITE ( ndso,903)
'curvictilinear'
311 WRITE ( ndso,903)
'unstructured'
315 WRITE ( ndso,903)
'not recognized'
321 WRITE ( ndso,904)
'none'
325 WRITE ( ndso,904)
'global (simple)'
329 WRITE ( ndso,904)
'global (tripolar)'
334 WRITE ( ndso,904)
'not recognized'
338 WRITE (ndso,905) nx, ny, nsea
339 IF ( nsea .EQ. 0 )
GOTO 824
344 CALL nextln ( comstr , ndsi , ndse )
345 READ (ndsi,*,
END=801,ERR=802,IOSTAT=IERR) NG, NITMAX, STARG, nhext
347 nitmax = max( 1, nitmax )
348 starg = max( 0. , starg )
349 nhext = max( 0, nhext )
350 WRITE (ndso,930) ng, nitmax, starg, nhext
352 CALL nextln ( comstr , ndsi , ndse )
353 READ (ndsi,*,
END=801,ERR=802,IOSTAT=IERR) IDLA1, IDFM1, &
355 IF (idla1.LT.1 .OR. idla1.GT.4) idla1 = 1
356 IF (idfm1.LT.1 .OR. idfm1.GT.3) idfm1 = 1
357 IF ( abs(vsc1) .LT. 1.e-15 ) vsc1 = 1.
359 WRITE (ndso,931) idla1, idfm1, vsc1, rform1
361 CALL nextln ( comstr , ndsi , ndse )
362 READ (ndsi,*,
END=801,ERR=802,IOSTAT=IERR) IDLA2, IDFM2, &
364 IF (idla2.LT.1 .OR. idla2.GT.4) idla2 = 1
365 IF (idfm2.LT.1 .OR. idfm2.GT.3) idfm2 = 1
366 IF ( abs(vsc2) .LT. 1.e-15 ) vsc2 = 1.
367 IF ( trflag .EQ. 0 )
THEN
370 WRITE (ndso,933) idla2, idfm2, vsc2, rform2
373 CALL nextln ( comstr , ndsi , ndse )
374 READ (ndsi,*,
END=801,ERR=802,IOSTAT=IERR) IDLA3, IDFM3, &
376 IF (idla3.LT.1 .OR. idla3.GT.4) idla3 = 1
377 IF (idfm3.LT.1 .OR. idfm3.GT.3) idfm3 = 1
378 IF ( vsc3 .EQ. 0 ) vsc3 = 1
379 WRITE (ndso,934) idla3, idfm3, vsc3, rform3
381 CALL nextln ( comstr , ndsi , ndse )
382 READ (ndsi,*,
END=801,ERR=802,IOSTAT=IERR) FRACL, FRACH, frflag
383 fracl = max( 0. , fracl )
384 frach = min( 1. , frach )
385 WRITE (ndso,935) fracl, frach
386 IF ( fracl .GT. frach )
GOTO 830
387 IF ( .NOT. frflag )
WRITE (ndso,936)
393 ALLOCATE ( msplit(ny,nx) , mtemp(ny,nx), sea(ny,nx) )
397 IF ( mapsta(iy,ix) .EQ. 0 )
THEN
411 ratio1 = real(nx) / real(ny)
417 IF ( ngx*ngy .GE. ng )
EXIT
418 IF ( real(ngx)/real(ngy) .GT. ratio1 )
THEN
425 IF ( ngx .GT. ngy )
THEN
426 IF ( (ngy-1)*ngx .GE. ng ) ngy = ngy - 1
427 IF ( (ngx-1)*ngy .GE. ng ) ngx = ngx - 1
429 IF ( (ngy-1)*ngx .GE. ng ) ngy = ngy - 1
430 IF ( (ngx-1)*ngy .GE. ng ) ngx = ngx - 1
434 WRITE (ndst,9040) ngx, ngy
446 ALLOCATE ( ingrd(ngx*ngy) )
456 IF ( igy .EQ. ngy )
THEN
459 igyn = nint( real(ny*igy) / real(ngy) )
466 IF ( igx .EQ. ngx )
THEN
469 igxn = nint( real(nx*igx) / real(ngx) )
474 IF ( mtemp(iy,ix) .EQ. -1 )
THEN
476 ingrd(ig) = ingrd(ig) + 1
481 IF ( ingrd(ig) .GT. 0 )
THEN
483 WRITE (ndst,9042) ig, igx0, igxn, igy0, igyn, &
489 WRITE (ndst,9042) ig, igx0, igxn, igy0, igyn, &
490 ingrd(ig),
'EMPTY (SKIPPED)'
499 IF ( ig .LT. ng )
THEN
500 IF ( ngx .LT. ngy )
THEN
507 WRITE (ndst,9040) ngx, ngy
517 mingrd = mingrd + ingrd(j)
519 IF ( mingrd .NE. nsea )
GOTO 825
522 WRITE (ndst,9043) ig, ng
531 IF ( igg .EQ. ng )
EXIT
536 IF ( ingrd(j) .LT. mingrd )
THEN
541 ingrd(minnr) = nsea + 1
544 WRITE (ndst,9044) mingrd, minnr
547 ALLOCATE ( isnext(0:ig) )
552 IF ( ( mtemp(iy ,ix ) - minnr ) * &
553 ( mtemp(iy+1,ix ) - minnr ) * &
554 ( mtemp(iy ,ix+1) - minnr ) * &
555 ( mtemp(iy+1,ix+1) - minnr ) .EQ. 0 )
THEN
556 isnext(mtemp(iy ,ix )) = .true.
557 isnext(mtemp(iy+1,ix )) = .true.
558 isnext(mtemp(iy ,ix+1)) = .true.
559 isnext(mtemp(iy+1,ix+1)) = .true.
566 IF ( ( mtemp(iy ,nx) - minnr ) * &
567 ( mtemp(iy+1,nx) - minnr ) * &
568 ( mtemp(iy , 1) - minnr ) * &
569 ( mtemp(iy+1, 1) - minnr ) .EQ. 0 )
THEN
570 isnext(mtemp(iy ,nx)) = .true.
571 isnext(mtemp(iy+1,nx)) = .true.
572 isnext(mtemp(iy , 1)) = .true.
573 isnext(mtemp(iy+1, 1)) = .true.
581 IF ( isnext(j) .AND. ( ingrd(j) .LT. minnxt ) )
THEN
588 WRITE (ndst,9045) minnxt, minnnr
591 IF ( minnnr .GT. 0 )
THEN
594 IF ( mtemp(iy,ix) .EQ. minnr )
THEN
595 mtemp(iy,ix) = minnnr
596 ingrd(minnnr) = ingrd(minnnr) + 1
602 WRITE (ndst,9046) minnr, minnnr
604 WRITE (ndst,9047) j, ingrd(j)
607 WRITE (ndst,9048) minnr
613 WRITE (ndst,9043) igg, ng
623 IF ( ingrd(j) .GT. nsea ) ingrd(j) = 0
625 WRITE (ndso,9047) j, ingrd(j)
633 IF ( ingrd(j) .NE. 0 )
THEN
637 IF ( mtemp(iy,ix) .EQ. j ) msplit(iy,ix) = igg
646 WRITE ( ndsg ) ((real(msplit(iy,ix)),ix=1,nx),iy=1,ny)
654 ALLOCATE ( gstats(ng), gstold(ng), pgrid(ng) )
655 gstats(:)%INSTAT = .true.
660 WRITE (ndso,951) 0, mstats%NMIN, mstats%NMAX, &
661 100.*mstats%RSTD/xmean
663 IF ( mstats%NMIN .EQ. 0 )
GOTO 850
669 stdmin = 100.*mstats%RSTD/xmean
674 IF ( ng .EQ. 1 )
EXIT
680 WRITE (ndst,9050)
'a', mstats%NMIN, mstats%NMAX, mstats%RSTD
685 IF ( mstats%NMIN .LT. nint(0.45*xmean) )
THEN
691 IF ( mstold%NMIN .NE. mstats%NMIN )
THEN
692 WRITE (ndso,951) iit, mstats%NMIN, mstats%NMAX, &
693 100.*mstats%RSTD/xmean
694 IF ( mstats%NMIN .EQ. 0 )
GOTO 850
696 WRITE ( ndsg ) ((real(msplit(iy,ix)),ix=1,nx),iy=1,ny)
702 WRITE (ndso,952) mstats%NMIN, mstats%NMAX, &
703 100.*mstats%RSTD/xmean
704 IF ( mstats%NMIN .EQ. 0 )
GOTO 850
718 WRITE (ndst,9051)
'd', mstats%NMIN, mstats%NMAX, mstats%RSTD
744 WRITE (ndso,951) iit, mstats%NMIN, mstats%NMAX, &
745 100.*mstats%RSTD/xmean
747 WRITE (ndst,9051)
'g', mstats%NMIN, mstats%NMAX, mstats%RSTD
751 IF ( mstats%NMIN .EQ. 0 )
GOTO 850
756 WRITE ( ndsg ) ((real(msplit(iy,ix)),ix=1,nx),iy=1,ny)
763 IF ( 100.*mstats%RSTD/xmean .LE. starg )
THEN
770 IF ( 100.*mstats%RSTD/xmean .LT. 1.0001*stdmin )
THEN
771 IF ( nstdlg .LT. mstdlg )
THEN
777 stdmin = 100.*mstats%RSTD/xmean
780 IF ( nstdlg .GT. mstdlg ) stdmin = 1.01*stdmin
785 IF ( mstats%NMAX .LT. ingmax )
THEN
792 IF ( mstats%NMIN .GT. ingmin )
THEN
801 IF ( ingmnc .GE. inglag )
THEN
804 WRITE (ndst,9052)
'MINIMUM'
807 IF ( real(ingmin) .LT. 0.85*xmean )
THEN
810 WRITE (ndst,9053) 0.85*xmean / real(ingmin)
814 WRITE (ndso,952) mstats%NMIN, mstats%NMAX, &
815 100.*mstats%RSTD/xmean
833 IF ( ingmxc .GE. inglag )
THEN
836 WRITE (ndst,9052)
'MAXIMUM'
839 IF ( real(ingmax) .GT. 1.075*xmean )
THEN
842 WRITE (ndst,9053) real(ingmax) / ( 1.075*xmean )
845 WRITE (ndso,952) mstats%NMIN, mstats%NMAX, &
846 100.*mstats%RSTD/xmean
867 ALLOCATE ( isnext(ng) )
874 IF ( isnext(j) .AND. gstats(j)%NPTS.LT.minnr )
THEN
875 minnr = gstats(j)%NPTS
880 WRITE (ndst,956) ig, gstats(ig)%STRADLE, gstats(ig)%NPTS, &
881 gstats(ig)%NXL, gstats(ig)%NXH, &
882 gstats(ig)%NYL, gstats(ig)%NYH
885 DEALLOCATE ( isnext )
894 IF ( maxval(zb) .LT. -0.11 )
THEN
897 zbmin = maxval(zb) + 1.
898 zbdum = max( zbdum , zbmin+1 )
902 j2 = 1 + int(log10(real(ng)+0.5))
903 WRITE (nrfmt,
'(A2,I1,A1,I1,A1)')
'(I', j2,
'.', j2,
')'
905 IF ( j1 + j2 + 2 .LE. 10 )
THEN
906 fname = fext(:j1) //
'_p'
923 nseat = nseat + pgrid(ig)%NSEA
925 WRITE (aext,nrfmt) ig
926 fname(j3:j4) = aext(:j2)
932 fname(j4+1:j5) =
'.bot'
933 WRITE (ndso,962) fname(:j5)
935 IF ( idfm1 .EQ. 3 )
THEN
936 OPEN (ndsm,
file=fnmpre(:j)//fname(:j5), &
937 form=
'UNFORMATTED', convert=
file_endian,err=860,iostat=ierr)
939 OPEN (ndsm,
file=fnmpre(:j)//fname(:j5), err=860,iostat=ierr)
942 CALL outa2r ( pgrid(ig)%ZBIN, pgrid(ig)%NX, pgrid(ig)%NY, &
943 1, pgrid(ig)%NX, 1, pgrid(ig)%NY, ndsm, ndst, &
944 ndse, idfm1, rform1, idla1, vsc1, 0.0 )
950 fname(j4+1:j5) =
'.obst'
952 IF ( trflag .EQ. 0 )
THEN
953 WRITE (ndso,963) fname(:j5)
955 WRITE (ndso,962) fname(:j5)
957 IF ( idfm2 .EQ. 3 )
THEN
958 OPEN (ndsm,
file=fnmpre(:j)//fname(:j5), &
959 form=
'UNFORMATTED', convert=
file_endian,err=860,iostat=ierr)
961 OPEN (ndsm,
file=fnmpre(:j)//fname(:j5), &
965 CALL outa2r ( pgrid(ig)%OBSX, pgrid(ig)%NX, pgrid(ig)%NY, &
966 1, pgrid(ig)%NX, 1, pgrid(ig)%NY, ndsm, &
967 ndst, ndse, idfm2, rform2, idla2, vsc2, 0.0 )
968 CALL outa2r ( pgrid(ig)%OBSY, pgrid(ig)%NX, pgrid(ig)%NY, &
969 1, pgrid(ig)%NX, 1, pgrid(ig)%NY, ndsm, &
970 ndst, ndse, idfm2, rform2, idla2, vsc2, 0.0 )
978 fname(j4+1:j5) =
'.mask'
979 WRITE (ndso,962) fname(:j5)
981 IF ( idfm3 .EQ. 3 )
THEN
982 OPEN (ndsm,
file=fnmpre(:j)//fname(:j5), &
983 form=
'UNFORMATTED', convert=
file_endian,err=860,iostat=ierr)
985 OPEN (ndsm,
file=fnmpre(:j)//fname(:j5), err=860,iostat=ierr)
988 CALL outa2i ( pgrid(ig)%MASK, pgrid(ig)%NX, pgrid(ig)%NY, &
989 1, pgrid(ig)%NX, 1, pgrid(ig)%NY, ndsm, ndst, &
990 ndse, idfm3, rform3, idla3, vsc3, 0 )
996 fname(j4+1:j5) =
'.tmpl'
997 WRITE (ndso,962) fname(:j5)
999 OPEN (ndsm,
file=fnmpre(:j)//fname(:j5), err=860,iostat=ierr)
1001 gname(31-j2:30) = aext
1002 gname(30-j2:30-j2) =
'p'
1003 WRITE (ndsm,965) gname, sig(2)/sig(1),
tpiinv*sig(1), nk, &
1004 nth, th(1)/dth, fldry, flcx, flcy, flcth, &
1005 flck, flsou, dtmax, dtcfl, dtcfli, dtmin
1006 j5 = len_trim(rform1)
1007 IF ( real(pgrid(ig)%NX) * pgrid(ig)%SX .LT. 359.9 )
THEN
1012 WRITE (ndsm,966) idgrid, flagll, ptclse, &
1013 pgrid(ig)%NX, pgrid(ig)%NY, &
1014 pgrid(ig)%SX, pgrid(ig)%SY, &
1015 pgrid(ig)%X0, pgrid(ig)%Y0, &
1016 zbmin, dmin, vsc1, idla1, idfm1, &
1017 rform1(:j5), fname(:j4)//
'.bot'
1018 IF ( trflag .NE. 0 )
THEN
1019 j5 = len_trim(rform2)
1020 WRITE (ndsm,967) vsc2,idla2, idfm2, rform2(:j5), &
1023 j5 = len_trim(rform3)
1024 WRITE (ndsm,968) idla3, idfm3, rform3(:j5), fname(:j4)//
'.mask'
1029 WRITE (ndso,969) 100. * (real(nseat)/real(nsea)-1.)
1035 iname(:j5) =
'ww3_multi.'//fext(:j1)//
'.'//aext(:j2)
1036 OPEN (ndsm,
file=fnmpre(:j)//iname(:j5), err=870,iostat=ierr)
1039 WRITE (aext,nrfmt) ig
1040 fname(j3:j4) = aext(:j2)
1042 WRITE (ndsm,970) fname(:j4), &
1043 fracl + real(ig-1)*(frach-fracl)/real(ng), &
1044 fracl + real( ig )*(frach-fracl)/real(ng)
1046 WRITE (ndsm,970) fname(:j4), fracl, frach
1056 iname(:j5) =
'ww3_mask.'//fext(:j1)//
'.'//aext(:j2)
1057 OPEN (ndsm,
file=fnmpre(:j)//iname(:j5), err=870,iostat=ierr)
1060 WRITE (ndsm,980) msplit(iy,:)
1068 OPEN ( ndsg,
file=
'ww3.ctl')
1069 WRITE (ndsg,985) nx, x0, sx, ny, y0, sy, ntgrds
1081 WRITE (ndse,1000) ierr
1089 WRITE (ndse,1002) ierr
1093 WRITE (ndse,1020) gtype
1097 WRITE (ndse,1021) gtype
1101 WRITE (ndse,1022) iclose
1105 WRITE (ndse,1023) iclose
1113 WRITE (ndse,1025) mingrd, nsea
1121 WRITE (ndse,1050) g0id
1125 WRITE (ndse,1060) fnmpre(:j)//fname(:j5), ierr
1129 WRITE (ndse,1070) fnmpre(:j)//iname(:j5), ierr
1137 900
FORMAT (/15x,
' *** WAVEWATCH III Grid splitting *** '/ &
1138 15x,
'=========================================='/)
1139 901
FORMAT (
' Comment character is ''',a,
''''/)
1140 902
FORMAT (
' Grid ID : ',a/ &
1142 903
FORMAT (
' Grid type : ',a)
1143 904
FORMAT (
' Closure : ',a)
1144 905
FORMAT (
' Grid size : ',i4,
' x',i4,
' (',i8,
')'/)
1146 930
FORMAT (
' Generating ',i3,
' grids'/ &
1147 ' No more than',i4,
' refinement iterations'/ &
1148 ' Grid point count std target (%) :',f6.2/ &
1149 ' Halo per sub grid extended by',i3,
' grid point.')
1150 931
FORMAT (
' Format info for bottom file :',2i2,f12.4,2x,a)
1151 932
FORMAT (
' Format info for obstruction file not used')
1152 933
FORMAT (
' Format info for obstruction file :',2i2,f12.4,2x,a)
1153 934
FORMAT (
' Format info for mask file :',2i2,i7,7x,a)
1154 935
FORMAT (
' Part of cummunicator to be used :',2f7.4)
1155 936
FORMAT (
' Not running grids side-by-side'/ &
1156 ' *** NON CONVENTIONAL OPERATION ***'/)
1158 950
FORMAT (/
' Iterations:'/ &
1159 ' nr min max std (%) '/ &
1160 ' ---------------------------------')
1161 951
FORMAT (2x,i5,2i8,2f10.2)
1162 952
FORMAT (2x,5x,2i8,2f10.2)
1163 955
FORMAT (/
' Resulting grids:'/ &
1164 ' grid stradle points range X range Y '/ &
1165 ' ---------------------------------------------')
1166 956
FORMAT (
' ',i4,5x,l1,2x,i7,4i5)
1167 959
FORMAT (
' Convergence reached')
1169 960
FORMAT (/
' Generating grid data:'/ &
1170 ' ---------------------------------------------')
1171 961
FORMAT (
' Extracting data for grid',i4)
1172 962
FORMAT (
' Writing file ',a)
1173 963
FORMAT (
' File ',a,
' not requested')
1175 970
FORMAT (
' ''',a,
''' ''LEV'' ''CUR'' ''WND'' ''ICE''', &
1176 ' ''D1'' ''D2'' ''D3'' RANK GROUP',2f10.7,
' BFLAG')
1178 980
FORMAT (1x,360i2)
1181 985
FORMAT (
'DSET ww3.ww3_gspl'/ &
1182 'TITLE WAVEWATCH III grid splitting data'/ &
1183 'OPTIONS sequential'/ &
1185 'XDEF ',i6,
' LINEAR ',2f12.5/ &
1186 'YDEF ',i6,
' LINEAR ',2f12.5/ &
1187 'ZDEF 1 LINEAR 1000.00000 1.00000'/ &
1188 'TDEF ',i6,
' LINEAR 00:00 06JUN1968 1HR'/ &
1190 'MAP 0 99 grid use map '/ &
1194 965
FORMAT (
'$ -------------------------------------', &
1195 '------------------------------- $'/ &
1196 '$ WAVEWATCH III Grid preprocessor input', &
1198 '$ -------------------------------------', &
1199 '------------------------------- $'/ &
1201 ' ',f8.4,f10.6,2i6,f8.4/
' ',6l2/
' ',4f12.4/ &
1203 966
FORMAT (
' ''',a4,
''' ',l1,
' ''',a4,
''''/1x,i8,i12/ &
1204 4x,2f12.6,
' 1.0'/4x,2f12.6,
' 1.0'/2f8.2,
' 20', &
1205 f12.6,2i2,
' ''',a,
''' ''NAME'' ''',a,
'''')
1206 967
FORMAT ( 18x,
'30',f12.6,2i2,
' ''',a,
''' ''NAME'' ''',a,
'''' )
1207 968
FORMAT ( 18x,
'40',12x,2i2,
' ''',a,
''' ''NAME'' ''',a,
''''/
'$'/ &
1208 '$ Note: cannot make output boundary points here'/
'$'/ &
1210 '$ -------------------------------------', &
1211 '------------------------------- $'/ &
1212 '$ End of input file ', &
1214 '$ -------------------------------------', &
1215 '------------------------------- $')
1217 969
FORMAT (/
' Grid point inflation',f7.2,
'%')
1219 999
FORMAT(//
' End of program '/ &
1220 ' ========================================='/ &
1221 ' WAVEWATCH III Grid splitting '/)
1223 1000
FORMAT (/
' *** WAVEWATCH III ERROR IN W3GSPL : '/ &
1224 ' ERROR IN OPENING INPUT FILE'/ &
1227 1001
FORMAT (/
' *** WAVEWATCH III ERROR IN W3GSPL : '/ &
1228 ' PREMATURE END OF INPUT FILE'/)
1230 1002
FORMAT (/
' *** WAVEWATCH III ERROR IN W3GSPL : '/ &
1231 ' ERROR IN READING FROM INPUT FILE'/ &
1234 1020
FORMAT (/
' *** WAVEWATCH III ERROR IN W3GSPL : '/ &
1235 ' SPLITTING NOT AVAILABLE FOR GRID TYPE'/ &
1238 1021
FORMAT (/
' *** WAVEWATCH III ERROR IN W3GSPL : '/ &
1239 ' GRID TYPE NOT RECOGNIZED'/ &
1242 1022
FORMAT (/
' *** WAVEWATCH III ERROR IN W3GSPL : '/ &
1243 ' SPLITTING NOT AVAILABLE FOR CLOSURE TYPE'/ &
1246 1023
FORMAT (/
' *** WAVEWATCH III ERROR IN W3GSPL : '/ &
1247 ' CLOSURE TYPE NOT RECOGNIZED'/ &
1250 1024
FORMAT (/
' *** WAVEWATCH III ERROR IN W3GSPL : '/ &
1251 ' NO ACTIVE SEA POINT IN GRID'/)
1253 1025
FORMAT (/
' *** WAVEWATCH III ERROR IN W3GSPL : '/ &
1254 ' WRONG NUMBER OF SEA POINTS'/ &
1255 ' MINGRD, NSEA =',2i7/)
1257 1030
FORMAT (/
' *** WAVEWATCH III ERROR IN W3GSPL : '/ &
1258 ' ILLEGAL PART OF COMMUNICATOR REQUESTED'/)
1260 1050
FORMAT (/
' *** WAVEWATCH III ERROR IN W3GSPL : '/ &
1261 ' SHOULD NOT HAVE ZERO GRID SIZE (',a,
') ...'/)
1263 1060
FORMAT (/
' *** WAVEWATCH III ERROR IN W3GSPL : '/ &
1264 ' ERROR IN OPENING FILE ',a/ &
1267 1070
FORMAT (/
' *** WAVEWATCH III ERROR IN W3GSPL : '/ &
1268 ' ERROR IN OPENING FILE ',a/ &
1272 9040
FORMAT (
'TEST W3GSPL: CHECKERBOARD X-Y:',2i8)
1273 9041
FORMAT (
'TEST W3GSPL: FILLING CHECKERBOARD TRY:',i3/ &
1274 ' GRID, IGX0, IGXN, IGY0, IGYN, POINTS ')
1275 9042
FORMAT (
' ',i6,2(2i8), i8,2x,a)
1276 9043
FORMAT (
'TEST W3GSPL: CHECKERBOARD GRIDS:',i4,
' (',i4,
')')
1277 9044
FORMAT (
' SMALLEST SIZE/GRID:',i8,i4)
1278 9045
FORMAT (
' SMALLEST NEIGHBOR :',i8,i4)
1279 9046
FORMAT (
' GRID',i4
', MERGED WITH GRID',i4)
1280 9047
FORMAT (
' ',i6,i8)
1281 9048
FORMAT (
' GRID',i4
', IS ISOLATED, LEFT UNCHANGED')
1282 9049
FORMAT (
'TEST W3GSPL: CHECKERBOARD CONSOLIDATED ON',i4,
' GRIDS')
1286 9050
FORMAT (
'TEST W3GSPL',a,
': MIN, MAX, STD:',2i8,f10.2)
1287 9051
FORMAT (
' ',a,
': MIN, MAX, STD:',2i8,f10.2)
1289 9052
FORMAT (
'TEST W3GSPL: STUCK ON ',a,
' GRID SIZE')
1290 9053
FORMAT (
' OUT OF RANGE, PROCESSING (',f6.3,
')')
1291 9054
FORMAT (
' IN RANGE, NO ACTION')
1329 INTEGER :: NOCNT, NOCNTM, NOCNTL, NGC, NSEAC
1331 INTEGER,
SAVE :: IENT = 0
1334 LOGICAL :: LEFT, RIGHT, THERE
1339 CALL strace (ient,
'GRINFO')
1344 gstats(:)%STRADLE = .false.
1358 IF ( gstats(ig)%INSTAT ) ngc = ngc + 1
1360 IF ( msplit(iy, 1) .EQ. ig ) left = .true.
1361 IF ( msplit(iy,nx) .EQ. ig ) right = .true.
1363 gstats(ig)%STRADLE = left .AND. right
1366 IF ( ngc .EQ. 0 )
THEN
1377 IF ( msplit(iy,ix) .GT. 0 )
THEN
1378 gstats(ig)%NPTS = gstats(ig)%NPTS + 1
1379 gstats(ig)%NXL = min( gstats(ig)%NXL , ix )
1380 gstats(ig)%NXH = max( gstats(ig)%NXH , ix )
1381 gstats(ig)%NYL = min( gstats(ig)%NYL , iy )
1382 gstats(ig)%NYH = max( gstats(ig)%NYH , iy )
1389 IF ( ng .GT. 1)
THEN
1391 IF ( gstats(ig)%STRADLE )
THEN
1398 IF ( msplit(iy,ix) .EQ. ig )
THEN
1407 IF ( nocnt .GT. nocntm )
THEN
1413 gstats(ig)%NXL = nocntl + 1
1414 gstats(ig)%NXH = nocntl - nocntm
1418 gstats(1)%STRADLE = .false.
1426 IF ( gstats(ig)%INSTAT ) nseac = nseac + gstats(ig)%NPTS
1431 mstats%NMIN = nsea + 1
1433 xmean = real(nseac) / real(ngc)
1437 IF ( .NOT. gstats(ig)%INSTAT ) cycle
1438 mstats%NMIN = min( mstats%NMIN , gstats(ig)%NPTS )
1439 mstats%NMAX = max( mstats%NMAX , gstats(ig)%NPTS )
1440 sumsqr = sumsqr + ( real(gstats(ig)%NPTS) - xmean )**2
1443 mstats%RSTD = sqrt( sumsqr / real(ngc) )
1450 WRITE (ndst,9001) ig, gstats(ig)%STRADLE, gstats(ig)%NPTS, &
1451 gstats(ig)%NXL, gstats(ig)%NXH, &
1452 gstats(ig)%NYL, gstats(ig)%NYH
1454 WRITE (ndst,9010) mstats%NMIN, mstats%NMAX, mstats%RSTD
1462 9000
FORMAT (
'TEST GRINFO: J, STRADLE, NPTS,NXL-H, NYL-H')
1463 9001
FORMAT (
' ',i4,2x,l1,2x,i7,4i5)
1464 9010
FORMAT (
'TEST GRINFO: MIN, MAX, STD:',2i8,f10.2)
1510 INTEGER :: ITARG, ITL, IPTS, MX, MY, ICIRC, NWDTH
1512 INTEGER,
SAVE :: IENT = 0
1514 LOGICAL :: MASK(NY,NX)
1519 CALL strace (ient,
'GRTRIM')
1528 ipts = gstats(ig)%NPTS
1529 my = 1 + gstats(ig)%NYH - gstats(ig)%NYL
1530 mx = 1 + gstats(ig)%NXH - gstats(ig)%NXL
1531 IF ( gstats(ig)%STRADLE ) mx = mx + nx
1532 icirc = 2 * ( mx + my )
1536 itl = min( itarg , max( itarg-2*icirc , 3*icirc ) )
1537 IF ( ipts .LT. itl ) nwdth = 0
1539 IF ( ipts.GT.itarg )
THEN
1541 max(0,+nint((real((ipts-itarg))/real(icirc)-1.)/3.))
1551 IF ( msplit( 1,ix) .EQ. ig ) mask( 1,ix) = &
1552 (sea( 2,ix ).AND.(msplit( 2,ix ).NE.ig)) &
1553 .OR. (sea( 1,ix+1).AND.(msplit( 1,ix+1).NE.ig)) &
1554 .OR. (sea( 1,ix-1).AND.(msplit( 1,ix-1).NE.ig))
1556 IF ( msplit(iy,ix) .EQ. ig ) mask(iy,ix) = &
1557 (sea(iy+1,ix ).AND.(msplit(iy+1,ix ).NE.ig)) &
1558 .OR. (sea(iy-1,ix ).AND.(msplit(iy-1,ix ).NE.ig)) &
1559 .OR. (sea(iy ,ix+1).AND.(msplit(iy ,ix+1).NE.ig)) &
1560 .OR. (sea(iy ,ix-1).AND.(msplit(iy ,ix-1).NE.ig))
1562 IF ( msplit(ny,ix) .EQ. ig ) mask(ny,ix) = &
1563 (sea(ny-1,ix ).AND.(msplit(ny-1,ix ).NE.ig)) &
1564 .OR. (sea(ny ,ix+1).AND.(msplit(ny ,ix+1).NE.ig)) &
1565 .OR. (sea(ny ,ix-1).AND.(msplit(ny ,ix-1).NE.ig))
1569 IF ( msplit( 1, 1) .EQ. ig ) mask( 1, 1) = &
1570 (sea( 2, 1).AND.(msplit( 2, 1).NE.ig)) &
1571 .OR. (sea( 1, 2).AND.(msplit( 1, 2).NE.ig)) &
1572 .OR. (sea( 1,nx).AND.(msplit( 1,nx).NE.ig))
1573 IF ( msplit( 1,nx) .EQ. ig ) mask( 1,nx) = &
1574 (sea( 2,nx ).AND.(msplit( 2,nx ).NE.ig)) &
1575 .OR. (sea( 1, 1 ).AND.(msplit( 1, 1 ).NE.ig)) &
1576 .OR. (sea( 1,nx-1).AND.(msplit( 1,nx-1).NE.ig))
1578 IF ( msplit(iy, 1) .EQ. ig ) mask(iy, 1) = &
1579 (sea(iy+1, 1).AND.(msplit(iy+1, 1).NE.ig)) &
1580 .OR. (sea(iy-1, 1).AND.(msplit(iy-1, 1).NE.ig)) &
1581 .OR. (sea(iy , 2).AND.(msplit(iy , 2).NE.ig)) &
1582 .OR. (sea(iy ,nx).AND.(msplit(iy ,nx).NE.ig))
1583 IF ( msplit(iy,nx) .EQ. ig ) mask(iy,nx) = &
1584 (sea(iy+1,nx).AND.(msplit(iy+1,nx).NE.ig)) &
1585 .OR. (sea(iy-1,nx).AND.(msplit(iy-1,nx).NE.ig)) &
1586 .OR. (sea(iy , 1).AND.(msplit(iy , 1).NE.ig)) &
1587 .OR. (sea(iy,nx-1).AND.(msplit(iy,nx-1).NE.ig))
1589 IF ( msplit(ny, 1) .EQ. ig ) mask(ny, 1) = &
1590 (sea(ny-1, 1).AND.(msplit(ny-1, 1).NE.ig)) &
1591 .OR. (sea(ny , 2).AND.(msplit(ny , 2).NE.ig)) &
1592 .OR. (sea(ny ,nx).AND.(msplit(ny ,nx).NE.ig))
1593 IF ( msplit(ny,nx) .EQ. ig ) mask(ny,nx) = &
1594 (sea(ny-1,nx).AND.(msplit(ny-1,nx).NE.ig)) &
1595 .OR. (sea(ny , 1).AND.(msplit(ny , 1).NE.ig)) &
1596 .OR. (sea(ny,nx-1).AND.(msplit(ny,nx-1).NE.ig))
1598 IF ( msplit( 1, 1) .EQ. ig ) mask( 1, 1) = &
1599 (sea( 2, 1).AND.(msplit( 2, 1).NE.ig)) &
1600 .OR. (sea( 1, 2).AND.(msplit( 1, 2).NE.ig))
1601 IF ( msplit( 1,nx) .EQ. ig ) mask( 1,nx) = &
1602 (sea( 2,nx ).AND.(msplit( 2,nx ).NE.ig)) &
1603 .OR. (sea( 1,nx-1).AND.(msplit( 1,nx-1).NE.ig))
1605 IF ( msplit(iy, 1) .EQ. ig ) mask(iy, 1) = &
1606 (sea(iy+1, 1).AND.(msplit(iy+1, 1).NE.ig)) &
1607 .OR. (sea(iy-1, 1).AND.(msplit(iy-1, 1).NE.ig)) &
1608 .OR. (sea(iy , 2).AND.(msplit(iy , 2).NE.ig))
1609 IF ( msplit(iy,nx) .EQ. ig ) mask(iy,nx) = &
1610 (sea(iy+1,nx).AND.(msplit(iy+1,nx).NE.ig)) &
1611 .OR. (sea(iy-1,nx).AND.(msplit(iy-1,nx).NE.ig)) &
1612 .OR. (sea(iy,nx-1).AND.(msplit(iy,nx-1).NE.ig))
1614 IF ( msplit(ny, 1) .EQ. ig ) mask(ny, 1) = &
1615 (sea(ny-1, 1).AND.(msplit(ny-1, 1).NE.ig)) &
1616 .OR. (sea(ny , 2).AND.(msplit(ny , 2).NE.ig))
1617 IF ( msplit(ny,nx) .EQ. ig ) mask(ny,nx) = &
1618 (sea(ny-1,nx).AND.(msplit(ny-1,nx).NE.ig)) &
1619 .OR. (sea(ny,nx-1).AND.(msplit(ny,nx-1).NE.ig))
1626 IF ( mask(iy,ix) )
THEN
1688 INTEGER,
INTENT(IN) :: ND
1693 INTEGER :: NMIN, I, NDEPTH, NITT, NADD, IXL, IXR,&
1694 NLEFT, NRIGHT, NXL, NXH, NYL, NYH
1695 INTEGER :: NXYOFF = 3
1696 INTEGER :: IIX(NSEA), IIY(NSEA), ISEA, NSEAL
1698 INTEGER,
SAVE :: IENT = 0
1700 LOGICAL :: DONE(NG), MASK(NY,NX), FLOST(NG), &
1706 CALL strace (ient,
'GRFILL')
1719 IF ( msplit(iy,ix) .EQ. -1 )
THEN
1742 IF ( .NOT.done(i) .AND. gstats(i)%NPTS.LT.nmin )
THEN
1744 nmin = gstats(i)%NPTS
1751 WRITE (ndst,9030) ig, j, nmin
1765 ixl = 1 + mod(ix-2+nx,nx)
1766 ixr = 1 + mod(ix,nx)
1767 IF ( msplit(iy,ix) .EQ. -1 ) mask(iy,ix) = &
1768 ( msplit(iy+1,ix ) .EQ. ig ) &
1769 .OR. ( msplit(iy-1,ix ) .EQ. ig ) &
1770 .OR. ( msplit(iy ,ixr) .EQ. ig ) &
1771 .OR. ( msplit(iy ,ixl) .EQ. ig )
1781 IF ( mask(iy,ix) )
THEN
1787 IF ( nadd .EQ. 0 )
EXIT
1808 IF ( msplit(iy,ix) .EQ. -1 ) nleft = nleft + 1
1812 WRITE (ndst,9070) nitt, nleft
1817 IF ( nleft .EQ. 0 )
EXIT
1821 IF ( nright .GT. 0 )
THEN
1822 IF ( nleft .EQ. nright )
THEN
1826 IF ( .NOT. flost(ig) )
THEN
1833 WRITE (ndse,1000) ig, nitt, nleft
1841 IF ( msplit(iy,ix) .EQ. -1 )
THEN
1842 xfl(max(1,ix-nxyoff):min(nx,ix+nxyoff)) = .true.
1843 yfl(max(1,iy-nxyoff):min(ny,iy+nxyoff)) = .true.
1850 IF ( xfl(ix) .AND. nxl.EQ. 0 ) nxl = ix
1851 IF ( xfl(ix) .AND. ix.EQ. nx ) nxh = ix
1852 IF ( .NOT. xfl(ix) .AND. nxl.NE. 0 ) nxh = ix-1
1853 IF ( nxh .NE. 0 )
THEN
1857 IF ( yfl(iy) .AND. nyl.EQ. 0 ) nyl = iy
1858 IF ( yfl(iy) .AND. iy.EQ. ny ) nyh = iy
1859 IF ( .NOT. yfl(iy) .AND. nyl.NE. 0 ) &
1861 IF ( nyh .NE. 0 )
THEN
1862 WRITE (ndst,1001) nxl, nxh, nyh, nyl
1864 WRITE (ndst,1002) msplit(i,nxl:nxh)
1891 1000
FORMAT (/
' *** ERROR GRFILL : NO MORE CONVERGENCE, ', &
1892 'NITT, NLEFT:',2i8,
' ***'/)
1893 1001
FORMAT (
' MAP OUTPUT FOR GRID',i3,
' AND X AND Y RANGE :',4i6/)
1894 1002
FORMAT (
' ',60i2)
1897 9030
FORMAT (
'TEST GRFILL: PROCESSING GRID',i5,
' (',i5,
')',i8)
1898 9060
FORMAT (
'TEST GRFILL: GRID, HALO, NADD :',i5,i2,i8)
1899 9070
FORMAT (
'TEST GRFILL: NITT, NLEFT :',2i6)
1937 INTEGER :: IX, IY, IOFF, JJX, JX, JY, IG, I
1939 INTEGER,
SAVE :: IENT = 0
1941 INTEGER :: IFOUND(-1:NG)
1946 CALL strace (ient,
'GRLOST')
1954 IF ( msplit(iy,ix) .EQ. -1 )
THEN
1963 DO jjx=ix-ioff, ix+ioff
1965 jx = 1 + mod(jjx-1+2*nx,nx)
1969 IF ( jx.LT.1 .OR. jx.GT.nx ) cycle
1970 DO jy=iy-ioff, iy+ioff
1971 IF ( jy.LT.1 .OR. jy.GT.ny ) cycle
1972 ifound(msplit(jy,jx)) = ifound(msplit(jy,jx)) + 1
1978 IF ( ifound(i) .GT. 0 )
THEN
1984 IF ( ig .NE. 0 )
THEN
1990 IF ( ioff .GT. nx .AND. ioff.GT.ny )
EXIT
2047 INTEGER,
SAVE :: IENT = 0
2053 CALL strace (ient,
'GRSQRG')
2060 my = 1 + gstats(ig)%NYH - gstats(ig)%NYL
2061 mx = 1 + gstats(ig)%NXH - gstats(ig)%NXL
2062 IF ( gstats(ig)%STRADLE ) mx = mx + nx
2066 IF ( my .GE. 5 )
THEN
2069 IF (msplit(gstats(ig)%NYH,ix) .EQ. ig ) &
2070 msplit(gstats(ig)%NYH,ix) = -1
2076 IF (msplit(gstats(ig)%NYL,ix) .EQ. ig ) &
2077 msplit(gstats(ig)%NYL,ix) = -1
2084 IF ( mx .GE. 5 )
THEN
2086 DO iy=gstats(ig)%NYL, gstats(ig)%NYH
2087 IF (msplit(iy,gstats(ig)%NXL) .EQ. ig ) &
2088 msplit(iy,gstats(ig)%NXL) = -1
2093 DO iy=gstats(ig)%NYH, gstats(ig)%NYH
2094 IF (msplit(iy,gstats(ig)%NXH) .EQ. ig ) &
2095 msplit(iy,gstats(ig)%NXH) = -1
2157 LOGICAL,
INTENT(INOUT) :: OK
2162 INTEGER :: NX0, NXN, IXL, IXH, COUNT(-1:NG), &
2165 INTEGER,
SAVE :: IENT = 0
2171 CALL strace (ient,
'GRSNGL')
2190 IF ( ix .EQ. 1 ) ixl = nx
2191 IF ( ix .EQ. nx ) ixh = 1
2197 IF ( sea(iy,ix) .AND. sea(iy-1,ix ) .AND. sea(iy+1,ix ) &
2198 .AND. sea(iy ,ixl) .AND. sea(iy ,ixh) )
THEN
2206 count(msplit(iy-1,ix )) = count(msplit(iy-1,ix )) + 1
2207 count(msplit(iy+1,ix )) = count(msplit(iy+1,ix )) + 1
2208 count(msplit(iy ,ixl)) = count(msplit(iy ,ixl)) + 1
2209 count(msplit(iy ,ixh)) = count(msplit(iy ,ixh)) + 1
2211 IF ( count(ig) .LE. 2 )
THEN
2214 WRITE (ndst,9040) ix, iy, ig
2221 IF ( count(j) .GE. 2 )
THEN
2225 IF ( inew1 .EQ. -1 )
THEN
2234 IF ( inew1 .EQ. -1 )
THEN
2240 ELSE IF ( inew2 .EQ. -1 )
THEN
2243 WRITE (ndst,9042) inew
2246 IF ( gstats(inew1)%NPTS .GT. &
2247 gstats(inew2)%NPTS )
THEN
2253 WRITE (ndst,9042) inew
2257 msplit(iy,ix) = inew
2274 9040
FORMAT (
'TEST GRSNGL: POINT FOUND, IX, IY, IG:',2i5,i4)
2275 9041
FORMAT (
' CANDIDATE GRID :',10x,i4)
2276 9042
FORMAT (
' GRID USED :',10x,i4)
2277 9043
FORMAT (
' GRID LEFT UNDIFINED')
2293 SUBROUTINE grsepa ( OK, FRAC )
2330 REAL,
INTENT(IN) :: FRAC
2331 LOGICAL,
INTENT(INOUT) :: OK
2336 INTEGER :: IPAVG, IPCHCK, ID, IPTOT, IX, IY, &
2337 IXL, IYL, IDL, JX, JY, KY, IPT, &
2338 IXH, IYH, I, J, K, L, IMIN, LMIN
2340 INTEGER,
SAVE :: IENT = 0
2342 INTEGER :: GMASK(NY,NX), IIX(NSEA), IIY(NSEA)
2343 INTEGER,
ALLOCATABLE :: PMAP(:), INGRD(:)
2345 LOGICAL,
ALLOCATABLE :: FLNEXT(:), NEXTTO(:,:)
2350 CALL strace (ient,
'GRSEPA')
2353 ipavg = nint( real(nsea) / real(ng) )
2354 ipchck = nint( frac * real(nsea) / real(ng) )
2357 WRITE (ndst,9000) ipavg, ipchck
2368 WRITE (ndst,9010) ig
2378 ixl = 1 + mod(ix-2+nx,nx)
2382 IF (msplit(iy,ix) .EQ. ig )
THEN
2386 IF ( .NOT. prev)
THEN
2391 ELSE IF ( prev )
THEN
2395 IF ( gmask(jy,ix) .EQ. 0 )
EXIT
2396 IF ( gmask(jy,ixl).NE.0 .AND. idl.EQ.0 ) &
2399 IF ( idl .NE. 0 )
THEN
2401 IF ( gmask(ky,ix).EQ.id ) gmask(ky,ix) = idl
2412 IF ( iptot .LE. ipavg )
THEN
2414 WRITE (ndst,9020) iptot, ipavg
2422 ALLOCATE ( nextto(0:id,0:id), pmap(0:id) )
2428 ixl = 1 + mod(ix-2+nx,nx)
2430 ixh = 1 + mod(ix,nx)
2432 nextto( gmask(iy,ix) , gmask(iy ,ixl) ) = .true.
2433 nextto( gmask(iy,ix) , gmask(iy ,ixh) ) = .true.
2434 nextto( gmask(iy,ix) , gmask(iyl,ix ) ) = .true.
2435 nextto( gmask(iy,ix) , gmask(iyh,ix ) ) = .true.
2442 nextto(i,j) = nextto(i,j) .OR. nextto(j,i)
2450 IF ( nextto(i,j) )
THEN
2452 IF ( nextto(k,j) )
THEN
2453 nextto(k,i) = .true.
2454 nextto(i,k) = .true.
2468 IF ( pmap(i) .EQ. 0 )
THEN
2471 IF ( nextto(j,i) )
EXIT
2473 IF ( j .GT. idl )
THEN
2477 IF ( pmap(k).EQ.0 .AND. nextto(j,k) ) pmap(k) = id
2483 DEALLOCATE ( nextto )
2487 IF ( id .EQ. 1 )
THEN
2489 WRITE (ndst,9030) ig
2498 WRITE (ndst,9040) ig
2506 gmask(iy,ix) = pmap(gmask(iy,ix))
2513 ALLOCATE ( ingrd(id), flnext(id) )
2520 IF ( gmask(jy,jx) .GT. 0 )
THEN
2521 ingrd(gmask(jy,jx)) = ingrd(gmask(jy,jx)) + 1
2529 IF ( ( gmask(jy ,jx) .GT. 0 ) .AND. &
2530 ( sea(jy+1,jx) .AND. msplit(jy+1,jx).NE.ig ) ) &
2531 flnext(gmask(jy ,jx)) = .true.
2532 IF ( ( gmask(jy+1,jx) .GT. 0 ) .AND. &
2533 ( sea(jy ,jx) .AND. msplit(jy ,jx).NE.ig ) ) &
2534 flnext(gmask(jy+1,jx)) = .true.
2540 IF ( ( gmask(jy,jx ) .GT. 0 ) .AND. &
2541 ( sea(jy,jx+1) .AND. msplit(jy,jx+1).NE.ig ) ) &
2542 flnext(gmask(jy,jx )) = .true.
2543 IF ( ( gmask(jy,jx+1) .GT. 0 ) .AND. &
2544 ( sea(jy,jx ) .AND. msplit(jy,jx ).NE.ig ) ) &
2545 flnext(gmask(jy,jx+1)) = .true.
2548 IF ( ( gmask(jy,nx) .GT. 0 ) .AND. &
2549 ( sea(jy, 1) .AND. msplit(jy, 1).NE.ig ) ) &
2550 flnext(gmask(jy,nx)) = .true.
2551 IF ( ( gmask(jy, 1) .GT. 0 ) .AND. &
2552 ( sea(jy,nx) .AND. msplit(jy,nx).NE.ig ) ) &
2553 flnext(gmask(jy, 1)) = .true.
2559 WRITE (ndst,9041) j, ingrd(j), flnext(j)
2569 IF ( flnext(j) .AND. ingrd(j).LT.imin )
THEN
2575 IF ( lmin .EQ. 0 )
THEN
2579 DEALLOCATE ( ingrd, flnext )
2583 IF ( imin .GT. ipchck )
THEN
2587 DEALLOCATE ( ingrd, flnext )
2594 WRITE (ndst,9060) lmin
2599 IF ( gmask(jy,jx) .EQ. lmin ) msplit(jy,jx) = -1
2603 DEALLOCATE ( ingrd, flnext )
2615 9000
FORMAT (
'TEST GRSEPA: IPAVG/CHCK:',2i8)
2616 9010
FORMAT (
'TEST GRSEPA: WORKING ON GRID'i4)
2617 9020
FORMAT (
' GRID TOO SMALL TO CUT',2i8)
2618 9030
FORMAT (
'TEST GRSEPA: GRID',i4,
' IS CONTIGUOUS')
2619 9040
FORMAT (
'TEST GRSEPA: GRID',i4,
' CONTAINS PARTS')
2620 9041
FORMAT (
' PART, SIZE, NEIGHBOUR:',i4,i8,l4)
2621 9050
FORMAT (
' NO PART NEXT TO OTHER')
2622 9051
FORMAT (
' NO PART SMALL ENOUGH')
2623 9060
FORMAT (
' CUTTING PART',i4)
2671 INTEGER :: NSMALL, IGMIN(NG), NNEXT, JG, IGADD, &
2672 IGTEST, FREE(NG), NFREE, NBIG, IGB, &
2673 MX, MY, NX0, NXN, NY0, NYN, JX
2678 INTEGER,
SAVE :: IENT = 0
2680 CHARACTER(LEN=1) :: NEXTTO(0:NG,0:NG), TEMP(NG)
2685 CALL strace (ient,
'GRFSML')
2694 IF ( gstats(ig)%INSTAT .AND. &
2695 gstats(ig)%NPTS .EQ. mstats%NMIN )
THEN
2702 WRITE (ndst,9010) nsmall, igmin(:nsmall)
2711 nextto(msplit(iy ,ix ),msplit(iy+1,ix )) =
'X'
2712 nextto(msplit(iy+1,ix ),msplit(iy ,ix )) =
'X'
2713 nextto(msplit(iy ,ix+1),msplit(iy ,ix )) =
'X'
2714 nextto(msplit(iy ,ix ),msplit(iy ,ix+1)) =
'X'
2720 nextto(msplit(iy ,nx),msplit(iy+1,nx)) =
'X'
2721 nextto(msplit(iy+1,nx),msplit(iy ,nx)) =
'X'
2722 nextto(msplit(iy , 1),msplit(iy ,nx)) =
'X'
2723 nextto(msplit(iy ,nx),msplit(iy , 1)) =
'X'
2734 temp = nextto(ig,1:)
2735 WRITE (ndst,9021) ig, temp
2747 WRITE (ndst,9030) igmin(j)
2757 IF ( nextto(ig,jg) .EQ.
'X' )
THEN
2759 IF ( gstats(jg)%NPTS .LT. igtest )
THEN
2760 igtest = gstats(jg)%NPTS
2767 WRITE (ndst,9031) nnext
2772 IF ( nnext .EQ. 0 )
THEN
2773 gstats(ig)%INSTAT = .false.
2775 WRITE (ndst,9032) ig
2782 WRITE (ndst,9033) igadd, igtest, igtest+ingmin, nint(xmean)
2785 IF ( igtest + ingmin .LT. nint(xmean) )
THEN
2791 IF ( msplit(iy,ix) .EQ. ig ) msplit(iy,ix) = igadd
2806 gstats(ig)%INSTAT = .false.
2808 WRITE (ndst,9032) ig
2812 IF ( nextto(igadd,jg) .EQ.
'X' ) nnext = nnext + 1
2814 IF ( nnext .EQ. 1 )
THEN
2815 gstats(igadd)%INSTAT = .false.
2817 WRITE (ndst,9032) igadd
2830 WRITE (ndst,9040) nfree
2836 WRITE (ndst,9041) free(j)
2845 IF ( gstats(ig)%NPTS .GT. nbig )
THEN
2846 nbig = gstats(ig)%NPTS
2853 nx0 = gstats(igb)%NXL
2854 nxn = gstats(igb)%NXH
2855 ny0 = gstats(igb)%NYL
2856 nyn = gstats(igb)%NYH
2858 my = 1 + gstats(igb)%NYH - gstats(igb)%NYL
2859 mx = 1 + gstats(igb)%NXH - gstats(igb)%NXL
2860 IF ( gstats(igb)%STRADLE ) mx = mx + nx
2862 IF ( my .GE. mx )
THEN
2864 WRITE (ndst,9042) igb,
'VERTICAL', mx, my
2869 WRITE (ndst,9042) igb,
'HORIZONTAL', mx, my
2873 nxnt = 1 + mod(nxn-1,nx)
2877 WRITE (ndst,9043) gstats(igb)%NXL, gstats(igb)%NXH, &
2878 gstats(igb)%NYL, gstats(igb)%NYH, &
2879 gstats(igb)%STRADLE, nx0, nxn, ny0, nyn
2883 jx = 1 + mod(ix-1,nx)
2885 IF ( msplit(iy,jx) .EQ. igb ) msplit(iy,jx) = free(j)
2889 gstats(igb)%NPTS = 0
2890 gstats(free(j))%NPTS = 0
2899 9010
FORMAT (
'TEST GRFSML:',i2,
' SMALL GRIDS:',10i4)
2900 9020
FORMAT (
'TEST GRFSML: NEIGHBOUR MAP PER GRID')
2901 9021
FORMAT (2x,i3,2x,120a1)
2902 9030
FORMAT (
'TEST GRFSML: PROCESSING SMALL GRID',i4)
2903 9031
FORMAT (
' GRID HAS',i3,
' NEIGHBOURS')
2904 9032
FORMAT (
' REMOVED GRID',i4,
' FROM STATS')
2905 9033
FORMAT (
' SMALLEST NEIGHBOUR AND SIZE',i4,i6/ &
2906 ' SIZE OF COMBINED GRIDS',i8,
' (',i8,
')')
2907 9034
FORMAT (
' GRIDS TOO LARGE TO MERGE')
2908 9040
FORMAT (
'TEST GRFSML: GENERATING',i3,
' NEW GRIDS')
2909 9041
FORMAT (
' MAKING GRID NR.:',i4)
2910 9042
FORMAT (
' SPLITTING GRID',i3,
' ',a,
', MX,MY:',2i6)
2911 9043
FORMAT (
' OLD RANGE :',4i6,l4/ &
2952 INTEGER :: NBIG, IGMAX(NG), NNEXT, JG
2957 INTEGER,
SAVE :: IENT = 0
2959 CHARACTER(LEN=1) :: NEXTTO(0:NG,0:NG), TEMP(NG)
2964 CALL strace (ient,
'GRFLRG')
2973 IF ( gstats(ig)%INSTAT .AND. &
2974 gstats(ig)%NPTS .EQ. mstats%NMAX )
THEN
2981 WRITE (ndst,9010) nbig, igmax(:nbig)
2990 nextto(msplit(iy ,ix ),msplit(iy+1,ix )) =
'X'
2991 nextto(msplit(iy+1,ix ),msplit(iy ,ix )) =
'X'
2992 nextto(msplit(iy ,ix+1),msplit(iy ,ix )) =
'X'
2993 nextto(msplit(iy ,ix ),msplit(iy ,ix+1)) =
'X'
2999 nextto(msplit(iy ,nx),msplit(iy+1,nx)) =
'X'
3000 nextto(msplit(iy+1,nx),msplit(iy ,nx)) =
'X'
3001 nextto(msplit(iy , 1),msplit(iy ,nx)) =
'X'
3002 nextto(msplit(iy ,nx),msplit(iy , 1)) =
'X'
3013 temp = nextto(ig,1:)
3014 WRITE (ndst,9021) ig, temp
3023 WRITE (ndst,9030) igmax(j)
3031 IF ( nextto(ig,jg) .EQ.
'X' ) nnext = nnext + 1
3035 WRITE (ndst,9031) nnext
3040 IF ( nnext .GE. 1 )
THEN
3041 gstats(ig)%INSTAT = .false.
3060 930
FORMAT (
' *** ERROR GRFLRG: LARGEST GRID IS ISOLATED ***' &
3061 ' SPLITTING NOT YET IMPLEMENTED '/)
3064 9010
FORMAT (
'TEST GRFLRG:',i2,
' BIG GRIDS:',10i4)
3065 9020
FORMAT (
'TEST GRFLRG: NEIGHBOUR MAP PER GRID')
3066 9021
FORMAT (2x,i3,2x,120a1)
3067 9030
FORMAT (
'TEST GRFLRG: PROCESSING BIG GRID',i4)
3068 9031
FORMAT (
' GRID HAS',i3,
' NEIGHBOURS')
3069 9032
FORMAT (
' NO ACTION')
3114 INTEGER :: NIT, IIT, IXL, IXH, IYL, IYH, NOCNT,&
3115 NOCNTM, NOCNTL, JX, JY, ISEA, MX, MY
3116 INTEGER :: MTMP2(NY,NX)
3118 INTEGER,
SAVE :: IENT = 0
3121 LOGICAL :: MASK(NY,NX), LEFT, RIGHT, THERE
3126 CALL strace (ient,
'GR1GRD')
3130 WRITE (ndst,9000) ig
3137 IF ( msplit(iy,ix) .EQ. ig )
THEN
3139 ELSE IF ( msplit(iy,ix) .GT. 0 )
THEN
3151 IF ( mapsta(iy,ix) .EQ. 2 )
THEN
3166 nit = 1 + nhext + ( 1 + int(dtmax/dtcfl-0.001) ) * 1
3169 nit = 1 + nhext + ( 1 + int(dtmax/dtcfl-0.001) ) * 3
3172 nit = 1 + nhext + ( 1 + int(dtmax/dtcfl-0.001) ) * 3
3182 ixl = 1 + mod(ix-2+nx,nx)
3183 ixh = 1 + mod(ix,nx)
3185 IF ( mtemp(iy,ix) .EQ. 3 ) mask(iy,ix) = &
3186 ( ( mtemp(iy+1,ix ) .EQ. 1 ) .OR. &
3187 ( mtemp(iy-1,ix ) .EQ. 1 ) .OR. &
3188 ( mtemp(iy ,ixh) .EQ. 1 ) .OR. &
3189 ( mtemp(iy ,ixl) .EQ. 1 ) ) &
3190 .OR. ( ( mtemp(iy+1,ixl) .EQ. 1 ) .AND. &
3191 ( ( mtemp(iy ,ixl) .EQ. 1 ) .OR. &
3192 ( mtemp(iy+1,ix ) .EQ. 1 ) ) ) &
3193 .OR. ( ( mtemp(iy+1,ixh) .EQ. 1 ) .AND. &
3194 ( ( mtemp(iy ,ixh) .EQ. 1 ) .OR. &
3195 ( mtemp(iy+1,ix ) .EQ. 1 ) ) ) &
3196 .OR. ( ( mtemp(iy-1,ixh) .EQ. 1 ) .AND. &
3197 ( ( mtemp(iy ,ixh) .EQ. 1 ) .OR. &
3198 ( mtemp(iy-1,ix ) .EQ. 1 ) ) ) &
3199 .OR. ( ( mtemp(iy-1,ixl) .EQ. 1 ) .AND. &
3200 ( ( mtemp(iy ,ixl) .EQ. 1 ) .OR. &
3201 ( mtemp(iy-1,ix ) .EQ. 1 ) ) )
3207 IF ( mask(iy,ix) ) mtemp(iy,ix) = 1
3273 ixl = 1 + mod(ix-2+nx,nx)
3274 ixh = 1 + mod(ix,nx)
3276 ixl = max( 1 , ix-1 )
3277 ixh = min( nx , ix+1 )
3281 IF ( mtemp(iy,ix) .EQ. 2 )
THEN
3282 iyl = max( 1 , iy-1 )
3283 iyh = min( ny , iy+1 )
3284 IF ( .NOT. ( ( mtemp(iyl,ix ) .EQ. 1 ) .OR. &
3285 ( mtemp(iyh,ix ) .EQ. 1 ) .OR. &
3286 ( mtemp(iy ,ixl) .EQ. 1 ) .OR. &
3287 ( mtemp(iy ,ixh) .EQ. 1 ) ) ) &
3302 WRITE (ndst,9050) gstats(ig)%STRADLE, gstats(ig)%NPTS, &
3303 gstats(ig)%NXL, gstats(ig)%NXH, &
3304 gstats(ig)%NYL, gstats(ig)%NYH
3307 gstold(ig)%STRADLE = .false.
3320 IF ( mtemp(iy, 1).EQ.1 .OR. mtemp(iy, 1).EQ.2 ) left = .true.
3321 IF ( mtemp(iy,nx).EQ.1 .OR. mtemp(iy,nx).EQ.2 ) right = .true.
3323 gstold(ig)%STRADLE = left .AND. right
3329 IF ( mtemp(iy,ix).EQ.1 .OR. mtemp(iy,ix).EQ.2 )
THEN
3330 gstold(ig)%NPTS = gstold(ig)%NPTS + 1
3331 gstold(ig)%NXL = min( gstold(ig)%NXL , ix )
3332 gstold(ig)%NXH = max( gstold(ig)%NXH , ix )
3333 gstold(ig)%NYL = min( gstold(ig)%NYL , iy )
3334 gstold(ig)%NYH = max( gstold(ig)%NYH , iy )
3339 IF ( gstold(ig)%STRADLE )
THEN
3346 IF ( mtemp(iy,ix).EQ.1 .OR. mtemp(iy,ix).EQ.2 )
THEN
3355 IF ( nocnt .GT. nocntm )
THEN
3361 gstold(ig)%NXL = nocntl + 1
3362 gstold(ig)%NXH = nocntl - nocntm
3368 WRITE (ndst,9051) gstold(ig)%STRADLE, gstold(ig)%NPTS, &
3369 gstold(ig)%NXL, gstold(ig)%NXH, &
3370 gstold(ig)%NYL, gstold(ig)%NYH
3376 left = left .OR. ( mtemp(gstold(ig)%NYL,ix) .EQ. 1 )
3377 right = right .OR. ( mtemp(gstold(ig)%NYH,ix) .EQ. 1 )
3380 IF ( left ) gstold(ig)%NYL = gstold(ig)%NYL - 1
3381 IF ( right ) gstold(ig)%NYH = gstold(ig)%NYH + 1
3384 left = left .OR. ( mtemp(iy,gstold(ig)%NXL) .EQ. 1 )
3385 right = right .OR. ( mtemp(iy,gstold(ig)%NXH) .EQ. 1 )
3388 IF ( left ) gstold(ig)%NXL = gstold(ig)%NXL - 1
3389 IF ( right ) gstold(ig)%NXH = gstold(ig)%NXH + 1
3391 IF ( global .AND. gstold(ig)%NXL.EQ.0 )
THEN
3393 gstold(ig)%STRADLE = .true.
3396 IF ( global .AND. gstold(ig)%NXH.EQ.nx+1 )
THEN
3398 gstold(ig)%STRADLE = .true.
3402 WRITE (ndst,9052) gstold(ig)%STRADLE, gstold(ig)%NPTS, &
3403 gstold(ig)%NXL, gstold(ig)%NXH, &
3404 gstold(ig)%NYL, gstold(ig)%NYH
3409 my = 1 + gstold(ig)%NYH - gstold(ig)%NYL
3410 mx = 1 + gstold(ig)%NXH - gstold(ig)%NXL
3411 IF ( gstold(ig)%STRADLE ) mx = mx + nx
3414 pgrid(ig)%NSEA = gstold(ig)%NPTS
3415 pgrid(ig)%X0 = x0 + real(gstold(ig)%NXL-1)*sx
3416 pgrid(ig)%Y0 = y0 + real(gstold(ig)%NYL-1)*sy
3420 xoff = 360. * real( nint((pgrid(ig)%X0+0.5*real(mx-1)*sx)/360.) )
3421 pgrid(ig)%X0 = pgrid(ig)%X0 - xoff
3424 WRITE (ndst,9060) pgrid(ig)%NX, pgrid(ig)%NY, pgrid(ig)%NSEA, &
3425 pgrid(ig)%X0, pgrid(ig)%Y0, pgrid(ig)%SX, pgrid(ig)%SY
3428 ALLOCATE ( pgrid(ig)%ZBIN(mx,my) , &
3429 pgrid(ig)%OBSX(mx,my) , &
3430 pgrid(ig)%OBSY(mx,my) , &
3431 pgrid(ig)%MASK(mx,my) )
3433 pgrid(ig)%ZBIN = zbdum
3438 DO ix=1, pgrid(ig)%NX
3439 jx = 1 + mod( ix+gstold(ig)%NXL-2 , nx )
3440 DO iy=1, pgrid(ig)%NY
3441 jy = iy + gstold(ig)%NYL - 1
3443 IF ( mtemp(jy,jx) .NE. 0 )
THEN
3444 pgrid(ig)%ZBIN(ix,iy) = zb(isea)
3446 IF ( trflag .NE. 0 )
THEN
3447 pgrid(ig)%OBSX(ix,iy) = 1. - trnx(jy,jx)
3448 pgrid(ig)%OBSY(ix,iy) = 1. - trny(jy,jx)
3450 pgrid(ig)%MASK(ix,iy) = mtemp(jy,jx)
3459 9000
FORMAT (
'TEST GR1GRD: EXTRACTING GRID:',i4)
3460 9040
FORMAT (
' MASK ON FULL GRID COMPUTED')
3461 9050
FORMAT (
'TEST GR1GRD: GRID STATS :'/ &
3462 ' GRID MAP :',l2,2x,i8,4i5)
3463 9051
FORMAT (
' HALO ADDED :',l2,2x,i8,4i5)
3464 9052
FORMAT (
' BORDER ADDED :',l2,2x,i8,4i5)
3465 9060
FORMAT (
'TEST GR1GRD: EXTRACTED GRID :',2i5,i8/ &