diff --git a/model/src/pdlib_field_vec.F90 b/model/src/pdlib_field_vec.F90 index b386b8786a..88b9ff87e2 100644 --- a/model/src/pdlib_field_vec.F90 +++ b/model/src/pdlib_field_vec.F90 @@ -169,6 +169,9 @@ SUBROUTINE GET_ARRAY_SIZE(TheSize) IF ( FLGRDALL( 2, 19) ) THEN IH = IH + 1 END IF + IF ( FLGRDALL( 2, 20) ) THEN + IH =IH + 1 + END IF IF ( FLGRDALL( 3, 1) ) THEN DO IK=E3DF(2,1),E3DF(3,1) IH = IH + 1 @@ -830,7 +833,7 @@ SUBROUTINE DO_OUTPUT_EXCHANGES(IMOD) STH2M, HSIG, TAUICE, PHICE, PTHP0, PQP,& PPE, PGW, PSW, PTM1, PT1, PT2, PEP, & QP, MSSD, MSCD, STMAXE, STMAXD, HMAXE, & - HCMAXE, HMAXD, HCMAXD, WBT, USSP + HCMAXE, HMAXD, HCMAXD, WBT, USSP, BRCOEF USE W3GDATMD, ONLY: NK, NSEAL USE W3ODATMD, ONLY: NDST, IAPROC, NAPROC, NTPROC, FLOUT, & NAPFLD, NAPPNT, NAPRST, NAPBPT, NAPTRK,& @@ -968,6 +971,10 @@ SUBROUTINE DO_OUTPUT_EXCHANGES(IMOD) IH = IH + 1 Arrexch(IH,JSEA)=WNMEAN(JSEA) END IF + IF ( FLGRDALL( 2, 20) ) THEN + IH = IH + 1 + Arrexch(IH,JSEA)=BRCOEF(JSEA) + END IF IF ( FLGRDALL( 3, 1) ) THEN DO IK=E3DF(2,1),E3DF(3,1) IH = IH + 1 @@ -1411,6 +1418,10 @@ SUBROUTINE DO_OUTPUT_EXCHANGES(IMOD) IH = IH + 1 WNMEAN(1:NSEA) = ARRtotal(IH,:) END IF + IF ( FLGRDALL( 2, 20) ) THEN + IH = IH + 1 + BRCOEF(1:NSEA) = ARRtotal(IH,:) + END IF IF ( FLGRDALL( 3, 1) ) THEN DO IK=E3DF(2,1),E3DF(3,1) IH = IH + 1 diff --git a/model/src/w3adatmd.F90 b/model/src/w3adatmd.F90 index 2daee3609b..72f5a717ee 100644 --- a/model/src/w3adatmd.F90 +++ b/model/src/w3adatmd.F90 @@ -407,14 +407,15 @@ MODULE W3ADATMD THS(:), THP0(:), & HSIG(:), STMAXE(:), STMAXD(:), & HMAXE(:), HCMAXE(:), HMAXD(:), & - HCMAXD(:), QP(:), WBT(:), WNMEAN(:) + HCMAXD(:), QP(:), WBT(:), WNMEAN(:),& + BRCOEF(:) REAL, POINTER :: XHS(:), XWLM(:), XT02(:), XT0M1(:), & XT01 (:), XFP0(:), XTHM(:), & XTHS(:), XTHP0(:), & XHSIG(:), XSTMAXE(:), XSTMAXD(:), & XHMAXE(:), XHCMAXE(:), XHMAXD(:), & XHCMAXD(:), XQP(:), XWBT(:), & - XWNMEAN(:) + XWNMEAN(:), XBRCOEF(:) ! ! Output fields group 3) ! @@ -589,7 +590,7 @@ MODULE W3ADATMD THP0(:), HSIG(:), & STMAXE(:), STMAXD(:), HMAXE(:), & HCMAXE(:), HMAXD(:), HCMAXD(:), & - QP(:), WBT(:), WNMEAN(:) + QP(:), WBT(:), WNMEAN(:), BRCOEF(:) ! REAL, POINTER :: EF(:,:), TH1M(:,:), STH1M(:,:), & TH2M(:,:), STH2M(:,:) @@ -1050,6 +1051,7 @@ SUBROUTINE W3DIMA ( IMOD, NDSE, NDST, D_ONLY ) WADATS(IMOD)%HCMAXD(NSEALM), WADATS(IMOD)%QP(NSEALM), & WADATS(IMOD)%WBT(NSEALM), & WADATS(IMOD)%WNMEAN(NSEALM), & + WADATS(IMOD)%BRCOEF(NSEALM), & STAT=ISTAT ) CHECK_ALLOC_STATUS ( ISTAT ) ! @@ -1072,6 +1074,7 @@ SUBROUTINE W3DIMA ( IMOD, NDSE, NDST, D_ONLY ) WADATS(IMOD)%QP = UNDEF WADATS(IMOD)%WBT = UNDEF WADATS(IMOD)%WNMEAN = UNDEF + WADATS(IMOD)%BRCOEF = UNDEF call print_memcheck(memunit, 'memcheck_____:'//' W3DIMA 3') ! @@ -1733,6 +1736,14 @@ SUBROUTINE W3XDMA ( IMOD, NDSE, NDST, OUTFLAGS ) CHECK_ALLOC_STATUS ( ISTAT ) END IF ! + IF ( OUTFLAGS( 2, 20) ) THEN + ALLOCATE ( WADATS(IMOD)%XBRCOEF(NXXX), STAT=ISTAT ) + CHECK_ALLOC_STATUS ( ISTAT ) + ELSE + ALLOCATE ( WADATS(IMOD)%XBRCOEF(1), STAT=ISTAT ) + CHECK_ALLOC_STATUS ( ISTAT ) + END IF + ! WADATS(IMOD)%XHS = UNDEF WADATS(IMOD)%XWLM = UNDEF WADATS(IMOD)%XT02 = UNDEF @@ -1751,6 +1762,7 @@ SUBROUTINE W3XDMA ( IMOD, NDSE, NDST, OUTFLAGS ) WADATS(IMOD)%XHCMAXD= UNDEF WADATS(IMOD)%XWBT = UNDEF WADATS(IMOD)%XWNMEAN= UNDEF + WADATS(IMOD)%XBRCOEF= UNDEF ! IF ( OUTFLAGS( 3, 1) ) THEN ALLOCATE ( WADATS(IMOD)%XEF(NXXX,E3DF(2,1):E3DF(3,1)), STAT=ISTAT ) @@ -2860,6 +2872,7 @@ SUBROUTINE W3SETA ( IMOD, NDSE, NDST ) QP => WADATS(IMOD)%QP WBT => WADATS(IMOD)%WBT WNMEAN => WADATS(IMOD)%WNMEAN + BRCOEF => WADATS(IMOD)%BRCOEF ! EF => WADATS(IMOD)%EF TH1M => WADATS(IMOD)%TH1M @@ -3203,6 +3216,7 @@ SUBROUTINE W3XETA ( IMOD, NDSE, NDST ) QP => WADATS(IMOD)%XQP WBT => WADATS(IMOD)%XWBT WNMEAN => WADATS(IMOD)%XWNMEAN + BRCOEF => WADATS(IMOD)%XBRCOEF ! EF => WADATS(IMOD)%XEF TH1M => WADATS(IMOD)%XTH1M diff --git a/model/src/w3gdatmd.F90 b/model/src/w3gdatmd.F90 index e73957128b..29aac68700 100644 --- a/model/src/w3gdatmd.F90 +++ b/model/src/w3gdatmd.F90 @@ -528,6 +528,9 @@ MODULE W3GDATMD ! SDBC2 Real Public Hmax/d ratio. (!/DB1) ! FDONLY Log. Public Flag for checking depth only (!/DB1) ! otherwise Miche criterion. + ! FSLOPE Log. Public Flag for computing slope (!/DB1) + ! dependant breaking coeff, + ! constant otherwise ! ---------------------------------------------------------------- ! ! The structure STRP contains parameters for the triad interaction @@ -989,7 +992,7 @@ MODULE W3GDATMD #endif #ifdef W3_DB1 REAL :: SDBC1, SDBC2 - LOGICAL :: FDONLY + LOGICAL :: FDONLY, FSLOPE REAL :: SDBSC #endif END TYPE SDBP @@ -1391,7 +1394,7 @@ MODULE W3GDATMD !/ #ifdef W3_DB1 REAL, POINTER :: SDBC1, SDBC2 - LOGICAL, POINTER :: FDONLY + LOGICAL, POINTER :: FDONLY, FSLOPE REAL, POINTER :: SDBSC #endif !/ @@ -2814,6 +2817,7 @@ SUBROUTINE W3SETG ( IMOD, NDSE, NDST ) SDBC1 => MPARS(IMOD)%SDBPS%SDBC1 SDBC2 => MPARS(IMOD)%SDBPS%SDBC2 FDONLY => MPARS(IMOD)%SDBPS%FDONLY + FSLOPE => MPARS(IMOD)%SDBPS%FSLOPE SDBSC => MPARS(IMOD)%SDBPS%SDBSC #endif ! diff --git a/model/src/w3gridmd.F90 b/model/src/w3gridmd.F90 index ecf2726a0e..4196ea014e 100644 --- a/model/src/w3gridmd.F90 +++ b/model/src/w3gridmd.F90 @@ -896,6 +896,7 @@ MODULE W3GRIDMD #ifdef W3_DB1 REAL :: BJALFA, BJGAM LOGICAL :: BJFLAG + LOGICAL :: BRFLAG #endif #ifdef W3_PR2 REAL :: DTIME @@ -1066,7 +1067,7 @@ MODULE W3GRIDMD BOTROUGHMIN, BOTROUGHFAC #endif #ifdef W3_DB1 - NAMELIST /SDB1/ BJALFA, BJGAM, BJFLAG + NAMELIST /SDB1/ BJALFA, BJGAM, BJFLAG, BRFLAG #endif #ifdef W3_UOST NAMELIST /UOST/ UOSTFILELOCAL, UOSTFILESHADOW, & @@ -2358,11 +2359,20 @@ SUBROUTINE W3GRID() BJALFA = 1. BJGAM = 0.73 BJFLAG = .TRUE. + BRFLAG = .FALSE. CALL READNL ( NDSS, 'SDB1', STATUS ) - WRITE (NDSO,928) STATUS - BJALFA = MAX ( 0. , BJALFA ) - BJGAM = MAX ( 0. , BJGAM ) - WRITE (NDSO,929) BJALFA, BJGAM + WRITE (NDSO,928) STATUS + IF ( BRFLAG ) THEN + WRITE (NDSO,*) ' Slope-dependant breaking coeff.' + BJALFA = MIN (50. , MAX ( 40. , BJALFA )) + BJGAM = MAX ( 0. , BJGAM ) + WRITE (NDSO,929) BJALFA, BJGAM + ELSE + WRITE (NDSO,*) ' Constant breaking coeff.' + BJALFA = MAX ( 0. , BJALFA ) + BJGAM = MAX ( 0. , BJGAM ) + WRITE (NDSO,929) BJALFA, BJGAM + END IF IF ( BJFLAG ) THEN WRITE (NDSO,*) ' Using Hmax/d ratio only.' ELSE @@ -2373,6 +2383,7 @@ SUBROUTINE W3GRID() SDBC1 = BJALFA SDBC2 = BJGAM FDONLY = BJFLAG + FSLOPE = BRFLAG #endif ! ! @@ -3314,9 +3325,17 @@ SUBROUTINE W3GRID() #endif #ifdef W3_DB1 IF ( BJFLAG ) THEN - WRITE (NDSO,2928) BJALFA, BJGAM, '.TRUE.' + IF (BRFLAG) THEN + WRITE (NDSO,2928) BJALFA, BJGAM, '.TRUE.', '.TRUE.' + ELSE + WRITE (NDSO,2928) BJALFA, BJGAM, '.TRUE.', '.FALSE.' + END IF ELSE - WRITE (NDSO,2928) BJALFA, BJGAM, '.FALSE.' + IF (BRFLAG) THEN + WRITE (NDSO,2928) BJALFA, BJGAM, '.FALSE.', '.TRUE.' + ELSE + WRITE (NDSO,2928) BJALFA, BJGAM, '.FALSE.', '.FALSE.' + END IF END IF #endif #ifdef W3_PR1 @@ -6514,10 +6533,10 @@ SUBROUTINE W3GRID() #ifdef W3_DB1 928 FORMAT (/' Surf breaking (B&J 1978) ',A/ & ' --------------------------------------------------') -929 FORMAT ( ' alpha :',F8.3/ & +929 FORMAT ( ' alpha / slope factor :',F8.3/ & ' gamma :',F8.3) 2928 FORMAT ( ' &SDB1 BJALFA =',F7.3,', BJGAM =',F7.3, & - ', BJFLAG = ',A,' /') + ', BJFLAG = ',A,', BRFLAG = ' ,A,' /') #endif ! #ifdef W3_TR0 diff --git a/model/src/w3initmd.F90 b/model/src/w3initmd.F90 index 4badbcb1a3..89ad4887ef 100644 --- a/model/src/w3initmd.F90 +++ b/model/src/w3initmd.F90 @@ -2150,7 +2150,8 @@ SUBROUTINE W3MPIO ( IMOD ) STMAXE, STMAXD, HMAXE, HCMAXE, HMAXD, & HCMAXD, QP, PTHP0, PQP, PPE, PGW, PSW, & PTM1, PT1, PT2, PEP, WBT, CX, CY, & - TAUOCX, TAUOCY, WNMEAN, QKK, SKEW, EMBIA1, EMBIA2 + TAUOCX, TAUOCY, WNMEAN, QKK, SKEW, & + EMBIA1, EMBIA2, BRCOEF #endif #ifdef W3_MPI @@ -2464,6 +2465,16 @@ SUBROUTINE W3MPIO ( IMOD ) IT, MPI_COMM_WAVE, IRQGO(IH), IERR) #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/19', IROOT, IT, IRQGO(IH), IERR +#endif + END IF + ! + IF ( FLGRDALL( 2, 20) ) THEN + IH = IH + 1 + IT = IT + 1 + CALL MPI_SEND_INIT (BRCOEF(1),NSEALM , MPI_REAL, IROOT, & + IT, MPI_COMM_WAVE, IRQGO(IH), IERR) +#ifdef W3_MPIT + WRITE (NDST,9011) IH, ' 2/20', IROOT, IT, IRQGO(IH), IERR #endif END IF ! @@ -3534,6 +3545,16 @@ SUBROUTINE W3MPIO ( IMOD ) MPI_COMM_WAVE, IRQGO2(IH), IERR ) #ifdef W3_MPIT WRITE (NDST,9011) IH, ' 2/19', IFROM, IT, IRQGO2(IH), IERR +#endif + END IF + ! + IF ( FLGRDALL( 2, 20) ) THEN + IH = IH + 1 + IT = IT + 1 + CALL MPI_RECV_INIT (BRCOEF(I0),1,WW3_FIELD_VEC, IFROM, IT, & + MPI_COMM_WAVE, IRQGO2(IH), IERR ) +#ifdef W3_MPIT + WRITE (NDST,9011) IH, ' 2/20', IFROM, IT, IRQGO2(IH), IERR #endif END IF ! diff --git a/model/src/w3iogomd.F90 b/model/src/w3iogomd.F90 index de660ded47..b741ef51a8 100644 --- a/model/src/w3iogomd.F90 +++ b/model/src/w3iogomd.F90 @@ -912,10 +912,13 @@ SUBROUTINE W3FLDTOIJ(FLD, I, J, IAPROC, NAPOUT, NDSEN) CASE('WNM') I = 2 J = 19 + CASE('BRCOEF') + I = 2 + J = 20 #ifdef W3_OASOCM CASE('THM') I = 2 - J = 20 + J = 21 #endif ! ! Group 3 @@ -2517,7 +2520,7 @@ SUBROUTINE W3IOGO ( INXOUT, NDSOG, IOTST, IMOD & USE W3ADATMD, ONLY: AINIT, DW, UA, UD, AS, CX, CY, WN, & TAUA, TAUADIR USE W3ADATMD, ONLY: HS, WLM, T02, T0M1, T01, FP0, THM, THS, THP0,& - WBT, WNMEAN + WBT, WNMEAN, BRCOEF USE W3ADATMD, ONLY: DTDYN, FCUT, ABA, ABD, UBA, UBD, SXX, SYY, SXY,& PHS, PTP, PLP, PDIR, PSI, PWS, PWST, PNR, & PTHP0, PQP, PPE, PGW, PSW, PTM1, PT1, PT2, & @@ -2841,6 +2844,7 @@ SUBROUTINE W3IOGO ( INXOUT, NDSOG, IOTST, IMOD & IF ( FLOGRD( 2,16) ) HCMAXD(ISEA) = UNDEF IF ( FLOGRD( 2,17) ) WBT (ISEA) = UNDEF IF ( FLOGRD( 2,19) ) WNMEAN(ISEA) = UNDEF + IF ( FLOGRD( 2,20) ) BRCOEF(ISEA) = UNDEF ! IF ( FLOGRD( 3, 1) ) EF (ISEA,:) = UNDEF IF ( FLOGRD( 3, 2) ) TH1M (ISEA,:) = UNDEF @@ -3210,6 +3214,11 @@ SUBROUTINE W3IOGO ( INXOUT, NDSOG, IOTST, IMOD & WRITE ( NDSOG ) WNMEAN(1:NSEA) #ifdef W3_ASCII WRITE ( NDSOA,* ) 'WNMEAN:', WNMEAN(1:NSEA) +#endif + ELSE IF ( IFI .EQ. 2 .AND. IFJ .EQ. 20 ) THEN + WRITE ( NDSOG ) BRCOEF(1:NSEA) +#ifdef W3_ASCII + WRITE ( NDSOA,* ) 'BRCOEF:', BRCOEF(1:NSEA) #endif ! ! Section 3) @@ -3779,6 +3788,9 @@ SUBROUTINE W3IOGO ( INXOUT, NDSOG, IOTST, IMOD & ELSE IF ( IFI .EQ. 2 .AND. IFJ .EQ. 19 ) THEN READ (NDSOG,END=801,ERR=802,IOSTAT=IERR) & WNMEAN(1:NSEA) + ELSE IF ( IFI .EQ. 2 .AND. IFJ .EQ. 20 ) THEN + READ (NDSOG,END=801,ERR=802,IOSTAT=IERR) & + BRCOEF(1:NSEA) ! ! Section 3) ! diff --git a/model/src/w3iogrmd.F90 b/model/src/w3iogrmd.F90 index 9f9e8c8db1..9f41095253 100644 --- a/model/src/w3iogrmd.F90 +++ b/model/src/w3iogrmd.F90 @@ -1809,18 +1809,18 @@ SUBROUTINE W3IOGR ( INXOUT, NDSM, IMOD, FEXT & #ifdef W3_DB1 IF ( WRITE ) THEN WRITE (NDSM) & - SDBC1, SDBC2, FDONLY + SDBC1, SDBC2, FDONLY, FSLOPE #ifdef W3_ASCII WRITE (NDSA,*) & - 'SDBC1, SDBC2, FDONLY:', & - SDBC1, SDBC2, FDONLY + 'SDBC1, SDBC2, FDONLY, FSLOPE:', & + SDBC1, SDBC2, FDONLY, FSLOPE #endif ELSE READ (NDSM,END=801,ERR=802,IOSTAT=IERR) & - SDBC1, SDBC2, FDONLY + SDBC1, SDBC2, FDONLY, FSLOPE END IF ! - IF ( FLTEST ) WRITE (NDST,9053) SDBC1, SDBC2, FDONLY + IF ( FLTEST ) WRITE (NDST,9053) SDBC1, SDBC2, FDONLY, FSLOPE #endif #ifdef W3_UOST diff --git a/model/src/w3odatmd.F90 b/model/src/w3odatmd.F90 index 3a667ebbfa..e8998991ed 100644 --- a/model/src/w3odatmd.F90 +++ b/model/src/w3odatmd.F90 @@ -321,7 +321,7 @@ MODULE W3ODATMD INTEGER :: NOUTP = -1, IOUTP = -1, IOSTYP = 1 ! INTEGER, PARAMETER :: NOGRP = 10 - INTEGER, PARAMETER :: NGRPP = 20 + INTEGER, PARAMETER :: NGRPP = 21 INTEGER, PARAMETER :: DIMP = 15 INTEGER :: NOGE(NOGRP) INTEGER :: NOTYPE @@ -770,9 +770,9 @@ SUBROUTINE W3NOUT ( NDSERR, NDSTST ) ! ! 2) Standard mean wave parameters ! - NOGE(2) = 19 -#ifdef W3_OASOCM NOGE(2) = 20 +#ifdef W3_OASOCM + NOGE(2) = 21 #endif ! IDOUT( 2, 1) = 'Wave height ' @@ -794,8 +794,9 @@ SUBROUTINE W3NOUT ( NDSERR, NDSTST ) IDOUT( 2, 17) = 'Dominant wave bT ' IDOUT( 2, 18) = 'Peak prd. (from fp)' IDOUT( 2, 19) = 'Mean wave number ' + IDOUT( 2, 20) = 'Breaking coef. ' #ifdef W3_OASOCM - IDOUT( 2, 20) = 'Mean wave dir. norot' + IDOUT( 2, 21) = 'Mean wave dir. norot' #endif ! IDOUT( 2,10) = 'Mean wave dir. a2b2' ! IDOUT( 2,11) = 'Mean dir. spr. a2b2' diff --git a/model/src/w3ounfmetamd.F90 b/model/src/w3ounfmetamd.F90 index 87e606e569..dfbea50f38 100644 --- a/model/src/w3ounfmetamd.F90 +++ b/model/src/w3ounfmetamd.F90 @@ -2972,6 +2972,17 @@ SUBROUTINE DEFAULT_META() META(1)%VARNG='' META(1)%VMIN = 0 META(1)%VMAX = 32 + ! IFI=2, IFJ=20 + META => GROUP(2)%FIELD(20)%META + META(1)%FSC = 0.001 + META(1)%UNITS = '1' + META(1)%ENAME = '.brc' + META(1)%VARNM='brcoef' + META(1)%VARNL='breaking coefficient' + META(1)%VARNS='' + META(1)%VARNG='' + META(1)%VMIN = 0 + META(1)%VMAX = 1.2 ! !---------- GROUP 3 ---------------- ! diff --git a/model/src/w3sdb1md.F90 b/model/src/w3sdb1md.F90 index 34c7ec3bfb..7e16335fe7 100644 --- a/model/src/w3sdb1md.F90 +++ b/model/src/w3sdb1md.F90 @@ -128,6 +128,8 @@ SUBROUTINE W3SDB1 (IX, A, DEPTH, EMEAN, FMEAN, WNMEAN, CG, LBREAK, S, D ) ! ! Where CDB = SDBC1 = BJALFA (defaults to BJALFA = 1) ! modified via ww3_grid namelist parameter BJALFA + ! = BRCOEF if FSLOPE=T + ! modified via ww3_grid namelist parameter BRFLAG ! HM = GAMMA * DEP ! GAMMA = SDBC2 defaults to 0.73 (mean Battjes/Janssen value) ! modified via ww3_grid namelist parameter BJGAM @@ -183,7 +185,8 @@ SUBROUTINE W3SDB1 (IX, A, DEPTH, EMEAN, FMEAN, WNMEAN, CG, LBREAK, S, D ) !/ ------------------------------------------------------------------- / !/ USE CONSTANTS - USE W3GDATMD, ONLY: NK, NTH, NSPEC, SDBC1, SDBC2, FDONLY, FSSOURCE, DDEN + USE W3ADATMD, ONLY: BRCOEF + USE W3GDATMD, ONLY: NK, NTH, NSPEC, SDBC1, SDBC2, FDONLY, FSLOPE, FSSOURCE, DDEN USE W3ODATMD, ONLY: NDST USE W3GDATMD, ONLY: SIG USE W3ODATMD, only : IAPROC @@ -220,6 +223,7 @@ SUBROUTINE W3SDB1 (IX, A, DEPTH, EMEAN, FMEAN, WNMEAN, CG, LBREAK, S, D ) REAL*8 :: HM, BB, ARG, Q0, QB, B, CBJ, HRMS, EB(NK) REAL*8 :: AUX, CBJ2, RATIO, S0, S1, THR, BR1, BR2, FAK REAL :: ETOT, FMEAN2 + REAL :: BRCOEF_LOC #ifdef W3_T0 REAL :: DOUT(NK,NTH) #endif @@ -312,15 +316,23 @@ SUBROUTINE W3SDB1 (IX, A, DEPTH, EMEAN, FMEAN, WNMEAN, CG, LBREAK, S, D ) QB = 1.0 - THR END IF ! - ! 3. Estimate the breaking coefficient ------------------------------- / + ! 3. Breaking coefficient + ! + IF (FSLOPE) THEN + BRCOEF_LOC = BRCOEF(IX) + ELSE + BRCOEF_LOC = DBLE(SDBC1) + END IF + ! + ! 4. Estimate the breaking coefficient ------------------------------- / ! CBJ = 0 IF (IWB == 1) THEN IF ( ( BB .GT. THR) .AND. ( ABS ( BB - QB ) .GT. THR) ) THEN IF ( BB .LT. 1.0) THEN - CBJ = 2 * DBLE(SDBC1) * QB * DBLE(FMEAN) / BB + CBJ = 2 * BRCOEF_LOC * QB * DBLE(FMEAN) / BB ELSE - CBJ = 2 * DBLE(SDBC1) * DBLE(FMEAN) * BB ! AR: degenerative regime, all waves must be .le. Hmax, we just smoothly let the excessive energy vanish by * BB. + CBJ = 2 * BRCOEF_LOC * DBLE(FMEAN) * BB ! AR: degenerative regime, all waves must be .le. Hmax, we just smoothly let the excessive energy vanish by * BB. END IF ELSE CBJ = 0.d0 @@ -331,7 +343,7 @@ SUBROUTINE W3SDB1 (IX, A, DEPTH, EMEAN, FMEAN, WNMEAN, CG, LBREAK, S, D ) IF (ETOT .GT. THR) THEN HRMS = SQRT(8*EMEAN) FAK = (1+4./SQRT(PI)*(B*BB+1.5*B)*exp(-BB)-ERF(B)) - CBJ = -SDBC1*SQRT(PI)/16.*FMEAN*HRMS**3/DEPTH/ETOT + CBJ = -BRCOEF_LOC*SQRT(PI)/16.*FMEAN*HRMS**3/DEPTH/ETOT ELSE CBJ = 0. ENDIF @@ -347,8 +359,8 @@ SUBROUTINE W3SDB1 (IX, A, DEPTH, EMEAN, FMEAN, WNMEAN, CG, LBREAK, S, D ) #ifdef W3_DEBUGRUN IF (IX == DEBUG_NODE) THEN - WRITE(*,'(A200)') 'IX, DEPTH, CBJ, BB, QB, SDBC1, SDBC2, FMEAN, FMEAN2, HS' - WRITE(*,'(I10,20F20.10)') IX, DEPTH, CBJ, BB, QB, SDBC1, SDBC2, FMEAN, FMEAN2, 4*SQRT(ETOT) + WRITE(*,'(A200)') 'IX, DEPTH, CBJ, BB, QB, BRCOEF_LOC SDBC1, SDBC2, FMEAN, FMEAN2, HS' + WRITE(*,'(I10,20F20.10)') IX, DEPTH, CBJ, BB, QB, BRCOEF_LOC, SDBC1, SDBC2, FMEAN, FMEAN2, 4*SQRT(ETOT) ENDIF #endif ! diff --git a/model/src/w3srcemd.F90 b/model/src/w3srcemd.F90 index e90ba88ebe..61acc12ff7 100644 --- a/model/src/w3srcemd.F90 +++ b/model/src/w3srcemd.F90 @@ -1282,7 +1282,7 @@ SUBROUTINE W3SRCE ( srce_call, IT, ISEA, JSEA, IX, IY, IMOD, & IF (.NOT. FSSOURCE .or. LSLOC) THEN #endif #ifdef W3_DB1 - CALL W3SDB1 ( IX, SPEC, DEPTH, EMEAN, FMEAN, WNMEAN, CG1, & + CALL W3SDB1 ( JSEA, SPEC, DEPTH, EMEAN, FMEAN, WNMEAN, CG1, & LBREAK, VSDB, VDDB ) #endif #ifdef W3_PDLIB diff --git a/model/src/w3wavemd.F90 b/model/src/w3wavemd.F90 index 6db2f03af0..6f6c3d60e7 100644 --- a/model/src/w3wavemd.F90 +++ b/model/src/w3wavemd.F90 @@ -543,7 +543,7 @@ SUBROUTINE W3WAVE ( IMOD, ODAT, TEND, STAMP, NO_OUT & DTGA, DTG, DTGpre, DTRES, & FAC, VGX, VGY, FACK, FACTH, & FACX, XXX, REFLEC(4), & - DELX, DELY, DELA, DEPTH, D50, PSIC + DELX, DELY, DELA, DEPTH, D50, PSIC, TANBETA REAL :: VSioDummy(NSPEC), VDioDummy(NSPEC), VAoldDummy(NSPEC) LOGICAL :: SHAVETOTioDummy #ifdef W3_SEC1 @@ -1451,7 +1451,6 @@ SUBROUTINE W3WAVE ( IMOD, ODAT, TEND, STAMP, NO_OUT & END IF #endif call print_memcheck(memunit, 'memcheck_____:'//' WW3_WAVE TIME LOOP 13') - ! #ifdef W3_PDLIB IF (LPDLIB .and. FLSOU .and. FSSOURCE) THEN #endif @@ -1479,7 +1478,6 @@ SUBROUTINE W3WAVE ( IMOD, ODAT, TEND, STAMP, NO_OUT & #ifdef W3_PDLIB - DO JSEA = 1, NP CALL INIT_GET_ISEA(ISEA, JSEA) @@ -1672,7 +1670,23 @@ SUBROUTINE W3WAVE ( IMOD, ODAT, TEND, STAMP, NO_OUT & END IF END IF #endif - +#ifdef W3_DB1 + ! + ! Compute slope-dependant depth-induced breaking coefficient + ! + CALL W3OUTG ( VA, .FALSE., .FALSE., .FALSE. ) + DO JSEA=1, NSEAL + CALL INIT_GET_ISEA(ISEA, JSEA) + IX = MAPSF(ISEA,1) + IY = MAPSF(ISEA,2) + IF (LPDLIB) THEN + TANBETA = -DDDX(1,JSEA)*COS(THM(JSEA)) - DDDY(1,JSEA)*SIN(THM(JSEA)) + ELSE + TANBETA = -DDDX(IY,IX)*COS(THM(JSEA)) - DDDY(IY,IX)*SIN(THM(JSEA)) + END IF + BRCOEF(JSEA) = MAX(0.1,MIN(DBLE(SDBC1)*TANBETA,1.2)) + END DO +#endif ! ! 3.6 Perform Propagation = = = = = = = = = = = = = = = = = = = = = = = ! 3.6.1 Preparations diff --git a/model/src/ww3_gint.F90 b/model/src/ww3_gint.F90 index bfd2dd467b..b74fe0812a 100644 --- a/model/src/ww3_gint.F90 +++ b/model/src/ww3_gint.F90 @@ -1093,7 +1093,7 @@ SUBROUTINE W3EXGI ( NGRD, NSEA, NOSWLL_MIN, INTMETHOD, OUTorRESTflag, & FP0AUX, THMAUX1, THMAUX2, THSAUX, THP0AUX1, & THP0AUX2, HSIGAUX, STMAXEAUX,STMAXDAUX, & HMAXEAUX, HCMAXEAUX, HMAXDAUX, HCMAXDAUX, & - WBTAUX, WNMEANAUX, SUMWT2(NOGE(2)) + WBTAUX, WNMEANAUX, BRCOEFAUX, SUMWT2(NOGE(2)) ! Local group 3 variables REAL :: EFAUX(E3DF(2,1):E3DF(3,1)), & TH1MAUX(E3DF(2,2):E3DF(3,2)), & @@ -1198,6 +1198,7 @@ SUBROUTINE W3EXGI ( NGRD, NSEA, NOSWLL_MIN, INTMETHOD, OUTorRESTflag, & HCMAXD = UNDEF WBT = UNDEF WNMEAN = UNDEF + BRCOEF = UNDEF ! ! Group 3 variables ! @@ -1434,6 +1435,7 @@ SUBROUTINE W3EXGI ( NGRD, NSEA, NOSWLL_MIN, INTMETHOD, OUTorRESTflag, & HCMAXDAUX = UNDEF WBTAUX = UNDEF WNMEANAUX = UNDEF + BRCOEFAUX = UNDEF SUMWT2 = 0 ! ! Group 3 variables @@ -1888,6 +1890,14 @@ SUBROUTINE W3EXGI ( NGRD, NSEA, NOSWLL_MIN, INTMETHOD, OUTorRESTflag, & END IF END IF ! + IF ( FLOGRD(2,20) .AND. ACTIVE ) THEN + IF ( WADATS(IGRID)%BRCOEF(GSEA) .NE. UNDEF ) THEN + SUMWT2(20) = SUMWT2(20) + WT + IF ( BRCOEFAUX .EQ. UNDEF ) BRCOEFAUX = 0. + BRCOEFAUX = BRCOEFAUX + WADATS(IGRID)%BRCOEF(GSEA)*WT + END IF + END IF + ! ! Group 3 variables ! IF ( FLOGRD(3,1) .AND. ACTIVE ) THEN @@ -2829,6 +2839,12 @@ SUBROUTINE W3EXGI ( NGRD, NSEA, NOSWLL_MIN, INTMETHOD, OUTorRESTflag, & WNMEANAUX / REAL( SUMWT2(19)*SUMGRD ) END IF ! + IF ( BRCOEFAUX .NE. UNDEF ) THEN + IF ( BRCOEF(ISEA) .EQ. UNDEF ) BRCOEF(ISEA) = 0. + BRCOEF(ISEA) = BRCOEF(ISEA) + & + BRCOEFAUX / REAL( SUMWT2(20)*SUMGRD ) + END IF + ! ! Group 3 variables ! IF ( E3DF(1,1).GT.0 ) THEN diff --git a/model/src/ww3_ounf.F90 b/model/src/ww3_ounf.F90 index a2ff83e269..c357670cae 100644 --- a/model/src/ww3_ounf.F90 +++ b/model/src/ww3_ounf.F90 @@ -194,7 +194,8 @@ PROGRAM W3OUNF CFLTHMAX, CFLXYMAX, CFLKMAX, TAUICE, PHICE, & STMAXE, STMAXD, HMAXE, HCMAXE, HMAXD, HCMAXD,& P2SMS, EF, US3D, TH1M, STH1M, TH2M, STH2M, & - WN, USSP, WBT, WNMEAN, QKK, SKEW, EMBIA1, EMBIA2 + WN, USSP, WBT, WNMEAN, QKK, SKEW, EMBIA1, & + EMBIA2, BRCOEF USE W3ODATMD, ONLY: NDSO, NDSE, SCREEN, NOGRP, NGRPP, IDOUT, & UNDEF, FLOGRD, FNMPRE, NOSWLL, NOGE ! @@ -1404,6 +1405,10 @@ SUBROUTINE W3EXNC ( NX, NY, IX1, IXN, IY1, IYN, NSEA, & CALL W3S2XY ( NSEA, NSEA, NX+1, NY, WNMEAN, MAPSF, X1 ) END IF ! + ! Breaking coefficient + ELSE IF ( IFI .EQ. 2 .AND. IFJ .EQ. 20 ) THEN + CALL S2GRID(BRCOEF, X1) + ! ! Wave elevation spectrum ELSE IF ( IFI .EQ. 3 .AND. IFJ .EQ. 1 ) THEN ! Information for spectral diff --git a/model/src/ww3_outf.F90 b/model/src/ww3_outf.F90 index 590518037a..0714d0dce8 100644 --- a/model/src/ww3_outf.F90 +++ b/model/src/ww3_outf.F90 @@ -168,7 +168,7 @@ PROGRAM W3OUTF CFLTHMAX, CFLKMAX, BEDFORMS, WHITECAP, T02, & CGE, T01, HSIG, STMAXE, STMAXD, HMAXE, & HCMAXE, HMAXD, HCMAXD, MSSD, MSCD, WBT, & - WNMEAN, TAUA, TAUADIR + WNMEAN, TAUA, TAUADIR, BRCOEF USE W3ODATMD, ONLY: NDSO, NDSE, NDST, NOGRP, NGRPP, IDOUT, & UNDEF, FLOGRD, FNMPRE, NOSWLL, NOGE ! @@ -1254,6 +1254,16 @@ SUBROUTINE W3EXGO ( NX, NY, NSEA ) CALL W3S2XY ( NSEA, NSEA, NX+1, NY, WNMEAN, MAPSF, X1) ENDIF ! + ELSE IF ( IFI .EQ. 2 .AND. IFJ .EQ. 20 ) THEN + FLONE = .TRUE. + FSC = 0.001 + UNITS = '1' + ENAME = '.br' + IF ( ITYPE .EQ. 4 ) THEN + XS1 = BRCOEF + ELSE + CALL W3S2XY ( NSEA, NSEA, NX+1, NY, BRCOEF, MAPSF, X1) + ENDIF ELSE IF ( IFI .EQ. 4 .AND. IFJ .EQ. 1 ) THEN FLONE = .TRUE. FSC = 0.01