Perform output of spectral information along provided tracks.
223 USE w3gdatmd,
ONLY: nk, nth, nspec, nsea, nseal,
nx,
ny, &
261 INTEGER,
INTENT(IN) :: NDSINP, NDSOUT, IMOD
262 REAL,
INTENT(IN) :: A(NTH,NK,0:NSEAL)
267 INTEGER,
PARAMETER :: OTYPE = 3
268 INTEGER :: NDSTI, NDSTO, ISPROC, IERR, &
269 IK, ITH, IX, IY, TIMEB(2), TIMEE(2), &
270 TTIME(2), IX1, IX2, IY1, IY2, &
271 IXX(4), IYY(4), I, J, ISEA, JSEA, &
274 INTEGER,
SAVE :: IENT = 0
277 INTEGER :: NREAD, NTRACK, NSPECO, NLOCO
283 INTEGER :: IT, IROOT, IFROM, IERR_MPI
284 INTEGER,
ALLOCATABLE :: STATUS(:,:)
286 REAL :: XN, YN, XT, YT, RD, X, Y, WX, WY, &
287 SPEC(NK,NTH), FACTOR, ASPTRK(NTH,NK),&
289 REAL,
SAVE :: RDCHCK = 0.05, rtchck = 0.05
290 LOGICAL :: FORMI, FLAG1, FLAG2, INGRID
291 CHARACTER :: TRCKT*32, LINE*1024, TSTSTR*3, IDTST*34
292 CHARACTER(LEN=100) :: LIST(5)
294 CHARACTER(LEN=17),
SAVE :: TSTLOC =
' '
297 CHARACTER(LEN=1) :: MAPSTR(NX)
300 equivalence(ixx(1),ix1) , (ixx(2),ix2) , &
301 (iyy(1),iy1) , (iyy(3),iy2)
306 CALL strace (ient,
'W3IOTR')
309 CALL w3seto ( imod, ndse, ndst )
310 CALL w3setg ( imod, ndse, ndst )
311 CALL w3seta ( imod, ndse, ndst )
312 CALL w3setw ( imod, ndse, ndst )
314 tolast = atolast(:,otype)
315 dtout = adtout(otype)
317 IF ( .NOT. o3init )
CALL w3dmo3 ( imod, ndse, ndst )
319 formi = ndsinp .GT. 0
340 WRITE (ndst,9000)
time
344 IF (
nrqtr .NE. 0 )
THEN
346 ALLOCATE ( status(mpi_status_size,
nrqtr) )
347 CALL mpi_waitall (
nrqtr,
irqtr , status, ierr_mpi )
348 DEALLOCATE ( status )
354 IF ( ipass .EQ. 1 )
THEN
357 WRITE (ndst,9010) tolast, dtout, ndsti, ndsto, formi
368 WRITE (ndst,9011) fnmpre(:j)//
'track_i.'//filext(:i), &
371 OPEN (ndsti,
file=fnmpre(:j)//
'track_i.'//filext(:i), &
372 status=
'OLD',err=800,form=
'FORMATTED',iostat=ierr)
373 READ (ndsti,
'(A)',err=801,
END=802,IOSTAT=IERR) idtst
376 WRITE (ndst,9011) fnmpre(:j)//
'track_i.'//filext(:i), &
379 OPEN (ndsti,
file=fnmpre(:j)//
'track_i.'//filext(:i), &
381 READ (ndsti,err=801,
END=802,IOSTAT=IERR) idtst
384 IF ( idtst .NE. idstri )
GOTO 803
388 IF ( iaproc .EQ. naptrk )
THEN
390 WRITE (ndst,9012) fnmpre(:j)//
'track_o.'//filext(:i), &
393 OPEN (ndsto,
file=fnmpre(:j)//
'track_o.'//filext(:i), &
394 form=
'UNFORMATTED', convert=
file_endian,err=810,iostat=ierr)
395 WRITE (ndsto,err=811,iostat=ierr) idstro, flagll,
nk, &
397 WRITE (ndsto,err=811,iostat=ierr) 0.5*
pi-th(1), -dth, &
398 (sig(ik)*tpiinv,ik=1,
nk), &
399 (dsip(ik)*tpiinv,ik=1,
nk)
427 CALL tick21 ( timee , dtout )
429 IF ( dsec21(timee,tolast) .LT. 0. )
THEN
437 WRITE (ndst,9021) timeb, timee
464 READ (ndsti,
'(A)',err=801,
END=390,IOSTAT=IERR) line
466 CALL strsplit(line,list)
467 READ(list(1),
'(I8)') ttime(1)
468 READ(list(2),
'(I6)') ttime(2)
471 IF(
SIZE(list).GE.5) trckt=list(5)
473 READ (ndsti, err=801,
END=390,IOSTAT=IERR) TTIME, XT, YT, trckt
481 IF ( dsec21(timeb,ttime) .LT. 0. )
THEN
483 WRITE (ndst,9031) ttime,factor*xt,factor*yt,
'TOO EARLY'
490 IF ( dsec21(timee,ttime) .GT. 0. )
THEN
496 WRITE (ndst,9031) ttime,factor*xt,factor*yt,
'TOO LATE'
503 flag1 = dsec21(ttime,timee) .GT. rtchck*dtout
504 flag2 = dsec21(timeb,ttime) .GT. rtchck*dtout
514 ingrid = w3gfcl( gsu, xt, yt, ixx, iyy, xx, yy )
515 IF ( .NOT. ingrid )
THEN
517 WRITE (ndst,9031) ttime, factor*xt, factor*yt, &
524 ix = ixx(4); iy = iyy(4);
525 ixx(4) = ixx(3); iyy(4) = iyy(3);
526 ixx(3) = ix; iyy(3) = iy;
534 rd = dpdx(iyy(1),ixx(1))*(xt-xx(1)) &
535 + dpdy(iyy(1),ixx(1))*(yt-yy(1))
538 IF ( rd .LT. rdchck )
THEN
541 ELSE IF ( rd .GT. 1.-rdchck )
THEN
547 rd = dqdx(iyy(1),ixx(1))*(xt-xx(1)) &
548 + dqdy(iyy(1),ixx(1))*(yt-yy(1))
551 IF ( rd .LT. rdchck )
THEN
554 ELSE IF ( rd .GT. 1.-rdchck )
THEN
567 IF(gtype .EQ. ungtype)
THEN
571 mask1(iy,ix) = mask1(iy,ix) .OR. flag1
572 mask2(iy,ix) = mask2(iy,ix) .OR. flag2
573 trckid(iy,ix) = trckt
576 IF ( mapsta(iy,ix) .EQ. 0 )
THEN
577 IF ( mapst2(iy,ix) .EQ. 0 )
THEN
578 tstloc(4*j-3:4*j-1) =
'LND'
580 tstloc(4*j-3:4*j-1) =
'XCL'
582 ELSE IF ( mapsta(iy,ix) .LT. 0 )
THEN
583 IF ( mapst2(iy,ix) .EQ. 1 )
THEN
584 tstloc(4*j-3:4*j-1) =
'ICE'
585 ELSE IF ( mapst2(iy,ix) .EQ. 2 )
THEN
586 tstloc(4*j-3:4*j-1) =
'DRY'
588 tstloc(4*j-3:4*j-1) =
'DIS'
590 ELSE IF ( mapsta(iy,ix) .GT. 0 )
THEN
591 tstloc(4*j-3:4*j-1) =
'SEA'
598 WRITE (ndst,9031) ttime, factor*xt, factor*yt, tstloc, &
599 ixx(1), ixx(2), iyy(1), iyy(3), flag1, flag2
626 IF ( mask1(iy,ix) )
THEN
628 ELSE IF ( mask2(iy,ix) )
THEN
634 WRITE (ndst,9036) mapstr
647 ALLOCATE (
status(mpi_status_size,1) )
652 IF ( mask1(iy,ix) )
THEN
654 IF(gtype .EQ. ungtype)
THEN
670 IF ( mapsta(iy,ix) .EQ. 0 )
THEN
671 IF ( mapst2(iy,ix) .EQ. 0 )
THEN
676 ELSE IF ( mapsta(iy,ix) .LT. 0 )
THEN
677 IF ( mapst2(iy,ix) .EQ. 1 )
THEN
679 ELSE IF ( mapst2(iy,ix) .EQ. 2 )
THEN
689 IF ( tststr .EQ.
'SEA' ) nspeco = nspeco + 1
697 IF ( isea .EQ. 0 )
THEN
703 CALL init_get_jsea_isproc(isea, jsea, isproc)
714 IF ( isproc.EQ.iaproc .AND. iaproc.NE.naptrk )
THEN
716 WRITE (ndst,9040) ix, iy, isea, ispt,
'SENDING'
719 CALL mpi_send ( a(1,1,jsea), nspec, mpi_real, &
720 iroot, it, mpi_comm_wave, ierr_mpi )
726 IF ( iaproc .EQ. naptrk )
THEN
730 IF ( tststr .EQ.
'SEA' )
THEN
732 wx = ua(isea) * cos(ud(isea))
733 wy = ua(isea) * sin(ud(isea))
737 IF ( iaproc .EQ. isproc )
THEN
741 tpi*a(ith,ik,jsea)*sig(ik)/cg(ik,isea)
749 WRITE (ndst,9040) ix, iy, isea, ispt, &
753 CALL mpi_recv (asptrk, nspec, mpi_real,&
754 ifrom, it, mpi_comm_wave, &
761 tpi*asptrk(ith,ik)*sig(ik)/cg(ik,isea)
768 WRITE (ndsto,err=811,iostat=ierr) &
769 time, x, y, tststr, trckid(iy,ix)
770 WRITE (ndsto,err=811,iostat=ierr) &
771 dw(isea), cx(isea), cy(isea), wx, wy, &
772 ust(isea), as(isea), spec
777 WRITE (ndsto,err=811,iostat=ierr) &
778 time, x, y, tststr, trckid(iy,ix)
787 WRITE (ndst,9040) ix, iy, isea, ispt,
'WRITTEN',
time
805 WRITE (ndst,9090) ntrack, nread, nspeco, nloco
813 IF ( iaproc .EQ. naperr )
WRITE (ndse,1000) filext(:i), ierr
817 IF ( iaproc .EQ. naperr )
WRITE (ndse,1001) filext(:i), ierr
821 IF ( iaproc .EQ. naperr )
WRITE (ndse,1002) filext(:i)
825 IF ( iaproc .EQ. naperr )
WRITE (ndse,1003) filext(:i), idstri, idtst
829 IF ( iaproc .EQ. naperr )
WRITE (ndse,1010) filext(:i), ierr
833 IF ( iaproc .EQ. naperr )
WRITE (ndse,1011) filext(:i), ierr
849 1000
FORMAT (/
' *** WAVEWATCH III WARNING IN W3IOTR : '/ &
850 ' INPUT FILE WITH TRACK DATA NOT FOUND ', &
851 '(FILE track_i.',a,
' IOSTAT =',i6,
')'/ &
852 ' TRACK OUTPUT DISABLED '/)
853 1001
FORMAT (/
' *** WAVEWATCH III WARNING IN W3IOTR : '/ &
854 ' ERROR IN READING FILE track_i.',a,
' IOSTAT =',i6/&
855 ' (ADITIONAL) TRACK OUTPUT DISABLED '/)
856 1002
FORMAT (/
' *** WAVEWATCH III WARNING IN W3IOTR : '/ &
857 ' PREMATURE END OF FILE track_i.',a/ &
858 ' TRACK OUTPUT DISABLED '/)
859 1003
FORMAT (/
' *** WAVEWATCH III WARNING IN W3IOTR : '/ &
860 ' UNEXPECTED CONTENTS OF OF FILE track_i.',a/ &
863 ' TRACK OUTPUT DISABLED '/)
864 1010
FORMAT (/
' *** WAVEWATCH III WARNING IN W3IOTR : '/ &
865 ' ERROR IN OPENING OUTPUT FILE ', &
866 '(FILE track_o.',a,
' IOSTAT =',i6,
')'/ &
867 ' TRACK OUTPUT DISABLED '/)
868 1011
FORMAT (/
' *** WAVEWATCH III WARNING IN W3IOTR : '/ &
869 ' ERROR IN WRITING TO FILE track_o.',a,
' IOSTAT =',i6/ &
870 ' (ADITIONAL) TRACK OUTPUT DISABLED '/)
873 9000
FORMAT (
' TEST W3IOTR : MODEL TIME : ',i8.8,i7.6)
874 9010
FORMAT (
' LAST OUTPUT TIME : ',i8.8,i7.6/ &
875 ' OUTPUT TIME INC, : ',f6.0/ &
876 ' UNIT NUMBERS : ',2i4/ &
877 ' FORMAT FLAGS : ',l4)
878 9011
FORMAT (
' TEST W3IOTR : OPENING INPUT : ',a,
' [',a,
']')
879 9012
FORMAT (
' TEST W3IOTR : OPENING OUTPUT : ',a,
' [',a,
']')
880 9015
FORMAT (
' TEST W3IOTR : PREPARING MASKS')
881 9020
FORMAT (
' TEST W3IOTR : SHIFTING MASKS')
882 9021
FORMAT (
' TEST W3IOTR : OUTPUT TIME FRAME: ',i8.8,i7.6/ &
884 9022
FORMAT (
' TEST W3IOTR : ENDING TIME REACHED')
885 9033
FORMAT (
' TEST W3IOTR : END OF INPUT FILE')
886 9034
FORMAT (
' TEST W3IOTR : OUTPUT TYPE DISABLED')
887 9090
FORMAT (
' TEST W3IOTR : NUMBER OF TRACK P: ',i10, &
888 ' (OUT OF',i10,
')'/ &
889 ' NUMBER OF SPECTRA: ',i10, &
891 9080
FORMAT (
' TEST W3IOTR : OUTPUT TYPE DISABLED.')
895 9030
FORMAT (
' TEST W3IOTR : POINT-BY-POINT STATUS')
896 9031
FORMAT (
' ',i8.8,i7.6,2f9.2,1x,a,1x,4i4,2l3)
899 9035
FORMAT (
' TEST W3IOTR : DUMP OF MAPS : ')
904 9040
FORMAT (
' TEST W3IOTR : POINT',2i4,
' (',i6,
')', &
905 ' ON PROCESS',i4,2x,a,i10.8,i7.6)