75 INTEGER :: ngbrsys(50)
98 REAL,
POINTER :: lat(:,:)
99 REAL,
POINTER :: lon(:,:)
101 TYPE(
wind),
POINTER :: wnd(:,:)
123 INTEGER :: sysval(50)
150 REAL,
POINTER :: hs(:)
151 REAL,
POINTER :: tp(:)
152 REAL,
POINTER :: dir(:)
153 REAL,
POINTER :: dspr(:)
155 INTEGER,
POINTER :: i(:)
156 INTEGER,
POINTER :: j(:)
157 INTEGER,
POINTER :: indx(:)
158 REAL,
POINTER :: lat(:)
159 REAL,
POINTER :: lon(:)
166 INTEGER :: ngbr(1000)
184 INTEGER,
POINTER :: indx(:)
294 seedLon ,dirTimeKnob, &
295 tpTimeKnob ,paramFile , &
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
511 OPEN(unit=11,
file=filename,status=
'old')
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...'
557 OPEN(unit=11,
file=filename,status=
'old')
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...'
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.
698 OPEN(unit=11,
file=filename,status=
'old')
700 OPEN(unit=11,
file=filename,status=
'old', &
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)
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 - '/ &
1746 SUBROUTINE spiraltrackv3 (wsdat ,dirKnob ,perKnob ,wetPts , &
1747 hsKnob ,seedLat ,seedLon , &
1804 TYPE(
dat2d) :: wsdat
1805 REAL :: dirKnob,perKnob,wetPts,hsKnob,seedLat,seedLon
1807 TYPE(
system),
POINTER :: sys(:)
1809 INTENT (IN) wetpts,dirknob,perknob,hsknob,seedlat,seedlon
1810 INTENT (IN OUT) wsdat
1822 INTEGER :: ngbrExt, combine, maxI, maxJ, i, j, oldJ
1823 INTEGER :: horizStepCount, vertStepCount, checkCount, sc, &
1824 maxPts, landPts, horizBorder, vertBorder, m, k, &
1826 REAL :: deltaLat, minLat, maxLat, minLon, maxLon
1863 WRITE(20,*)
'In spiralTrackV3: combine = ',combine
1867 IF ( (seedlat.EQ.0).OR.(seedlon.EQ.0) )
THEN
1868 i=nint(real(maxi)/2.)
1869 j=nint(real(maxj)/2.)
1870 WRITE(20,*)
'In spiralTrackV3, i=NINT(maxI/2.) =',i
1871 WRITE(20,*)
'In spiralTrackV3, j=NINT(maxJ/2.) =',j
1875 DO WHILE ( (wsdat%lat(1,j).LT.seedlat).AND.(j.LT.wsdat%maxj) )
1878 DO WHILE ( (wsdat%lon(i,1).LT.seedlon).AND.(i.LT.wsdat%maxi) )
1883 IF (wsdat%par(i,j)%checked.EQ.-1)
THEN
1885 DO WHILE (wsdat%par(i,j)%checked.EQ.-1)
1895 deltalat=(wsdat%lat(i,j)-wsdat%lat(i,j-1))*111.18
1907 minlat=minval(wsdat%lat)
1908 maxlat=maxval(wsdat%lat)
1909 minlon=minval(wsdat%lon)
1910 maxlon=maxval(wsdat%lon)
1914 DO WHILE (checkcount.LE.(maxi*maxj-3) )
1917 CALL findway(way, horizstepcount, vertstepcount, &
1918 vertborder, horizborder, stepcount)
1921 DO k=1,
length(wsdat%par(i,j)%hs, &
1922 SIZE(wsdat%par(i,j)%hs),9999.)
1923 IF ( (wsdat%par(i,j)%hs(k).EQ.0.).AND. &
1924 (wsdat%par(i,j)%tp(k).EQ.0.) )
THEN
1925 wsdat%par(i,j)%sys(k)=-1
1928 wsdat%par(i,j)%sys(k)=m
1932 wsdat%par(i,j)%checked=1
1933 checkcount=checkcount+1
1936 DO sc = 1, stepcount
1937 CALL findnext (i,j,maxi,maxj,way,vertborder,horizborder)
1938 IF ( wsdat%par(i,j)%checked.EQ.-1 )
THEN
1940 checkcount=checkcount+1
1943 wsdat%par(i,j)%checked=-2
1944 ELSE IF ( wsdat%par(i,j)%checked.EQ.0 )
THEN
1946 checkcount=checkcount+1
1947 CALL findsys(i, j, wsdat, maxsys, ngbrext, maxi, maxj, &
1948 perknob, dirknob, hsknob)
1953 maxpts=nint(wetpts*(maxi*maxj-1))
1955 WRITE(20,*)
'Call combineWaveSystems...'
1957 perknob,dirknob,hsknob,combine,sys)
1965 dirTimeKnob,ts0 ,maxGroup , &
1966 dt ,lonext ,latext , &
2014 TYPE(
timsys),
POINTER :: sysA(:)
2015 INTEGER,
POINTER :: maxSys(:)
2016 REAL :: dirTimeKnob, tpTimeKnob
2017 INTEGER :: ts0, maxGroup
2019 REAL :: lonext, latext
2020 INTEGER :: maxI, maxJ
2022 INTENT (IN) tptimeknob, dirtimeknob, ts0, maxi, maxj
2024 INTENT (OUT) maxgroup
2031 LOGICAL :: file_exists
2032 CHARACTER :: dummy*23
2034 INTEGER :: leng, l, i, ii, j, k, kk, idir, numSys, &
2035 counter, new, DIFSIZE, tpMinInd, dirMinInd, used, ok
2036 REAL :: Tb, deltaPer, deltaDir, tpMinVal, dirMinVal, &
2037 dirForTpMin, tpForDirMin
2038 REAL,
ALLOCATABLE :: sysOrdered(:), TEMP(:), dirs(:)
2039 REAL,
POINTER :: DIFARR(:)
2040 INTEGER,
ALLOCATABLE :: indSorted(:), alreadyUsed(:), allInd(:)
2041 INTEGER,
ALLOCATABLE :: ind(:), ind2(:)
2043 REAL,
ALLOCATABLE :: GOF(:,:), GOFMinVal(:), GOFMinInd(:), &
2044 Tbsysmem(:), deltaDirsysmem(:), &
2045 deltaPersysmem(:),m1sysmem(:),m2sysmem(:)
2047 REAL :: lonmean, latmean, dmndiag
2048 INTEGER :: npnts, npnts2
2049 REAL,
ALLOCATABLE :: mnlonlist(:), mnlatlist(:), mndist(:)
2050 REAL,
POINTER :: dummy1(:),dummy2(:),dummy3(:)
2051 INTEGER,
ALLOCATABLE :: olsize(:)
2052 REAL :: TEMP1, TEMP2
2053 INTEGER :: iii, jj, ll, idup
2084 WRITE(20,*)
'TIME TRACKING'
2085 WRITE(20,*)
'Inside timeTrackingV2: SIZE(sysA(1)%sys) =', &
2087 WRITE(20,*)
'Inside timeTrackingV2: maxSys(1) =',maxsys(1)
2088 WRITE(20,*)
'ts0 = ',ts0
2093 DO i = ts1,
SIZE(sysa)
2094 IF (
SIZE(sysa(ts1)%sys).EQ.0) ts1 = ts1+1
2096 IF (ts1.GT.
SIZE(sysa))
THEN
2101 WRITE(20,*)
'TS = ',ts1
2103 IF (
SIZE(sysa(ts1)%sys).GT.0)
THEN
2105 sysa(ts1)%sys(:)%grp = 9999
2106 sysmem(:)%grp = 9999
2107 sysmem(:)%nPoints = 0
2108 sysmem(:)%lonMean = 9999.
2109 sysmem(:)%latMean = 9999.
2110 sysmem(:)%tpMean = 9999.
2111 sysmem(:)%dirMean = 9999.
2112 sysmem(:)%updated = -9999
2113 sysmem(:)%length = 0
2115 ALLOCATE(sysmem(iii)%indx(maxi*maxj))
2116 sysmem(iii)%indx = 9999
2119 INQUIRE(
file=
"sys_restart.ww3", exist=file_exists)
2120 IF (file_exists)
THEN
2122 WRITE(20,*)
'*** Using group memory hotfile'
2123 OPEN(unit=12,
file=
'sys_restart.ww3',status=
'old')
2124 READ(12,
'(A23,I10)') dummy,maxgroup
2125 WRITE(20,*)
'Reading ',maxgroup,
' systems'
2127 READ(12,
'(A23,I10)') dummy,sysmem(k)%grp
2128 READ(12,
'(A23,I10)') dummy,sysmem(k)%nPoints
2129 READ(12,
'(A23,F10.4)') dummy,sysmem(k)%lonMean
2130 READ(12,
'(A23,F10.4)') dummy,sysmem(k)%latMean
2131 READ(12,
'(A23,F10.3)') dummy,sysmem(k)%tpMean
2132 READ(12,
'(A23,F10.3)') dummy,sysmem(k)%dirMean
2133 READ(12,
'(A23,I10)') dummy,sysmem(k)%updated
2134 READ(12,
'(A23,I10)') dummy,sysmem(k)%length
2136 READ(12,*) (sysmem(k)%indx((j-1)*maxi+i), i = 1,maxi)
2139 sysmem(k)%updated = 0
2145 ALLOCATE( sysordered(maxsys(ts1)) )
2146 ALLOCATE( indsorted(maxsys(ts1)) )
2147 CALL sort (real(sysa(ts1)%sys(1:maxsys(ts1))%nPoints), &
2148 maxsys(ts1),sysordered,indsorted,
'D')
2149 sysa(ts1)%sys(1:maxsys(ts1)) = sysa(ts1)%sys(indsorted)
2150 IF (
ALLOCATED(sysordered))
DEALLOCATE(sysordered)
2151 IF (
ALLOCATED(indsorted))
DEALLOCATE(indsorted)
2154 DO i = 1, maxsys(ts1)
2155 sysa(ts1)%sys(i)%grp = i
2158 sysmem(i)%nPoints = sysa(ts1)%sys(i)%nPoints
2159 sysmem(i)%lonMean = &
2160 sum(sysa(ts1)%sys(i)%lon(1:sysmem(i)%nPoints))/&
2162 sysmem(i)%latMean = &
2163 sum(sysa(ts1)%sys(i)%lat(1:sysmem(i)%nPoints))/&
2168 DO iii = 1,sysmem(i)%nPoints
2170 (sysa(ts1)%sys(i)%hs(iii)**2)*sysa(ts1)%sys(i)%lon(iii)
2172 (sysa(ts1)%sys(i)%hs(iii)**2)*sysa(ts1)%sys(i)%lat(iii)
2174 sysmem(i)%lonMean = temp1/&
2175 max(sum(sysa(ts1)%sys(i)%hs(1:sysmem(i)%nPoints)**2),&
2177 sysmem(i)%latMean = temp2/&
2178 max(sum(sysa(ts1)%sys(i)%hs(1:sysmem(i)%nPoints)**2),&
2181 sysmem(i)%tpMean = sysa(ts1)%sys(i)%tpMean
2182 sysmem(i)%dirMean = sysa(ts1)%sys(i)%dirMean
2183 sysmem(i)%updated = ts1
2184 sysmem(i)%length = 1
2186 DO iii = 1,sysmem(i)%nPoints
2187 sysmem(i)%indx(iii) = (sysa(ts1)%sys(i)%j(iii)-1)*maxi +&
2188 sysa(ts1)%sys(i)%i(iii)
2192 maxgroup = maxsys(ts1)
2198 WRITE(20,*)
'sysMem(',i,
')%grp =',sysmem(i)%grp
2199 WRITE(20,*)
'sysMem(',i,
')%nPoints =',sysmem(i)%nPoints
2200 WRITE(20,*)
'sysMem(',i,
')%lonMean =',sysmem(i)%lonMean
2201 WRITE(20,*)
'sysMem(',i,
')%latMean =',sysmem(i)%latMean
2202 WRITE(20,*)
'sysMem(',i,
')%tpMean =',sysmem(i)%tpMean
2203 WRITE(20,*)
'sysMem(',i,
')%dirMean =',sysmem(i)%dirMean
2204 WRITE(20,*)
'sysMem(',i,
')%updated =',sysmem(i)%updated
2205 WRITE(20,*)
'sysMem(',i,
')%length =',sysmem(i)%length
2211 WRITE(20,*)
'Number of time levels = ',
SIZE(sysa)
2212 DO i = (ts1+1),
SIZE(sysa)
2213 WRITE(20,*)
'TS = ',i
2215 IF (
SIZE(sysa(i)%sys).GT.0)
THEN
2218 ALLOCATE( sysordered(maxsys(i)) )
2219 ALLOCATE( indsorted(maxsys(i)) )
2220 CALL sort (real(sysa(i)%sys(1:maxsys(i))%nPoints), &
2221 maxsys(i),sysordered,indsorted,
'D')
2222 sysa(i)%sys(1:maxsys(i)) = sysa(i)%sys(indsorted)
2223 IF (
ALLOCATED(sysordered))
DEALLOCATE(sysordered)
2224 IF (
ALLOCATED(indsorted))
DEALLOCATE(indsorted)
2228 sysa(i)%sys(:)%grp = 9999
2230 leng =
length(real(sysmem(:)%grp), &
2231 SIZE(sysmem(:)%grp),real(9999))
2232 ALLOCATE( alreadyused(leng+10) )
2233 WRITE(20,*)
'sysMem(1:leng)%grp =', &
2235 ALLOCATE( allind(leng) )
2237 allind(:) = sysmem(1:leng)%grp
2240 ALLOCATE( ind(
SIZE(allind)) )
2242 ALLOCATE( ind2(
SIZE(ind)) )
2243 DO ii = 1,
SIZE(ind)
2244 ind2(ii) =
findfirst(real(allind),
SIZE(allind), &
2248 ALLOCATE( gof(maxsys(i),maxgroup) )
2249 ALLOCATE( gofminval(maxgroup) )
2250 ALLOCATE( gofminind(maxgroup) )
2251 ALLOCATE( tbsysmem(maxgroup) )
2252 ALLOCATE( deltadirsysmem(maxgroup) )
2253 ALLOCATE( deltapersysmem(maxgroup) )
2254 ALLOCATE( m1sysmem(maxgroup) )
2255 ALLOCATE( m2sysmem(maxgroup) )
2258 npnts = sysa(i)%sys(j)%nPoints
2259 lonmean = sum(sysa(i)%sys(j)%lon(1:npnts))/npnts
2260 latmean = sum(sysa(i)%sys(j)%lat(1:npnts))/npnts
2266 (sysa(i)%sys(j)%hs(iii)**2)*sysa(i)%sys(j)%lon(iii)
2268 (sysa(i)%sys(j)%hs(iii)**2)*sysa(i)%sys(j)%lat(iii)
2270 lonmean=temp1/max(sum(sysa(i)%sys(j)%hs(1:npnts)**2),0.001)
2271 latmean=temp2/max(sum(sysa(i)%sys(j)%hs(1:npnts)**2),0.001)
2274 ALLOCATE(sysa(i)%sys(j)%indx(maxi*maxj))
2275 sysa(i)%sys(j)%indx = 9999
2276 DO iii = 1,sysa(i)%sys(j)%nPoints
2277 sysa(i)%sys(j)%indx(iii) = &
2278 (sysa(i)%sys(j)%j(iii)-1)*maxi + &
2279 sysa(i)%sys(j)%i(iii)
2282 WRITE(20,*)
'System no. ',j,
' of ',maxsys(i)
2283 WRITE(20,*)
'Size =', npnts
2284 WRITE(20,*)
'lonMean =', lonmean
2285 WRITE(20,*)
'latMean =', latmean
2286 WRITE(20,*)
'tpMean =', sysa(i)%sys(j)%tpMean
2287 WRITE(20,*)
'dirMean =', sysa(i)%sys(j)%dirMean
2288 sysa(i)%sys(j)%grp = 9999
2291 tbsysmem = sysmem(1:maxgroup)%tpMean
2292 WRITE(20,*)
'Tbsysmem(:) = ', tbsysmem(:)
2310 DO ii = 1,
SIZE(ind2)
2311 m1sysmem(ii) = max((-3.645*tbsysmem(ii)+63.211),10.)
2312 m2sysmem(ii) = max((-0.346*tbsysmem(ii)+3.686),0.6)
2314 deltadirsysmem = m1sysmem(:)*1. + dirtimeknob
2315 deltapersysmem = m2sysmem(:)*1. + tptimeknob
2316 WRITE(20,*)
'deltaDirsysmem(:) = ',deltadirsysmem
2317 WRITE(20,*)
'deltaPersysmem(:) = ',deltapersysmem
2320 ALLOCATE( temp(
SIZE(ind2)) )
2321 temp = abs( sysa(i)%sys(j)%tpMean - &
2322 sysmem(ind2(:))%tpMean )
2323 WRITE(20,*)
'tpMean list =', &
2324 sysmem(ind2(:))%tpMean
2325 WRITE(20,*)
'tpMinVal list =', temp
2326 tpminval = minval(temp)
2327 tpminind =
findfirst(temp,
SIZE(temp),tpminval)
2330 ALLOCATE( dirs(
SIZE(ind2)) )
2331 dirs(:)=abs( sysa(i)%sys(j)%dirMean - &
2332 sysmem(ind2(:))%dirMean )
2334 DO idir = 1,
SIZE(dirs)
2335 IF (dirs(idir).GE.180.) dirs(idir)=360-dirs(idir)
2337 WRITE(20,*)
'dirMean list =', &
2338 sysmem(ind2(:))%dirMean
2339 WRITE(20,*)
'dirMinVal list =', dirs
2342 WRITE(20,*)
'Size list =', &
2343 sysmem(ind2(:))%nPoints
2346 ALLOCATE (mnlonlist(
SIZE(ind2)))
2347 ALLOCATE (mnlatlist(
SIZE(ind2)))
2348 ALLOCATE (mndist(
SIZE(ind2)))
2349 DO ii = 1,
SIZE(ind2)
2350 mnlonlist(ii) = sysmem(ind2(ii))%lonMean
2351 mnlatlist(ii) = sysmem(ind2(ii))%latMean
2352 mndist(ii) = sqrt((lonmean-mnlonlist(ii))**2 + &
2353 (latmean-mnlatlist(ii))**2)
2355 dmndiag = sqrt(lonext**2+latext**2)
2356 WRITE(20,*)
'Distance list =',mndist(:)
2357 WRITE(20,*)
'Domain diagonal =',dmndiag
2360 ALLOCATE (olsize(
SIZE(ind2)))
2361 DO ii = 1,
SIZE(ind2)
2363 IF (sysmem(ind2(ii))%nPoints.GT.0)
THEN
2364 CALL intersect(real(sysa(i)%sys(j)%indx(1:npnts)),npnts, &
2365 REAL(sysMem(ind2(ii))%indx(1:sysMem(ind2(ii))%nPoints)),&
2366 sysMem(ind2(ii))%nPoints,dummy1,olsize(ii),dummy2,dummy3)
2372 gof(j,1:
SIZE(ind2)) = (temp/deltapersysmem(:))**2 + &
2373 (dirs/deltadirsysmem(:))**2 + &
2375 ( (real(olsize(:)) - &
2376 REAL(sysMem(ind2(:))%nPoints) )/&
2377 (0.50*MAX(
REAL(sysMem(ind2(:))%nPoints),0.001)) )**2
2379 DO ii = 1,
SIZE(ind2)
2380 WRITE(20,*)
'Testing: ii,olsize(ii),size,frac =',&
2381 ii,olsize(ii),sysmem(ind2(ii))%nPoints,&
2383 MAX(
REAL(sysMem(ind2(ii))%nPoints),0.001)
2384 IF ( real(olsize(ii)).LT.&
2385 0.50*real(sysmem(ind2(ii))%nPoints) )
THEN
2388 IF ( (temp(ii).GT.deltapersysmem(ii)).OR.&
2389 (dirs(ii).GT.deltadirsysmem(ii)) )
THEN
2393 WRITE(20,*)
'GOF(j,:) =',gof(j,:)
2395 IF (
ALLOCATED(temp))
DEALLOCATE(temp)
2396 IF (
ALLOCATED(dirs))
DEALLOCATE(dirs)
2397 IF (
ALLOCATED(mnlonlist))
DEALLOCATE(mnlonlist)
2398 IF (
ALLOCATED(mnlatlist))
DEALLOCATE(mnlatlist)
2399 IF (
ALLOCATED(mndist))
DEALLOCATE(mndist)
2400 IF (
ALLOCATED(olsize))
DEALLOCATE(olsize)
2404 IF (
ALLOCATED(tbsysmem))
DEALLOCATE(tbsysmem)
2405 IF (
ALLOCATED(deltadirsysmem))
DEALLOCATE(deltadirsysmem)
2406 IF (
ALLOCATED(deltapersysmem))
DEALLOCATE(deltapersysmem)
2407 IF (
ALLOCATED(m1sysmem))
DEALLOCATE(m1sysmem)
2408 IF (
ALLOCATED(m2sysmem))
DEALLOCATE(m2sysmem)
2412 WRITE(20,*) gof(jj,:)
2417 gofminval(k) = minval(gof(:,k))
2418 gofminind(k) =
findfirst(gof(:,k),
SIZE(gof,1),gofminval(k))
2419 IF (gofminval(k).EQ.9999)
THEN
2424 IF (
ALLOCATED(gof))
DEALLOCATE(gof)
2432 DO jj = 1,
SIZE(gofminind)
2433 IF (gofminind(jj).EQ.j)
THEN
2434 IF (gofminval(jj).LT.temp1)
THEN
2436 temp1 = gofminval(jj)
2440 dirminind = tpminind
2441 WRITE(20,*)
'System, GOFMinInd: ',j,tpminind
2443 IF (tpminind.NE.0)
THEN
2448 sysa(i)%sys(j)%grp = &
2449 sysmem(ind2(dirminind))%grp
2450 alreadyused(counter) = sysa(i)%sys(j)%grp
2452 WRITE(20,*)
'Case 1: matched this ts (',i, &
2453 ') sys ',sysa(i)%sys(j)%sysInd,
' (tp=', &
2454 sysa(i)%sys(j)%tpMean,
' dir=', &
2455 sysa(i)%sys(j)%dirMean,
') with grp ', &
2456 sysmem(ind2(dirminind))%grp
2457 WRITE(20,*)
'Added ',alreadyused(counter), &
2458 ' in array *alreadyUsed*'
2467 WRITE(20,*)
'maxGroup,k,ok,used =', &
2471 (.NOT.any(alreadyused(:).EQ.k)))
THEN
2476 IF ( (sysmem(l)%grp.EQ.k).AND. &
2477 ((i-sysmem(l)%updated).LT.6) ) ok = 0
2478 WRITE(20,*)
'l, ok = ',l,ok
2481 sysa(i)%sys(j)%grp = k
2482 counter = counter+1;
2483 alreadyused(counter) = k
2485 WRITE(20,*)
'k,used,counter =', &
2492 maxgroup = maxgroup+1
2493 sysa(i)%sys(j)%grp = maxgroup
2495 sysmem(maxgroup)%grp = maxgroup
2497 alreadyused(counter) = maxgroup
2499 WRITE(20,*)
'counter,maxGroup,sysA(i)%sys(j)%grp =',&
2500 counter,maxgroup,sysa(i)%sys(j)%grp
2501 WRITE(20,*)
'NO GRP MATCH case 2'
2505 IF (
ALLOCATED(ind))
DEALLOCATE(ind)
2506 IF (
ALLOCATED(ind2))
DEALLOCATE(ind2)
2507 IF (
ALLOCATED(gofminval))
DEALLOCATE(gofminval)
2508 IF (
ALLOCATED(gofminind))
DEALLOCATE(gofminind)
2510 IF (
ALLOCATED(alreadyused))
DEALLOCATE(alreadyused)
2511 IF (
ALLOCATED(allind))
DEALLOCATE(allind)
2515 DO kk = 1, maxsys(i)
2516 IF (sysa(i)%sys(kk)%grp.EQ.sysmem(k)%grp)
THEN
2517 sysmem(k)%nPoints = sysa(i)%sys(kk)%nPoints
2518 sysmem(k)%lonMean = &
2519 sum(sysa(i)%sys(kk)%lon(1:sysmem(k)%nPoints))/&
2521 sysmem(k)%latMean = &
2522 sum(sysa(i)%sys(kk)%lat(1:sysmem(k)%nPoints))/&
2527 DO iii = 1,sysmem(k)%nPoints
2529 (sysa(i)%sys(kk)%hs(iii)**2)*sysa(i)%sys(kk)%lon(iii)
2531 (sysa(i)%sys(kk)%hs(iii)**2)*sysa(i)%sys(kk)%lat(iii)
2533 sysmem(k)%lonMean = temp1/&
2534 max(sum(sysa(i)%sys(kk)%hs(1:sysmem(k)%nPoints)**2),&
2536 sysmem(k)%latMean = temp2/&
2537 max(sum(sysa(i)%sys(kk)%hs(1:sysmem(k)%nPoints)**2),&
2540 sysmem(k)%tpMean = sysa(i)%sys(kk)%tpMean
2541 sysmem(k)%dirMean = sysa(i)%sys(kk)%dirMean
2543 sysmem(k)%indx(:) = 9999
2544 DO iii = 1,sysmem(k)%nPoints
2545 sysmem(k)%indx(iii) = &
2546 (sysa(i)%sys(kk)%j(iii)-1)*maxi + &
2547 sysa(i)%sys(kk)%i(iii)
2550 sysmem(k)%updated = i
2551 sysmem(k)%length = sysmem(k)%length + 1
2555 IF ((i-sysmem(k)%updated).GE.6)
THEN
2556 sysmem(k)%nPoints = 0
2557 sysmem(k)%lonMean = 9999.
2558 sysmem(k)%latMean = 9999.
2559 sysmem(k)%tpMean = 9999.
2560 sysmem(k)%dirMean = 9999.
2561 sysmem(k)%indx(:) = 9999
2562 sysmem(k)%updated = -9999
2563 sysmem(k)%length = 0
2568 DO ll = (l+1), maxgroup
2570 deltadir = max((-3.645*sysmem(l)%tpMean+63.211),10.)*1.
2571 deltaper = max((-0.346*sysmem(l)%tpMean+3.686),0.6)*1.
2573 IF ( (abs(sysmem(l)%tpMean-sysmem(ll)%tpMean).LT.&
2575 (abs(sysmem(l)%dirMean-sysmem(ll)%dirMean).LT.&
2577 (sysmem(l)%updated.NE.sysmem(ll)%updated).AND. &
2578 (sysmem(ll)%nPoints.NE.0) )
THEN
2580 IF (sysmem(ll)%length.LT.sysmem(l)%length)
THEN
2582 WRITE(20,*)
'Deleting memgroup ',ll, &
2583 '(updated',sysmem(ll)%updated,
', length', &
2584 sysmem(ll)%length,
'), duplicate of memgroup', &
2585 l,
'(updated',sysmem(l)%updated,
', length', &
2586 sysmem(l)%length,
'):'
2589 WRITE(20,*)
'Deleting memgroup ',l, &
2590 '(updated',sysmem(l)%updated,
', length', &
2591 sysmem(l)%length,
'), duplicate of memgroup', &
2592 ll,
'(updated',sysmem(ll)%updated,
', length', &
2593 sysmem(ll)%length,
'):'
2595 WRITE(20,*)
'deltaPer, diff Per:',deltaper,&
2596 abs(sysmem(l)%tpMean-sysmem(ll)%tpMean)
2597 WRITE(20,*)
'deltaDir, diff Dir:',deltadir,&
2598 abs(sysmem(l)%dirMean-sysmem(ll)%dirMean)
2599 sysmem(idup)%nPoints = 0
2600 sysmem(idup)%lonMean = 9999.
2601 sysmem(idup)%latMean = 9999.
2602 sysmem(idup)%tpMean = 9999.
2603 sysmem(idup)%dirMean = 9999.
2604 sysmem(idup)%indx(:) = 9999
2605 sysmem(idup)%updated = -9999
2606 sysmem(idup)%length = 0
2611 WRITE(20,*)
'*** No systems at this time level. ', &
2612 'No. systems =',
SIZE(sysa(i)%sys)
2615 IF ((i-sysmem(k)%updated).GE.6)
THEN
2616 sysmem(k)%nPoints = 0
2617 sysmem(k)%lonMean = 9999.
2618 sysmem(k)%latMean = 9999.
2619 sysmem(k)%tpMean = 9999.
2620 sysmem(k)%dirMean = 9999.
2621 sysmem(k)%indx(:) = 9999
2622 sysmem(k)%updated = -9999
2623 sysmem(k)%length = 0
2629 WRITE(20,*)
'sysMem(',k,
')%grp =',sysmem(k)%grp
2630 WRITE(20,*)
'sysMem(',k,
')%nPoints =',sysmem(k)%nPoints
2631 WRITE(20,*)
'sysMem(',k,
')%lonMean =',sysmem(k)%lonMean
2632 WRITE(20,*)
'sysMem(',k,
')%latMean =',sysmem(k)%latMean
2633 WRITE(20,*)
'sysMem(',k,
')%tpMean =',sysmem(k)%tpMean
2634 WRITE(20,*)
'sysMem(',k,
')%dirMean =',sysmem(k)%dirMean
2635 WRITE(20,*)
'sysMem(',k,
')%updated =',sysmem(k)%updated
2636 WRITE(20,*)
'sysMem(',k,
')%length =',sysmem(k)%length
2642 OPEN(unit=27,
file=
'sys_restart1.ww3',status=
'unknown')
2643 WRITE(27,
'(A23,I10)')
'maxGroup =',maxgroup
2645 WRITE(27,
'(A8,I3,A12,I10)')
'sysMem( ',k, &
2646 ' )%grp =',sysmem(k)%grp
2647 WRITE(27,
'(A8,I3,A12,I10)')
'sysMem( ',k, &
2648 ' )%nPoints =',sysmem(k)%nPoints
2649 WRITE(27,
'(A8,I3,A12,F10.4)')
'sysMem( ',k, &
2650 ' )%lonMean =',sysmem(k)%lonMean
2651 WRITE(27,
'(A8,I3,A12,F10.4)')
'sysMem( ',k, &
2652 ' )%latMean =',sysmem(k)%latMean
2653 WRITE(27,
'(A8,I3,A12,F10.3)')
'sysMem( ',k, &
2654 ' )%tpMean =',sysmem(k)%tpMean
2655 WRITE(27,
'(A8,I3,A12,F10.3)')
'sysMem( ',k, &
2656 ' )%dirMean =',sysmem(k)%dirMean
2657 WRITE(27,
'(A8,I3,A12,I10)')
'sysMem( ',k, &
2658 ' )%updated =',sysmem(k)%updated
2659 WRITE(27,
'(A8,I3,A12,I10)')
'sysMem( ',k, &
2660 ' )%length =',sysmem(k)%length
2663 WRITE(27,
'(I8)',advance=
'NO') sysmem(k)%indx((j-1)*maxi+i)
2665 WRITE(27,
'(A)',advance=
'YES')
''
2676 SUBROUTINE findway (way ,horizStepCount,vertStepCount , &
2677 vertBorder ,horizBorder ,stepCount )
2718 INTEGER :: horizStepCount, vertStepCount, &
2719 vertBorder, horizBorder, stepCount
2721 INTENT (IN) vertborder, horizborder
2722 INTENT (OUT) stepcount
2757 vertstepcount=vertstepcount+1
2758 IF (horizborder.EQ.1)
THEN
2759 horizstepcount=horizstepcount-1
2761 stepcount=vertstepcount
2764 horizstepcount=horizstepcount+1
2765 IF (vertborder.EQ.1)
THEN
2766 vertstepcount=vertstepcount-1
2768 stepcount=horizstepcount
2771 vertstepcount=vertstepcount+1
2772 IF (horizborder.EQ.1)
THEN
2773 horizstepcount=horizstepcount-1
2775 stepcount=vertstepcount
2778 horizstepcount=horizstepcount+1
2779 IF (vertborder.EQ.1)
THEN
2780 vertstepcount=vertstepcount-1
2782 stepcount=horizstepcount
2784 WRITE(20,*)
'In spaTack:findWay should NOT go here!'
2792 SUBROUTINE findnext (i ,j ,maxI ,maxJ , &
2793 way ,vertBorder ,horizBorder )
2834 INTEGER :: i, j, maxI, maxJ, vertBorder, horizBorder
2836 INTENT (IN) maxi, maxj, way
2837 INTENT (IN OUT) i, j
2838 INTENT (OUT) vertborder, horizborder
2905 SUBROUTINE findsys (i ,j ,wsdat ,maxSys , &
2906 ngbrExt ,maxI ,maxJ ,perKnob , &
2948 TYPE(
dat2d) :: wsdat
2949 INTEGER :: i, j, maxI, maxJ, ngbrExt, maxSys
2950 REAL :: perKnob ,dirKnob, hsKnob
2952 INTENT (IN) i, j, maxi, maxj, ngbrext, perknob ,dirknob
2953 INTENT (IN OUT) wsdat, maxsys
2960 TYPE(
system),
ALLOCATABLE :: tmpsys(:)
2964 INTEGER :: counter, ii, jj, nngbr, startCount, endCount, l,&
2965 nout, maxS, s, p, n, countAll, ind, minInd, &
2967 INTEGER :: allFullSys(50)
2968 REAL,
POINTER :: realarr(:)
2969 INTEGER,
ALLOCATABLE :: allSys(:)
2970 REAL :: hsAll(50),tpAll(50),dirAll(50),GOF(50)
2971 REAL :: absDir,absPer,absHs,T,&
2972 deltaPer,deltaDir,deltaHs,temp
2975 INTEGER :: GOFMinInd
3008 DO ii=(i-ngbrext), (i+ngbrext)
3009 DO jj=(j-ngbrext), (j+ngbrext)
3010 IF ( (ii.GT.0).AND.(jj.GT.0).AND. &
3011 (jj.LE.maxj).AND.(ii.LE.maxi) )
THEN
3012 IF ( wsdat%par(ii,jj)%checked.EQ.1 )
THEN
3013 ngbr(counter)%par = wsdat%par(ii,jj)
3014 ngbr(counter)%i = ii
3015 ngbr(counter)%j = jj
3024 IF (nngbr.GT.0)
THEN
3028 DO WHILE (l.LE.nngbr)
3029 leng =
length(real(ngbr(l)%par%sys), &
3030 SIZE(ngbr(l)%par%sys),real(9999))
3031 endcount = startcount+leng-1
3032 allfullsys(startcount:endcount) = ngbr(l)%par%sys(1:leng)
3033 startcount=endcount+1
3037 IF (endcount.EQ.0)
WRITE(20,*)
'***1.Calling UNIQUE w. len=0!'
3038 CALL unique (real(allfullsys),endcount,realarr,nout)
3039 ALLOCATE(allsys(nout))
3040 allsys = int(realarr)
3041 IF (
ASSOCIATED(realarr))
DEALLOCATE(realarr)
3042 maxs = maxval(allsys)
3044 IF (maxsys.LT.maxs)
THEN
3048 ALLOCATE( tmpsys(
SIZE(allsys)) )
3051 wsdat%par(i,j)%sys(1:10) = 9999
3053 DO s=1,
SIZE(allsys)
3060 DO WHILE (n.LE.nngbr)
3064 DO ind = 1,
SIZE(ngbr(n)%par%sys)
3065 IF ( ngbr(n)%par%sys(ind).EQ.allsys(s) )
THEN
3073 hsall(countall)=ngbr(n)%par%hs(ind)
3074 tpall(countall)=ngbr(n)%par%tp(ind)
3075 dirall(countall)=ngbr(n)%par%dir(ind)
3083 tmpsys(s)%hsMean = sum(hsall(1:countall))/countall
3084 tmpsys(s)%tpMean = sum(tpall(1:countall))/countall
3085 tmpsys(s)%dirMean = &
3092 wsdat%par(i,j)%ngbrSys(1:
SIZE(allsys)) = allsys
3094 npart =
length(real(wsdat%par(i,j)%ipart), &
3095 SIZE(wsdat%par(i,j)%ipart),real(0))
3097 IF ( (wsdat%par(i,j)%hs(p).LT.hsknob).OR. &
3098 (wsdat%par(i,j)%tp(p).EQ.0.) )
THEN
3099 wsdat%par(i,j)%sys(p)=-1
3104 match%sysVal(:) = 9999
3105 match%tpVal(:) = 9999.
3106 match%dirVal(:) = 9999.
3110 abshs = abs(wsdat%par(i,j)%hs(p)-tmpsys(s)%hsMean)
3111 absper = abs(wsdat%par(i,j)%tp(p)-tmpsys(s)%tpMean)
3112 absdir = abs(wsdat%par(i,j)%dir(p)-tmpsys(s)%dirMean)
3114 IF (absdir.GT.180)
THEN
3115 absdir = 360 - absdir
3116 IF (absdir.LT.0)
THEN
3117 WRITE(20,*)
'*** WARNING: absDir negative!'
3118 WRITE(20,*)
'wsdat%par(i,j)%dir(p) =', &
3119 wsdat%par(i,j)%dir(p)
3120 WRITE(20,*)
'tmpsys(s)%dirMean) =', &
3126 t = tmpsys(s)%tpMean
3127 dx = 0.5*( (wsdat%lon(2,1)-wsdat%lon(1,1)) + &
3128 (wsdat%lat(1,2)-wsdat%lat(1,1)) )
3129 m1 = -3.645*t + 63.211
3131 m2 = -0.346*t + 3.686
3141 deltadir = m1*dx + dirknob
3142 deltaper = m2*dx + perknob
3143 deltahs = 0.25*tmpsys(s)%hsMean
3144 IF ((absper.LT.deltaper).AND.(absdir.LT.deltadir))
THEN
3146 match%sysVal(ind) = allsys(s)
3147 match%tpVal(ind) = absper
3148 match%dirVal(ind) = absdir
3149 match%hsVal(ind) = abshs
3156 wsdat%par(i,j)%sys(p) = match%sysVal(1)
3160 gof(1:ind) = (match%tpVal(1:ind)/deltaper)**2 + &
3161 (match%dirVal(1:ind)/deltadir)**2 + &
3162 (match%hsVal(1:ind)/deltahs)**2
3163 gofminval = minval(gof(1:ind))
3164 gofminind =
findfirst(gof(1:ind),ind,gofminval)
3165 wsdat%par(i,j)%sys(p) = match%sysVal(gofminind)
3173 npart =
length(real(wsdat%par(i,j)%ipart), &
3174 SIZE(wsdat%par(i,j)%ipart),real(0))
3176 DO pp = (p+1), npart
3177 IF (wsdat%par(i,j)%sys(p).EQ.wsdat%par(i,j)%sys(pp))
THEN
3186 npart =
length(real(wsdat%par(i,j)%ipart), &
3187 SIZE(wsdat%par(i,j)%ipart),real(0))
3190 IF (wsdat%par(i,j)%sys(p).EQ.9999)
THEN
3192 wsdat%par(i,j)%sys(p) = maxsys
3195 wsdat%par(i,j)%checked=1
3197 IF (
ALLOCATED(allsys))
DEALLOCATE(allsys)
3198 IF (
ALLOCATED(tmpsys))
DEALLOCATE(tmpsys)
3206 maxI ,maxJ ,perKnob , &
3207 dirKnob ,hsKnob ,combine , &
3251 TYPE(
dat2d) :: wsdat
3252 TYPE(
system),
POINTER :: sys(:), systemp(:)
3253 INTEGER :: maxSys, maxPts, maxI, maxJ, combine
3254 REAL :: perKnob ,dirKnob, hsKnob
3256 INTENT (IN) maxpts, maxi, maxj, hsknob, combine
3257 INTENT (IN OUT) wsdat, maxsys
3265 INTEGER,
ALLOCATABLE :: sysOut(:)
3266 INTEGER,
ALLOCATABLE :: actSysInd(:)
3267 INTEGER :: iter, ok, nSys, mS, s, so, ss, ind, leng, &
3270 REAL :: dev, hsCmp, maxHgt, temp(5)
3303 IF (.NOT.
ALLOCATED(actsysind))
ALLOCATE( actsysind(maxsys) )
3304 actsysind(1:maxsys) = (/ (ind, ind = 1, maxsys) /)
3307 IF (combine.EQ.1)
THEN
3309 WRITE(20,*)
'Calling printFinalSys...'
3318 IF (
ALLOCATED(actsysind))
THEN
3319 nsys =
SIZE(actsysind)
3323 WRITE(20,
'(A,A,I3,A,I5,A)')
'Calling combineSys for ', &
3324 'iteration',iter,
' (maxSys =',nsys,
').'
3327 CALL combinesys (wsdat,sys,maxsys,maxi,maxj, &
3328 actsysind,perknob,dirknob)
3333 IF (
SIZE(actsysind).EQ.nsys) ok = 1
3345 ms =
SIZE(actsysind)
3347 WRITE(20,*)
'Filtering the set of',ms,
'systems on size and mag.'
3355 leng =
length(sys(ss)%hs,
SIZE(sys(ss)%hs),9999.)
3356 dev =
std(sys(ss)%hs(1:leng),leng)
3357 hscmp = sys(ss)%hsMean + 2.*dev
3360 IF ( (hscmp.LT.maxhgt).OR.(sys(ss)%nPoints.LT.maxpts) )
THEN
3369 IF (ind.LE.maxsys)
THEN
3373 sys(iloop)%sysInd = 9999
3374 sys(iloop)%nPoints = 0
3375 sys(iloop)%grp = 9999
3376 DEALLOCATE( sys(iloop)%hs )
3377 DEALLOCATE( sys(iloop)%tp )
3378 DEALLOCATE( sys(iloop)%dir )
3379 DEALLOCATE( sys(iloop)%dspr )
3381 DEALLOCATE( sys(iloop)%i )
3382 DEALLOCATE( sys(iloop)%j )
3383 DEALLOCATE( sys(iloop)%lat )
3384 DEALLOCATE( sys(iloop)%lon )
3397 leng =
length(real(wsdat%par(iw,jw)%sys), &
3398 SIZE(wsdat%par(iw,jw)%sys),real(9999))
3403 DO WHILE (ind.LE.leng)
3404 IF ( wsdat%par(iw,jw)%sys(ind).EQ.s )
THEN
3412 wsdat%par(iw,jw)%sys(ind) = 9999
3413 wsdat%par(iw,jw)%ipart(ind) = 9999
3423 IF (sys(so)%nPoints>0) actsys = actsys + 1
3425 IF (
ALLOCATED(actsysind))
DEALLOCATE(actsysind)
3426 ALLOCATE( actsysind(actsys) )
3429 IF (sys(so)%nPoints>0)
THEN
3431 actsysind(actsys) = sys(so)%sysInd
3436 DO so = 1,
SIZE(actsysind)
3454 maxI ,maxJ ,flag ,sys )
3494 TYPE(
dat2d) :: wsdat
3495 TYPE(
system),
POINTER :: sys(:)
3496 INTEGER :: maxSys, maxI, maxJ, flag
3497 INTEGER,
ALLOCATABLE :: actSysInd(:)
3499 INTENT (IN) wsdat, actsysind, maxi, maxj, flag
3507 INTEGER :: ic, nGuys, startInd, endInd, i, j, ind, leng, leng2
3508 INTEGER :: UNISIZE, DIFSIZE
3509 REAL,
ALLOCATABLE :: sysOrdered(:)
3510 REAL,
POINTER :: UNIARR(:), DIFARR(:)
3511 INTEGER,
ALLOCATABLE :: ngbrSysAll(:), sysSortedInd(:)
3512 REAL :: TEMP(2), TEMP1, TEMP2
3545 WRITE(20,*)
'In printFinalSys...'
3546 maxsys =
SIZE(actsysind)
3548 ALLOCATE( sys(maxsys) )
3549 WRITE(20,*)
'Allocated sys okay, SIZE(sys) =',
SIZE(sys)
3551 ALLOCATE( ngbrsysall(50*maxi*maxj) )
3553 NULLIFY( sys(ic)%hs )
3554 NULLIFY( sys(ic)%tp )
3555 NULLIFY( sys(ic)%dir )
3556 NULLIFY( sys(ic)%dspr )
3558 NULLIFY( sys(ic)%i )
3559 NULLIFY( sys(ic)%j )
3560 NULLIFY( sys(ic)%lat )
3561 NULLIFY( sys(ic)%lon )
3562 ALLOCATE( sys(ic)%hs(maxi*maxj) )
3563 ALLOCATE( sys(ic)%tp(maxi*maxj) )
3564 ALLOCATE( sys(ic)%dir(maxi*maxj) )
3565 ALLOCATE( sys(ic)%dspr(maxi*maxj) )
3567 ALLOCATE( sys(ic)%i(maxi*maxj) )
3568 ALLOCATE( sys(ic)%j(maxi*maxj) )
3569 ALLOCATE( sys(ic)%lat(maxi*maxj) )
3570 ALLOCATE( sys(ic)%lon(maxi*maxj) )
3571 sys(ic)%hs(:) = 9999.
3572 sys(ic)%tp(:) = 9999.
3573 sys(ic)%dir(:) = 9999.
3574 sys(ic)%dspr(:) = 9999.
3578 sys(ic)%lat(:) = 9999.
3579 sys(ic)%lon(:) = 9999.
3580 sys(ic)%sysInd = 9999
3581 sys(ic)%hsMean = 9999.
3582 sys(ic)%tpMean = 9999.
3583 sys(ic)%dirMean = 9999.
3585 sys(ic)%ngbr(:) = 9999
3594 DO ind = 1,
SIZE(wsdat%par(i,j)%sys)
3595 IF (wsdat%par(i,j)%sys(ind).EQ.actsysind(ic)) &
3598 sys(ic)%hs(nguys)=wsdat%par(i,j)%hs(ind)
3599 sys(ic)%tp(nguys)=wsdat%par(i,j)%tp(ind)
3600 sys(ic)%dir(nguys)=wsdat%par(i,j)%dir(ind)
3601 sys(ic)%dspr(nguys)=wsdat%par(i,j)%dspr(ind)
3605 sys(ic)%lat(nguys)=wsdat%lat(i,j)
3606 sys(ic)%lon(nguys)=wsdat%lon(i,j)
3607 leng =
length(real(wsdat%par(i,j)%ngbrSys), &
3608 SIZE(wsdat%par(i,j)%ngbrSys),real(9999))
3609 endind = startind + leng-1
3610 ngbrsysall(startind:endind) = &
3611 wsdat%par(i,j)%ngbrSys(1:leng)
3619 IF (nguys.GT.0)
THEN
3621 sys(ic)%hsMean = sum(sys(ic)%hs(1:nguys))/nguys
3622 sys(ic)%tpMean = sum(sys(ic)%tp(1:nguys))/nguys
3630 temp1 = temp1 + (sys(ic)%hs(i)**2)*sys(ic)%hs(i)
3631 temp2 = temp2 + (sys(ic)%hs(i)**2)*sys(ic)%tp(i)
3634 temp1/max(sum(sys(ic)%hs(1:nguys)**2),0.001)
3636 temp2/max(sum(sys(ic)%hs(1:nguys)**2),0.001)
3638 sys(ic)%hs(1:nguys),nguys)
3640 sys(ic)%nPoints = nguys
3641 IF (endind.GT.0)
THEN
3642 CALL unique(real(ngbrsysall(1:endind)),endind, &
3644 temp = (/real(sys(ic)%sysInd),real(sys(ic)%sysInd)/)
3645 CALL setdiff(real(uniarr),unisize, &
3646 temp,2,difarr,difsize)
3647 difsize = min(difsize,
SIZE(sys(ic)%ngbr))
3648 sys(ic)%ngbr(1:difsize) = nint(difarr(1:difsize))
3649 IF (
ASSOCIATED(uniarr))
DEALLOCATE(uniarr)
3650 IF (
ASSOCIATED(difarr))
DEALLOCATE(difarr)
3656 IF (
ALLOCATED(ngbrsysall))
DEALLOCATE(ngbrsysall)
3660 leng =
length(real(sys(:)%nPoints), &
3661 SIZE(sys(:)%nPoints),real(9999))
3662 ALLOCATE( sysordered(leng) )
3663 ALLOCATE( syssortedind(leng) )
3664 CALL sort (real(sys(:)%nPoints),leng, &
3665 sysordered,syssortedind,
'D')
3666 leng =
length(real(sysordered), &
3667 SIZE(sysordered),real(0))
3670 leng2 =
length(real(sys(syssortedind(ic))%ngbr), &
3671 SIZE(sys(syssortedind(ic))%ngbr),real(9999))
3673 IF (
ALLOCATED(sysordered))
DEALLOCATE(sysordered)
3674 IF (
ALLOCATED(syssortedind))
DEALLOCATE(syssortedind)
3681 SUBROUTINE combinesys (wsdat ,sys ,maxSys ,maxI , &
3682 maxJ ,actSysInd,perKnob ,dirKnob )
3723 TYPE(
dat2d) :: wsdat
3724 TYPE(
system),
POINTER :: sys(:)
3725 INTEGER :: maxSys, maxI, maxJ
3726 INTEGER,
ALLOCATABLE :: actSysInd(:)
3727 REAL :: perKnob ,dirKnob
3730 INTENT (IN) maxi, maxj, perknob, dirknob
3737 INTEGER,
ALLOCATABLE :: sysSortedInd(:), sysOut(:)
3738 INTEGER,
POINTER :: indSys1(:), indSys2(:)
3739 REAL,
ALLOCATABLE :: sysOrdered(:), rounded(:)
3740 REAL,
POINTER :: uniarr(:), difarr(:), allngbr(:)
3741 INTEGER :: leng, leng2, s, ss, so, ngb, lsys, lsys2, hh, i, j, &
3742 ii, jj, ind, ind2, nn, nbr, icEnd,ic,iii,iloop
3743 INTEGER :: myngbr, indMatch, matchSys, keep, replacedInd, &
3744 hhForIndMatch, lMatch, tot, outsize
3745 INTEGER :: ngbIndex(10000), keepInd(maxI*maxJ), oneLess(1000)
3747 REAL :: Tb,deltaPerB,deltaDirB,deltaHsB,absDir,absPer,absHs
3748 LOGICAL :: file_exists
3749 INTEGER :: MASK(maxI,maxJ)
3750 REAL :: lonmean, latmean, DIST
3753 INTEGER :: counter, count2, izp, izp2, in, jn, icnt, ngbrExt
3754 REAL :: T, ngb_tp, ngb_dir
3755 REAL :: ngbmatch(maxI*maxJ)
3758 REAL :: TEMP1, TEMP2
3800 ALLOCATE( sysordered(maxsys) )
3801 ALLOCATE( syssortedind(maxsys) )
3802 ALLOCATE( sysout(maxsys) )
3803 ALLOCATE( rounded(maxsys) )
3807 rounded = real(int(sys(1:maxsys)%tpMean*1.e4))*1.e-4
3808 CALL sort(rounded,maxsys,sysordered,syssortedind,
'D')
3809 sysout=sys(syssortedind)%sysInd
3810 IF (
ALLOCATED(rounded))
DEALLOCATE(rounded)
3814 INQUIRE(
file=
"sys_mask.ww3", exist=file_exists)
3815 IF (file_exists)
THEN
3816 WRITE(20,*)
'*** Using land mask'
3817 OPEN(unit=13,
file=
'sys_mask.ww3',status=
'old')
3819 READ(13,*) (mask(i,j), i=1,maxi)
3826 DO so = 1,
SIZE(sysout)
3829 ss =
findfirst(real(sys(:)%sysInd),
SIZE(sys(:)%sysInd), &
3834 leng =
length(real(sys(ss)%ngbr),
SIZE(sys(ss)%ngbr), &
3839 IF ( sys(ss)%ngbr(ngb).NE.s )
THEN
3841 DO WHILE (myngbr.LE.
SIZE(sysout))
3842 IF (sys(myngbr)%sysInd.EQ.sys(ss)%ngbr(ngb))
THEN
3843 ngbindex(ii) = myngbr
3846 WRITE(20,*)
'*** WARNING: ngbIndex(:) exceeded!'
3861 CALL findijv4 (sys(ss),sys(ngbindex(ngb)), &
3862 maxi,maxj,indsys1,indsys2)
3863 IF ((
SIZE(indsys1)>10).AND.(
SIZE(indsys2)>10).AND. &
3864 (sys(ss)%nPoints.GT.sys(ngbindex(ngb))%nPoints)) &
3866 lsys =
SIZE(indsys1)
3867 lsys2 =
SIZE(indsys2)
3872 IF ((sys(ss)%nPoints.LT.5).OR. &
3873 (sys(ngbindex(ngb))%nPoints.LT.5))
THEN
3876 dx=0.5*((wsdat%lon(2,1)-wsdat%lon(1,1)) + &
3877 (wsdat%lat(1,2)-wsdat%lat(1,1)))
3882 DO in=(sys(ss)%i(indsys1(izp))-ngbrext), &
3883 (sys(ss)%i(indsys1(izp))+ngbrext)
3884 DO jn=(sys(ss)%j(indsys1(izp))-ngbrext), &
3885 (sys(ss)%j(indsys1(izp))+ngbrext)
3887 ngbr(counter)%i = in
3888 ngbr(counter)%j = jn
3897 IF ((sys(ngbindex(ngb))%i(indsys2(izp2)) &
3898 .EQ.ngbr(icnt)%i).AND. &
3899 (sys(ngbindex(ngb))%j(indsys2(izp2)) &
3900 .EQ.ngbr(icnt)%j))
THEN
3903 sys(ngbindex(ngb))%tp(indsys2(izp2))
3904 ngb_dir = ngb_dir + &
3905 sys(ngbindex(ngb))%dir(indsys2(izp2))
3909 IF (count2.GT.0)
THEN
3910 absper = abs(sys(ss)%tp(indsys1(izp))-ngb_tp/count2)
3911 absdir = abs(sys(ss)%dir(indsys1(izp))-ngb_dir/count2)
3912 t = sys(ss)%tp(indsys1(izp))
3913 m1 = -3.645*t + 63.211
3915 m2 = -0.346*t + 3.686
3917 deltadirb = (m1*dx + dirknob)*1.
3918 deltaperb = (m2*dx + perknob)*1.
3919 IF ( (absper.LT.deltaperb).AND. &
3920 (absdir.LT.deltadirb) )
THEN
3926 IF ((sum(ngbmatch(1:lsys))/lsys).GT.0.50)
THEN
3927 indmatch = ngbindex(ngb)
3928 matchsys = sys(indmatch)%sysInd
3935 tb = max(sum(sys(ss)%tp(indsys1))/lsys, &
3936 sum(sys(ngbindex(ngb))%tp(indsys2))/lsys2)
3941 dx=0.5*((wsdat%lon(2,1)-wsdat%lon(1,1)) + &
3942 (wsdat%lat(1,2)-wsdat%lat(1,1)))
3943 m1 = -3.523*tb + 64.081
3945 m2 = -0.337*tb + 3.732
3955 deltadirb = (m1*1. + dirknob)*1.
3956 deltaperb = (m2*1. + perknob)*1.
3957 deltahsb = 0.50*sum(sys(ss)%hs(indsys1))/lsys
3963 IF (any(mask.EQ.1))
THEN
3964 lonmean = sum(sys(ss)%lon(indsys1))/lsys
3965 latmean = sum(sys(ss)%lat(indsys1))/lsys
3968 IF (mask(i,j).EQ.1)
THEN
3970 dist = sqrt((lonmean-wsdat%lon(i,j))**2 +&
3971 (latmean-wsdat%lat(i,j))**2)
3972 IF (dist.LT.3.)
THEN
3977 deltadirb = (m1*1. + 30)*1.
3978 deltaperb = (m2*1. + 3)*1.
3990 abshs = abs( sum(sys(ss)%hs(indsys1))/lsys - &
3991 sum(sys(ngbindex(ngb))%hs(indsys2))/lsys2 )
3992 absper = abs( sum(sys(ss)%tp(indsys1))/lsys - &
3993 sum(sys(ngbindex(ngb))%tp(indsys2))/lsys2 )
3998 IF (absdir.GT.180) absdir = 360.-absdir
4002 IF ( (absper.LT.deltaperb).AND. &
4003 (absdir.LT.deltadirb).AND. &
4004 (abshs.LT.deltahsb) )
THEN
4005 indmatch = ngbindex(ngb)
4006 matchsys = sys(indmatch)%sysInd
4019 DO hh = 1, sys(ss)%nPoints
4023 ind =
findfirst(real(wsdat%par(ii,jj)%sys), &
4024 SIZE(wsdat%par(ii,jj)%sys),real(s))
4026 wsdat%par(ii,jj)%sys(ind)=matchsys
4031 leng =
length(real(wsdat%par(ii,jj)%sys), &
4032 SIZE(wsdat%par(ii,jj)%sys),real(9999))
4034 IF ( wsdat%par(ii,jj)%sys(ind).NE.-1 )
THEN
4035 oneless(ind2) = wsdat%par(ii,jj)%sys(ind)
4043 WRITE(20,*)
'***2.Calling UNIQUE w. len=0!'
4044 CALL unique(real(oneless(1:ind2)),ind2, &
4046 IF (
ASSOCIATED(uniarr))
DEALLOCATE(uniarr)
4047 IF (ind2.GT.outsize)
THEN
4053 findfirst(real(wsdat%par(ii,jj)%sys(:)), &
4054 SIZE(wsdat%par(ii,jj)%sys(:)), &
4057 DO WHILE (hhforindmatch.LE. &
4058 sys(indmatch)%nPoints)
4059 IF ( (sys(indmatch)%i(hhforindmatch) &
4061 (sys(indmatch)%j(hhforindmatch) &
4063 hhforindmatch = hhforindmatch + 1
4065 sys(indmatch)%hs(hhforindmatch) = &
4066 wsdat%par(ii,jj)%hs(replacedind)
4067 sys(indmatch)%tp(hhforindmatch) = &
4068 wsdat%par(ii,jj)%tp(replacedind)
4069 sys(indmatch)%dir(hhforindmatch) = &
4070 wsdat%par(ii,jj)%dir(replacedind)
4071 sys(indmatch)%dspr(hhforindmatch) = &
4072 wsdat%par(ii,jj)%dspr(replacedind)
4080 leng =
length(real(sys(indmatch)%hs), &
4081 SIZE(sys(indmatch)%hs),real(9999.))
4090 lmatch =
length(real(sys(indmatch)%hs), &
4091 SIZE(sys(indmatch)%hs),real(9999.))
4093 CALL union (real(sys(indmatch)%ngbr), &
4094 SIZE(sys(indmatch)%ngbr), &
4095 REAL(sys(ss)%ngbr), &
4096 SIZE(sys(ss)%ngbr), &
4098 CALL setdiff(allngbr,
SIZE(allngbr), &
4099 REAL((/sys(indMatch)%sysInd, &
4100 sys(ss)%sysInd/)), &
4101 SIZE((/sys(indMatch)%sysInd, &
4102 sys(ss)%sysInd/)),difarr,outsize)
4103 sys(indmatch)%ngbr(:) = 9999
4104 outsize = min(outsize,
size(sys(indmatch)%ngbr))
4105 sys(indmatch)%ngbr(1:outsize) = nint(difarr(1:outsize))
4106 IF (
ASSOCIATED(allngbr))
DEALLOCATE(allngbr)
4107 IF (
ASSOCIATED(difarr))
DEALLOCATE(difarr)
4109 leng =
length(real(sys(indmatch)%i), &
4110 SIZE(sys(indmatch)%i),real(9999))
4111 sys(indmatch)%hsMean = sum((/ &
4112 sys(ss)%hs(keepind(1:keep)), &
4113 sys(indmatch)%hs(1:leng) /))/tot
4114 sys(indmatch)%tpMean = sum((/ &
4115 sys(ss)%tp(keepind(1:keep)), &
4116 sys(indmatch)%tp(1:leng) /))/tot
4117 sys(indmatch)%dirMean = &
4119 sys(indmatch)%dir(1:leng) /),tot)
4124 temp1 = temp1 + (sys(ss)%hs(keepind(iii))**2)*&
4125 sys(ss)%hs(keepind(iii))
4126 temp2 = temp2 + (sys(ss)%hs(keepind(iii))**2)*&
4127 sys(ss)%tp(keepind(iii))
4130 temp1 = temp1 + (sys(indmatch)%hs(iii)**2)*&
4131 sys(indmatch)%hs(iii)
4132 temp2 = temp2 + (sys(indmatch)%hs(iii)**2)*&
4133 sys(indmatch)%tp(iii)
4135 sys(indmatch)%hsMean = temp1/max(sum((/ &
4136 sys(ss)%hs(keepind(1:keep))**2, &
4137 sys(indmatch)%hs(1:leng)**2 /)),0.001)
4138 sys(indmatch)%tpMean = temp2/max(sum((/ &
4139 sys(ss)%hs(keepind(1:keep))**2, &
4140 sys(indmatch)%hs(1:leng)**2 /)),0.001)
4141 sys(indmatch)%dirMean = &
4143 sys(indmatch)%dir(1:leng) /), &
4144 (/ sys(ss)%hs(keepind(1:keep)), &
4145 sys(indmatch)%hs(1:leng) /),tot)
4148 sys(indmatch)%i(1:(keep+leng))= &
4149 (/sys(ss)%i(keepind(1:keep)), &
4150 sys(indmatch)%i(1:leng)/)
4151 sys(indmatch)%j(1:(keep+leng))= &
4152 (/sys(ss)%j(keepind(1:keep)), &
4153 sys(indmatch)%j(1:leng)/)
4154 sys(indmatch)%lat(1:(keep+leng)) = &
4155 (/sys(ss)%lat(keepind(1:keep)), &
4156 sys(indmatch)%lat(1:leng)/)
4157 sys(indmatch)%lon(1:(keep+leng)) = &
4158 (/sys(ss)%lon(keepind(1:keep)), &
4159 sys(indmatch)%lon(1:leng)/)
4160 sys(indmatch)%dir(1:(keep+leng)) = &
4161 (/sys(ss)%dir(keepind(1:keep)), &
4162 sys(indmatch)%dir(1:leng)/)
4163 sys(indmatch)%dspr(1:(keep+leng)) = &
4164 (/sys(ss)%dspr(keepind(1:keep)), &
4165 sys(indmatch)%dspr(1:leng)/)
4169 sys(indmatch)%hs(1:(keep+leng)) = &
4170 (/sys(ss)%hs(keepind(1:keep)), &
4171 sys(indmatch)%hs(1:leng)/)
4172 sys(indmatch)%tp(1:(keep+leng)) = &
4173 (/sys(ss)%tp(keepind(1:keep)), &
4174 sys(indmatch)%tp(1:leng)/)
4175 sys(indmatch)%nPoints = &
4176 length(real(sys(indmatch)%i), &
4177 SIZE(sys(indmatch)%i),real(9999))
4180 sys(ss)%ngbr(:) = 9999
4181 WRITE(20,*)
'Deallocating sys',s
4182 DEALLOCATE( sys(ss)%hs )
4183 DEALLOCATE( sys(ss)%tp )
4184 DEALLOCATE( sys(ss)%dir )
4185 DEALLOCATE( sys(ss)%dspr )
4187 DEALLOCATE( sys(ss)%i )
4188 DEALLOCATE( sys(ss)%j )
4189 DEALLOCATE( sys(ss)%lat )
4190 DEALLOCATE( sys(ss)%lon )
4198 ind =
findfirst(real(wsdat%par(i,j)%ngbrSys), &
4199 SIZE(wsdat%par(i,j)%ngbrSys),real(s))
4201 wsdat%par(i,j)%ngbrSys(ind)=matchsys
4203 leng =
length(real(wsdat%par(i,j)%ngbrSys), &
4204 SIZE(wsdat%par(i,j)%ngbrSys),real(9999))
4207 REAL(wsdat%par(i,j)%ngbrSys(1:leng)), &
4208 leng,uniarr,outsize)
4209 wsdat%par(i,j)%ngbrSys(:) = 9999
4210 wsdat%par(i,j)%ngbrSys(1:outsize) = &
4212 IF (
ASSOCIATED(uniarr))
DEALLOCATE(uniarr)
4214 wsdat%par(i,j)%ngbrSys(:) = 9999
4222 SIZE(sys(nn)%ngbr),real(s))
4225 sys(nn)%ngbr(nbr)=matchsys
4227 leng2 =
length(real(sys(nn)%ngbr), &
4228 SIZE(sys(nn)%ngbr),real(9999))
4229 IF (leng2.GT.0)
THEN
4230 CALL unique(real(sys(nn)%ngbr(1:leng2)), &
4231 leng2,uniarr,outsize)
4232 sys(nn)%ngbr(:) = 9999
4233 sys(nn)%ngbr(1:outsize) = nint(uniarr)
4234 IF (
ASSOCIATED(uniarr))
DEALLOCATE(uniarr)
4243 IF (
ASSOCIATED(indsys1))
DEALLOCATE(indsys1)
4244 IF (
ASSOCIATED(indsys2))
DEALLOCATE(indsys2)
4249 IF (
ALLOCATED(sysordered))
DEALLOCATE(sysordered)
4250 IF (
ALLOCATED(syssortedind))
DEALLOCATE(syssortedind)
4251 IF (
ALLOCATED(sysout))
DEALLOCATE(sysout)
4256 IF (sys(ic)%nPoints>0) actsys = actsys + 1
4258 IF (
ALLOCATED(actsysind))
DEALLOCATE(actsysind)
4259 ALLOCATE( actsysind(actsys) )
4262 IF (sys(ic)%nPoints>0)
THEN
4264 actsysind(actsys) = sys(ic)%sysInd
4274 WRITE(20,*)
'Leaving combineSys...'
4333 TYPE(duplicate) :: dup(100)
4335 INTEGER :: nsys, ndup, p, pp, maxInd, npart, s, ss, ppp
4376 npart =
length(real(dat%ipart),
SIZE(dat%ipart),real(0))
4379 IF (any(dat%sys(p).EQ.dup(:)%val)) cycle
4380 DO pp = (p+1), npart
4381 IF (dat%sys(p).EQ.dat%sys(pp))
THEN
4383 IF (.NOT.found)
THEN
4385 dup(nsys)%val = dat%sys(p)
4387 dup(nsys)%ind(dup(nsys)%ndup) = p
4391 IF (.NOT.any(pp.EQ.dup(nsys)%ind(:)))
THEN
4392 dup(nsys)%ndup = dup(nsys)%ndup+1
4393 dup(nsys)%ind(dup(nsys)%ndup) = pp
4406 DO p = 1, dup(s)%ndup
4407 IF ( temp.LT.dat%hs(dup(s)%ind(p)) )
THEN
4408 temp = dat%hs(dup(s)%ind(p))
4414 dat%hs(dup(s)%ind(maxind)) = &
4415 sqrt( sum(dat%hs(dup(s)%ind(1:dup(s)%ndup))**2) )
4419 DO p = 1, dup(s)%ndup
4421 IF (p.NE.maxind)
THEN
4424 dat%hs( dup(s)%ind(p):(npart-1) ) = &
4425 dat%hs( (dup(s)%ind(p)+1):npart)
4426 dat%tp( dup(s)%ind(p):(npart-1) ) = &
4427 dat%tp( (dup(s)%ind(p)+1):npart)
4428 dat%dir( dup(s)%ind(p):(npart-1) ) = &
4429 dat%dir( (dup(s)%ind(p)+1):npart)
4430 dat%dspr( dup(s)%ind(p):(npart-1) ) = &
4431 dat%dspr( (dup(s)%ind(p)+1):npart)
4434 dat%sys( dup(s)%ind(p):(npart-1) ) = &
4435 dat%sys( (dup(s)%ind(p)+1):npart)
4436 dat%ipart( dup(s)%ind(p):(npart-1) ) = &
4437 dat%ipart( (dup(s)%ind(p)+1):npart)
4440 DO ppp = 1, dup(ss)%ndup
4441 IF (dup(ss)%ind(ppp).GT.dup(s)%ind(p)) &
4442 dup(ss)%ind(ppp) = dup(ss)%ind(ppp)-1
4446 dat%hs(npart) = 9999.
4447 dat%tp(npart) = 9999.
4448 dat%dir(npart) = 9999.
4449 dat%dspr(npart) = 9999.
4451 dat%sys(npart) = 9999
4452 dat%ipart(npart) = 0
4462 REAL FUNCTION mean_angleV2(ang,ll)
4511 parameter(
pi = 3.1416)
4512 REAL :: u(ll), v(ll), vm, um, theta
4541 v(:) = cos(ang(:)*(
pi/180.))
4542 u(:) = sin(ang(:)*(
pi/180.))
4547 theta = (atan2(um,vm))*(180/
pi)
4553 theta = theta*(
pi/180)
4555 theta =
pi*((abs(theta)/
pi) - &
4556 2*ceiling(((abs(theta)/
pi)-1)/2))*sign(1.,theta)
4559 IF (theta.LT.0.) theta = theta + 2*
pi
4609 REAL :: ang(ll), hsign(ll)
4610 REAL :: temp1, temp2
4620 parameter(
pi = 3.1416)
4621 REAL :: u(ll), v(ll), vm, um, theta
4651 v(:) = cos(ang(:)*(
pi/180.))
4652 u(:) = sin(ang(:)*(
pi/180.))
4656 temp1 = temp1 + (hsign(i)**2)*v(i)
4657 temp2 = temp2 + (hsign(i)**2)*u(i)
4659 vm = temp1/max(sum(hsign**2),0.001)
4660 um = temp2/max(sum(hsign**2),0.001)
4663 theta = (atan2(um,vm))*(180/
pi)
4669 theta = theta*(
pi/180)
4671 theta =
pi*((abs(theta)/
pi) - &
4672 2*ceiling(((abs(theta)/
pi)-1)/2))*sign(1.,theta)
4675 IF (theta.LT.0.) theta = theta + 2*
pi
4685 SUBROUTINE unique (INARRAY,INSIZE,OUTARRAY,OUTSIZE)
4728 INTEGER,
INTENT(IN) :: INSIZE
4729 INTEGER,
INTENT(OUT) :: OUTSIZE
4730 REAL,
INTENT(IN) :: INARRAY(INSIZE)
4731 REAL,
POINTER :: OUTARRAY(:)
4736 REAL :: ARRAY(INSIZE), TEMP(INSIZE)
4769 IF ( insize.EQ.0 )
THEN
4770 WRITE(20,*)
'*** In Subr. UNIQUE: Input array has length=0!'
4774 array(i) = inarray(i)
4779 CALL qsort(array,temp,1,insize)
4792 IF ( array(i).GT.array(i-1) .AND. &
4793 array(i).GT.temp(k-1) )
THEN
4801 ALLOCATE(outarray(outsize))
4803 IF ( outsize.GE.1 )
THEN
4805 outarray(i) = temp(i)
4816 SUBROUTINE sort (INARRAY,INSIZE,OUTARRAY,IY,DIRECTION)
4858 CHARACTER :: DIRECTION *1
4860 INTEGER :: IY(INSIZE)
4861 REAL :: INARRAY(INSIZE), OUTARRAY(INSIZE)
4863 INTENT (IN) inarray, insize, direction
4864 INTENT (OUT) outarray, iy
4907 IF (insize.EQ.0)
THEN
4908 WRITE(20,*)
'*** In Subr. SORT: Input array has length=0 !!!'
4912 outarray(i) = inarray(i)
4916 IF (direction .EQ.
'A')
THEN
4917 CALL qsort(outarray,ind,1,insize)
4918 ELSE IF (direction .EQ.
'D')
THEN
4935 SUBROUTINE setdiff (INARRAY1, INSIZE1, INARRAY2, INSIZE2, &
4977 INTEGER :: INSIZE1, INSIZE2, OUTSIZE
4978 REAL :: INARRAY1(INSIZE1), INARRAY2(INSIZE2)
4979 REAL,
POINTER :: OUTARRAY(:)
4981 INTENT (IN) inarray1, insize1, inarray2, insize2
4982 INTENT (OUT) outsize
4987 REAL :: TEMP(INSIZE1)
4988 REAL :: ARRAY1(INSIZE1),ARRAY2(INSIZE2)
4989 REAL :: ID1(INSIZE1),ID2(INSIZE2)
5019 IF ( (insize1).EQ.0 )
THEN
5021 ALLOCATE(outarray(outsize))
5022 ELSE IF ( insize2.EQ.0 )
THEN
5023 CALL unique(inarray1,insize1,outarray,outsize)
5027 array1(i) = inarray1(i)
5031 array2(i) = inarray2(i)
5036 CALL qsort(array1,id1,1,insize1)
5037 CALL qsort(array2,id2,1,insize2)
5051 IF ( array1(i).LT.array2(j) .OR. &
5052 array1(i).GT.array2(insize2) )
THEN
5058 ELSE IF ( temp(k-1).LT.array1(i) )
THEN
5063 ELSE IF ( array2(j).LT.array1(i) )
THEN
5070 IF ( i.GT.insize1 )
THEN
5081 ALLOCATE(outarray(outsize))
5084 outarray(i) = temp(i)
5094 SUBROUTINE intersect (INARRAY1 ,INSIZE1 ,INARRAY2 ,INSIZE2 , &
5095 OUTARRAY ,OUTSIZE ,IND1 ,IND2 )
5142 INTEGER :: INSIZE1, INSIZE2, OUTSIZE
5143 REAL :: INARRAY1(INSIZE1), INARRAY2(INSIZE2)
5144 REAL,
POINTER :: OUTARRAY(:)
5145 REAL,
POINTER :: IND1(:), IND2(:)
5147 INTENT (IN) inarray1, insize1, inarray2, insize2
5148 INTENT (OUT) outsize
5156 LOGICAL,
ALLOCATABLE :: VIDX1(:),VIDX2(:)
5157 INTEGER,
ALLOCATABLE :: IPOS1(:),IPOS2(:)
5160 INTEGER :: N, IMIN, IMAX
5161 INTEGER :: MINV1,MAXV1, MINV2, MAXV2
5189 minv1 = int(minval(inarray1))
5190 maxv1 = int(maxval(inarray1))
5191 minv2 = int(minval(inarray2))
5192 maxv2 = int(maxval(inarray2))
5195 IF ( maxv1.LT.minv2.OR.insize1.EQ.0.OR.insize2.EQ.0 )
THEN
5196 ALLOCATE(outarray(outsize))
5197 ALLOCATE(ind1(outsize))
5198 ALLOCATE(ind2(outsize))
5202 imin = min(minv1,minv2)-1
5203 imax = max(maxv1,maxv2)+1
5207 ALLOCATE(vidx1(n),vidx2(n))
5208 ALLOCATE(ipos1(n),ipos2(n))
5210 vidx1(1:n) = .false.
5211 vidx2(1:n) = .false.
5214 j = int(inarray1(i)-imin)
5220 j = int(inarray2(i)-imin)
5223 IF ( vidx1(j).AND..NOT.vidx2(j) )
THEN
5224 outsize = outsize + 1
5230 ALLOCATE(outarray(outsize))
5231 ALLOCATE(ind1(outsize))
5232 ALLOCATE(ind2(outsize))
5236 IF ( vidx1(j).AND.vidx2(j).AND.i.LE.outsize )
THEN
5237 outarray(i) = inarray1(ipos1(j))
5244 DEALLOCATE(vidx1,vidx2)
5245 DEALLOCATE(ipos1,ipos2)
5254 SUBROUTINE union (INARRAY1, INSIZE1, INARRAY2, INSIZE2, &
5295 INTEGER :: INSIZE1, INSIZE2, OUTSIZE
5296 REAL :: INARRAY1(INSIZE1), INARRAY2(INSIZE2)
5297 REAL,
POINTER :: OUTARRAY(:)
5299 INTENT (IN) inarray1, insize1, inarray2, insize2
5300 INTENT (OUT) outsize
5308 LOGICAL,
ALLOCATABLE :: VIDX1(:),VIDX2(:)
5309 INTEGER,
ALLOCATABLE :: IPOS1(:),IPOS2(:)
5310 REAL,
ALLOCATABLE :: TEMP(:)
5313 INTEGER :: N, IMIN, IMAX
5314 INTEGER :: MINV1,MAXV1, MINV2, MAXV2
5342 IF ( (insize1+insize2).EQ.0 )
THEN
5344 ALLOCATE(outarray(outsize))
5346 ELSEIF ( insize1.EQ.0 )
THEN
5348 ALLOCATE(outarray(outsize))
5349 ALLOCATE(temp(outsize))
5352 outarray(i) = inarray2(i)
5355 CALL qsort(outarray,temp,1,outsize)
5357 ELSEIF ( insize2.EQ.0 )
THEN
5359 ALLOCATE(outarray(outsize),temp(outsize))
5362 outarray(i) = inarray1(i)
5365 CALL qsort(outarray,temp,1,outsize)
5370 minv1 = int(minval(inarray1))
5371 maxv1 = int(maxval(inarray1))
5372 minv2 = int(minval(inarray2))
5373 maxv2 = int(maxval(inarray2))
5376 imin = min(minv1,minv2)-1
5377 imax = max(maxv1,maxv2)+1
5381 ALLOCATE(vidx1(n),vidx2(n))
5382 ALLOCATE(ipos1(n),ipos2(n))
5384 vidx1(1:n) = .false.
5385 vidx2(1:n) = .false.
5390 j = int(inarray1(i)-imin)
5391 IF ( .NOT.vidx1(j) )
THEN
5392 outsize = outsize + 1
5399 j = int(inarray2(i)-imin)
5400 IF ( .NOT.vidx1(j).AND..NOT.vidx2(j) )
THEN
5401 outsize = outsize + 1
5407 ALLOCATE(outarray(outsize))
5411 IF ( vidx1(j).AND.i.LE.outsize )
THEN
5412 outarray(i) = inarray1(ipos1(j))
5414 ELSEIF ( vidx2(j).AND.i.LE.outsize )
THEN
5415 outarray(i) = inarray2(ipos2(j))
5420 DEALLOCATE(vidx1,vidx2)
5421 DEALLOCATE(ipos1,ipos2)
5427 END SUBROUTINE union
5431 INTEGER FUNCTION length(ARRAY,ARRSIZE,VAL)
5465 REAL :: array(arrsize)
5476 IF (arrsize.GT.0)
THEN
5479 DO WHILE (field.NE.val)
5481 IF (i.GT.
SIZE(array))
EXIT
5494 INTEGER FUNCTION findfirst(ARRAY,ARRSIZE,VAL)
5527 REAL :: array(arrsize)
5538 DO WHILE (ind.LE.arrsize)
5539 IF ( array(ind).EQ.val )
EXIT
5542 IF (ind.GT.arrsize)
THEN
5553 REAL function
std(array,n)
5598 std = sqrt( 1/(real(n)-1)*sum( (array(:)-mn)**2 ) )
5607 RECURSIVE SUBROUTINE qsort(ARRAY,IDX,LO,HI)
5642 INTEGER,
INTENT(IN) :: lo,hi
5643 REAL,
INTENT(INOUT) :: array(:),idx(:)
5671 IF (
SIZE(array).EQ. 0 )
THEN
5674 ELSE IF (
SIZE(array).NE.
SIZE(idx) )
THEN
5677 ELSE IF ( lbound(array,1).GT.lo )
THEN
5680 ELSE IF ( ubound(array,1).LT.hi )
THEN
5687 val = array(int((lo+hi)/2))
5691 DO WHILE ( array(top).LT.val )
5694 DO WHILE ( val.LT.array(bot) )
5697 IF ( top.LT.bot )
THEN
5700 array(top) = array(bot)
5716 IF (lo.LT.top-1)
CALL qsort(array,idx,lo,top-1)
5717 IF (bot+1.LT.hi)
CALL qsort(array,idx,bot+1,hi)
5721 199
FORMAT (/
' *** WAVEWATCH III ERROR IN W3SYSTRK : '/ &
5722 ' QSORT ARRAY IS EMPTY' )
5723 201
FORMAT (/
' *** WAVEWATCH III ERROR IN W3SYSTRK : '/ &
5724 ' QSORT ARRAY SIZE AND INDEX ARRAY SIZE MISMATCH' )
5725 203
FORMAT (/
' *** WAVEWATCH III ERROR IN W3SYSTRK : '/ &
5726 ' QSORT ARRAY INDEX OUT OF LOWER BOUND' )
5727 205
FORMAT (/
' *** WAVEWATCH III ERROR IN W3SYSTRK : '/ &
5728 ' QSORT ARRAY INDEX OUT OF UPPER BOUND' )
5730 END SUBROUTINE qsort
5733 RECURSIVE SUBROUTINE qsort_desc(ARRAY,IDX,LO,HI)
5767 INTEGER,
INTENT(IN) :: lo,hi
5768 REAL,
INTENT(INOUT) :: array(:),idx(:)
5772 INTEGER :: top, bot, i
5796 IF (
SIZE(array).EQ. 0 )
THEN
5799 ELSE IF (
SIZE(array).NE.
SIZE(idx) )
THEN
5802 ELSE IF ( lbound(array,1).GT.lo )
THEN
5805 ELSE IF ( ubound(array,1).LT.hi )
THEN
5812 val = array(int((lo+hi)/2))
5816 DO WHILE ( array(top).GT.val )
5819 DO WHILE ( val.GT.array(bot) )
5822 IF ( top.LT.bot )
THEN
5825 array(top) = array(bot)
5840 IF (lo.LT.top-1)
CALL qsort_desc(array,idx,lo,top-1)
5841 IF (bot+1.LT.hi)
CALL qsort_desc(array,idx,bot+1,hi)
5845 199
FORMAT (/
' *** WAVEWATCH III ERROR IN W3SYSTRK : '/ &
5846 ' QSORT ARRAY IS EMPTY' )
5847 201
FORMAT (/
' *** WAVEWATCH III ERROR IN W3SYSTRK : '/ &
5848 ' QSORT ARRAY SIZE AND INDEX ARRAY SIZE MISMATCH' )
5849 203
FORMAT (/
' *** WAVEWATCH III ERROR IN W3SYSTRK : '/ &
5850 ' QSORT ARRAY INDEX OUT OF LOWER BOUND' )
5851 205
FORMAT (/
' *** WAVEWATCH III ERROR IN W3SYSTRK : '/ &
5852 ' QSORT ARRAY INDEX OUT OF UPPER BOUND' )
5857 FUNCTION swapi4(INT4)
RESULT(INT4SWP)
5877 INTEGER(KIND=4),
INTENT(IN) :: int4
5878 INTEGER(KIND=4) :: int4swp
5882 INTEGER(KIND=1),
DIMENSION(4) :: bytein, byteout
5884 bytein = transfer(int4, bytein)
5885 byteout = (/bytein(4),bytein(3),bytein(2),bytein(1)/)
5886 int4swp = transfer(byteout, int4swp)
5892 SUBROUTINE findijv4 (a ,b ,maxI, maxJ ,indA ,indB )
5936 INTEGER :: maxI, maxJ
5937 INTEGER,
POINTER :: indA(:), indB(:)
5939 INTENT (IN) a, b, maxi,maxj
5951 INTEGER :: LENG_AI,LENG_BI
5952 INTEGER :: OUTA,OUTB,I,J,IND,OUTDUMB
5953 INTEGER :: POSB,POSB_MM,POSB_PM,POSB_MP,POSB_PP
5954 INTEGER :: IND_B2(maxI,maxJ)
5955 REAL,
ALLOCATABLE :: TMPA(:),DUMA(:),TMPB(:)
5956 REAL,
POINTER :: DUMB(:)
5982 IF (
ASSOCIATED(inda))
DEALLOCATE(inda)
5983 IF (
ASSOCIATED(indb))
DEALLOCATE(indb)
5985 leng_ai =
length(real(a%i),
SIZE(a%i),real(9999))
5986 leng_bi =
length(real(b%i),
SIZE(b%i),real(9999))
5988 ALLOCATE(tmpa(leng_ai))
5989 ALLOCATE(tmpb(5*leng_ai))
6001 IF (ind_b2(i,j).EQ.0) ind_b2(i,j) = ind
6012 IF (i.GT.1.AND.j.GT.1) posb_mm = ind_b2(i-1,j-1)
6013 IF (i.GT.1.AND.j.LT.maxj) posb_mp = ind_b2(i-1,j+1)
6014 IF (i.LT.maxi.AND.j.LT.maxj) posb_pp = ind_b2(i+1,j+1)
6015 IF (i.LT.maxi.AND.j.GT.1) posb_pm = ind_b2(i+1,j-1)
6020 tmpb(outb) = real(posb)
6021 IF (.NOT.found)
THEN
6023 tmpa(outa) = real(ind)
6027 IF (posb_mm.NE.0)
THEN
6029 tmpb(outb) = real(posb_mm)
6030 IF (.NOT.found)
THEN
6032 tmpa(outa) = real(ind)
6036 IF (posb_mp.NE.0)
THEN
6038 tmpb(outb) = real(posb_mp)
6039 IF (.NOT.found)
THEN
6041 tmpa(outa) = real(ind)
6045 IF (posb_pm.NE.0)
THEN
6047 tmpb(outb) = real(posb_pm)
6048 IF (.NOT.found)
THEN
6050 tmpa(outa) = real(ind)
6054 IF (posb_pp.NE.0)
THEN
6056 tmpb(outb) = real(posb_pp)
6057 IF (.NOT.found)
THEN
6059 tmpa(outa) = real(ind)
6069 CALL unique(tmpb,outb,dumb,outdumb)
6072 ALLOCATE(indb(outb))
6073 IF (outb.GT.0) indb(1:outb) = int(dumb(1:outb))
6074 IF (
ASSOCIATED(dumb))
DEALLOCATE(dumb)
6078 ALLOCATE(inda(outa))
6080 ALLOCATE(duma(outa))
6082 CALL qsort(tmpa(1:outa),duma(1:outa),1,outa)
6083 IF (
ALLOCATED(duma))
DEALLOCATE(duma)
6084 inda(1:outa) = int(tmpa(1:outa))
6087 IF (
ALLOCATED(tmpa))
DEALLOCATE(tmpa)
6088 IF (
ALLOCATED(tmpb))
DEALLOCATE(tmpb)