76 CHARACTER(LEN=10),
PARAMETER ::
verbptbc =
'2018-03-01'
77 CHARACTER(LEN=32),
PARAMETER :: &
78 idstrbc =
'WAVEWATCH III BOUNDARY DATA FILE'
98 SUBROUTINE w3iobc ( INXOUT, NDSB, TIME1, TIME2, IOTST, IMOD )
254 INTEGER,
INTENT(IN) :: NDSB
255 INTEGER,
INTENT(INOUT) :: TIME1(2)
256 INTEGER,
INTENT(OUT) :: TIME2(2), IOTST
257 INTEGER,
INTENT(IN),
OPTIONAL :: IMOD
258 CHARACTER,
INTENT(IN) :: INXOUT*(*)
264 INTEGER :: IFILE, IERR, I, J, IX, IY, ISEA, &
265 IP, ISP, NPTS, ISOUT, IS, IGRD
270 INTEGER,
SAVE :: IENT = 0
278 REAL,
ALLOCATABLE :: Anglbdy(:), ELatbdy(:), ELonbdy(:)
279 REAL :: Spectr(NK*NTH)
282 REAL,
ALLOCATABLE :: TMPSPC(:,:)
284 CHARACTER(LEN=18) :: FILEN
285 CHARACTER(LEN=10) :: VERTST
286 CHARACTER(LEN=32) :: IDTST
291 CALL strace (ient,
'W3IOBC')
298 IF (
PRESENT(imod) )
THEN
309 IF (inxout.NE.
'READ' .AND. inxout.NE.
'WRITE' .AND. &
310 inxout.NE.
'DUMP' )
THEN
324 IF ( inxout.EQ.
'READ' .AND.
filer )
THEN
325 WRITE (filen,
'(A5,A)')
'nest.', filext(:i)
327 WRITE (
ndst,9001) filen(:5+i), ndsb
330 err=801,iostat=ierr,status=
'OLD')
333 IF ( inxout.EQ.
'WRITE' .AND.
filew )
THEN
335 ndsl(ifile) = ndsb + ifile - 1
336 WRITE (filen,
'(A4,I1,A1,A)')
'nest', ifile,
'.', &
339 WRITE (
ndst,9001) filen(:6+i),
ndsl(ifile)
342 form=
'UNFORMATTED', convert=
file_endian,err=800,iostat=ierr)
346 IF ( inxout.EQ.
'DUMP' .AND.
filed )
THEN
347 WRITE (filen,
'(A5,A)')
'nest.', filext(:i)
349 WRITE (
ndst,9001) filen(:5+i), ndsb
359 IF ( inxout.EQ.
'WRITE' .AND.
filew )
THEN
362 WRITE (
ndsl(ifile)) &
376 WRITE (
ndsl(ifile)) &
384 DO i=
nbo(ifile-1)+1,
nbo(ifile)
397 IF ( inxout.EQ.
'DUMP' .AND.
filed )
THEN
422 IF ( inxout.EQ.
'READ' .AND.
filer )
THEN
424 READ (ndsb,err=803,iostat=ierr) &
428 WRITE (
ndst,9002) 1, ndsb, idtst, vertst,
nbi
445 abs(
xfri/xfr-1.).GT.0.01 .OR. &
446 abs(
fr1i/fr1-1.).GT.0.01 .OR. &
447 abs(
th1i-th(1)).GT.0.01*dth
451 READ (ndsb,err=803,iostat=ierr) &
460 IF (
polat < 90. )
THEN
462 ALLOCATE ( anglbdy(
nbi), elatbdy(
nbi), elonbdy(
nbi) )
464 CALL w3lltoeq (
ybpi,
xbpi, elatbdy, elonbdy, &
472 IF ( x0 .LT. 0.0 )
THEN
480 xrlim = x0 + (nx-1) * sx
481 yrlim = y0 + (ny-1) * sy
483 IF ( abs(
xbpi(i) - x0) .LT. sx/4.0 )
xbpi(i) = x0
484 IF ( abs(
ybpi(i) - y0) .LT. sy/4.0 )
ybpi(i) = y0
485 IF ( abs(
xbpi(i) - xrlim) .LT. sx/4.0 )
xbpi(i) = xrlim
486 IF ( abs(
ybpi(i) - yrlim) .LT. sy/4.0 )
ybpi(i) = yrlim
489 DEALLOCATE ( anglbdy, elatbdy, elonbdy )
495 IF (gtype .EQ. ungtype)
THEN
499 ELSE IF( gtype .EQ. smctype )
THEN
509 IF ( w3gfpt( gsu,
xbpi(i),
ybpi(i), ix, iy, dcin=0.1 ) )
THEN
510 IF ( abs(mapsta(iy,ix)) .NE. 2 )
THEN
512 WRITE (
ndse,909) ix, iy, abs(mapsta(iy,ix))
520 isbpi(i) = mapfs(iy,ix)
532 IF ( .NOT.flok )
CALL extcde ( 20 )
537 IF ( abs(mapsta(iy,ix)) .EQ. 2 )
THEN
540 IF ( isea .EQ.
isbpi(i) ) flok = .true.
543 WRITE (
ndse,911) ix, iy
549 READ (ndsb,
END=810,ERR=810) TIME2, nbi2
552 WRITE (ndst,9012) ndsb, time2, nbi2
554 CALL w3dmo5 ( igrd, ndse, ndst, 3 )
560 IF ( inxout.EQ.
'READ' .AND. .NOT.filer )
THEN
565 abpi0(:,1:nbi2) = abpin(:,1:nbi2)
570 IF ( inxout .EQ.
'WRITE' )
THEN
572 npts = nbo2(ifile) - nbo2(ifile-1)
573 WRITE (ndsl(ifile)) time1, npts
575 WRITE (ndst,9010) ifile, ndsl(ifile), time1, npts
580 IF ( inxout .EQ.
'DUMP' )
THEN
581 WRITE (ndsb) time1, nbi2
583 WRITE (ndst,9011) ndsb, time1, nbi2
587 IF ( inxout .EQ.
'READ' )
THEN
588 READ (ndsb,err=810,
END=810) TIME2, nbi2
590 WRITE (ndst,9011) ndsb, time2, nbi2
596 IF ( inxout .EQ.
'WRITE' )
THEN
603 DO isout=nbo2(ifile-1)+1, nbo2(ifile)
611 abpos(is,isout) = va(is,isea) * sig2(is) / &
612 cg(1+(is-1)/nth,isea)
621 abpos(is,isout) = abpos(is,isout) * sig2(is) / &
622 cg(1+(is-1)/nth,isea)
629 IF ( polat < 90. )
THEN
632 spectr = abpos(:,isout)
633 CALL w3acturn( nth, nk, -angld(isea), spectr )
634 abpos(:,isout) = spectr
638 WRITE (ndsl(ifile)) (abpos(is,isout),is=1,nspec)
644 is = ith + (ik-1)*nth
645 hs = hs + abpos(is,isout)*sig(ik)
648 hs = 4. * sqrt( hs * dth * 0.5 * (xfr-1./xfr) )
649 WRITE (ndst,9041) ndsl(ifile), isout, isea, hs
657 IF ( inxout .EQ.
'DUMP' )
THEN
659 WRITE (ndsb) abpin(:,i)
663 IF ( inxout .EQ.
'READ' )
THEN
665 IF ( .NOT. spconv )
THEN
667 READ (ndsb,err=803,iostat=ierr) abpin(:,ip)
675 ALLOCATE ( tmpspc(nki*nthi,nbi2) )
677 READ (ndsb,err=803,iostat=ierr) tmpspc(:,ip)
679 CALL w3cspc ( tmpspc , nki, nthi, xfri, fr1i, th1i, &
680 abpin(:,1:nbi2),nk, nth, xfr, fr1, th(1),&
681 nbi2, ndst, ndse, fachfe )
682 DEALLOCATE ( tmpspc )
691 hs = hs + abpin(isp,ip)*sig2(isp)
692 IF ( .NOT.filer ) hs0 = hs0 + abpi0(isp,ip)*sig2(isp)
694 hs = 4. * sqrt( hs * dth * 0.5 * (xfr-1./xfr) )
695 hs0 = 4. * sqrt( hs0 * dth * 0.5 * (xfr-1./xfr) )
696 WRITE (ndst,9043) ip, hs0, hs
704 IF ( inxout.EQ.
'READ' .AND. filer )
THEN
710 abpi0(:,ip) = abpin(:,ip)
718 IF ( inxout .EQ.
'WRITE' ) filew = .false.
719 IF ( inxout .EQ.
'DUMP' ) filed = .false.
720 IF ( inxout .EQ.
'READ' ) filer = .false.
727 IF ( iaproc .EQ. naperr )
WRITE (ndse,1000) filen, ierr
731 IF ( iaproc .EQ. naperr )
WRITE (ndse,1001) imod
737 IF ( iaproc .EQ. naperr )
WRITE (ndse,1002)
741 IF ( iaproc .EQ. naperr )
WRITE (ndse,1003) ierr
746 IF ( iaproc .EQ. naperr )
WRITE (ndse,1010)
757 abpi0(isp,ip) = abpin(isp,ip)
767 900
FORMAT (/
' *** WAVEWATCH III ERROR IN W3IOBC :'/ &
768 ' ILLEGAL INXOUT VALUE: ',a/)
769 901
FORMAT (/
' *** WAVEWATCH III ERROR IN W3IOBC :'/ &
770 ' ILLEGAL IDSTRBC, READ : ',a/ &
772 902
FORMAT (/
' *** WAVEWATCH III ERROR IN W3IOBC :'/ &
773 ' ILLEGAL VEROGR, READ : ',a/ &
776 909
FORMAT (/
' *** WAVEWATCH III ERROR IN W3IOBC :'/ &
777 ' POINT',2i4,
' NOT ACTIVE SEA POINT (',i1,
')')
778 910
FORMAT (/
' *** WAVEWATCH III ERROR IN W3IOBC :'/ &
779 ' POINT',i4,2e14.6,
' NOT LOCATED IN GRID')
780 911
FORMAT (
' *** WAVEWATCH III WARNING : POINT',2i7, &
781 ' WILL NOT BE UPDATED')
782 920
FORMAT (/
' *** SMCTYPE mapped boundary cells:'/ ((i8,2f9.3)) )
784 1000
FORMAT (/
' *** WAVEWATCH III ERROR IN W3IOBC : '/ &
785 ' ERROR IN OPENING FILE ',a/ &
790 1001
FORMAT (/
' *** WAVEWATCH III WARNING IN W3IOBC : '/ &
791 ' INPUT FILE WITH BOUNDARY CONDITIONS NOT FOUND'/ &
792 ' BOUNDARY CONDITIONS WILL NOT BE UPDATED ',i5/)
793 1002
FORMAT (/
' *** WAVEWATCH III ERROR IN W3IOBC : '/ &
794 ' PREMATURE END OF FILE'/)
795 1003
FORMAT (/
' *** WAVEWATCH III ERROR IN W3IOBC : '/ &
796 ' ERROR IN READING FROM FILE'/ &
799 1010
FORMAT (/
' *** WAVEWATCH III ERROR IN W3IOBC : '/ &
800 ' NO DATA IN INPUT FILE'/)
803 9000
FORMAT (
' TEST W3IOBC : INXOUT : ',a5/ &
806 9001
FORMAT (
' TEST W3IOBC : OPENING FILE ',a,
' (',i2,
')')
807 9002
FORMAT (
' TEST W3IOBC : FILE # : ',i4/ &
815 9003
FORMAT (
' TEST W3IOBC : POINT DATA ')
816 9004
FORMAT (
' ',i3,2e10.3,2x,4i4,2x,4f5.2)
817 9005
FORMAT (
' ',i3,i4,2e10.3,2x,4i4,2x,4f5.2)
821 9010
FORMAT (
' TEST W3IOBC : OUTPUT FILE ',i1,
' UNIT',i3,
' TIME', &
822 i9.8,i7.6,
',',i5,
' SPECTRA')
823 9011
FORMAT (
' TEST W3IOBC : INPUT FILE UNIT',i3,
' TIME', &
824 i9.8,i7.6,
',',i5,
' SPECTRA')
825 9012
FORMAT (
' TEST W3IOBC : INPUT FILE UNIT',i3,
' TIME', &
826 i9.8,i7.6,
',',i5,
' SPECTRA (TEST READ)')
828 9020
FORMAT (
' TEST W3IOBC : SAVING OLD DATA')
829 9021
FORMAT (
' TEST W3IOBC : SAVING FIRST DATA')
830 9022
FORMAT (
' TEST W3IOBC : EOF REACHED')
834 9040
FORMAT (
' TEST W3IOBC : UNIT, ISOUT, ISEA, HS(NO TAIL) ')
835 9041
FORMAT (
' ',i3,2i6,f8.2)
836 9042
FORMAT (
' TEST W3IOBC : IP, HS(NO TAIL) ')
837 9043
FORMAT (
' ',i6,2f8.2)