164 INTEGER :: ix, iy, isea, i,jj,ip,ip1,j,it, &
165 ndsi,ndsm, ndsi2,ndss,ndsb, ndsc, &
166 ndstrc, ntrace, nk1,nth1,nt1, nspec1, &
167 nbi, nbi2, nki, nthi, nti, nbo, nbo2, &
168 ierr,
interp, iloop, verbose, ibo, &
170 INTEGER :: time(2), time2(2), varid(12), &
171 refdate(8), curdate(8), vartype
173 INTEGER,
SAVE :: ient = 0
176 INTEGER,
ALLOCATABLE :: ipbpi(:,:), ipbpo(:,:), ncid(:), &
177 dimid(:,:), dimln(:,:)
179 REAL :: fr1i, xfri, th1i, factor, offset, dmin,&
180 dist, dmin2, cos1, dlon, dlat, dlo, &
183 REAL,
ALLOCATABLE :: spec2d(:,:,:,:), lats(:), lons(:), &
185 xbpi(:), ybpi(:), rdbpi(:,:), &
186 xbpo(:), ybpo(:), rdbpo(:,:), &
187 abpin(:,:), abpin2(:,:,:)
189 REAL,
ALLOCATABLE :: xtmp(:), ytmp(:), angtmp(:)
193 REAL,
ALLOCATABLE :: tmpspci(:,:),tmpspco(:,:)
196 DOUBLE PRECISION :: refjulday, curjulday
197 DOUBLE PRECISION,
ALLOCATABLE :: times(:)
199 CHARACTER :: comstr*1, line*512, filename*512, &
201 CHARACTER*50 :: timeunits, calendar
202 CHARACTER*10 :: vertest
203 CHARACTER*32 :: idtst
204 CHARACTER*512,
ALLOCATABLE :: specfiles(:)
205 CHARACTER,
ALLOCATABLE :: station(:,:)
207 LOGICAL :: flgnml, spconv
216 CALL w3nmod ( 1, 6, 6 )
217 CALL w3setg ( 1, 6, 6 )
223 CALL w3seto ( 1, 6, 6 )
236 CALL itrace ( ndstrc, ntrace )
239 CALL strace (ient,
'W3BOUNC')
249 CALL w3iogr (
'READ', ndsm )
250 WRITE (
ndso,920) gname
253 isrtd =
polat .LT. 90.0
264 INQUIRE(
file=trim(fnmpre)//
"ww3_bounc.nml", exist=flgnml)
267 CALL w3nmlbounc (ndsi, trim(fnmpre)//
'ww3_bounc.nml', nml_bound, ierr)
269 inxout = nml_bound%MODE
271 verbose = nml_bound%VERBOSE
272 file = nml_bound%FILE
275 OPEN(ndsl,
file=trim(
file),status=
'OLD',err=809,iostat=ierr)
278 READ (ndsl,*,
END=400,ERR=802)
282 ALLOCATE(specfiles(nbo2))
285 READ (ndsl,
'(A512)',
END=801,ERR=802) SPECFILES(I)
294 IF (.NOT. flgnml)
THEN
295 OPEN (ndsi,
file=trim(fnmpre)//
'ww3_bounc.inp',status=
'OLD',err=805,iostat=ierr)
298 READ (ndsi,
'(A)',
END=801,ERR=802,IOSTAT=IERR) comstr
299 IF (comstr.EQ.
' ') comstr =
'$'
300 WRITE (ndso,901) comstr
302 CALL nextln ( comstr , ndsi , ndse )
303 READ (ndsi,*,
END=801,ERR=802) inxout
304 CALL nextln ( comstr , ndsi , ndse )
305 READ (ndsi,*,
END=801,ERR=802)
interp
306 CALL nextln ( comstr , ndsi , ndse )
307 READ (ndsi,*,
END=801,ERR=802) verbose
308 CALL nextln ( comstr , ndsi , ndse )
316 OPEN (ndss,
file=
'ww3_bounc.scratch',form=
'FORMATTED', &
318 IF ( iloop .EQ. 1 )
THEN
322 ALLOCATE(specfiles(nbo2))
329 CALL nextln ( comstr , ndsi2 , ndse )
330 READ (ndsi2,
'(A512)') filename
331 jj = len_trim(filename)
332 IF ( iloop .EQ. 1 )
THEN
334 READ (ndsi,
'(A)') line
335 WRITE (ndss,
'(A)') line
337 IF (filename(:jj).EQ.
"'STOPSTRING'")
EXIT
339 IF (iloop.EQ.1) cycle
340 specfiles(nbo2)=filename
343 IF ( iloop .EQ. 1 )
CLOSE ( ndss)
345 IF ( iloop .EQ. 2 )
CLOSE ( ndss, status=
'DELETE' )
357 IF ( inxout.EQ.
'READ')
THEN
358 OPEN(ndsb,
file=
'nest.ww3',form=
'UNFORMATTED', convert=
file_endian,status=
'old')
359 READ(ndsb) idtst, vertest, nk1, nth1, xfr, fr1i, th1i, nbi
361 IF ( idtst .NE. idstrbc )
GOTO 803
362 WRITE(ndso,940) vertest
363 WRITE(ndso,941) idtst
364 IF (verbose.EQ.1)
WRITE(ndso,
'(A,2I5,3F12.6,I5)')
'NK,NTH,XFR, FR1I, TH1I, NBI :', &
365 nk1,nth1,xfr, fr1i, th1i, nbi
366 ALLOCATE (xbpi(nbi),ybpi(nbi))
367 ALLOCATE (ipbpi(nbi,4),rdbpi(nbi,4))
368 READ(ndsb) (xbpi(i),i=1,nbi), &
370 ((ipbpi(i,j),i=1,nbi),j=1,4), &
371 ((rdbpi(i,j),i=1,nbi),j=1,4)
372 IF (verbose.GE.1)
WRITE(ndso,*)
'XBPI:',xbpi
373 IF (verbose.GE.1)
WRITE(ndso,*)
'YBPI:',ybpi
374 IF (verbose.GE.1)
WRITE(ndso,*)
'IPBPI:'
376 IF (verbose.GE.1)
WRITE(ndso,*) i,
' interpolated from:',ipbpi(i,1:4)
377 IF (verbose.GE.1)
WRITE(ndso,*) i,
' with coefficient :',rdbpi(i,1:4)
380 READ (ndsb) time2, nbi2
382 ALLOCATE (abpin(nspec1,nbi2))
385 READ (ndsb,iostat=ierr) time2, nbi2
387 IF (verbose.EQ.1)
WRITE(ndso,*)
'TIME2,NBI2:',time2, nbi2,ierr
389 READ (ndsb,
END=803,ERR=804) ABPIN(:,IP)
397 IF ( inxout.EQ.
'WRITE')
THEN
406 IF (mapsta(iy,ix).EQ.2)
THEN
410 ALLOCATE(xbpo(nbo),ybpo(nbo))
412 IF (isrtd)
ALLOCATE(xtmp(nbo), ytmp(nbo), angtmp(nbo))
414 ALLOCATE (ipbpo(nbo,4),rdbpo(nbo,4))
419 IF (mapsta(iy,ix).EQ.2)
THEN
421 SELECT CASE ( gtype )
423 xbpo(ibo)=x0+sx*(ix-1)
424 ybpo(ibo)=y0+sy*(iy-1)
426 xbpo(ibo)= xgrd(iy,ix)
427 ybpo(ibo)= ygrd(iy,ix)
429 xbpo(ibo)= xgrd(1,ix)
430 ybpo(ibo)= ygrd(1,ix)
440 CALL w3eqtoll(ytmp, xtmp, ybpo, xbpo, angtmp, polat, polon, nbo)
441 DEALLOCATE(xtmp, ytmp, angtmp)
446 OPEN(ndsb,
file=
'nest.ww3',form=
'UNFORMATTED', convert=
file_endian,status=
'unknown')
447 ALLOCATE(dimid(nbo2,3),dimln(nbo2,3),ncid(nbo2))
449 ALLOCATE(lats(nbo2),lons(nbo2),station(16,nbo2))
453 OPEN(ndsc,
file=trim(specfiles(ip)),form=
'UNFORMATTED', convert=
file_endian, &
454 status=
'old',iostat=icode)
458 WRITE (ndse,1010) trim(specfiles(ip))
462 iret=nf90_open(trim(specfiles(ip)),nf90_nowrite,ncid(ip))
463 WRITE(6,*)
'Opening file:',trim(specfiles(ip))
467 iret=nf90_inq_dimid(ncid(ip),
'time',dimid(ip,1))
469 iret=nf90_inq_dimid(ncid(ip),
'frequency',dimid(ip,2))
471 iret=nf90_inq_dimid(ncid(ip),
'direction',dimid(ip,3))
473 iret=nf90_inquire_dimension(ncid(ip),dimid(ip,1),len=dimln(ip,1))
475 iret=nf90_inquire_dimension(ncid(ip),dimid(ip,2),len=dimln(ip,2))
477 iret=nf90_inquire_dimension(ncid(ip),dimid(ip,3),len=dimln(ip,3))
490 ALLOCATE (freq(nk1),theta(nth1))
491 ALLOCATE (spec2d(nth1,nk1,nt1,nbo2))
492 ALLOCATE (abpin2(nk*nth,nt1,nbo2))
496 iret=nf90_inq_varid(ncid(ip),
"time",varid(1))
498 iret=nf90_get_var(ncid(ip), varid(1), times(:))
500 iret=nf90_get_att(ncid(ip),varid(1),
"calendar",calendar)
501 IF ( iret/=nf90_noerr )
THEN
503 ELSE IF ((index(calendar,
"standard").EQ.0) .AND. &
504 (index(calendar,
"gregorian").EQ.0))
THEN
507 iret=nf90_get_att(ncid(ip),varid(1),
"units",timeunits)
508 CALL u2d(timeunits,refdate,ierr)
509 CALL d2j(refdate,refjulday,ierr)
512 IF (nki.NE.nk1.OR.nthi.NE.nth1.OR.nt1.NE.nti &
518 iret=nf90_inq_varid(ncid(ip),
'latitude', varid(2))
520 iret=nf90_get_var(ncid(ip), varid(2), lats(ip))
522 iret=nf90_inq_varid(ncid(ip),
'longitude', varid(3))
524 iret=nf90_get_var(ncid(ip), varid(3), lons(ip))
527 iret=nf90_inq_varid(ncid(ip),
'y', varid(2))
529 iret=nf90_get_var(ncid(ip), varid(2), lats(ip))
531 iret=nf90_inq_varid(ncid(ip),
'x', varid(3))
533 iret=nf90_get_var(ncid(ip), varid(3), lons(ip))
538 iret=nf90_inq_varid(ncid(ip),
"frequency",varid(4))
540 iret=nf90_get_var(ncid(ip),varid(4),freq)
542 iret=nf90_inq_varid(ncid(ip),
"direction",varid(5))
544 iret=nf90_get_var(ncid(ip),varid(5),theta)
546 theta=mod(2.5*
pi-(
pi/180)*theta,
tpi)
549 iret=nf90_inq_varid(ncid(ip),
"efth",varid(7))
550 IF (iret.NE.0) iret=nf90_inq_varid(ncid(ip),
"Efth",varid(7))
552 iret=nf90_inquire_variable(ncid(ip),varid(7),xtype=vartype)
554 iret=nf90_get_att(ncid(ip),varid(7),
"_FillValue",fillval)
556 iret=nf90_get_att(ncid(ip),varid(7),
"scale_factor",factor)
557 IF (iret.NE.0) factor=1.
558 iret=nf90_get_att(ncid(ip),varid(7),
"add_offset",offset)
559 IF (iret.NE.0) offset=0.
560 iret = nf90_inq_varid(ncid(ip),
'station_name', varid(6))
563 iret=nf90_get_var(ncid(ip),varid(7),spec2d(:,:,:,ip), &
564 start=(/1,1,1,1/),count=(/1,1,nthi,nki,nti/))
568 iret=nf90_get_var(ncid(ip),varid(7),spec2d(:,:,:,ip), &
569 start=(/1,1,1,1/),count=(/nthi,nki,1,nti/))
573 IF (vartype.EQ.nf90_short)
THEN
574 WHERE(spec2d(:,:,:,ip).NE.fillval) spec2d(:,:,:,ip)=(exp(spec2d(:,:,:,ip)*factor*log(10.)))-1e-12
576 WHERE(spec2d(:,:,:,ip).NE.fillval) spec2d(:,:,:,ip)=(spec2d(:,:,:,ip)*factor)+offset
580 iret=nf90_close(ncid(ip))
593 xfri=exp(alog(freq(nki)/freq(1))/(nki-1))
596 spconv = nki.NE.nk .OR. nthi.NE.nth .OR. &
597 abs(xfri/xfr-1.).GT.0.01 .OR. &
598 abs(fr1i/fr1-1.).GT.0.01 .OR. &
599 abs(th1i-th(1)).GT.0.01*dth
601 IF (verbose.GE.1)
WRITE(ndso,*)
'SPCONV:', spconv, nki, nk, nthi, nth
606 IF ( .NOT. spconv )
THEN
612 abpin2((i-1)*nth+j,:,ip)=spec2d(j,i,:,ip)*
tpiinv
618 ALLOCATE(tmpspci(nki*nthi,nti))
619 ALLOCATE(tmpspco(nk*nth, nti))
623 tmpspci((i-1)*nthi+j,:)=spec2d(j,i,:,ip)*
tpiinv
626 CALL w3cspc ( tmpspci, nki, nthi, xfri, fr1i, th1i, &
627 tmpspco, nk, nth, xfr, fr1, th(1),&
628 nti, ndst, ndse, fachfe )
629 abpin2(:,:,ip)=tmpspco(:,:)
638 WRITE(ndsb) idstrbc, verbptbc, nk, nth, xfr, fr1, &
652 dist=dist_sphere( lons(ip),lats(ip),xbpo(ip1),ybpo(ip1) )
654 dist=sqrt((lons(ip)-xbpo(ip1))**2+(lats(ip)-ybpo(ip1))**2)
656 IF (dmin.EQ.(360.+180.))
THEN
657 IF(dist.LT.dmin)
THEN
662 IF(dist.LT.dmin2)
THEN
663 IF(dist.LT.dmin)
THEN
664 ipbpo(ip1,2)=ipbpo(ip1,1)
675 IF (verbose.GE.1)
WRITE(ndso,*)
'DIST:',dmin,dmin2,ip1,ipbpo(ip1,1),ipbpo(ip1,2), &
676 lons(ipbpo(ip1,1)),lons(ipbpo(ip1,2)),xbpo(ip1), &
677 lats(ipbpo(ip1,1)),lats(ipbpo(ip1,2)),ybpo(ip1)
684 IF (
interp.GT.1.AND.nbo2.GT.1)
THEN
686 dlon=lons(ipbpo(ip1,2))-lons(ipbpo(ip1,1))
687 dlat=lats(ipbpo(ip1,2))-lats(ipbpo(ip1,1))
688 dlo=xbpo(ip1)-lons(ipbpo(ip1,1))
689 IF (dlon.GT.180.) dlon=dlon-360
690 IF (dlon.LT.-180.) dlon=dlon+360
691 IF (dlo.GT.180.) dlo=dlo-360
692 IF (dlo.LT.-180.) dlo=dlo+360
693 dist=sqrt(dlon**2+dlat**2)
695 + (ybpo(ip1)-lats(ipbpo(ip1,1))) &
698 dist=sqrt((lons(ipbpo(ip1,1))-lons(ipbpo(ip1,2)))**2 &
699 +(lats(ipbpo(ip1,1))-lats(ipbpo(ip1,2)))**2)
700 cos1=( (xbpo(ip1)-lons(ipbpo(ip1,1))) &
701 *(lons(ipbpo(ip1,2))-lons(ipbpo(ip1,1))) &
702 + (ybpo(ip1)-lats(ipbpo(ip1,1))) &
703 *(lats(ipbpo(ip1,2))-lats(ipbpo(ip1,1))) )/(dist**2)
709 rdbpo(ip1,1)=1-min(1.,max(0.,cos1))
710 rdbpo(ip1,2)=min(1.,max(0.,cos1))
716 IF (verbose.GE.1)
WRITE(ndso,*)
'IPBP:',ip1,(ipbpo(ip1,j),j=1,4)
717 IF (verbose.GE.1)
WRITE(ndso,*)
'RDBP:',ip1,(rdbpo(ip1,j),j=1,4)
721 WRITE(ndsb) (xbpo(i),i=1,nbo), &
723 ((ipbpo(i,j),i=1,nbo),j=1,4), &
724 ((rdbpo(i,j),i=1,nbo),j=1,4)
733 IF (index(timeunits,
"seconds").NE.0) curjulday=curjulday/86400.
734 IF (index(timeunits,
"minutes").NE.0) curjulday=curjulday/1440.
735 IF (index(timeunits,
"hours").NE.0) curjulday=curjulday/24.
736 curjulday=refjulday+curjulday
739 CALL j2d(curjulday,curdate,ierr)
740 CALL d2t(curdate,time,ierr)
743 WRITE(ndso,
'(A,2I9,A,I6,A,G16.5)')
'Writing boundary data for time:', &
744 time,
' at ',nbo2,
' points. Max.: ', maxval(abpin2(:,it,:))
745 WRITE(ndsb,iostat=ierr) time, nbo2
747 WRITE(ndsb) abpin2(:,it,ip)
765 WRITE (ndse,1002) ierr
769 WRITE (ndse,1003) idtst, idstrbc
777 WRITE (ndse,1005) trim(specfiles(ip)), nki, nk1, nthi, nth1, nti, nt1
781 WRITE (ndse,1009)
file, ierr
791 900
FORMAT (/15x,
' *** WAVEWATCH III Bounday input prep. *** '/ &
792 15x,
'==============================================='/)
794 901
FORMAT (
' Comment character is ''',a,
''''/)
796 920
FORMAT (
' Grid name : ',a/)
798 940
FORMAT (
' Format version : ',a/)
800 941
FORMAT (
' File type : ',a/)
802 951
FORMAT (/
' *** WAVEWATCH III WARNING IN W3BOUNC : '/ &
803 ' CALENDAR ATTRIBUTE NOT DEFINED'/ &
804 ' IT MUST RESPECT STANDARD OR GREGORIAN CALENDAR')
806 952
FORMAT (/
' *** WAVEWATCH III WARNING IN W3BOUNC : '/ &
807 ' CALENDAR ATTRIBUTE NOT MATCH'/ &
808 ' IT MUST RESPECT STANDARD OR GREGORIAN CALENDAR')
810 999
FORMAT (/
' End of program '/ &
811 ' ========================================='/ &
812 ' WAVEWATCH III Boundary input '/)
814 1001
FORMAT (/
' *** WAVEWATCH-III ERROR IN W3BOUNC : '/ &
815 ' PREMATURE END OF INPUT FILE'/)
817 1002
FORMAT (/
' *** WAVEWATCH III ERROR IN W3BOUNC: '/ &
818 ' ERROR IN READING ',a,
' FROM INPUT FILE'/ &
821 1003
FORMAT (/
' *** WAVEWATCH-III ERROR IN W3IOBC :'/ &
822 ' ILLEGAL IDSTR, READ : ',a/ &
825 1004
FORMAT (/
' *** WAVEWATCH-III ERROR IN W3BOUNC : '/ &
826 ' PREMATURE END OF NEST FILE'/)
828 1005
FORMAT (/
' *** WAVEWATCH III ERROR IN W3BOUNC: '/ &
829 ' INCONSISTENT SPECTRAL DIMENSION FOR FILE ',a/ &
830 ' NKI =',i3,
' DIFFERS FROM NK1 =',i3/ &
831 ' OR NTHI =',i3,
' DIFFERS FROM NTH1 =',i3/ &
832 ' OR NTI =',i5,
' DIFFERS FROM NT1 =',i5 /)
834 1009
FORMAT (/
' *** WAVEWATCH III ERROR IN W3BOUNC : '/ &
835 ' ERROR IN OPENING SPEC FILE: ', a/ &
838 1010
FORMAT (/
' *** WAVEWATCH III ERROR IN W3BOUNC : '/ &
839 ' SPEC FILE DOES NOT EXIST : ',a/)
865 IF (iret .NE. nf90_noerr)
THEN
866 WRITE(
ndse,*)
' *** WAVEWATCH III ERROR IN BOUNC :'
867 WRITE(
ndse,*)
' NETCDF ERROR MESSAGE: '
868 WRITE(
ndse,*) nf90_strerror(iret)