042916 IF ( (llat(l).EQ.mlat(i,j)).AND. & 042916 (llon(l).EQ.mlon(i,j)) ) THEN
364 CHARACTER :: filename*50, paramFile*32
365 REAL :: dirKnob, perKnob, hsKnob, wetPts, seedLat, &
366 seedLon, dirTimeKnob, tpTimeKnob
367 real*8 :: tstart, tend
368 INTEGER :: maxGroup, intype, tmax, tcur, ntint
369 INTEGER,
POINTER :: maxSys(:)
370 TYPE(dat2d),
POINTER :: wsdat(:)
371 TYPE(timsys),
POINTER :: sysA(:), sysAA(:)
372 INTEGER :: NumConsSys, iConsSys
374 REAL :: minlon, maxlon, minlat, maxlat
375 INTEGER :: mxcwt, mycwt
380 INTENT (IN) intype, tmax, tcur, filename, paramfile, &
381 minlon, maxlon, minlat, maxlat, &
382 hsknob, wetpts, seedlat, seedlon, &
383 dirknob, perknob, dirtimeknob, tptimeknob
384 INTENT (OUT) maxgroup
403 LOGICAL :: file_exists, FLFORM, LOOP
405 parameter(testout = .false.)
406 CHARACTER :: dummy*10, dummyc*12
407 CHARACTER(LEN=10) :: VERPRT
408 CHARACTER(LEN=35) :: IDSTR
409 CHARACTER(LEN=78) :: headln1
410 CHARACTER(LEN=51) :: headln2
412 INTEGER,
ALLOCATABLE :: ts(:), tmp_i4(:)
413 REAL,
ALLOCATABLE :: llat(:),llon(:),hs0(:), &
414 tp0(:),dir0(:),dspr0(:),&
415 wndSpd0(:),wndDir0(:)
416 real*8,
ALLOCATABLE :: date0(:),tmp_r8(:)
417 INTEGER :: maxTs, t0, nout1, nout2, maxI, maxJ
418 REAL,
ALLOCATABLE :: mlon(:,:), mlat(:,:), tmp_r4(:)
419 REAL,
POINTER :: uniqueTim(:),uniqueLatraw(:),uniqueLonraw(:), &
420 uniqueLat(:),uniqueLon(:)
421 INTEGER :: ioerr,ierr, i, j, k, l, alreadyIn, ok, tss, tsA
422 INTEGER :: maxPart, DATETIME(2)
423 INTEGER :: tstep, iline, numpart, skipln, readln, filesize
424 REAL :: x,y,wnd,wnddir
425 REAL :: invar1, invar2, invar3, invar4
426 REAL :: invar5, invar6, invar7
427 REAL,
ALLOCATABLE :: phs(:),ptp(:),pdir(:),pspr(:),pwf(:)
428 real*8 :: date1, date2, ttest, ttemp
429 INTEGER :: ic, leng, maxpartout
431 INTEGER :: latind1, latind2, lonind1, lonind2
432 REAL :: lonext, latext
435 INTEGER :: rank, irank, nproc, EXTENT, DOMSIZE, tag1, tag2
437 INTEGER :: MPI_STATUS(MPI_STATUS_SIZE)
441 INTEGER :: COMMARR2(11)
473 CALL mpi_comm_rank(mpi_comm_world,
rank, ierr)
474 CALL mpi_comm_size(mpi_comm_world, nproc, ierr)
480 IF ((intype.EQ.1).OR.(intype.EQ.2))
THEN
484 IF (intype.EQ.1)
THEN
489 WRITE(20,*)
'Reading partRes partitioning file...'
491 ALLOCATE(ts(filesize))
492 ALLOCATE(llat(filesize))
493 ALLOCATE(llon(filesize))
494 ALLOCATE(hs0(filesize))
495 ALLOCATE(tp0(filesize))
496 ALLOCATE(dir0(filesize))
497 ALLOCATE(dspr0(filesize))
499 ALLOCATE(wndspd0(filesize))
500 ALLOCATE(wnddir0(filesize))
501 ALLOCATE(date0(filesize))
502 WRITE(20,*)
'*** Max number of lines read from "partRes" ', &
503 'input file is = ',filesize,
'!'
504 WRITE(6,*)
'Reading partRes file...'
505 INQUIRE(
file=filename, exist=file_exists)
506 IF (.NOT.file_exists)
THEN
514 READ (11, *,
END=113) dummyc,llat(line),llon(line), &
515 ts(line),hs0(line),tp0(line),dir0(line), &
516 wndspd0(line),wnddir0(line),invar7
525 WRITE(6,*)
'... finished'
530 ELSE IF (intype.EQ.2)
THEN
536 INQUIRE(
file=filename, exist=file_exists)
537 IF (.NOT.file_exists)
THEN
545 OPEN(unit=11,
file=filename,form=
'UNFORMATTED', convert=file_endian,
status=
'OLD',access=
'STREAM')
546 READ(11,err=802,iostat=ioerr) i
551 flform = .NOT.(i.EQ.(len(idstr)+len(verprt)).OR.&
552 k.EQ.(len(idstr)+len(verprt)) )
556 WRITE(6,*)
'Reading formatted ASCII file...'
558 READ(11,
'(78A)') headln1
559 idstr = headln1(1:len(idstr))
560 READ(11,
'(78A)') headln1
561 READ(11,
'(51A)') headln2
563 IF (k.EQ.(len(idstr)+len(verprt)))
THEN
574 WRITE(6,*)
'Reading binary formatted file...'
575 OPEN(unit=11,
file=filename,form=
'UNFORMATTED', convert=file_endian, &
579 READ(11,err=802,iostat=ioerr) idstr,verprt
580 READ(11,err=802,iostat=ioerr) headln1
581 READ(11,err=802,iostat=ioerr) headln2
584 IF (idstr(1:9).ne.
'WAVEWATCH')
THEN
595 DO WHILE (ttest.LT.tstart)
597 READ (11,1000,err=802,
END=112) date1,date2,x,y, &
598 numpart,wnd,wnddir,invar6,invar7
600 write(*,*)
'0:',x,y,numpart
604 READ (11,err=802,iostat=ioerr) datetime,x,y, &
605 dummy,numpart,invar1,wnd,wnddir, &
608 date1=dble(datetime(1))
609 date2=dble(datetime(2))
611 ttest = date1 + date2*1.0e-6
613 DO line = 1,numpart+1
614 READ(11,1010,
END=111,ERR=802,IOSTAT=IOERR) &
615 invar1,invar2,invar3,invar4
620 DO line = 1,numpart+1
621 READ (11,err=802,iostat=ioerr) iline,invar1, &
622 invar2,invar3,invar4,invar5,invar6
627 skipln = skipln-numpart-1-1
635 DO WHILE (tstep.LE.ntint)
636 IF (readln.GT.0)
THEN
638 READ (11,1000,err=802,
END=111) date1,date2,x,y, &
639 numpart,wnd,wnddir,invar6,invar7
641 READ (11,
END=111,ERR=802,IOSTAT=IOERR) DATETIME, &
642 x,y,dummy,numpart,wnd,wnddir,invar5,invar6,invar7
644 date1=dble(datetime(1))
645 date2=dble(datetime(2))
647 maxpart = max(maxpart,numpart)
650 ttest = date1 + date2*1.e-6
651 IF (ttest.GT.ttemp)
THEN
654 IF (tstep.GT.ntint)
EXIT
657 DO line = 1,numpart+1
658 READ (11,1010,
END=111,ERR=802,IOSTAT=IOERR) &
659 invar1,invar2,invar3,invar4
661 write(*,
'(A,2I6,4F7.2)')
'1+:',line,numpart+1,invar1,invar2,invar3,invar4
666 DO line = 1,numpart+1
667 READ (11,
END=111,ERR=802,IOSTAT=IOERR) iline,invar1,&
668 invar2,invar3,invar4,invar5,invar6
678 ALLOCATE(llat(readln))
679 ALLOCATE(llon(readln))
680 ALLOCATE(hs0(readln))
681 ALLOCATE(tp0(readln))
682 ALLOCATE(dir0(readln))
683 ALLOCATE(dspr0(readln))
685 ALLOCATE(wndspd0(readln))
686 ALLOCATE(wnddir0(readln))
687 ALLOCATE(date0(readln))
689 llat(1:readln) = 9999.
690 llon(1:readln) = 9999.
691 hs0(1:readln) = 9999.
692 tp0(1:readln) = 9999.
693 dir0(1:readln) = 9999.
694 dspr0(1:readln) = 9999.
701 form=
'unformatted', convert=file_endian)
715 READ(11,
END=112,ERR=802,IOSTAT=IOERR) IDSTR,verprt
716 READ(11,
END=112,ERR=802,IOSTAT=IOERR) headln1
717 READ(11,
END=112,ERR=802,IOSTAT=IOERR) headln2
720 IF (.NOT.
ALLOCATED(phs))
ALLOCATE(phs(maxpart))
721 IF (.NOT.
ALLOCATED(ptp))
ALLOCATE(ptp(maxpart))
722 IF (.NOT.
ALLOCATED(pdir))
ALLOCATE(pdir(maxpart))
723 IF (.NOT.
ALLOCATED(pspr))
ALLOCATE(pspr(maxpart))
724 IF (.NOT.
ALLOCATED(pwf))
ALLOCATE(pwf(maxpart))
728 DO WHILE (ttest.LT.tstart)
729 READ (11,
END=112,ERR=802,IOSTAT=IOERR) DATETIME, &
730 invar1,invar2,dummy,numpart,invar3, &
731 invar4,invar5,invar6,invar7
732 date1=dble(datetime(1))
733 date2=dble(datetime(2))
734 ttest = date1 + date2*1.0e-6
743 READ (11,
END=112,ERR=802,IOSTAT=IOERR) iline,invar1, &
744 invar2,invar3,invar4,invar5,invar6
746 READ (11,
END=112,ERR=802,IOSTAT=IOERR) iline, &
747 phs(i),ptp(i),invar3,pdir(i),pspr(i),pwf(i)
755 dspr0(line) = pspr(i)
756 date0(line) = date1 + date2*1.0e-6
761 wnddir0(line) = wnddir
771 DO WHILE (line.LE.readln)
773 READ (11,1000,
END=112) date1,date2,x,y,numpart, &
774 wnd,wnddir,invar6,invar7
776 READ (11,err=802,iostat=ioerr) datetime,x,y, &
777 dummy,numpart,wnd,wnddir,invar5,invar6,invar7
778 date1=dble(datetime(1))
779 date2=dble(datetime(2))
782 ttest = date1 + date2*1.0e-6
783 IF (ttest.GT.ttemp)
THEN
786 IF (tstep.GT.ntint)
EXIT
790 READ (11,1010,
END=112) invar1,invar2,invar3,invar4
792 IF (line.LE.readln)
THEN
793 READ (11,1010,
END=112) hs0(line),tp0(line), &
794 dir0(line),dspr0(line)
801 wnddir0(line) = wnddir
807 READ (11,err=802,iostat=ioerr) k,invar1,invar2, &
810 IF (line.LE.readln)
THEN
811 READ (11,
END=112,ERR=802,IOSTAT=IOERR) k, &
812 hs0(line),tp0(line),invar3,dir0(line), &
820 wnddir0(line) = wnddir
840 WRITE(6,*)
'... finished'
842 IF (ttest.LT.tstart)
THEN
843 WRITE(20,2003) tstart
848 IF (
ALLOCATED(phs))
DEALLOCATE(phs)
849 IF (
ALLOCATED(ptp))
DEALLOCATE(ptp)
850 IF (
ALLOCATED(pdir))
DEALLOCATE(pdir)
851 IF (
ALLOCATED(pspr))
DEALLOCATE(pspr)
852 IF (
ALLOCATED(pwf))
DEALLOCATE(pwf)
864 CALL unique(real(ts(1:line)),line,uniquetim,maxts)
867 CALL unique(llat(1:line),
SIZE(llat(1:line)),uniquelatraw,nout1)
868 CALL unique(llon(1:line),
SIZE(llon(1:line)),uniquelonraw,nout2)
873 WRITE(20,*)
'uniqueLatraw(:) =', uniquelatraw(:)
874 WRITE(20,*)
'uniqueLonraw(:) =', uniquelonraw(:)
876 WRITE(20,*)
'No. increments: Longitude, Latitue =', mxcwt, mycwt
877 DEALLOCATE(uniquelatraw)
878 DEALLOCATE(uniquelonraw)
879 ALLOCATE(uniquelatraw(mycwt+1))
880 ALLOCATE(uniquelonraw(mxcwt+1))
882 uniquelatraw(i) = minlat + &
883 (real(i)-1)/real(mycwt)*(maxlat-minlat)
886 uniquelonraw(i) = minlon + &
887 (real(i)-1)/real(mxcwt)*(maxlon-minlon)
889 WRITE(20,*)
'uniqueLatraw(:) =', uniquelatraw(:)
890 WRITE(20,*)
'uniqueLonraw(:) =', uniquelonraw(:)
895 DO latind1 = 1,
SIZE(uniquelatraw)
896 IF (uniquelatraw(latind1).GE.minlat)
EXIT
898 DO latind2 =
SIZE(uniquelatraw),1,-1
899 IF (uniquelatraw(latind2).LE.maxlat)
EXIT
901 DO lonind1 = 1,
SIZE(uniquelonraw)
902 IF (uniquelonraw(lonind1).GE.minlon)
EXIT
904 DO lonind2 =
SIZE(uniquelonraw),1,-1
905 IF (uniquelonraw(lonind2).LE.maxlon)
EXIT
907 WRITE(20,*)
'latind1, latind2, lonind1, lonind2 =', &
908 latind1, latind2, lonind1, lonind2
909 IF ((latind1.GE.latind2).OR.(lonind1.GE.lonind2))
THEN
916 ALLOCATE(uniquelat(latind2-latind1+1))
917 ALLOCATE(uniquelon(lonind2-lonind1+1))
918 uniquelat = uniquelatraw(latind1:latind2)
919 uniquelon = uniquelonraw(lonind1:lonind2)
920 WRITE(20,*)
'In waveTracking_NWS_V2: Longitude range =', &
921 uniquelon(1), uniquelon(
SIZE(uniquelon))
922 WRITE(20,*)
' Latitude range =', &
923 uniquelat(1), uniquelat(
SIZE(uniquelat))
929 ALLOCATE( mlon(
SIZE(uniquelon),
SIZE(uniquelat)) )
930 ALLOCATE( mlat(
SIZE(uniquelon),
SIZE(uniquelat)) )
932 maxi =
SIZE(uniquelon)
933 maxj =
SIZE(uniquelat)
936 mlon(i,j) = uniquelon(i)
937 mlat(i,j) = uniquelat(j)
945 CALL mpi_bcast(maxi,1,mpi_integer,0,mpi_comm_world,ierr)
946 CALL mpi_bcast(maxj,1,mpi_integer,0,mpi_comm_world,ierr)
947 CALL mpi_bcast(maxts,1,mpi_integer,0,mpi_comm_world,ierr)
954 WRITE(20,*)
'Allocating wsdat...'
959 ALLOCATE(wsdat(maxts))
963 WRITE(20,*)
'SIZE(wsdat) = ',
SIZE(wsdat)
973 ALLOCATE(wsdat(
tsa)%lat(maxi,maxj))
974 ALLOCATE(wsdat(
tsa)%lon(maxi,maxj))
975 ALLOCATE(wsdat(
tsa)%par(maxi,maxj))
976 ALLOCATE(wsdat(
tsa)%wnd(maxi,maxj))
980 wsdat(
tsa)%lat(i,j)=mlat(i,j)
981 wsdat(
tsa)%lon(i,j)=mlon(i,j)
984 wsdat(
tsa)%par(i,j)%hs(1:10)=9999.
985 wsdat(
tsa)%par(i,j)%tp(1:10)=9999.
986 wsdat(
tsa)%par(i,j)%dir(1:10)=9999.
987 wsdat(
tsa)%par(i,j)%dspr(1:10)=9999.
989 wsdat(
tsa)%par(i,j)%ipart(1:10)=0
990 wsdat(
tsa)%par(i,j)%sys(1:10)=9999
991 wsdat(
tsa)%par(i,j)%ngbrSys(1:50)=9999
992 wsdat(
tsa)%wnd(i,j)%wdir=9999.
993 wsdat(
tsa)%wnd(i,j)%wspd=9999.
994 wsdat(
tsa)%par(i,j)%checked=-1
1004 DO WHILE (l.LE.line)
1009 IF ( (abs(llat(l)-mlat(i,j)).LT.1.e-2).AND. &
1010 (abs(llon(l)-mlon(i,j)).LT.1.e-2) )
THEN
1014 wsdat(ts(l))%lat(i,j) = llat(l)
1015 wsdat(ts(l))%lon(i,j) = llon(l)
1022 abs(wsdat(ts(l))%lat(i,j)-llat(iline)).LT.1.e-3 &
1023 .AND.abs(wsdat(ts(l))%lon(i,j)-llon(iline)).LT.1.e-3 )
1025 wsdat(ts(iline))%par(i,j)%ipart(k) = k
1026 wsdat(ts(iline))%par(i,j)%hs(k) = hs0(iline)
1027 wsdat(ts(iline))%par(i,j)%tp(k) = tp0(iline)
1028 wsdat(ts(iline))%par(i,j)%dir(k) = dir0(iline)
1029 wsdat(ts(iline))%par(i,j)%dspr(k) = dspr0(iline)
1032 wsdat(ts(iline))%date = date0(iline)
1033 wsdat(ts(iline))%wnd(i,j)%wdir = wnddir0(iline)
1034 wsdat(ts(iline))%wnd(i,j)%wspd = wndspd0(iline)
1035 wsdat(ts(iline))%par(i,j)%checked = 0
1040 if (iline.GT.line)
EXIT
1050 IF (l+1.le.line)
THEN
1051 IF (ts(l).LT.ts(l+1))
THEN
1056 IF (
ALLOCATED(tmp_i4))
DEALLOCATE(tmp_i4)
1059 tmp_i4(1:k) = ts((l+1):line)
1062 ts(1:k) = tmp_i4(1:k)
1065 IF (
ALLOCATED(tmp_r8))
DEALLOCATE(tmp_r8)
1067 tmp_r8(1:k) = date0((l+1):line)
1070 date0(1:k) = tmp_r8(1:k)
1073 IF (
ALLOCATED(tmp_r4))
DEALLOCATE(tmp_r4)
1075 tmp_r4(1:k) = llat((l+1):line)
1078 llat(1:k) = tmp_r4(1:k)
1079 tmp_r4(1:k) = llon((l+1):line)
1082 llon(1:k) = tmp_r4(1:k)
1083 tmp_r4(1:k) = hs0((l+1):line)
1086 hs0(1:k) = tmp_r4(1:k)
1087 tmp_r4(1:k) = tp0((l+1):line)
1090 tp0(1:k) = tmp_r4(1:k)
1091 tmp_r4(1:k) = dir0((l+1):line)
1094 dir0(1:k) = tmp_r4(1:k)
1095 tmp_r4(1:k) = dspr0((l+1):line)
1098 dspr0(1:k) = tmp_r4(1:k)
1099 tmp_r4(1:k) = wndspd0((l+1):line)
1101 ALLOCATE(wndspd0(k))
1102 wndspd0(1:k) = tmp_r4(1:k)
1103 tmp_r4(1:k) = wnddir0((l+1):line)
1105 ALLOCATE(wnddir0(k))
1106 wnddir0(1:k) = tmp_r4(1:k)
1115 IF (
ALLOCATED(ts))
DEALLOCATE(ts)
1116 IF (
ALLOCATED(llat))
DEALLOCATE(llat)
1117 IF (
ALLOCATED(llon))
DEALLOCATE(llon)
1118 IF (
ALLOCATED(mlat))
DEALLOCATE(mlat)
1119 IF (
ALLOCATED(mlon))
DEALLOCATE(mlon)
1120 IF (
ALLOCATED(date0))
DEALLOCATE(date0)
1121 IF (
ALLOCATED(hs0))
DEALLOCATE(hs0)
1122 IF (
ALLOCATED(tp0))
DEALLOCATE(tp0)
1123 IF (
ALLOCATED(dir0))
DEALLOCATE(dir0)
1124 IF (
ALLOCATED(dspr0))
DEALLOCATE(dspr0)
1126 IF (
ALLOCATED(wndspd0))
DEALLOCATE(wndspd0)
1127 IF (
ALLOCATED(wnddir0))
DEALLOCATE(wnddir0)
1135 irank = mod((
tsa-t0),min(nproc,maxts))
1137 IF (irank.NE.0)
THEN
1140 IF (
rank.EQ.irank)
THEN
1141 ALLOCATE(wsdat(
tsa)%lat(maxi,maxj))
1142 ALLOCATE(wsdat(
tsa)%lon(maxi,maxj))
1143 ALLOCATE(wsdat(
tsa)%par(maxi,maxj))
1144 ALLOCATE(wsdat(
tsa)%wnd(maxi,maxj))
1148 wsdat(
tsa)%maxi=maxi
1149 wsdat(
tsa)%maxj=maxj
1150 wsdat(
tsa)%par(i,j)%hs(1:10)=9999.
1151 wsdat(
tsa)%par(i,j)%tp(1:10)=9999.
1152 wsdat(
tsa)%par(i,j)%dir(1:10)=9999.
1153 wsdat(
tsa)%par(i,j)%dspr(1:10)=9999.
1154 wsdat(
tsa)%par(i,j)%ipart(1:10)=0
1155 wsdat(
tsa)%par(i,j)%sys(1:10)=9999
1156 wsdat(
tsa)%par(i,j)%ngbrSys(1:50)=9999
1157 wsdat(
tsa)%wnd(i,j)%wdir=9999.
1158 wsdat(
tsa)%wnd(i,j)%wspd=9999.
1159 wsdat(
tsa)%par(i,j)%checked=-1
1166 tag1 = ((j-1)*maxi+i)*10
1171 commarr1 = (/wsdat(
tsa)%par(i,j)%hs(:), &
1172 wsdat(
tsa)%par(i,j)%tp(:), &
1173 wsdat(
tsa)%par(i,j)%dir(:), &
1174 wsdat(
tsa)%par(i,j)%dspr(:), &
1175 wsdat(
tsa)%wnd(i,j)%wdir, &
1176 wsdat(
tsa)%wnd(i,j)%wspd, &
1177 wsdat(
tsa)%lat(i,j), &
1178 wsdat(
tsa)%lon(i,j)/)
1179 CALL mpi_send(commarr1,44,mpi_real,irank, &
1180 (tag1+1),mpi_comm_world,ierr)
1182 IF (
rank.EQ.irank)
THEN
1185 CALL mpi_recv(commarr1,44,mpi_real,0,(tag1+1), &
1186 mpi_comm_world,mpi_status,ierr)
1187 wsdat(
tsa)%par(i,j)%hs = commarr1(1:10)
1188 wsdat(
tsa)%par(i,j)%tp = commarr1(11:20)
1189 wsdat(
tsa)%par(i,j)%dir = commarr1(21:30)
1190 wsdat(
tsa)%par(i,j)%dspr = commarr1(31:40)
1191 wsdat(
tsa)%wnd(i,j)%wdir = commarr1(41)
1192 wsdat(
tsa)%wnd(i,j)%wspd = commarr1(42)
1193 wsdat(
tsa)%lat(i,j) = commarr1(43)
1194 wsdat(
tsa)%lon(i,j) = commarr1(44)
1198 CALL mpi_send(wsdat(
tsa)%date,1, &
1199 mpi_double_precision,irank, &
1200 (tag1+2),mpi_comm_world,ierr)
1202 IF (
rank.EQ.irank)
THEN
1203 CALL mpi_recv(wsdat(
tsa)%date,1, &
1204 mpi_double_precision,0,(tag1+2), &
1205 mpi_comm_world,mpi_status,ierr)
1211 commarr2 = (/wsdat(
tsa)%par(i,j)%ipart(:), &
1212 wsdat(
tsa)%par(i,j)%checked/)
1213 CALL mpi_send(commarr2,11, &
1214 mpi_integer,irank,(tag1+3),mpi_comm_world,ierr)
1216 IF (
rank.EQ.irank)
THEN
1219 CALL mpi_recv(commarr2,11, &
1220 mpi_integer,0,(tag1+3), &
1221 mpi_comm_world,mpi_status,ierr)
1222 wsdat(
tsa)%par(i,j)%ipart(:) = commarr2(1:10)
1223 wsdat(
tsa)%par(i,j)%checked = commarr2(11)
1231 CALL mpi_barrier(mpi_comm_world,ierr)
1241 OPEN(unit=31,
file=
'PART_COORD.OUT',
status=
'unknown')
1243 WRITE(31,*)
'Longitude ='
1246 WRITE(31,
'(F7.2)',advance=
'NO') wsdat(1)%lon(i,j)
1248 WRITE(31,
'(A)',advance=
'YES')
''
1251 WRITE(31,*)
'Latitude = '
1254 WRITE(31,
'(F7.2)',advance=
'NO') wsdat(1)%lat(i,j)
1256 WRITE(31,
'(A)',advance=
'YES')
''
1262 OPEN(unit=32,
file=
'PART_HSIGN.OUT', &
1266 DO tsa = 1,
SIZE(wsdat)
1267 WRITE(32,
'(I4,71x,A)')
tsa,
'Time step'
1268 WRITE(32,
'(I4,71x,A)') maxpartout,
'Tot number of raw partitions'
1270 WRITE(32,
'(I4,71x,A)') k,
'System number'
1271 WRITE(32,
'(I4,71x,A)') 9999,
'Number of points in system'
1274 WRITE(32,
'(F8.2)',advance=
'NO') wsdat(
tsa)%par(i,j)%hs(k)
1276 WRITE(32,
'(A)',advance=
'YES')
''
1286 OPEN(unit=33,
file=
'PART_TP.OUT', &
1289 DO tsa = 1,
SIZE(wsdat)
1290 WRITE(33,
'(I4,71x,A)')
tsa,
'Time step'
1291 WRITE(33,
'(I4,71x,A)') maxpartout,
'Tot number of raw partitions'
1293 WRITE(33,
'(I4,71x,A)') k,
'System number'
1294 WRITE(33,
'(I4,71x,A)') 9999,
'Number of points in system'
1297 WRITE(33,
'(F8.2)',advance=
'NO') wsdat(
tsa)%par(i,j)%tp(k)
1299 WRITE(33,
'(A)',advance=
'YES')
''
1307 OPEN(unit=34,
file=
'PART_DIR.OUT', &
1310 DO tsa = 1,
SIZE(wsdat)
1311 WRITE(34,
'(I4,71x,A)')
tsa,
'Time step'
1312 WRITE(34,
'(I4,71x,A)') maxpartout,
'Tot number of raw partitions'
1314 WRITE(34,
'(I4,71x,A)') k,
'System number'
1315 WRITE(34,
'(I4,71x,A)') 9999,
'Number of points in system'
1318 WRITE(34,
'(F8.2)',advance=
'NO') wsdat(
tsa)%par(i,j)%dir(k)
1320 WRITE(34,
'(A)',advance=
'YES')
''
1328 OPEN(unit=35,
file=
'PART_DSPR.OUT', &
1331 DO tsa = 1,
SIZE(wsdat)
1332 WRITE(35,
'(I4,71x,A)')
tsa,
'Time step'
1333 WRITE(35,
'(I4,71x,A)') maxpartout,
'Tot number of raw partitions'
1335 WRITE(35,
'(I4,71x,A)') k,
'System number'
1336 WRITE(35,
'(I4,71x,A)') 9999,
'Number of points in system'
1339 WRITE(35,
'(F8.2)',advance=
'NO') &
1340 wsdat(
tsa)%par(i,j)%dspr(k)
1342 WRITE(35,
'(A)',advance=
'YES')
''
1359 WRITE(20,*)
'Allocating sysA...'
1363 ALLOCATE( sysa(maxts) )
1367 WRITE(20,*)
'SIZE(sysA) = ',
SIZE(sysa)
1368 WRITE(6,1020)
' Number of time levels being processed:',
SIZE(sysa)
1375 ALLOCATE( maxsys(maxts) )
1385 ALLOCATE( maxsys(1) )
1392 WRITE(6,*)
'Performing spatial tracking...'
1396 DO tsa = (t0+
rank),maxts,min(nproc,maxts)
1403 WRITE(20,*)
'Call spiralTrackV3, tsA=',
tsa,
'...'
1404 CALL spiraltrackv3 ( wsdat(
tsa), dirknob, perknob, wetpts, &
1405 hsknob, seedlat, seedlon, &
1406 maxsys(
tsa), sysa(
tsa)%sys )
1408 WRITE(20,*)
'*** SIZE(sysA(1:tsA)%sys) at end of time step', &
1410 WRITE(20,*)
SIZE(sysa(
tsa)%sys)
1419 CALL mpi_barrier(mpi_comm_world,ierr)
1439 irank = mod((
tsa-t0),min(nproc,maxts))
1441 IF (irank.NE.0)
THEN
1446 IF (
rank.EQ.irank)
THEN
1449 CALL mpi_send(maxsys(
tsa),1,mpi_integer,0,tag1, &
1450 mpi_comm_world,ierr)
1455 CALL mpi_recv(maxsys(
tsa),1,mpi_integer, &
1456 irank,tag1,mpi_comm_world,mpi_status,ierr)
1458 ALLOCATE( sysa(
tsa)%sys(maxsys(
tsa)) )
1459 DO ic = 1,maxsys(
tsa)
1460 NULLIFY( sysa(
tsa)%sys(ic)%i )
1461 NULLIFY( sysa(
tsa)%sys(ic)%j )
1462 NULLIFY( sysa(
tsa)%sys(ic)%lon )
1463 NULLIFY( sysa(
tsa)%sys(ic)%lat )
1464 NULLIFY( sysa(
tsa)%sys(ic)%hs )
1465 NULLIFY( sysa(
tsa)%sys(ic)%tp )
1466 NULLIFY( sysa(
tsa)%sys(ic)%dir)
1467 NULLIFY( sysa(
tsa)%sys(ic)%dspr)
1468 ALLOCATE( sysa(
tsa)%sys(ic)%i(maxi*maxj) )
1469 ALLOCATE( sysa(
tsa)%sys(ic)%j(maxi*maxj) )
1470 ALLOCATE( sysa(
tsa)%sys(ic)%lon(maxi*maxj) )
1471 ALLOCATE( sysa(
tsa)%sys(ic)%lat(maxi*maxj) )
1472 ALLOCATE( sysa(
tsa)%sys(ic)%hs(maxi*maxj) )
1473 ALLOCATE( sysa(
tsa)%sys(ic)%tp(maxi*maxj) )
1474 ALLOCATE( sysa(
tsa)%sys(ic)%dir(maxi*maxj) )
1475 ALLOCATE( sysa(
tsa)%sys(ic)%dspr(maxi*maxj) )
1476 sysa(
tsa)%sys(ic)%i(:) = 9999
1477 sysa(
tsa)%sys(ic)%j(:) = 9999
1478 sysa(
tsa)%sys(ic)%lon(:) = 9999.
1479 sysa(
tsa)%sys(ic)%lat(:) = 9999.
1480 sysa(
tsa)%sys(ic)%hs(:) = 9999.
1481 sysa(
tsa)%sys(ic)%tp(:) = 9999.
1482 sysa(
tsa)%sys(ic)%dir(:) = 9999.
1483 sysa(
tsa)%sys(ic)%dspr(:) = 9999.
1484 sysa(
tsa)%sys(ic)%hsMean = 9999.
1485 sysa(
tsa)%sys(ic)%tpMean = 9999.
1486 sysa(
tsa)%sys(ic)%dirMean = 9999.
1487 sysa(
tsa)%sys(ic)%sysInd = 9999
1488 sysa(
tsa)%sys(ic)%nPoints = 9999
1489 sysa(
tsa)%sys(ic)%grp = 9999
1494 IF ((
rank.EQ.0).OR.(
rank.EQ.irank))
THEN
1495 DO ic = 1, maxsys(
tsa)
1497 tag2 =
tsa*10000 + ic*100
1500 IF (
rank.EQ.irank)
THEN
1503 CALL mpi_send(sysa(
tsa)%sys(ic)%i(:),domsize, &
1504 mpi_integer,0,(tag2+1),mpi_comm_world,req(1),ierr)
1509 CALL mpi_recv(sysa(
tsa)%sys(ic)%i(:),domsize, &
1510 mpi_integer,irank,(tag2+1), &
1511 mpi_comm_world,mpi_status,req(2),ierr)
1515 IF (
rank.EQ.irank)
THEN
1518 CALL mpi_send(sysa(
tsa)%sys(ic)%j(:),domsize, &
1519 mpi_integer,0,(tag2+2),mpi_comm_world,req(1),ierr)
1524 CALL mpi_recv(sysa(
tsa)%sys(ic)%j(:),domsize, &
1525 mpi_integer,irank,(tag2+2), &
1526 mpi_comm_world,mpi_status,req(2),ierr)
1530 IF (
rank.EQ.irank)
THEN
1532 CALL mpi_send(sysa(
tsa)%sys(ic)%lon(:),domsize, &
1533 mpi_real,0,(tag2+3),mpi_comm_world,req(1),ierr)
1537 CALL mpi_recv(sysa(
tsa)%sys(ic)%lon(:),domsize, &
1538 mpi_real,irank,(tag2+3), &
1539 mpi_comm_world,mpi_status,req(2),ierr)
1543 IF (
rank.EQ.irank)
THEN
1545 CALL mpi_send(sysa(
tsa)%sys(ic)%lat(:),domsize, &
1546 mpi_real,0,(tag2+4),mpi_comm_world,req(1),ierr)
1550 CALL mpi_recv(sysa(
tsa)%sys(ic)%lat(:),domsize, &
1551 mpi_real,irank,(tag2+4), &
1552 mpi_comm_world,mpi_status,req(2),ierr)
1556 IF (
rank.EQ.irank)
THEN
1558 CALL mpi_send(sysa(
tsa)%sys(ic)%hs(:),domsize, &
1559 mpi_real,0,(tag2+5),mpi_comm_world,req(1),ierr)
1563 CALL mpi_recv(sysa(
tsa)%sys(ic)%hs(:),domsize, &
1564 mpi_real,irank,(tag2+5), &
1565 mpi_comm_world,mpi_status,req(2),ierr)
1569 IF (
rank.EQ.irank)
THEN
1571 CALL mpi_send(sysa(
tsa)%sys(ic)%tp(:),domsize, &
1572 mpi_real,0,(tag2+6),mpi_comm_world,req(1),ierr)
1576 CALL mpi_recv(sysa(
tsa)%sys(ic)%tp(:),domsize, &
1577 mpi_real,irank,(tag2+6), &
1578 mpi_comm_world,mpi_status,req(2),ierr)
1582 IF (
rank.EQ.irank)
THEN
1584 CALL mpi_send(sysa(
tsa)%sys(ic)%dir(:),domsize, &
1585 mpi_real,0,(tag2+7),mpi_comm_world,req(1),ierr)
1589 CALL mpi_recv(sysa(
tsa)%sys(ic)%dir(:),domsize, &
1590 mpi_real,irank,(tag2+7), &
1591 mpi_comm_world,mpi_status,req(2),ierr)
1595 IF (
rank.EQ.irank)
THEN
1597 CALL mpi_send(sysa(
tsa)%sys(ic)%dspr(:),domsize, &
1598 mpi_real,0,(tag2+8),mpi_comm_world,req(1),ierr)
1602 CALL mpi_recv(sysa(
tsa)%sys(ic)%dspr(:),domsize, &
1603 mpi_real,irank,(tag2+8), &
1604 mpi_comm_world,mpi_status,req(2),ierr)
1608 IF (
rank.EQ.irank)
THEN
1611 CALL mpi_send(sysa(
tsa)%sys(ic)%hsMean,1,mpi_real, &
1612 0,(tag2+9),mpi_comm_world,ierr)
1617 CALL mpi_recv(sysa(
tsa)%sys(ic)%hsMean,1,mpi_real, &
1618 irank,(tag2+9),mpi_comm_world,mpi_status,ierr)
1621 IF (
rank.EQ.irank)
THEN
1624 CALL mpi_send(sysa(
tsa)%sys(ic)%tpMean,1,mpi_real, &
1625 0,(tag2+10),mpi_comm_world,ierr)
1630 CALL mpi_recv(sysa(
tsa)%sys(ic)%tpMean,1,mpi_real, &
1631 irank,(tag2+10),mpi_comm_world,mpi_status,ierr)
1634 IF (
rank.EQ.irank)
THEN
1637 CALL mpi_send(sysa(
tsa)%sys(ic)%dirMean,1,mpi_real, &
1638 0,(tag2+11),mpi_comm_world,ierr)
1643 CALL mpi_recv(sysa(
tsa)%sys(ic)%dirMean,1,mpi_real, &
1644 irank,(tag2+11),mpi_comm_world,mpi_status,ierr)
1647 IF (
rank.EQ.irank)
THEN
1650 CALL mpi_send(sysa(
tsa)%sys(ic)%sysInd,1,mpi_integer,&
1651 0,(tag2+12),mpi_comm_world,ierr)
1656 CALL mpi_recv(sysa(
tsa)%sys(ic)%sysInd,1,mpi_integer,&
1657 irank,(tag2+12),mpi_comm_world,mpi_status,ierr)
1660 IF (
rank.EQ.irank)
THEN
1663 CALL mpi_send(sysa(
tsa)%sys(ic)%nPoints,1,mpi_integer,&
1664 0,(tag2+13),mpi_comm_world,ierr)
1669 CALL mpi_recv(sysa(
tsa)%sys(ic)%nPoints,1,mpi_integer,&
1670 irank,(tag2+13),mpi_comm_world,mpi_status,ierr)
1673 IF (
rank.EQ.irank)
THEN
1676 CALL mpi_send(sysa(
tsa)%sys(ic)%grp,1,mpi_integer,&
1677 0,(tag2+14),mpi_comm_world,ierr)
1682 CALL mpi_recv(sysa(
tsa)%sys(ic)%grp,1,mpi_integer,&
1683 irank,(tag2+14),mpi_comm_world,mpi_status,ierr)
1690 CALL mpi_barrier(mpi_comm_world,ierr)
1700 WRITE(6,*)
'Performing temporal tracking...'
1701 WRITE(20,*)
'Calling timeTrackingV2...'
1702 lonext = wsdat(1)%lon(maxi,1)-wsdat(1)%lon(1,1)
1703 latext = wsdat(1)%lat(1,maxj)-wsdat(1)%lat(1,1)
1705 CALL timetrackingv2 (sysa, maxsys, tptimeknob, dirtimeknob, 1, &
1706 maxgroup, dt, lonext, latext, maxi, maxj)
1718 990
FORMAT (/
' *** WAVEWATCH III ERROR IN W3STRKMD : '/ &
1719 ' ERROR IN READING FROM PARTITION FILE'/ &
1721 1000
FORMAT (f9.0,f7.0,f8.3,f8.3,14x,i3,7x,f5.1,f6.1,f5.1,f6.1)
1722 1010
FORMAT (3x,f8.2,f8.2,8x,f9.2,f9.2)
1723 1200
FORMAT (/
' *** WAVEWATCH III ERROR IN W3STRKMD : '/ &
1724 ' ERROR IN READING PARTITION FILE '/ &
1725 ' INCOMPATIBLE ENDIANESS'/ )
1726 1300
FORMAT (/
' *** WAVEWATCH III ERROR IN W3STRKMD : '/ &
1727 ' ERROR IN READING PARTITION FILE '/ &
1728 ' EXPECTED IDSTR "WAVEWATCH III PARTITIONED DATA FILE"'/ )
1729 1400
FORMAT (/
' *** WAVEWATCH III ERROR IN W3STRKMD : '/ &
1730 ' ERROR IN FINDING DOMAIN TO PROCESS - '/ &
1731 ' SPECIFIED LAT/LON LIMITS WITHIN DOMAIN '/ &
1732 ' OF RAW PARTITION FILE?'/ )
1733 2001
FORMAT (/
' *** WAVEWATCH III ERROR IN W3SYSTRK : '/ &
1734 ' ERROR IN OPENING INPUT FILE'/ )
1735 2002
FORMAT (/
' *** WAVEWATCH III ERROR IN W3SYSTRK : '/ &
1736 ' PREMATURE END OF INPUT FILE'/ )
1737 2003
FORMAT (/
' *** WAVEWATCH III ERROR IN W3SYSTRK : '/ &
1738 ' PREMATURE END OF PARTITION FILE - '/ &