From fa8cd8fff1920003901e5328147a0312a7769d84 Mon Sep 17 00:00:00 2001 From: Leynse Date: Thu, 12 Feb 2026 13:57:27 +0100 Subject: [PATCH 001/118] - Add option where IG source term uses mean wave energy Eprev_ig in source term calculation instead of bin dependent eeprev_ig, thanks to suggestion of Yasmine - results look promising --- source/src/sfincs_lib.f90 | 4 +- source/src/snapwave/snapwave_solver.f90 | 68 +++++++++++++++---------- 2 files changed, 44 insertions(+), 28 deletions(-) diff --git a/source/src/sfincs_lib.f90 b/source/src/sfincs_lib.f90 index d1881be4d..7e2bdc5f1 100644 --- a/source/src/sfincs_lib.f90 +++ b/source/src/sfincs_lib.f90 @@ -92,8 +92,8 @@ function sfincs_initialize() result(ierr) ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! - build_revision = "$Rev: v2.3.1 mt. Faber" - build_date = "$Date: 2025-12-18" + build_revision = "$Rev: v2.3.1 mt. Faber+:branch-281" + build_date = "$Date: 2026-02-02" ! call write_log('', 1) call write_log('------------ Welcome to SFINCS ------------', 1) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 409709f55..cea0f4ffc 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -472,7 +472,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term: ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) ! ! inout: alphaig_local, srcig_local - eeprev, eeprev_ig, cgprev, beta_local ! in: the rest @@ -555,7 +555,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term - every first sweep of iteration ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) ! endif ! @@ -1018,7 +1018,7 @@ subroutine baldock (rho,g,alfa,gamma,depth,H,T,opt,Dw,Hmax) ! end subroutine baldock - subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) + subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) ! implicit none ! @@ -1032,11 +1032,12 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d real*4, dimension(no_nodes), intent(in) :: nwav ! wave number n real*4, dimension(no_nodes), intent(in) :: depth ! water depth real*4, dimension(no_nodes), intent(in) :: zb ! actual bed level - real*4, dimension(no_nodes), intent(in) :: H ! wave height + real*4, dimension(no_nodes), intent(in) :: H ! wave height real*4, dimension(ntheta,no_nodes), intent(in) :: ee ! energy density - real*4, dimension(ntheta,no_nodes), intent(in) :: ee_ig ! energy density infragravity waves + real*4, dimension(ntheta,no_nodes), intent(in) :: ee_ig ! energy density infragravity waves integer, intent(in) :: ig_opt ! option of IG wave settings (1 = default = conservative shoaling based dSxx and Baldock breaking) real*4, intent(in) :: alphaigfac ! Multiplication factor for IG shoaling source/sink term, default = 1.0 + real*4, intent(in) :: dtheta ! directional resolution ! ! Inout variables real*4, dimension(:,:), intent(inout) :: alphaig_local ! Local infragravity wave shoaling parameter alpha @@ -1054,19 +1055,26 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d real*4, dimension(ntheta,no_nodes) :: Sxx ! Radiation Stress real*4, dimension(:), allocatable :: Sxxprev ! radiation stress at upwind intersection point real*4, dimension(:), allocatable :: Hprev ! Incident wave height at upwind intersection point + real*4, dimension(:), allocatable :: Eprev_ig ! Mean infragravity wave energy at upwind intersection point + real*4, dimension(no_nodes) :: E_ig_local ! mean wave energy infragravity waves - just local real*4 :: dSxx ! difference in Radiation stress real*4 :: Sxx_cons ! conservative estimate of radiation stress using conservative shoaling ! ! Allocate internal variables allocate(Sxxprev(ntheta)) allocate(Hprev(ntheta)) + allocate(Eprev_ig(ntheta)) ! Sxx = 0.0 + E_ig_local = 0.0 ! do k = 1, no_nodes ! if (inner(k)) then ! + ! Update E_ig (not saved from previous timestep) + E_ig_local(k) = sum(ee_ig(:, k))*dtheta + ! ! Compute exchange source term inc to ig waves - per direction ! do itheta = 1, ntheta @@ -1097,9 +1105,11 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d Sxxprev(itheta) = w(1, itheta, k)*Sxx(itheta,k1) + w(2, itheta, k)*Sxx(itheta,k2) ! eeprev(itheta) = w(1, itheta, k)*ee(itheta, k1) + w(2, itheta, k)*ee(itheta, k2) - eeprev_ig(itheta) = w(1, itheta, k)*ee_ig(itheta, k1) + w(2, itheta, k)*ee_ig(itheta, k2) + eeprev_ig(itheta) = w(1, itheta, k)*ee_ig(itheta, k1) + w(2, itheta, k)*ee_ig(itheta, k2) ! - Hprev(itheta) = w(1, itheta, k)*H(k1) + w(2, itheta, k)*H(k2) + Eprev_ig(itheta) = w(1, itheta, k)*E_ig_local(k1) + w(2, itheta, k)*E_ig_local(k2) + ! + Hprev(itheta) = w(1, itheta, k)*H(k1) + w(2, itheta, k)*H(k2) ! ! Determine relative waterdepth 'gam' ! @@ -1107,7 +1117,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! Determine dSxx and IG source/sink term 'srcig' ! - if (ig_opt == 1 .or. ig_opt == 2) then + if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3) then ! ! Calculate shoaling parameter alpha_ig following Leijnse et al. (2024) ! @@ -1121,26 +1131,32 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d srcig_local(itheta, k) = 0.0 !Avoid big jumps in dSxx that can happen if a upwind point is a boundary point with Hinc=0 ! else - ! - if (ig_opt == 1) then ! Option using conservative shoaling for dSxx/dx - ! - ! Calculate Sxx based on conservative shoaling of upwind point's energy: - ! Sxx_cons = E(i-1) * Cg(i-1) / Cg * (2 * n(i) - 0.5) - Sxx_cons = eeprev(itheta) * cgprev(itheta) / cg_ig(k) * ((2.0 * max(0.0,min(1.0,nwav(k)))) - 0.5) - ! Note - limit so value of nwav is between 0 and 1, and Sxx therefore doesn't become NaN for nwav=Infinite - ! - dSxx = Sxx_cons - Sxxprev(itheta) + ! + if (ig_opt == 1 .or. ig_opt == 3) then ! Option using conservative shoaling for dSxx/dx + ! + ! Calculate Sxx based on conservative shoaling of upwind point's energy: + ! Sxx_cons = E(i-1) * Cg(i-1) / Cg * (2 * n(i) - 0.5) + Sxx_cons = eeprev(itheta) * cgprev(itheta) / cg_ig(k) * ((2.0 * max(0.0,min(1.0,nwav(k)))) - 0.5) + ! Note - limit so value of nwav is between 0 and 1, and Sxx therefore doesn't become NaN for nwav=Infinite + ! + dSxx = Sxx_cons - Sxxprev(itheta) + ! + elseif (ig_opt == 2) then ! Option taking actual difference for dSxx/dx + ! + dSxx = Sxx(itheta,k) - Sxxprev(itheta) + ! + endif ! - elseif (ig_opt == 2) then ! Option taking actual difference for dSxx/dx + dSxx = max(dSxx, 0.0) ! - dSxx = Sxx(itheta,k) - Sxxprev(itheta) - ! - endif - ! - dSxx = max(dSxx, 0.0) - ! - srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(eeprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) - ! + if (ig_opt == 1 .or. ig_opt == 2) then + ! + srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(eeprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) + ! + elseif (ig_opt == 3) then + ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy + srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) + endif endif ! else ! TL: option to add future parameterisations here for e.g. coral reef type coasts From 3713e3b3f3591594cd5c8daf5f0da5bf0a05d313 Mon Sep 17 00:00:00 2001 From: Leynse Date: Thu, 12 Feb 2026 14:52:47 +0100 Subject: [PATCH 002/118] - Also add a 4th option where dSxx/dx is based on the mean incident wave energy, instead of the bin one - Works, but not sure whether it is better than snapwave_ig_opt =3 --- source/src/snapwave/snapwave_solver.f90 | 37 ++++++++++++++++++++----- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index cea0f4ffc..82a509596 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1055,7 +1055,9 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d real*4, dimension(ntheta,no_nodes) :: Sxx ! Radiation Stress real*4, dimension(:), allocatable :: Sxxprev ! radiation stress at upwind intersection point real*4, dimension(:), allocatable :: Hprev ! Incident wave height at upwind intersection point + real*4, dimension(:), allocatable :: Eprev ! Mean incident wave energy at upwind intersection point real*4, dimension(:), allocatable :: Eprev_ig ! Mean infragravity wave energy at upwind intersection point + real*4, dimension(no_nodes) :: E_local ! mean wave energy waves - just local real*4, dimension(no_nodes) :: E_ig_local ! mean wave energy infragravity waves - just local real*4 :: dSxx ! difference in Radiation stress real*4 :: Sxx_cons ! conservative estimate of radiation stress using conservative shoaling @@ -1063,17 +1065,26 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! Allocate internal variables allocate(Sxxprev(ntheta)) allocate(Hprev(ntheta)) - allocate(Eprev_ig(ntheta)) + allocate(Eprev(ntheta)) + allocate(Eprev_ig(ntheta)) ! Sxx = 0.0 + Hprev = 0.0 + Eprev = 0.0 + Eprev_ig = 0.0 + ! + E_local = 0.0 E_ig_local = 0.0 ! do k = 1, no_nodes ! if (inner(k)) then + ! + ! Update E (not saved from previous timestep) + E_local(k) = sum(ee(:,k))*dtheta ! ! Update E_ig (not saved from previous timestep) - E_ig_local(k) = sum(ee_ig(:, k))*dtheta + E_ig_local(k) = sum(ee_ig(:, k))*dtheta ! ! Compute exchange source term inc to ig waves - per direction ! @@ -1099,15 +1110,21 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! TL - Note: cg_ig = cg cgprev(itheta) = w(1, itheta, k)*cg_ig(k1) + w(2, itheta, k)*cg_ig(k2) ! - Sxx(itheta,k1) = ((2.0 * max(0.0,min(1.0,nwav(k1)))) - 0.5) * ee(itheta, k1) ! limit so value of nwav is between 0 and 1 - Sxx(itheta,k2) = ((2.0 * max(0.0,min(1.0,nwav(k2)))) - 0.5) * ee(itheta, k2) ! limit so value of nwav is between 0 and 1 + if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3) then + Sxx(itheta,k1) = ((2.0 * max(0.0,min(1.0,nwav(k1)))) - 0.5) * ee(itheta, k1) ! limit so value of nwav is between 0 and 1 + Sxx(itheta,k2) = ((2.0 * max(0.0,min(1.0,nwav(k2)))) - 0.5) * ee(itheta, k2) ! limit so value of nwav is between 0 and 1 + elseif (ig_opt == 4) then + Sxx(itheta,k1) = ((2.0 * max(0.0,min(1.0,nwav(k1)))) - 0.5) * E_local(k1) ! limit so value of nwav is between 0 and 1 + Sxx(itheta,k2) = ((2.0 * max(0.0,min(1.0,nwav(k2)))) - 0.5) * E_local(k2) ! limit so value of nwav is between 0 and 1 + endif ! Sxxprev(itheta) = w(1, itheta, k)*Sxx(itheta,k1) + w(2, itheta, k)*Sxx(itheta,k2) ! eeprev(itheta) = w(1, itheta, k)*ee(itheta, k1) + w(2, itheta, k)*ee(itheta, k2) eeprev_ig(itheta) = w(1, itheta, k)*ee_ig(itheta, k1) + w(2, itheta, k)*ee_ig(itheta, k2) ! - Eprev_ig(itheta) = w(1, itheta, k)*E_ig_local(k1) + w(2, itheta, k)*E_ig_local(k2) + Eprev(itheta) = w(1, itheta, k)*E_local(k1) + w(2, itheta, k)*E_local(k2) + Eprev_ig(itheta) = w(1, itheta, k)*E_ig_local(k1) + w(2, itheta, k)*E_ig_local(k2) ! Hprev(itheta) = w(1, itheta, k)*H(k1) + w(2, itheta, k)*H(k2) ! @@ -1117,7 +1134,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! Determine dSxx and IG source/sink term 'srcig' ! - if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3) then + if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 4) then ! ! Calculate shoaling parameter alpha_ig following Leijnse et al. (2024) ! @@ -1145,6 +1162,12 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! dSxx = Sxx(itheta,k) - Sxxprev(itheta) ! + elseif (ig_opt == 4) then ! Option using conservative shoaling for dSxx/dx + ! now using Eprev instead of eeprev + Sxx_cons = Eprev(itheta) * cgprev(itheta) / cg_ig(k) * ((2.0 * max(0.0,min(1.0,nwav(k)))) - 0.5) + ! + dSxx = Sxx_cons - Sxxprev(itheta) + ! endif ! dSxx = max(dSxx, 0.0) @@ -1153,7 +1176,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(eeprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) ! - elseif (ig_opt == 3) then + elseif (ig_opt == 3 .or. ig_opt == 4) then ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) endif From 6d021b74b6f2e5a637b51a7b5eb5a4b56024c985 Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 25 Feb 2026 06:47:20 +0100 Subject: [PATCH 003/118] - Start igopt5 with addition to limit srcig around incident wave breaking point when IG waves should be released - Determined based on delta Dw --- source/src/snapwave/snapwave_domain.f90 | 1 + source/src/snapwave/snapwave_solver.f90 | 46 +++++++++++++++++++------ 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/source/src/snapwave/snapwave_domain.f90 b/source/src/snapwave/snapwave_domain.f90 index bea58fa33..5ce29632e 100644 --- a/source/src/snapwave/snapwave_domain.f90 +++ b/source/src/snapwave/snapwave_domain.f90 @@ -200,6 +200,7 @@ subroutine initialize_snapwave_domain() prev360 = 0 H = 0.0 H_ig = 0.0 + Dw = 0.0 aa = 0.0 sig = 0.0 WsorE = 0.0 diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 82a509596..04ba901e0 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -205,7 +205,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & real*4, intent(in) :: baldock_ratio_ig ! option controlling from what depth wave breaking should take place for IG waves: (Hk_ig>baldock_ratio_ig*Hmx_ig(k)), default baldock_ratio_ig=0.2 real*4, dimension(no_nodes), intent(inout) :: H ! wave height - TODO - TL - CHECK > inout needed to have updated 'H' for determining srcig real*4, dimension(no_nodes), intent(out) :: H_ig ! wave height - real*4, dimension(no_nodes), intent(out) :: Dw ! wave breaking dissipation + real*4, dimension(no_nodes), intent(inout) :: Dw ! wave breaking dissipation real*4, dimension(no_nodes), intent(out) :: Dw_ig ! wave breaking dissipation IG real*4, dimension(no_nodes), intent(out) :: F ! wave force Dw/C/rho/h real*4, dimension(no_nodes), intent(out) :: Df ! wave friction dissipation @@ -359,7 +359,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & enddo ! df = 0.0 - dw = 0.0 + !dw = 0.0 ! TODO - TL: CHeck > needed for restart for IG > set to 0 now in snapwave_domain.f90 F = 0.0 ! ok = 0 @@ -472,7 +472,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term: ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw) ! ! inout: alphaig_local, srcig_local - eeprev, eeprev_ig, cgprev, beta_local ! in: the rest @@ -555,7 +555,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term - every first sweep of iteration ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw) ! endif ! @@ -1018,7 +1018,7 @@ subroutine baldock (rho,g,alfa,gamma,depth,H,T,opt,Dw,Hmax) ! end subroutine baldock - subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) + subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw) ! implicit none ! @@ -1038,6 +1038,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d integer, intent(in) :: ig_opt ! option of IG wave settings (1 = default = conservative shoaling based dSxx and Baldock breaking) real*4, intent(in) :: alphaigfac ! Multiplication factor for IG shoaling source/sink term, default = 1.0 real*4, intent(in) :: dtheta ! directional resolution + real*4, dimension(no_nodes), intent(in) :: Dw ! wave breaking dissipation ! ! Inout variables real*4, dimension(:,:), intent(inout) :: alphaig_local ! Local infragravity wave shoaling parameter alpha @@ -1061,6 +1062,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d real*4, dimension(no_nodes) :: E_ig_local ! mean wave energy infragravity waves - just local real*4 :: dSxx ! difference in Radiation stress real*4 :: Sxx_cons ! conservative estimate of radiation stress using conservative shoaling + real*4 :: delta_Dw ! difference of Dw compared to upwind point, to get sign for max breaking point ! ! Allocate internal variables allocate(Sxxprev(ntheta)) @@ -1074,7 +1076,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d Eprev_ig = 0.0 ! E_local = 0.0 - E_ig_local = 0.0 + E_ig_local = 0.0 ! do k = 1, no_nodes ! @@ -1110,7 +1112,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! TL - Note: cg_ig = cg cgprev(itheta) = w(1, itheta, k)*cg_ig(k1) + w(2, itheta, k)*cg_ig(k2) ! - if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3) then + if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 5) then Sxx(itheta,k1) = ((2.0 * max(0.0,min(1.0,nwav(k1)))) - 0.5) * ee(itheta, k1) ! limit so value of nwav is between 0 and 1 Sxx(itheta,k2) = ((2.0 * max(0.0,min(1.0,nwav(k2)))) - 0.5) * ee(itheta, k2) ! limit so value of nwav is between 0 and 1 elseif (ig_opt == 4) then @@ -1134,7 +1136,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! Determine dSxx and IG source/sink term 'srcig' ! - if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 4) then + if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5) then ! ! Calculate shoaling parameter alpha_ig following Leijnse et al. (2024) ! @@ -1149,7 +1151,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! else ! - if (ig_opt == 1 .or. ig_opt == 3) then ! Option using conservative shoaling for dSxx/dx + if (ig_opt == 1 .or. ig_opt == 3 .or. ig_opt == 5) then ! Option using conservative shoaling for dSxx/dx ! ! Calculate Sxx based on conservative shoaling of upwind point's energy: ! Sxx_cons = E(i-1) * Cg(i-1) / Cg * (2 * n(i) - 0.5) @@ -1176,10 +1178,32 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(eeprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) ! - elseif (ig_opt == 3 .or. ig_opt == 4) then + elseif (ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5) then ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) - endif + endif + ! + ! Limit srcig to only where incident waves are not maximum dissipated + ! Calculated by determining the sign of delta Dw (positive means not yet the max Dw reached, meaning not yet at approximately hbr=Hinc,0/h,i) + ! In this way, don't need to look along a transect and no Hinc,0 value needed + ! + ! Ergo, it is assumed that after this point IG waves are free, and no bound wave forcing is happening anymore, so srcig should be 0 from here on + ! + if (ig_opt == 5) then + ! + !write(*,*)'Dw', Dw + ! + delta_Dw = Dw(k) - (w(1, itheta, k)*Dw(k1) + w(2, itheta, k)*Dw(k2)) + ! + if (delta_Dw < 0.0) then + ! + !write(*,*)'delta_Dw', delta_Dw + srcig_local(itheta, k) = 0.0 + ! + endif + ! + endif + ! endif ! else ! TL: option to add future parameterisations here for e.g. coral reef type coasts From 3339c8bd93df9d85c97be2e75c62d6264864ea2f Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 25 Feb 2026 18:23:52 +0100 Subject: [PATCH 004/118] - Try lower beta5 (/only in shallow water part) --- source/src/snapwave/snapwave_solver.f90 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 04ba901e0..b51759f6c 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1239,6 +1239,7 @@ subroutine estimate_shoaling_parameter_alphaig(beta, gam, alphaig) beta3 = 17.7104 beta4 = 1 beta5 = 0.7 + !beta5 = 0.5 beta6 = 0.11841 beta7 = 0.34037 ! @@ -1254,7 +1255,8 @@ subroutine estimate_shoaling_parameter_alphaig(beta, gam, alphaig) ! elseif (gam >= beta7) then ! shallow water - for gam>0.7 the fit automatically goes to 0 ! - alphaig = exp(-beta3 * beta ** beta4) * (max(beta5 - gam, 0.0)) * beta6 + alphaig = exp(-beta3 * beta ** beta4) * (max(beta5 - gam, 0.0)) * beta6 + !alphaig = exp(-beta3 * beta ** beta4) * (max(0.5 - gam, 0.0)) * beta6 ! else ! for safety, but negative gamma should not occur ! From d9b5b4ce7c7bee8db8020ef90268b278cd67f4a9 Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 25 Feb 2026 18:25:05 +0100 Subject: [PATCH 005/118] - Fix Hmx vs Hmx_ig inconsistency in SnapWave code, as found by Maarten --- source/src/snapwave/snapwave_solver.f90 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index b51759f6c..47fc85aff 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -86,7 +86,8 @@ subroutine compute_wave_field() enddo if (igwaves) then do k = 1, no_nodes - Hmx_ig(k) = 0.88/kwav_ig(k)*tanh(gamma_ig*kwav_ig(k)*depth(k)/0.88) ! Note - uses gamma_ig + !Hmx_ig(k) = 0.88/kwav_ig(k)*tanh(gamma_ig*kwav_ig(k)*depth(k)/0.88) ! Note - uses gamma_ig + Hmx_ig(k) = gamma_ig*depth(k) enddo else Hmx_ig = 0.0 From ab2767d5979c386fef07e37184f852217329cf90 Mon Sep 17 00:00:00 2001 From: Leynse Date: Thu, 26 Feb 2026 01:20:44 +0100 Subject: [PATCH 006/118] - Add option 6 where there is no energy transfer anymore after incident waves start breaking (Qb > 1%) --- source/src/snapwave/snapwave_solver.f90 | 39 ++++++++++++++++++------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 47fc85aff..9c2eedae6 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -473,7 +473,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term: ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw) + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx) ! ! inout: alphaig_local, srcig_local - eeprev, eeprev_ig, cgprev, beta_local ! in: the rest @@ -556,7 +556,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term - every first sweep of iteration ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw) + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx) ! endif ! @@ -1019,7 +1019,7 @@ subroutine baldock (rho,g,alfa,gamma,depth,H,T,opt,Dw,Hmax) ! end subroutine baldock - subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw) + subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx) ! implicit none ! @@ -1039,7 +1039,8 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d integer, intent(in) :: ig_opt ! option of IG wave settings (1 = default = conservative shoaling based dSxx and Baldock breaking) real*4, intent(in) :: alphaigfac ! Multiplication factor for IG shoaling source/sink term, default = 1.0 real*4, intent(in) :: dtheta ! directional resolution - real*4, dimension(no_nodes), intent(in) :: Dw ! wave breaking dissipation + real*4, dimension(no_nodes), intent(in) :: Dw ! wave breaking dissipation + real*4, dimension(no_nodes), intent(in) :: Hmx ! Hmax ! ! Inout variables real*4, dimension(:,:), intent(inout) :: alphaig_local ! Local infragravity wave shoaling parameter alpha @@ -1063,7 +1064,8 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d real*4, dimension(no_nodes) :: E_ig_local ! mean wave energy infragravity waves - just local real*4 :: dSxx ! difference in Radiation stress real*4 :: Sxx_cons ! conservative estimate of radiation stress using conservative shoaling - real*4 :: delta_Dw ! difference of Dw compared to upwind point, to get sign for max breaking point + real*4 :: delta_Dw ! difference of Dw compared to upwind point, to get sign for max breaking point + real*4 :: Qb ! Percentage of breaking incident waves ! ! Allocate internal variables allocate(Sxxprev(ntheta)) @@ -1113,7 +1115,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! TL - Note: cg_ig = cg cgprev(itheta) = w(1, itheta, k)*cg_ig(k1) + w(2, itheta, k)*cg_ig(k2) ! - if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 5) then + if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 5 .or. ig_opt == 6) then Sxx(itheta,k1) = ((2.0 * max(0.0,min(1.0,nwav(k1)))) - 0.5) * ee(itheta, k1) ! limit so value of nwav is between 0 and 1 Sxx(itheta,k2) = ((2.0 * max(0.0,min(1.0,nwav(k2)))) - 0.5) * ee(itheta, k2) ! limit so value of nwav is between 0 and 1 elseif (ig_opt == 4) then @@ -1137,7 +1139,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! Determine dSxx and IG source/sink term 'srcig' ! - if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5) then + if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6) then ! ! Calculate shoaling parameter alpha_ig following Leijnse et al. (2024) ! @@ -1152,7 +1154,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! else ! - if (ig_opt == 1 .or. ig_opt == 3 .or. ig_opt == 5) then ! Option using conservative shoaling for dSxx/dx + if (ig_opt == 1 .or. ig_opt == 3 .or. ig_opt == 5 .or. ig_opt == 6) then ! Option using conservative shoaling for dSxx/dx ! ! Calculate Sxx based on conservative shoaling of upwind point's energy: ! Sxx_cons = E(i-1) * Cg(i-1) / Cg * (2 * n(i) - 0.5) @@ -1179,7 +1181,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(eeprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) ! - elseif (ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5) then + elseif (ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6) then ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) endif @@ -1203,6 +1205,22 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! endif ! + elseif (ig_opt == 6) then + ! + ! Percentage of breaking waves Qb = exp(-(Hmx(k) / H(k))**2.0) + ! + ! Free waves if incident waves start breaking (defined here as 1%) + ! + !Qb = exp(-(Hmx(k) / H(k))**2) + ! Base on upwind point: + Qb = exp(-((w(1, itheta, k)*Hmx(k1) + w(2, itheta, k)*Hmx(k2)) / Hprev(itheta))**2) + ! + if (Qb > 0.01) then + ! + srcig_local(itheta, k) = 0.0 + ! + endif + ! endif ! endif @@ -1255,9 +1273,10 @@ subroutine estimate_shoaling_parameter_alphaig(beta, gam, alphaig) alphaig = exp(-beta3 * beta ** beta4) * ((beta5 - gam) * beta6 + (beta7 - gam) * (beta1 / beta ** beta2)) ! elseif (gam >= beta7) then ! shallow water - for gam>0.7 the fit automatically goes to 0 + !elseif (gam >= beta7 .and. gam < 0.5) then ! shallow water - for gam>0.7 the fit automatically goes to 0 ! alphaig = exp(-beta3 * beta ** beta4) * (max(beta5 - gam, 0.0)) * beta6 - !alphaig = exp(-beta3 * beta ** beta4) * (max(0.5 - gam, 0.0)) * beta6 + !alphaig = exp(-beta3 * beta ** beta4) * (max(0.5 - gam, 0.0)) * beta6 ! else ! for safety, but negative gamma should not occur ! From dab2264c5967bdaef1221a7f8accaf309e3dd30b Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 27 Feb 2026 04:37:39 +0100 Subject: [PATCH 007/118] - Add igopt 7 where srcig is multiplied by (-Qb), similar to Reniers&Zijlema (2022) - Does at first glance not seem to influence much/enough --- source/src/snapwave/snapwave_solver.f90 | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 9c2eedae6..fa03dcf3d 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1115,7 +1115,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! TL - Note: cg_ig = cg cgprev(itheta) = w(1, itheta, k)*cg_ig(k1) + w(2, itheta, k)*cg_ig(k2) ! - if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 5 .or. ig_opt == 6) then + if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7) then Sxx(itheta,k1) = ((2.0 * max(0.0,min(1.0,nwav(k1)))) - 0.5) * ee(itheta, k1) ! limit so value of nwav is between 0 and 1 Sxx(itheta,k2) = ((2.0 * max(0.0,min(1.0,nwav(k2)))) - 0.5) * ee(itheta, k2) ! limit so value of nwav is between 0 and 1 elseif (ig_opt == 4) then @@ -1139,7 +1139,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! Determine dSxx and IG source/sink term 'srcig' ! - if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6) then + if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7) then ! ! Calculate shoaling parameter alpha_ig following Leijnse et al. (2024) ! @@ -1154,7 +1154,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! else ! - if (ig_opt == 1 .or. ig_opt == 3 .or. ig_opt == 5 .or. ig_opt == 6) then ! Option using conservative shoaling for dSxx/dx + if (ig_opt == 1 .or. ig_opt == 3 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7) then ! Option using conservative shoaling for dSxx/dx ! ! Calculate Sxx based on conservative shoaling of upwind point's energy: ! Sxx_cons = E(i-1) * Cg(i-1) / Cg * (2 * n(i) - 0.5) @@ -1183,7 +1183,22 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! elseif (ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6) then ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy - srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) + ! + srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) + ! + elseif (ig_opt == 7) then + ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy + ! Now also reduced by fraction of breaking waves (1-Qb) + Qb = exp(-(Hmx(k) / H(k))**2) + ! + ! Base on upwind point: + !Qb = exp(-((w(1, itheta, k)*Hmx(k1) + w(2, itheta, k)*Hmx(k2)) / Hprev(itheta))**2) + ! + ! Limit to [0,1] just in case + Qb = min(Qb,max(Qb, 0.0),1.0) + ! + srcig_local(itheta, k) = (1 - Qb) * alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) + ! endif ! ! Limit srcig to only where incident waves are not maximum dissipated From 061766025e2566ef27a4ea175479d6c7049f233e Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 27 Feb 2026 06:09:46 +0100 Subject: [PATCH 008/118] - igopt 8 option that is same as 6, but with changing cg_ig to sqrt(gh) where waves start breaking - not sure this is the best place to do this... --- source/src/snapwave/snapwave_solver.f90 | 59 ++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 7 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index fa03dcf3d..6cdb9d1fb 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -189,7 +189,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & real*4, dimension(no_nodes), intent(in) :: kwav_ig ! wave number real*4, dimension(no_nodes), intent(inout) :: cg ! group velocity real*4, dimension(ntheta,no_nodes), intent(inout):: ctheta ! refractioon speed - real*4, dimension(no_nodes), intent(in) :: cg_ig ! group velocity + real*4, dimension(no_nodes), intent(inout) :: cg_ig ! group velocity real*4, dimension(no_nodes), intent(in) :: nwav ! wave number n real*4, dimension(ntheta,no_nodes), intent(inout):: ee ! real*4, dimension(ntheta,no_nodes), intent(inout):: ee_ig ! @@ -1029,7 +1029,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d real*4, dimension(2,ntheta,no_nodes),intent(in) :: w ! weights of upwind grid points, 2 per grid point and per wave direction real*4, dimension(ntheta,no_nodes), intent(in) :: ds ! distance to interpolated upwind point, per grid point and direction integer, dimension(2,ntheta,no_nodes),intent(in) :: prev ! two upwind grid points per grid point and wave direction - real*4, dimension(no_nodes), intent(in) :: cg_ig ! group velocity + real*4, dimension(no_nodes), intent(inout) :: cg_ig ! group velocity real*4, dimension(no_nodes), intent(in) :: nwav ! wave number n real*4, dimension(no_nodes), intent(in) :: depth ! water depth real*4, dimension(no_nodes), intent(in) :: zb ! actual bed level @@ -1065,6 +1065,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d real*4 :: dSxx ! difference in Radiation stress real*4 :: Sxx_cons ! conservative estimate of radiation stress using conservative shoaling real*4 :: delta_Dw ! difference of Dw compared to upwind point, to get sign for max breaking point + real*4 :: Dwprev real*4 :: Qb ! Percentage of breaking incident waves ! ! Allocate internal variables @@ -1113,9 +1114,26 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d !betan_local(itheta,k) = (beta/sigm_ig)*sqrt(9.81/max(depth(k), hmin)) ! TL: in case in the future we would need the normalised bed slope again ! ! TL - Note: cg_ig = cg + if (ig_opt == 8) then + ! + ! Free waves if incident waves start breaking (defined here as 1%) + ! + Qb = exp(-(Hmx(k) / H(k))**2) + ! Base on upwind point: + !Qb = exp(-((w(1, itheta, k)*Hmx(k1) + w(2, itheta, k)*Hmx(k2)) / Hprev(itheta))**2) + ! + if (Qb > 0.01) then + ! + cg_ig(k) = sqrt(9.81 * depth(k)) + cg_ig(k1) = sqrt(9.81 * depth(k1)) + cg_ig(k2) = sqrt(9.81 * depth(k2)) + ! + endif + endif + ! cgprev(itheta) = w(1, itheta, k)*cg_ig(k1) + w(2, itheta, k)*cg_ig(k2) ! - if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7) then + if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7 .or. ig_opt == 8) then Sxx(itheta,k1) = ((2.0 * max(0.0,min(1.0,nwav(k1)))) - 0.5) * ee(itheta, k1) ! limit so value of nwav is between 0 and 1 Sxx(itheta,k2) = ((2.0 * max(0.0,min(1.0,nwav(k2)))) - 0.5) * ee(itheta, k2) ! limit so value of nwav is between 0 and 1 elseif (ig_opt == 4) then @@ -1139,7 +1157,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! Determine dSxx and IG source/sink term 'srcig' ! - if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7) then + if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7 .or. ig_opt == 8) then ! ! Calculate shoaling parameter alpha_ig following Leijnse et al. (2024) ! @@ -1154,7 +1172,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! else ! - if (ig_opt == 1 .or. ig_opt == 3 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7) then ! Option using conservative shoaling for dSxx/dx + if (ig_opt == 1 .or. ig_opt == 3 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7 .or. ig_opt == 8) then ! Option using conservative shoaling for dSxx/dx ! ! Calculate Sxx based on conservative shoaling of upwind point's energy: ! Sxx_cons = E(i-1) * Cg(i-1) / Cg * (2 * n(i) - 0.5) @@ -1181,7 +1199,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(eeprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) ! - elseif (ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6) then + elseif (ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 8) then ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy ! srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) @@ -1211,7 +1229,8 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! !write(*,*)'Dw', Dw ! - delta_Dw = Dw(k) - (w(1, itheta, k)*Dw(k1) + w(2, itheta, k)*Dw(k2)) + Dwprev = w(1, itheta, k)*Dw(k1) + w(2, itheta, k)*Dw(k2) + delta_Dw = Dw(k) - Dwprev ! if (delta_Dw < 0.0) then ! @@ -1236,6 +1255,32 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! endif ! + elseif (ig_opt == 8) then + ! + ! Free waves if incident waves start breaking (defined here as 1%) + ! + Qb = exp(-(Hmx(k) / H(k))**2) + ! Base on upwind point: + !Qb = exp(-((w(1, itheta, k)*Hmx(k1) + w(2, itheta, k)*Hmx(k2)) / Hprev(itheta))**2) + ! + if (Qb > 0.01) then + ! + !cg_ig(k) = SQRT(9.81 * depth(k)) + srcig_local(itheta, k) = 0.0 + ! + endif ! + + !Dwprev = w(1, itheta, k)*Dw(k1) + w(2, itheta, k)*Dw(k2) + !delta_Dw = Dw(k) - Dwprev + !! + !! More strict + !if (delta_Dw < 0.0 .and. Dwprev > 0.0 .and. Dw(k) < 0.0 ) then + ! ! + ! !write(*,*)'delta_Dw', delta_Dw + ! srcig_local(itheta, k) = 0.0 + ! ! + !endif + ! endif ! endif From 6113058ba61054d0f2327edacf4d78c9f867ef2e Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 27 Feb 2026 19:48:44 +0100 Subject: [PATCH 009/118] - Add percentage of breaking waves qb to his output - Add local wave height water depth ration 'gam' to his output - For now with Qb determined based on upwind point - For now with taking maxval over itheta for both qb and gam output --- source/src/sfincs_data.f90 | 2 + source/src/sfincs_domain.f90 | 4 ++ source/src/sfincs_ncoutput.F90 | 25 +++++++++- source/src/sfincs_snapwave.f90 | 24 ++++++++-- source/src/snapwave/snapwave_data.f90 | 2 + source/src/snapwave/snapwave_domain.f90 | 2 + source/src/snapwave/snapwave_solver.f90 | 62 ++++++++++++++----------- 7 files changed, 90 insertions(+), 31 deletions(-) diff --git a/source/src/sfincs_data.f90 b/source/src/sfincs_data.f90 index 43a3918b9..02ef5b828 100644 --- a/source/src/sfincs_data.f90 +++ b/source/src/sfincs_data.f90 @@ -590,6 +590,8 @@ module sfincs_data real*4, dimension(:), allocatable :: dwig real*4, dimension(:), allocatable :: dfig real*4, dimension(:), allocatable :: cg + real*4, dimension(:), allocatable :: qb + real*4, dimension(:), allocatable :: gam real*4, dimension(:), allocatable :: betamean real*4, dimension(:), allocatable :: srcig real*4, dimension(:), allocatable :: alphaig diff --git a/source/src/sfincs_domain.f90 b/source/src/sfincs_domain.f90 index f4b8fe1b1..e7c583021 100644 --- a/source/src/sfincs_domain.f90 +++ b/source/src/sfincs_domain.f90 @@ -2581,6 +2581,10 @@ subroutine initialize_hydro() dfig = 0.0 allocate(cg(np)) cg = 0.0 + allocate(qb(np)) + qb = 0.0 + allocate(gam(np)) + gam = 0.0 allocate(betamean(np)) betamean = 0.0 allocate(srcig(np)) diff --git a/source/src/sfincs_ncoutput.F90 b/source/src/sfincs_ncoutput.F90 index 3de049327..64d11a39a 100644 --- a/source/src/sfincs_ncoutput.F90 +++ b/source/src/sfincs_ncoutput.F90 @@ -54,7 +54,7 @@ module sfincs_ncoutput integer :: patm_varid, wind_speed_varid, wind_dir_varid integer :: inp_varid, total_runtime_varid, average_dt_varid, status_varid integer :: hm0_varid, hm0ig_varid, zsm_varid, tp_varid, tpig_varid, wavdir_varid, dirspr_varid - integer :: dw_varid, df_varid, dwig_varid, dfig_varid, cg_varid, beta_varid, srcig_varid, alphaig_varid + integer :: dw_varid, df_varid, dwig_varid, dfig_varid, cg_varid, beta_varid, srcig_varid, alphaig_varid, qb_varid, gam_varid integer :: runup_gauge_name_varid, runup_gauge_zs_varid ! end type @@ -1848,6 +1848,19 @@ subroutine ncoutput_his_init() NF90(nf90_put_att(his_file%ncid, his_file%cg_varid, 'standard_name', 'wave_group_velocity')) NF90(nf90_put_att(his_file%ncid, his_file%cg_varid, 'long_name', 'wave group velocity')) NF90(nf90_put_att(his_file%ncid, his_file%cg_varid, 'coordinates', 'station_id station_name point_x point_y')) + NF90(nf90_def_var(his_file%ncid, 'qb', NF90_FLOAT, (/his_file%points_dimid, his_file%time_dimid/), his_file%qb_varid)) ! time-varying water level point + NF90(nf90_put_att(his_file%ncid, his_file%qb_varid, '_FillValue', FILL_VALUE)) + NF90(nf90_put_att(his_file%ncid, his_file%qb_varid, 'units', '-')) + NF90(nf90_put_att(his_file%ncid, his_file%qb_varid, 'standard_name', 'fraction_breaking_waves')) + NF90(nf90_put_att(his_file%ncid, his_file%qb_varid, 'long_name', 'fraction breaking incident waves')) + NF90(nf90_put_att(his_file%ncid, his_file%qb_varid, 'coordinates', 'station_id station_name point_x point_y')) + ! + NF90(nf90_def_var(his_file%ncid, 'gam', NF90_FLOAT, (/his_file%points_dimid, his_file%time_dimid/), his_file%gam_varid)) ! time-varying water level point + NF90(nf90_put_att(his_file%ncid, his_file%gam_varid, '_FillValue', FILL_VALUE)) + NF90(nf90_put_att(his_file%ncid, his_file%gam_varid, 'units', '-')) + NF90(nf90_put_att(his_file%ncid, his_file%gam_varid, 'standard_name', 'local_wave_height_water_depth_ratio')) + NF90(nf90_put_att(his_file%ncid, his_file%gam_varid, 'long_name', 'local wave height water depth ratio')) + NF90(nf90_put_att(his_file%ncid, his_file%gam_varid, 'coordinates', 'station_id station_name point_x point_y')) ! NF90(nf90_def_var(his_file%ncid, 'beta', NF90_FLOAT, (/his_file%points_dimid, his_file%time_dimid/), his_file%beta_varid)) ! time-varying water level point NF90(nf90_put_att(his_file%ncid, his_file%beta_varid, '_FillValue', FILL_VALUE)) @@ -2915,6 +2928,8 @@ subroutine ncoutput_update_his(t,nthisout) real*4, dimension(nobs) :: dwigobs real*4, dimension(nobs) :: dfigobs real*4, dimension(nobs) :: cgobs + real*4, dimension(nobs) :: qbobs + real*4, dimension(nobs) :: gamobs real*4, dimension(nobs) :: betaobs real*4, dimension(nobs) :: srcigobs real*4, dimension(nobs) :: alphaigobs @@ -2938,6 +2953,8 @@ subroutine ncoutput_update_his(t,nthisout) dwobs = FILL_VALUE dfobs = FILL_VALUE cgobs = FILL_VALUE + qbobs = FILL_VALUE + gamobs = FILL_VALUE betaobs = FILL_VALUE srcigobs = FILL_VALUE alphaigobs = FILL_VALUE @@ -3038,7 +3055,9 @@ subroutine ncoutput_update_his(t,nthisout) dfobs(iobs) = df(nm) dwigobs(iobs) = dwig(nm) dfigobs(iobs) = dfig(nm) - cgobs(iobs) = cg(nm) + cgobs(iobs) = cg(nm) + qbobs(iobs) = qb(nm) + gamobs(iobs) = gam(nm) betaobs(iobs) = betamean(nm) srcigobs(iobs) = srcig(nm) alphaigobs(iobs) = alphaig(nm) @@ -3101,6 +3120,8 @@ subroutine ncoutput_update_his(t,nthisout) NF90(nf90_put_var(his_file%ncid, his_file%dfig_varid, dfigobs, (/1, nthisout/))) ! NF90(nf90_put_var(his_file%ncid, his_file%cg_varid, cgobs, (/1, nthisout/))) + NF90(nf90_put_var(his_file%ncid, his_file%qb_varid, qbobs, (/1, nthisout/))) + NF90(nf90_put_var(his_file%ncid, his_file%gam_varid, gamobs, (/1, nthisout/))) ! NF90(nf90_put_var(his_file%ncid, his_file%beta_varid, betaobs, (/1, nthisout/))) NF90(nf90_put_var(his_file%ncid, his_file%srcig_varid, srcigobs, (/1, nthisout/))) diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index 05281e4d2..a4544a61c 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -26,6 +26,8 @@ module sfincs_snapwave real*4, dimension(:), allocatable :: snapwave_Dwig real*4, dimension(:), allocatable :: snapwave_Dfig real*4, dimension(:), allocatable :: snapwave_cg + real*4, dimension(:), allocatable :: snapwave_qb + real*4, dimension(:), allocatable :: snapwave_gam real*4, dimension(:), allocatable :: snapwave_beta real*4, dimension(:), allocatable :: snapwave_srcig real*4, dimension(:), allocatable :: snapwave_alphaig @@ -297,7 +299,9 @@ subroutine update_wave_field(t, tloop) real*4, dimension(:), allocatable :: df0 real*4, dimension(:), allocatable :: dwig0 real*4, dimension(:), allocatable :: dfig0 - real*4, dimension(:), allocatable :: cg0 + real*4, dimension(:), allocatable :: cg0 + real*4, dimension(:), allocatable :: qb0 + real*4, dimension(:), allocatable :: gam0 real*4, dimension(:), allocatable :: beta0 real*4, dimension(:), allocatable :: srcig0 real*4, dimension(:), allocatable :: alphaig0 @@ -312,7 +316,9 @@ subroutine update_wave_field(t, tloop) allocate(df0(np)) allocate(dwig0(np)) allocate(dfig0(np)) - allocate(cg0(np)) + allocate(cg0(np)) + allocate(qb0(np)) + allocate(gam0(np)) allocate(beta0(np)) allocate(srcig0(np)) allocate(alphaig0(np)) @@ -324,6 +330,8 @@ subroutine update_wave_field(t, tloop) dwig0 = 0.0 dfig0 = 0.0 cg0 = 0.0 + qb0 = 0.0 + gam0 = 0.0 beta0 = 0.0 srcig0 = 0.0 alphaig0 = 0.0 @@ -418,6 +426,8 @@ subroutine update_wave_field(t, tloop) dwig0(nm) = snapwave_Dwig(ip) dfig0(nm) = snapwave_Dfig(ip) cg0(nm) = snapwave_cg(ip) + qb0(nm) = snapwave_qb(ip) + gam0(nm) = snapwave_gam(ip) beta0(nm) = snapwave_beta(ip) srcig0(nm) = snapwave_srcig(ip) alphaig0(nm) = snapwave_alphaig(ip) @@ -441,6 +451,8 @@ subroutine update_wave_field(t, tloop) dwig0(nm) = 0.0 dfig0(nm) = 0.0 cg0(nm) = 0.0 + qb0(nm) = 0.0 + gam0(nm) = 0.0 beta0(nm) = 0.0 srcig0(nm) = 0.0 alphaig0(nm) = 0.0 @@ -459,7 +471,9 @@ subroutine update_wave_field(t, tloop) df(nm) = df0(nm) dwig(nm) = dwig0(nm) dfig(nm) = dfig0(nm) - cg(nm) = cg0(nm) + cg(nm) = cg0(nm) + qb(nm) = qb0(nm) + gam(nm) = gam0(nm) betamean(nm) = beta0(nm) srcig(nm) = srcig0(nm) alphaig(nm) = alphaig0(nm) @@ -536,6 +550,8 @@ subroutine compute_snapwave(t) snapwave_Dwig = Dw_ig snapwave_Dfig = Df_ig snapwave_cg = cg + snapwave_qb = qb + snapwave_gam = gam snapwave_beta = beta snapwave_srcig = srcig snapwave_alphaig = alphaig @@ -552,6 +568,8 @@ subroutine compute_snapwave(t) snapwave_mean_direction(k) = 0.0 snapwave_directional_spreading(k) = 0.0 snapwave_cg(k) = 0.0 + snapwave_qb(k) = 0.0 + snapwave_gam(k) = 0.0 endif ! if (snapwave_H_ig(k) <= 0.0) then diff --git a/source/src/snapwave/snapwave_data.f90 b/source/src/snapwave/snapwave_data.f90 index d90cc331d..e18b8a16b 100644 --- a/source/src/snapwave/snapwave_data.f90 +++ b/source/src/snapwave/snapwave_data.f90 @@ -73,6 +73,8 @@ module snapwave_data real*4, dimension(:), allocatable :: beta real*4, dimension(:), allocatable :: srcig real*4, dimension(:), allocatable :: alphaig + real*4, dimension(:), allocatable :: qb + real*4, dimension(:), allocatable :: gam ! integer*4, dimension(:), allocatable :: index_snapwave_in_quadtree integer*4, dimension(:), allocatable :: index_quadtree_in_snapwave diff --git a/source/src/snapwave/snapwave_domain.f90 b/source/src/snapwave/snapwave_domain.f90 index 5ce29632e..988cc72c3 100644 --- a/source/src/snapwave/snapwave_domain.f90 +++ b/source/src/snapwave/snapwave_domain.f90 @@ -136,6 +136,8 @@ subroutine initialize_snapwave_domain() allocate(beta(no_nodes)) allocate(srcig(no_nodes)) allocate(alphaig(no_nodes)) + allocate(qb(no_nodes)) + allocate(gam(no_nodes)) ! allocate(uorb(no_nodes)) allocate(ctheta(ntheta,no_nodes)) allocate(ctheta_ig(ntheta,no_nodes)) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 6cdb9d1fb..091016bcd 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -134,7 +134,7 @@ subroutine compute_wave_field() aa, sig, jadcgdx, sigmin, sigmax,& c_dispT, WsorE, WsorA, SwE, SwA, Tpini, & igwaves,kwav_ig, cg_ig,H_ig,ctheta_ig,Hmx_ig, ee_ig,fw_ig, & - beta, srcig, alphaig, Dw_ig, Df_ig, & + beta, srcig, alphaig, Dw_ig, Df_ig, qb, gam, & vegetation, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, Dveg, & zb, nwav, ig_opt, alpha_ig, gamma_ig, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) ! @@ -159,7 +159,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & aa, sig, jadcgdx, sigmin, sigmax,& c_dispT, WsorE, WsorA, SwE, SwA, Tpini, & igwaves,kwav_ig, cg_ig,H_ig,ctheta_ig,Hmx_ig, ee_ig,fw_ig, & - betamean, srcig, alphaig, Dw_ig, Df_ig, & + betamean, srcig, alphaig, Dw_ig, Df_ig, qb, gam, & vegetation, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, Dveg, & zb, nwav, ig_opt, alfa_ig, gamma_ig, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) ! @@ -196,6 +196,8 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & real*4, dimension(ntheta,no_nodes), intent(in) :: ctheta_ig ! refractioon speed real*4, dimension(no_nodes), intent(in) :: fw ! wave friction factor real*4, dimension(no_nodes), intent(in) :: fw_ig ! wave friction factor + real*4, dimension(no_nodes), intent(out) :: qb ! Fraction of breaking waves according to Baldock's formulation + real*4, dimension(no_nodes), intent(out) :: gam ! Local incident wave height water depth ratio real*4, dimension(no_nodes), intent(out) :: betamean ! Mean local bed slope parameter real*4, dimension(no_nodes), intent(out) :: srcig ! Directionally averaged incident wave sink/infragravity source term real*4, dimension(no_nodes), intent(out) :: alphaig ! Mean IG shoaling parameter alpha @@ -258,7 +260,9 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & real*4, dimension(:,:), allocatable :: srcig_local ! Energy source/sink term because of IG wave energy transfer from incident waves real*4, dimension(:,:), allocatable :: beta_local ! Local bed slope based on bed level per direction real*4, dimension(:,:), allocatable :: alphaig_local ! Local infragravity wave shoaling parameter alpha - real*4, dimension(:,:), allocatable :: depthprev ! water depth at upwind intersection point per direction + real*4, dimension(:,:), allocatable :: depthprev ! water depth at upwind intersection point per direction + real*4, dimension(:,:), allocatable :: qb_local ! + real*4, dimension(:,:), allocatable :: gam_local ! real*4, dimension(:), allocatable :: dee ! difference with energy previous iteration real*4, dimension(:), allocatable :: eeprev, cgprev ! energy density and group velocity at upwind intersection point real*4, dimension(:), allocatable :: eeprev_ig, cgprev_ig ! energy density and group velocity at upwind intersection point @@ -341,6 +345,9 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & allocate(depthprev(ntheta,no_nodes)); depthprev=0.0 allocate(beta_local(ntheta,no_nodes)); beta_local=0.0 allocate(alphaig_local(ntheta,no_nodes)); alphaig_local=0.0 + allocate(qb_local(ntheta,no_nodes)); qb_local=0.0 + allocate(gam_local(ntheta,no_nodes)); gam_local=0.0 + endif ! if (wind) then @@ -473,7 +480,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term: ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx) + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local) ! ! inout: alphaig_local, srcig_local - eeprev, eeprev_ig, cgprev, beta_local ! in: the rest @@ -556,7 +563,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term - every first sweep of iteration ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx) + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local) ! endif ! @@ -939,6 +946,16 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! srcig(k) = sum(srcig_local(:,k)) /ntheta ! real mean ! + !qb(k) = sum(qb_local(:,k)) /ntheta ! real mean + qb(k) = maxval(qb_local(:,k)) ! max + ! + !gam(k) = sum(gam_local(:,k)) /ntheta ! real mean + gam(k) = maxval(gam_local(:,k)) ! max + ! + !if (qb(k) > 0.01) then + ! write(*,*)'k qb gam',k, qb_local(:,k), gam_local(:,k) + !endif + ! endif ! if (wind) then @@ -1019,7 +1036,7 @@ subroutine baldock (rho,g,alfa,gamma,depth,H,T,opt,Dw,Hmax) ! end subroutine baldock - subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx) + subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local) ! implicit none ! @@ -1047,7 +1064,9 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d real*4, dimension(:,:), intent(inout) :: srcig_local ! Energy source/sink term because of IG wave shoaling real*4, dimension(:), intent(inout) :: eeprev, cgprev ! energy density and group velocity at upwind intersection point real*4, dimension(:), intent(inout) :: eeprev_ig ! energy density at upwind intersection point - real*4, dimension(ntheta,no_nodes), intent(inout):: beta_local ! Local bed slope based on bed level per direction + real*4, dimension(ntheta,no_nodes), intent(inout):: beta_local ! Local bed slope based on bed level per direction + real*4, dimension(ntheta,no_nodes), intent(inout):: qb_local ! + real*4, dimension(ntheta,no_nodes), intent(inout):: gam_local ! ! ! Internal variables integer :: itheta ! directional counter @@ -1113,14 +1132,17 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! !betan_local(itheta,k) = (beta/sigm_ig)*sqrt(9.81/max(depth(k), hmin)) ! TL: in case in the future we would need the normalised bed slope again ! + ! Fraction of breaking waves, based on H(k) + !Qb = min(max(exp(-(Hmx(k)/H(k))**2), 0.0), 1.0) ! Qb percentage of breaking waves according to Baldock's formulation, between 0 and 1 + ! Base on upwind point: + Qb = min(max(exp(-((w(1, itheta, k)*Hmx(k1) + w(2, itheta, k)*Hmx(k2)) / Hprev(itheta))**2), 0.0), 1.0) ! Qb percentage of breaking waves according to Baldock's formulation, between 0 and 1 + ! + qb_local(itheta, k) = Qb + ! ! TL - Note: cg_ig = cg if (ig_opt == 8) then ! ! Free waves if incident waves start breaking (defined here as 1%) - ! - Qb = exp(-(Hmx(k) / H(k))**2) - ! Base on upwind point: - !Qb = exp(-((w(1, itheta, k)*Hmx(k1) + w(2, itheta, k)*Hmx(k2)) / Hprev(itheta))**2) ! if (Qb > 0.01) then ! @@ -1155,6 +1177,8 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! gam = max(0.5*(Hprev(itheta)/depthprev(itheta,k) + H(k)/depth(k)), 0.0) ! mean gamma over current and upwind point ! + gam_local(itheta, k) = gam + ! ! Determine dSxx and IG source/sink term 'srcig' ! if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7 .or. ig_opt == 8) then @@ -1206,14 +1230,8 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! elseif (ig_opt == 7) then ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy - ! Now also reduced by fraction of breaking waves (1-Qb) - Qb = exp(-(Hmx(k) / H(k))**2) - ! - ! Base on upwind point: - !Qb = exp(-((w(1, itheta, k)*Hmx(k1) + w(2, itheta, k)*Hmx(k2)) / Hprev(itheta))**2) ! - ! Limit to [0,1] just in case - Qb = min(Qb,max(Qb, 0.0),1.0) + ! Now also reduced by fraction of breaking waves (1-Qb) ! srcig_local(itheta, k) = (1 - Qb) * alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) ! @@ -1245,10 +1263,6 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! Free waves if incident waves start breaking (defined here as 1%) ! - !Qb = exp(-(Hmx(k) / H(k))**2) - ! Base on upwind point: - Qb = exp(-((w(1, itheta, k)*Hmx(k1) + w(2, itheta, k)*Hmx(k2)) / Hprev(itheta))**2) - ! if (Qb > 0.01) then ! srcig_local(itheta, k) = 0.0 @@ -1258,10 +1272,6 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d elseif (ig_opt == 8) then ! ! Free waves if incident waves start breaking (defined here as 1%) - ! - Qb = exp(-(Hmx(k) / H(k))**2) - ! Base on upwind point: - !Qb = exp(-((w(1, itheta, k)*Hmx(k1) + w(2, itheta, k)*Hmx(k2)) / Hprev(itheta))**2) ! if (Qb > 0.01) then ! From c9bc56fcd42e700edf78ce7904f4d52878200bca Mon Sep 17 00:00:00 2001 From: Leynse Date: Sat, 28 Feb 2026 01:07:27 +0100 Subject: [PATCH 010/118] - Add cg_ig to netcdf his output for testing igopt=8 where after breaking is started the velocity of cg_ig is changed to sqrt(g*h) - In igopt 8 for now set only point 'k' to sqrt(g*h), not yet k1 and k2, to be discussed --- source/src/sfincs_data.f90 | 3 ++- source/src/sfincs_domain.f90 | 2 ++ source/src/sfincs_ncoutput.F90 | 16 ++++++++++++++-- source/src/sfincs_snapwave.f90 | 13 +++++++++++-- source/src/snapwave/snapwave_solver.f90 | 4 ++-- 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/source/src/sfincs_data.f90 b/source/src/sfincs_data.f90 index 02ef5b828..ed9b4d918 100644 --- a/source/src/sfincs_data.f90 +++ b/source/src/sfincs_data.f90 @@ -589,7 +589,8 @@ module sfincs_data real*4, dimension(:), allocatable :: df real*4, dimension(:), allocatable :: dwig real*4, dimension(:), allocatable :: dfig - real*4, dimension(:), allocatable :: cg + real*4, dimension(:), allocatable :: cg + real*4, dimension(:), allocatable :: cgig real*4, dimension(:), allocatable :: qb real*4, dimension(:), allocatable :: gam real*4, dimension(:), allocatable :: betamean diff --git a/source/src/sfincs_domain.f90 b/source/src/sfincs_domain.f90 index e7c583021..724b028e6 100644 --- a/source/src/sfincs_domain.f90 +++ b/source/src/sfincs_domain.f90 @@ -2581,6 +2581,8 @@ subroutine initialize_hydro() dfig = 0.0 allocate(cg(np)) cg = 0.0 + allocate(cgig(np)) + cgig = 0.0 allocate(qb(np)) qb = 0.0 allocate(gam(np)) diff --git a/source/src/sfincs_ncoutput.F90 b/source/src/sfincs_ncoutput.F90 index 64d11a39a..4bea2f651 100644 --- a/source/src/sfincs_ncoutput.F90 +++ b/source/src/sfincs_ncoutput.F90 @@ -54,7 +54,7 @@ module sfincs_ncoutput integer :: patm_varid, wind_speed_varid, wind_dir_varid integer :: inp_varid, total_runtime_varid, average_dt_varid, status_varid integer :: hm0_varid, hm0ig_varid, zsm_varid, tp_varid, tpig_varid, wavdir_varid, dirspr_varid - integer :: dw_varid, df_varid, dwig_varid, dfig_varid, cg_varid, beta_varid, srcig_varid, alphaig_varid, qb_varid, gam_varid + integer :: dw_varid, df_varid, dwig_varid, dfig_varid, cg_varid, cgig_varid, beta_varid, srcig_varid, alphaig_varid, qb_varid, gam_varid integer :: runup_gauge_name_varid, runup_gauge_zs_varid ! end type @@ -1848,6 +1848,14 @@ subroutine ncoutput_his_init() NF90(nf90_put_att(his_file%ncid, his_file%cg_varid, 'standard_name', 'wave_group_velocity')) NF90(nf90_put_att(his_file%ncid, his_file%cg_varid, 'long_name', 'wave group velocity')) NF90(nf90_put_att(his_file%ncid, his_file%cg_varid, 'coordinates', 'station_id station_name point_x point_y')) + ! + NF90(nf90_def_var(his_file%ncid, 'cgig', NF90_FLOAT, (/his_file%points_dimid, his_file%time_dimid/), his_file%cgig_varid)) ! time-varying water level point + NF90(nf90_put_att(his_file%ncid, his_file%cgig_varid, '_FillValue', FILL_VALUE)) + NF90(nf90_put_att(his_file%ncid, his_file%cgig_varid, 'units', 'm/s')) + NF90(nf90_put_att(his_file%ncid, his_file%cgig_varid, 'standard_name', 'infragravity_wave_velocity')) + NF90(nf90_put_att(his_file%ncid, his_file%cgig_varid, 'long_name', 'infragravity wave velocity')) + NF90(nf90_put_att(his_file%ncid, his_file%cgig_varid, 'coordinates', 'station_id station_name point_x point_y')) + ! NF90(nf90_def_var(his_file%ncid, 'qb', NF90_FLOAT, (/his_file%points_dimid, his_file%time_dimid/), his_file%qb_varid)) ! time-varying water level point NF90(nf90_put_att(his_file%ncid, his_file%qb_varid, '_FillValue', FILL_VALUE)) NF90(nf90_put_att(his_file%ncid, his_file%qb_varid, 'units', '-')) @@ -2928,6 +2936,7 @@ subroutine ncoutput_update_his(t,nthisout) real*4, dimension(nobs) :: dwigobs real*4, dimension(nobs) :: dfigobs real*4, dimension(nobs) :: cgobs + real*4, dimension(nobs) :: cgigobs real*4, dimension(nobs) :: qbobs real*4, dimension(nobs) :: gamobs real*4, dimension(nobs) :: betaobs @@ -2953,8 +2962,9 @@ subroutine ncoutput_update_his(t,nthisout) dwobs = FILL_VALUE dfobs = FILL_VALUE cgobs = FILL_VALUE + cgigobs = FILL_VALUE qbobs = FILL_VALUE - gamobs = FILL_VALUE + gamobs = FILL_VALUE betaobs = FILL_VALUE srcigobs = FILL_VALUE alphaigobs = FILL_VALUE @@ -3056,6 +3066,7 @@ subroutine ncoutput_update_his(t,nthisout) dwigobs(iobs) = dwig(nm) dfigobs(iobs) = dfig(nm) cgobs(iobs) = cg(nm) + cgigobs(iobs) = cgig(nm) qbobs(iobs) = qb(nm) gamobs(iobs) = gam(nm) betaobs(iobs) = betamean(nm) @@ -3120,6 +3131,7 @@ subroutine ncoutput_update_his(t,nthisout) NF90(nf90_put_var(his_file%ncid, his_file%dfig_varid, dfigobs, (/1, nthisout/))) ! NF90(nf90_put_var(his_file%ncid, his_file%cg_varid, cgobs, (/1, nthisout/))) + NF90(nf90_put_var(his_file%ncid, his_file%cgig_varid, cgigobs, (/1, nthisout/))) NF90(nf90_put_var(his_file%ncid, his_file%qb_varid, qbobs, (/1, nthisout/))) NF90(nf90_put_var(his_file%ncid, his_file%gam_varid, gamobs, (/1, nthisout/))) ! diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index a4544a61c..bf0c83bfa 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -26,6 +26,7 @@ module sfincs_snapwave real*4, dimension(:), allocatable :: snapwave_Dwig real*4, dimension(:), allocatable :: snapwave_Dfig real*4, dimension(:), allocatable :: snapwave_cg + real*4, dimension(:), allocatable :: snapwave_cgig real*4, dimension(:), allocatable :: snapwave_qb real*4, dimension(:), allocatable :: snapwave_gam real*4, dimension(:), allocatable :: snapwave_beta @@ -300,6 +301,7 @@ subroutine update_wave_field(t, tloop) real*4, dimension(:), allocatable :: dwig0 real*4, dimension(:), allocatable :: dfig0 real*4, dimension(:), allocatable :: cg0 + real*4, dimension(:), allocatable :: cgig0 real*4, dimension(:), allocatable :: qb0 real*4, dimension(:), allocatable :: gam0 real*4, dimension(:), allocatable :: beta0 @@ -317,6 +319,7 @@ subroutine update_wave_field(t, tloop) allocate(dwig0(np)) allocate(dfig0(np)) allocate(cg0(np)) + allocate(cgig0(np)) allocate(qb0(np)) allocate(gam0(np)) allocate(beta0(np)) @@ -330,6 +333,7 @@ subroutine update_wave_field(t, tloop) dwig0 = 0.0 dfig0 = 0.0 cg0 = 0.0 + cgig0 = 0.0 qb0 = 0.0 gam0 = 0.0 beta0 = 0.0 @@ -426,6 +430,7 @@ subroutine update_wave_field(t, tloop) dwig0(nm) = snapwave_Dwig(ip) dfig0(nm) = snapwave_Dfig(ip) cg0(nm) = snapwave_cg(ip) + cgig0(nm) = snapwave_cgig(ip) qb0(nm) = snapwave_qb(ip) gam0(nm) = snapwave_gam(ip) beta0(nm) = snapwave_beta(ip) @@ -451,6 +456,7 @@ subroutine update_wave_field(t, tloop) dwig0(nm) = 0.0 dfig0(nm) = 0.0 cg0(nm) = 0.0 + cgig0(nm) = 0.0 qb0(nm) = 0.0 gam0(nm) = 0.0 beta0(nm) = 0.0 @@ -471,7 +477,8 @@ subroutine update_wave_field(t, tloop) df(nm) = df0(nm) dwig(nm) = dwig0(nm) dfig(nm) = dfig0(nm) - cg(nm) = cg0(nm) + cg(nm) = cg0(nm) + cgig(nm) = cgig0(nm) qb(nm) = qb0(nm) gam(nm) = gam0(nm) betamean(nm) = beta0(nm) @@ -550,6 +557,7 @@ subroutine compute_snapwave(t) snapwave_Dwig = Dw_ig snapwave_Dfig = Df_ig snapwave_cg = cg + snapwave_cgig = cg_ig snapwave_qb = qb snapwave_gam = gam snapwave_beta = beta @@ -573,7 +581,8 @@ subroutine compute_snapwave(t) endif ! if (snapwave_H_ig(k) <= 0.0) then - snapwave_Tp_ig(k) = 0.0 + snapwave_Tp_ig(k) = 0.0 + snapwave_cgig(k) = 0.0 endif enddo ! diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 091016bcd..6cf7b49db 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1147,8 +1147,8 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d if (Qb > 0.01) then ! cg_ig(k) = sqrt(9.81 * depth(k)) - cg_ig(k1) = sqrt(9.81 * depth(k1)) - cg_ig(k2) = sqrt(9.81 * depth(k2)) + !cg_ig(k1) = sqrt(9.81 * depth(k1)) + !cg_ig(k2) = sqrt(9.81 * depth(k2)) ! endif endif From 1db5716e5a3e1117d344cfb708440eb76e74f648 Mon Sep 17 00:00:00 2001 From: Leynse Date: Sat, 28 Feb 2026 01:23:12 +0100 Subject: [PATCH 011/118] - Add ig_opt = 9 with bound/free wave criterion based on Hm0,inc / h > 0.5 --- source/src/snapwave/snapwave_solver.f90 | 33 ++++++++++++------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 6cf7b49db..2b2a7a703 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1155,7 +1155,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! cgprev(itheta) = w(1, itheta, k)*cg_ig(k1) + w(2, itheta, k)*cg_ig(k2) ! - if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7 .or. ig_opt == 8) then + if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7 .or. ig_opt == 8 .or. ig_opt == 9) then Sxx(itheta,k1) = ((2.0 * max(0.0,min(1.0,nwav(k1)))) - 0.5) * ee(itheta, k1) ! limit so value of nwav is between 0 and 1 Sxx(itheta,k2) = ((2.0 * max(0.0,min(1.0,nwav(k2)))) - 0.5) * ee(itheta, k2) ! limit so value of nwav is between 0 and 1 elseif (ig_opt == 4) then @@ -1181,7 +1181,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! Determine dSxx and IG source/sink term 'srcig' ! - if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7 .or. ig_opt == 8) then + if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7 .or. ig_opt == 8 .or. ig_opt == 9) then ! ! Calculate shoaling parameter alpha_ig following Leijnse et al. (2024) ! @@ -1196,7 +1196,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! else ! - if (ig_opt == 1 .or. ig_opt == 3 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7 .or. ig_opt == 8) then ! Option using conservative shoaling for dSxx/dx + if (ig_opt == 1 .or. ig_opt == 3 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7 .or. ig_opt == 8 .or. ig_opt == 9) then ! Option using conservative shoaling for dSxx/dx ! ! Calculate Sxx based on conservative shoaling of upwind point's energy: ! Sxx_cons = E(i-1) * Cg(i-1) / Cg * (2 * n(i) - 0.5) @@ -1223,7 +1223,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(eeprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) ! - elseif (ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 8) then + elseif (ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 8 .or. ig_opt == 9) then ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy ! srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) @@ -1278,19 +1278,18 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d !cg_ig(k) = SQRT(9.81 * depth(k)) srcig_local(itheta, k) = 0.0 ! - endif ! - - !Dwprev = w(1, itheta, k)*Dw(k1) + w(2, itheta, k)*Dw(k2) - !delta_Dw = Dw(k) - Dwprev - !! - !! More strict - !if (delta_Dw < 0.0 .and. Dwprev > 0.0 .and. Dw(k) < 0.0 ) then - ! ! - ! !write(*,*)'delta_Dw', delta_Dw - ! srcig_local(itheta, k) = 0.0 - ! ! - !endif - ! + endif + ! + elseif (ig_opt == 9) then + ! + ! Free waves if incident waves start breaking (defined here as gam=Hm0,inc / h > 0.5) + ! + ! gam is in Hrms, so multiply by sqrt(2) + if ((gam * sqrt(2.0)) > 0.5) then + ! + srcig_local(itheta, k) = 0.0 + ! + endif endif ! endif From 9b1fa7e9121e42a5f00102c61749a02abc383b44 Mon Sep 17 00:00:00 2001 From: Leynse Date: Sat, 28 Feb 2026 01:33:35 +0100 Subject: [PATCH 012/118] - Seems more robust as fraction of gamma, 2/3 seems to work quite well over a range of different cases --- source/src/snapwave/snapwave_solver.f90 | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 2b2a7a703..70547add2 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -480,7 +480,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term: ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local) + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) ! ! inout: alphaig_local, srcig_local - eeprev, eeprev_ig, cgprev, beta_local ! in: the rest @@ -563,7 +563,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term - every first sweep of iteration ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local) + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) ! endif ! @@ -1036,7 +1036,7 @@ subroutine baldock (rho,g,alfa,gamma,depth,H,T,opt,Dw,Hmax) ! end subroutine baldock - subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local) + subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) ! implicit none ! @@ -1056,6 +1056,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d integer, intent(in) :: ig_opt ! option of IG wave settings (1 = default = conservative shoaling based dSxx and Baldock breaking) real*4, intent(in) :: alphaigfac ! Multiplication factor for IG shoaling source/sink term, default = 1.0 real*4, intent(in) :: dtheta ! directional resolution + real*4, intent(in) :: gamma ! coefficients in Baldock wave breaking dissipation real*4, dimension(no_nodes), intent(in) :: Dw ! wave breaking dissipation real*4, dimension(no_nodes), intent(in) :: Hmx ! Hmax ! @@ -1285,7 +1286,8 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! Free waves if incident waves start breaking (defined here as gam=Hm0,inc / h > 0.5) ! ! gam is in Hrms, so multiply by sqrt(2) - if ((gam * sqrt(2.0)) > 0.5) then + !if ((gam * sqrt(2.0)) > 0.5) then + if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then ! srcig_local(itheta, k) = 0.0 ! From c942b81f7426f041977b628b9e98793d6110b7da Mon Sep 17 00:00:00 2001 From: Leynse Date: Mon, 2 Mar 2026 19:33:40 +0100 Subject: [PATCH 013/118] - Also set cg_ig to sqrt(g*h) after breaking for ig_opt 9 --- source/src/snapwave/snapwave_solver.f90 | 38 ++++++++++++++++--------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 70547add2..55cce3c50 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1140,20 +1140,6 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! qb_local(itheta, k) = Qb ! - ! TL - Note: cg_ig = cg - if (ig_opt == 8) then - ! - ! Free waves if incident waves start breaking (defined here as 1%) - ! - if (Qb > 0.01) then - ! - cg_ig(k) = sqrt(9.81 * depth(k)) - !cg_ig(k1) = sqrt(9.81 * depth(k1)) - !cg_ig(k2) = sqrt(9.81 * depth(k2)) - ! - endif - endif - ! cgprev(itheta) = w(1, itheta, k)*cg_ig(k1) + w(2, itheta, k)*cg_ig(k2) ! if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7 .or. ig_opt == 8 .or. ig_opt == 9) then @@ -1180,6 +1166,30 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! gam_local(itheta, k) = gam ! + ! Adjust cg_ig for free infragravity waves release in surfzone + ! TL - Note: cg_ig = cg + if (ig_opt == 8 .or. ig_opt == 9) then + ! + ! Free waves if incident waves start breaking (defined here as 1%) + ! + if (Qb > 0.01) then + ! + cg_ig(k) = sqrt(9.81 * depth(k)) + !cg_ig(k1) = sqrt(9.81 * depth(k1)) !TL - Note: if adjusted, then cgprev from above should also be updated + !cg_ig(k2) = sqrt(9.81 * depth(k2)) + ! + endif + ! + elseif (ig_opt == 9) then + ! + if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then + ! + cg_ig(k) = sqrt(9.81 * depth(k)) + ! + endif + ! + endif + ! ! Determine dSxx and IG source/sink term 'srcig' ! if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7 .or. ig_opt == 8 .or. ig_opt == 9) then From 86c7a174ebb25b61e946206b1ff199f25d048b56 Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 3 Mar 2026 01:09:14 +0100 Subject: [PATCH 014/118] - Add igopt 10 with first version SxxoverE - Does not work well in shadow zones currently, question is mostly how to determine Sxx_cons --- source/src/snapwave/snapwave_solver.f90 | 88 ++++++++++++++++++------- 1 file changed, 65 insertions(+), 23 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 55cce3c50..8dd1d1309 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -479,7 +479,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! As defined in Leijnse, van Ormondt, van Dongeren, Aerts & Muis et al. 2024 ! ! Actual determining of source term: - ! + ! call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) ! ! inout: alphaig_local, srcig_local - eeprev, eeprev_ig, cgprev, beta_local @@ -1081,7 +1081,8 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d real*4, dimension(:), allocatable :: Eprev ! Mean incident wave energy at upwind intersection point real*4, dimension(:), allocatable :: Eprev_ig ! Mean infragravity wave energy at upwind intersection point real*4, dimension(no_nodes) :: E_local ! mean wave energy waves - just local - real*4, dimension(no_nodes) :: E_ig_local ! mean wave energy infragravity waves - just local + real*4, dimension(no_nodes) :: E_ig_local ! mean wave energy infragravity waves - just local + real*4, dimension(no_nodes) :: SxxoverE ! Sxx over E real*4 :: dSxx ! difference in Radiation stress real*4 :: Sxx_cons ! conservative estimate of radiation stress using conservative shoaling real*4 :: delta_Dw ! difference of Dw compared to upwind point, to get sign for max breaking point @@ -1100,7 +1101,31 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d Eprev_ig = 0.0 ! E_local = 0.0 - E_ig_local = 0.0 + E_ig_local = 0.0 + SxxoverE = 0.0 + ! + ! Precompute all Sxx + if (ig_opt == 10) then + ! + do k = 1, no_nodes + ! + if (inner(k)) then + ! + ! Update E (not saved from previous timestep) + ! + E_local(k) = sum(ee(:,k))*dtheta + ! + ! As for dissipation calculate SxxoverE(k) + ! + SxxoverE(k) = (((2.0 * max(0.0,min(1.0,nwav(k)))) - 0.5) * E_local(k))/max(E_local(k), 1.0e-6) + ! as DoverE(k) = (Dwk + Dfk)/max(Ek, 1.0e-6) + ! + endif + enddo + ! + endif + ! + ! Actual computation of srcig ! do k = 1, no_nodes ! @@ -1147,7 +1172,12 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d Sxx(itheta,k2) = ((2.0 * max(0.0,min(1.0,nwav(k2)))) - 0.5) * ee(itheta, k2) ! limit so value of nwav is between 0 and 1 elseif (ig_opt == 4) then Sxx(itheta,k1) = ((2.0 * max(0.0,min(1.0,nwav(k1)))) - 0.5) * E_local(k1) ! limit so value of nwav is between 0 and 1 - Sxx(itheta,k2) = ((2.0 * max(0.0,min(1.0,nwav(k2)))) - 0.5) * E_local(k2) ! limit so value of nwav is between 0 and 1 + Sxx(itheta,k2) = ((2.0 * max(0.0,min(1.0,nwav(k2)))) - 0.5) * E_local(k2) ! limit so value of nwav is between 0 and 1 + elseif (ig_opt == 10) then + ! + Sxx(itheta,k1) = SxxoverE(k1) * ee(itheta, k1) + Sxx(itheta,k2) = SxxoverE(k2) * ee(itheta, k2) + ! endif ! Sxxprev(itheta) = w(1, itheta, k)*Sxx(itheta,k1) + w(2, itheta, k)*Sxx(itheta,k2) @@ -1168,31 +1198,34 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! Adjust cg_ig for free infragravity waves release in surfzone ! TL - Note: cg_ig = cg - if (ig_opt == 8 .or. ig_opt == 9) then + if (ig_opt == 8 .or. ig_opt == 9 .or. ig_opt == 10) then ! - ! Free waves if incident waves start breaking (defined here as 1%) - ! - if (Qb > 0.01) then - ! - cg_ig(k) = sqrt(9.81 * depth(k)) - !cg_ig(k1) = sqrt(9.81 * depth(k1)) !TL - Note: if adjusted, then cgprev from above should also be updated - !cg_ig(k2) = sqrt(9.81 * depth(k2)) + if (ig_opt == 8 ) then + ! Free waves if incident waves start breaking (defined here as 1%) + ! + if (Qb > 0.01) then + ! + cg_ig(k) = sqrt(9.81 * depth(k)) + !cg_ig(k1) = sqrt(9.81 * depth(k1)) !TL - Note: if adjusted, then cgprev from above should also be updated + !cg_ig(k2) = sqrt(9.81 * depth(k2)) + ! + endif ! - endif - ! - elseif (ig_opt == 9) then - ! - if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then + elseif (ig_opt == 9 .or. ig_opt == 10) then ! - cg_ig(k) = sqrt(9.81 * depth(k)) - ! - endif + if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then + ! + cg_ig(k) = sqrt(9.81 * depth(k)) + ! + endif + ! + endif ! endif ! ! Determine dSxx and IG source/sink term 'srcig' ! - if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7 .or. ig_opt == 8 .or. ig_opt == 9) then + if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7 .or. ig_opt == 8 .or. ig_opt == 9 .or. ig_opt == 10) then ! ! Calculate shoaling parameter alpha_ig following Leijnse et al. (2024) ! @@ -1226,6 +1259,15 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! dSxx = Sxx_cons - Sxxprev(itheta) ! + elseif (ig_opt == 10) then + ! + ! TODO: think whether using eeprev(itheta) rather than E_local is isue or not! + !Sxx_cons = eeprev(itheta) * cgprev(itheta) / cg_ig(k) * ((2.0 * max(0.0,min(1.0,nwav(k)))) - 0.5) + Sxx_cons = Eprev(itheta) /max(E_local(k), 1.0e-6) * ee(itheta,k) * cgprev(itheta) / cg_ig(k) * ((2.0 * max(0.0,min(1.0,nwav(k)))) - 0.5) + + ! + dSxx = Sxx_cons - Sxxprev(itheta) + ! endif ! dSxx = max(dSxx, 0.0) @@ -1234,7 +1276,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(eeprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) ! - elseif (ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 8 .or. ig_opt == 9) then + elseif (ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 8 .or. ig_opt == 9 .or. ig_opt == 10) then ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy ! srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) @@ -1291,7 +1333,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! endif ! - elseif (ig_opt == 9) then + elseif (ig_opt == 9 .or. ig_opt == 10) then ! ! Free waves if incident waves start breaking (defined here as gam=Hm0,inc / h > 0.5) ! From ba99dcb9cd4f05574d570888f96c2b36be2c2449 Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 3 Mar 2026 02:55:27 +0100 Subject: [PATCH 015/118] - Add igopt 11 with better rewritten code for determining srcig based on integrated energies, and at the redistributing them over bins like for Dw - Result pretty much the same as before with igopt 9 --- source/src/snapwave/snapwave_solver.f90 | 247 +++++++++++++++++++++++- 1 file changed, 245 insertions(+), 2 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 8dd1d1309..162c28fec 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -480,7 +480,15 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term: ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) + if (ig_opt > 0 .AND. ig_opt < 11) then + ! + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) + ! + else + ! + call determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) + ! + endif ! ! inout: alphaig_local, srcig_local - eeprev, eeprev_ig, cgprev, beta_local ! in: the rest @@ -563,7 +571,15 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term - every first sweep of iteration ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) + if (ig_opt > 0 .AND. ig_opt < 11) then + ! + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) + ! + else + ! + call determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) + ! + endif ! endif ! @@ -1366,6 +1382,233 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! end subroutine determine_infragravity_source_sink_term + subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) + ! + implicit none + ! + ! Incoming variables + logical, dimension(no_nodes), intent(in) :: inner ! mask of inner grid points (not on boundary) + integer, intent(in) :: no_nodes,ntheta ! number of grid points, number of directions + real*4, dimension(2,ntheta,no_nodes),intent(in) :: w ! weights of upwind grid points, 2 per grid point and per wave direction + real*4, dimension(ntheta,no_nodes), intent(in) :: ds ! distance to interpolated upwind point, per grid point and direction + integer, dimension(2,ntheta,no_nodes),intent(in) :: prev ! two upwind grid points per grid point and wave direction + real*4, dimension(no_nodes), intent(inout) :: cg_ig ! group velocity + real*4, dimension(no_nodes), intent(in) :: nwav ! wave number n + real*4, dimension(no_nodes), intent(in) :: depth ! water depth + real*4, dimension(no_nodes), intent(in) :: zb ! actual bed level + real*4, dimension(no_nodes), intent(in) :: H ! wave height + real*4, dimension(ntheta,no_nodes), intent(in) :: ee ! energy density + real*4, dimension(ntheta,no_nodes), intent(in) :: ee_ig ! energy density infragravity waves + integer, intent(in) :: ig_opt ! option of IG wave settings (1 = default = conservative shoaling based dSxx and Baldock breaking) + real*4, intent(in) :: alphaigfac ! Multiplication factor for IG shoaling source/sink term, default = 1.0 + real*4, intent(in) :: dtheta ! directional resolution + real*4, intent(in) :: gamma ! coefficients in Baldock wave breaking dissipation + real*4, dimension(no_nodes), intent(in) :: Dw ! wave breaking dissipation + real*4, dimension(no_nodes), intent(in) :: Hmx ! Hmax + ! + ! Inout variables + real*4, dimension(:,:), intent(inout) :: alphaig_local ! Local infragravity wave shoaling parameter alpha + real*4, dimension(:,:), intent(inout) :: srcig_local ! Energy source/sink term because of IG wave shoaling + real*4, dimension(:), intent(inout) :: cgprev ! group velocity at upwind intersection point + real*4, dimension(ntheta,no_nodes), intent(inout):: beta_local ! Local bed slope based on bed level per direction + real*4, dimension(ntheta,no_nodes), intent(inout):: qb_local ! + real*4, dimension(ntheta,no_nodes), intent(inout):: gam_local ! + ! + ! Internal variables + integer :: itheta ! directional counter + integer :: k ! counters (k is grid index) + integer :: k1,k2 ! upwind counters (k is grid index) + real*4 :: gam ! local gamma (Hinc / depth ratio) + real*4, dimension(ntheta,no_nodes) :: depthprev ! water depth at upwind intersection point + real*4, dimension(no_nodes) :: Sxx ! Radiation Stress + real*4, dimension(:), allocatable :: Sxxprev ! radiation stress at upwind intersection point + real*4, dimension(:), allocatable :: Hprev ! Incident wave height at upwind intersection point + real*4, dimension(:), allocatable :: Eprev ! Mean incident wave energy at upwind intersection point + real*4, dimension(:), allocatable :: Eprev_ig ! Mean infragravity wave energy at upwind intersection point + real*4, dimension(no_nodes) :: E_local ! mean wave energy waves - just local + real*4, dimension(no_nodes) :: E_ig_local ! mean wave energy infragravity waves - just local + real*4 :: dSxx ! difference in Radiation stress + real*4 :: Sxx_cons ! conservative estimate of radiation stress using conservative shoaling + real*4 :: delta_Dw ! difference of Dw compared to upwind point, to get sign for max breaking point + real*4 :: Dwprev + real*4 :: Qb ! Percentage of breaking incident waves + ! + ! Allocate internal variables + allocate(Sxxprev(ntheta)) + allocate(Hprev(ntheta)) + allocate(Eprev(ntheta)) + allocate(Eprev_ig(ntheta)) + ! + Sxx = 0.0 + Hprev = 0.0 + Eprev = 0.0 + Eprev_ig = 0.0 + ! + E_local = 0.0 + E_ig_local = 0.0 + ! + ! Precompute all Sxx - FIXME - add parallellisation + ! + do k = 1, no_nodes + ! + if (inner(k)) then + ! + ! Update E (not saved from previous timestep) + ! + E_local(k) = sum(ee(:,k))*dtheta + ! + ! Update E_ig (not saved from previous timestep) + E_ig_local(k) = sum(ee_ig(:, k))*dtheta + ! + endif + ! + ! Calculate Sxx for all point - FIXME double check correct also for not inner + ! + Sxx(k) = (((2.0 * max(0.0,min(1.0,nwav(k)))) - 0.5) * E_local(k)) + ! + !endif + enddo + ! + ! Actual computation of srcig + ! + do k = 1, no_nodes + ! + if (inner(k)) then + ! + ! Compute exchange source term inc to ig waves - per direction + ! + do itheta = 1, ntheta + ! + k1 = prev(1, itheta, k) + k2 = prev(2, itheta, k) + ! + if (k1>0 .and. k2>0) then ! IMPORTANT - for some reason (k1*k2)>0 is not reliable always, resulting in directions being uncorrectly skipped!!! + ! + ! First calculate upwind direction dependent variables + depthprev(itheta,k) = w(1, itheta, k)*depth(k1) + w(2, itheta, k)*depth(k2) + ! + beta_local(itheta,k) = max((w(1, itheta, k)*(zb(k) - zb(k1)) + w(2, itheta, k)*(zb(k) - zb(k2)))/ds(itheta, k), 0.0) + ! + ! Notes: + ! - use actual bed level now for slope, because depth changes because of wave setup/tide/surge + ! - in zb, depth is negative > therefore zb(k) minus zb(k1) + ! - beta=0 means a horizontal or decreasing slope > need alphaig=0 then in IG src/sink term + ! + !betan_local(itheta,k) = (beta/sigm_ig)*sqrt(9.81/max(depth(k), hmin)) ! TL: in case in the future we would need the normalised bed slope again + ! + ! Fraction of breaking waves, based on H(k) + !Qb = min(max(exp(-(Hmx(k)/H(k))**2), 0.0), 1.0) ! Qb percentage of breaking waves according to Baldock's formulation, between 0 and 1 + ! Base on upwind point: + Qb = min(max(exp(-((w(1, itheta, k)*Hmx(k1) + w(2, itheta, k)*Hmx(k2)) / Hprev(itheta))**2), 0.0), 1.0) ! Qb percentage of breaking waves according to Baldock's formulation, between 0 and 1 + ! + qb_local(itheta, k) = Qb + ! + cgprev(itheta) = w(1, itheta, k)*cg_ig(k1) + w(2, itheta, k)*cg_ig(k2) + ! + Sxxprev(itheta) = w(1, itheta, k)*Sxx(k1) + w(2, itheta, k)*Sxx(k2) + ! + Eprev(itheta) = w(1, itheta, k)*E_local(k1) + w(2, itheta, k)*E_local(k2) + Eprev_ig(itheta) = w(1, itheta, k)*E_ig_local(k1) + w(2, itheta, k)*E_ig_local(k2) + ! + Hprev(itheta) = w(1, itheta, k)*H(k1) + w(2, itheta, k)*H(k2) + ! + ! Determine relative waterdepth 'gam' + ! + gam = max(0.5*(Hprev(itheta)/depthprev(itheta,k) + H(k)/depth(k)), 0.0) ! mean gamma over current and upwind point + ! + gam_local(itheta, k) = gam + ! + ! Adjust cg_ig for free infragravity waves release in surfzone + ! TL - Note: cg_ig = cg + if (ig_opt == 11) then + ! + if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then + ! + cg_ig(k) = sqrt(9.81 * depth(k)) + ! + endif + ! + endif + + ! + ! Determine dSxx and IG source/sink term 'srcig' + ! + if (ig_opt == 11) then + ! + ! Calculate shoaling parameter alpha_ig following Leijnse et al. (2024) + ! + call estimate_shoaling_parameter_alphaig(beta_local(itheta,k), gam, alphaig_local(itheta,k)) ! [input, input, output] + ! + ! Now calculate source term component + ! + ! Newest dSxx/dx based method, using estimate of Sxx(k) using conservative shoaling + if (Sxxprev(itheta)<=0.0) then + ! + srcig_local(itheta, k) = 0.0 !Avoid big jumps in dSxx that can happen if a upwind point is a boundary point with Hinc=0 + ! + else + ! + if (ig_opt == 11) then ! Option using conservative shoaling for dSxx/dx + ! + ! Calculate Sxx based on conservative shoaling of upwind point's energy: + ! Sxx_cons = E(i-1) * Cg(i-1) / Cg * (2 * n(i) - 0.5) + Sxx_cons = Eprev(itheta) * cgprev(itheta) / cg_ig(k) * ((2.0 * max(0.0,min(1.0,nwav(k)))) - 0.5) + ! Note - limit so value of nwav is between 0 and 1, and Sxx therefore doesn't become NaN for nwav=Infinite + ! + dSxx = Sxx_cons - Sxxprev(itheta) + ! + endif + ! + dSxx = max(dSxx, 0.0) + ! + if (ig_opt == 11) then + ! + ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy + ! NOTE - in main script this is multiplied with ee(itheta,k) / E(k) to get directional energy + ! + srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) * ee(itheta,k) / E_local(k) + ! + endif + ! + ! Limit srcig to only where incident waves are not maximum dissipated + ! Calculated by determining the sign of delta Dw (positive means not yet the max Dw reached, meaning not yet at approximately hbr=Hinc,0/h,i) + ! In this way, don't need to look along a transect and no Hinc,0 value needed + ! + ! Ergo, it is assumed that after this point IG waves are free, and no bound wave forcing is happening anymore, so srcig should be 0 from here on + ! + if (ig_opt == 11) then + ! + ! Free waves if incident waves start breaking (defined here as gam=Hm0,inc / h > 0.5) + ! + ! gam is in Hrms, so multiply by sqrt(2) + !if ((gam * sqrt(2.0)) > 0.5) then + if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then + ! + srcig_local(itheta, k) = 0.0 + ! + endif + endif + ! + endif + ! + else ! TL: option to add future parameterisations here for e.g. coral reef type coasts + ! + srcig_local(itheta, k) = 0.0 + ! + endif + ! + srcig_local(itheta, k) = max(srcig_local(itheta, k), 0.0) + ! + endif + ! + enddo + ! + endif + ! + enddo + ! + end subroutine determine_infragravity_source_sink_term_overE + subroutine estimate_shoaling_parameter_alphaig(beta, gam, alphaig) real*4, intent(in) :: beta real*4, intent(in) :: gam From 97731930aa8db63602ce72bbf9ce3ec675422e0f Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 3 Mar 2026 03:18:20 +0100 Subject: [PATCH 016/118] - first version moving srcig term over from 'R' to 'B', for igopt=11 --- source/src/snapwave/snapwave_solver.f90 | 76 ++++++++++++++++++++----- 1 file changed, 62 insertions(+), 14 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 162c28fec..b086e0cbc 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -480,7 +480,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term: ! - if (ig_opt > 0 .AND. ig_opt < 11) then + if (ig_opt > 0 .and. ig_opt < 11) then ! call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) ! @@ -571,7 +571,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term - every first sweep of iteration ! - if (ig_opt > 0 .AND. ig_opt < 11) then + if (ig_opt > 0 .and. ig_opt < 11) then ! call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) ! @@ -685,26 +685,42 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! do itheta = 1, ntheta ! - R(itheta) = oneoverdt*ee(itheta, k) + cgprev(itheta)*eeprev(itheta)/ds(itheta, k) - srcig_local(itheta, k) * shinc2ig + if (ig_opt > 0 .and. ig_opt < 11) then + R(itheta) = oneoverdt*ee(itheta, k) + cgprev(itheta)*eeprev(itheta)/ds(itheta, k) - srcig_local(itheta, k) * shinc2ig + else + R(itheta) = oneoverdt*ee(itheta, k) + cgprev(itheta)*eeprev(itheta)/ds(itheta, k) + endif ! enddo ! do itheta = 2, ntheta - 1 ! A(itheta) = -ctheta(itheta - 1, k)*oneover2dtheta - B(itheta) = oneoverdt + cg(k)/ds(itheta,k) + DoverE(k) + ! + if (ig_opt > 0 .and. ig_opt < 11) then + B(itheta) = oneoverdt + cg(k)/ds(itheta,k) + DoverE(k) + else + B(itheta) = oneoverdt + cg(k)/ds(itheta,k) + DoverE(k) - srcig_local(itheta, k) * shinc2ig + endif + ! C(itheta) = ctheta(itheta + 1, k)*oneover2dtheta ! enddo ! A(1) = -ctheta(ntheta, k)*oneover2dtheta - B(1) = oneoverdt + cg(k)/ds(1,k) + DoverE(k) C(1) = ctheta(2, k)*oneover2dtheta ! A(ntheta) = -ctheta(ntheta - 1, k)*oneover2dtheta - B(ntheta) = oneoverdt + cg(k)/ds(ntheta,k) + DoverE(k) C(ntheta) = ctheta(1, k)*oneover2dtheta ! + if (ig_opt > 0 .and. ig_opt < 11) then + B(1) = oneoverdt + cg(k)/ds(1,k) + DoverE(k) + B(ntheta) = oneoverdt + cg(k)/ds(ntheta,k) + DoverE(k) + else + B(1) = oneoverdt + cg(k)/ds(1,k) + DoverE(k) - srcig_local(1, k) * shinc2ig + B(ntheta) = oneoverdt + cg(k)/ds(ntheta,k) + DoverE(k) - srcig_local(ntheta, k) * shinc2ig + endif + ! ! Solve tridiagonal system per point ! if (wind) then @@ -788,35 +804,68 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! do itheta = 1, ntheta ! - R_ig(itheta) = oneoverdt*ee_ig(itheta, k) + cgprev_ig(itheta)*eeprev_ig(itheta)/ds(itheta, k) + srcig_local(itheta, k) !TL: new version + if (ig_opt > 0 .and. ig_opt < 11) then + R_ig(itheta) = oneoverdt*ee_ig(itheta, k) + cgprev_ig(itheta)*eeprev_ig(itheta)/ds(itheta, k) + srcig_local(itheta, k) + else + R_ig(itheta) = oneoverdt*ee_ig(itheta, k) + cgprev_ig(itheta)*eeprev_ig(itheta)/ds(itheta, k) + endif ! enddo ! do itheta = 2, ntheta - 1 ! A_ig(itheta) = -ctheta_ig(itheta - 1, k)*oneover2dtheta - B_ig(itheta) = oneoverdt + cg_ig(k)/ds(itheta,k) + DoverE_ig(k) + ! + if (ig_opt > 0 .and. ig_opt < 11) then + B_ig(itheta) = oneoverdt + cg_ig(k)/ds(itheta,k) + DoverE_ig(k) + else + B_ig(itheta) = oneoverdt + cg_ig(k)/ds(itheta,k) + DoverE_ig(k) + srcig_local(itheta, k) + endif + ! C_ig(itheta) = ctheta_ig(itheta + 1, k)*oneover2dtheta ! enddo ! if (ctheta_ig(1,k)<0) then A_ig(1) = 0.0 - B_ig(1) = oneoverdt - ctheta_ig(1, k)/dtheta + cg_ig(k)/ds(1, k) + DoverE_ig(k) + if (ig_opt > 0 .and. ig_opt < 11) then + B_ig(1) = oneoverdt - ctheta_ig(1, k)/dtheta + cg_ig(k)/ds(1, k) + DoverE_ig(k) + else + B_ig(1) = oneoverdt - ctheta_ig(1, k)/dtheta + cg_ig(k)/ds(1, k) + DoverE_ig(k) + srcig_local(itheta, k) + endif + ! C_ig(1) = ctheta_ig(2, k)/dtheta else A_ig(1)=0.0 - B_ig(1)=1.0/dt + cg_ig(k)/ds(1, k) + DoverE_ig(k) + ! + if (ig_opt > 0 .and. ig_opt < 11) then + B_ig(1)=1.0/dt + cg_ig(k)/ds(1, k) + DoverE_ig(k) + else + B_ig(1)=1.0/dt + cg_ig(k)/ds(1, k) + DoverE_ig(k) + srcig_local(itheta, k) + endif + ! C_ig(1)=0.0 endif ! if (ctheta_ig(ntheta, k)>0) then A_ig(ntheta) = -ctheta_ig(ntheta - 1, k)/dtheta - B_ig(ntheta) = oneoverdt + ctheta_ig(ntheta, k)/dtheta + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) + ! + if (ig_opt > 0 .and. ig_opt < 11) then + B_ig(ntheta) = oneoverdt + ctheta_ig(ntheta, k)/dtheta + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) + else + B_ig(ntheta) = oneoverdt + ctheta_ig(ntheta, k)/dtheta + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) + srcig_local(itheta, k) + endif + ! C_ig(ntheta) = 0.0 else A_ig(ntheta) = 0.0 - B_ig(ntheta) = oneoverdt + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) + ! + if (ig_opt > 0 .and. ig_opt < 11) then + B_ig(ntheta) = oneoverdt + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) + else + B_ig(ntheta) = oneoverdt + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) + srcig_local(itheta, k) + endif + ! C_ig(ntheta) = 0.0 endif ! @@ -1566,7 +1615,7 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy ! NOTE - in main script this is multiplied with ee(itheta,k) / E(k) to get directional energy ! - srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) * ee(itheta,k) / E_local(k) + srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) /max(E_local(k), 1.0e-6) !* ee(itheta,k) ! endif ! @@ -1581,7 +1630,6 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta ! Free waves if incident waves start breaking (defined here as gam=Hm0,inc / h > 0.5) ! ! gam is in Hrms, so multiply by sqrt(2) - !if ((gam * sqrt(2.0)) > 0.5) then if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then ! srcig_local(itheta, k) = 0.0 From 5ad4779eb4a1e433c1f9e021858f4858acdea3b2 Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 3 Mar 2026 03:33:39 +0100 Subject: [PATCH 017/118] - Not fully working yet, so end now by last working step of having srcig as alrready mutliplied by ee_itheta,k) and in 'B' term - ig opt 12 can be the working version in R --- source/src/snapwave/snapwave_solver.f90 | 27 +++++++++++++++---------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index b086e0cbc..ad11106af 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -685,7 +685,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! do itheta = 1, ntheta ! - if (ig_opt > 0 .and. ig_opt < 11) then + if (ig_opt > 0 .and. ig_opt < 12) then R(itheta) = oneoverdt*ee(itheta, k) + cgprev(itheta)*eeprev(itheta)/ds(itheta, k) - srcig_local(itheta, k) * shinc2ig else R(itheta) = oneoverdt*ee(itheta, k) + cgprev(itheta)*eeprev(itheta)/ds(itheta, k) @@ -697,7 +697,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! A(itheta) = -ctheta(itheta - 1, k)*oneover2dtheta ! - if (ig_opt > 0 .and. ig_opt < 11) then + if (ig_opt > 0 .and. ig_opt < 12) then B(itheta) = oneoverdt + cg(k)/ds(itheta,k) + DoverE(k) else B(itheta) = oneoverdt + cg(k)/ds(itheta,k) + DoverE(k) - srcig_local(itheta, k) * shinc2ig @@ -713,7 +713,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & A(ntheta) = -ctheta(ntheta - 1, k)*oneover2dtheta C(ntheta) = ctheta(1, k)*oneover2dtheta ! - if (ig_opt > 0 .and. ig_opt < 11) then + if (ig_opt > 0 .and. ig_opt < 12) then B(1) = oneoverdt + cg(k)/ds(1,k) + DoverE(k) B(ntheta) = oneoverdt + cg(k)/ds(ntheta,k) + DoverE(k) else @@ -804,7 +804,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! do itheta = 1, ntheta ! - if (ig_opt > 0 .and. ig_opt < 11) then + if (ig_opt > 0 .and. ig_opt < 12) then R_ig(itheta) = oneoverdt*ee_ig(itheta, k) + cgprev_ig(itheta)*eeprev_ig(itheta)/ds(itheta, k) + srcig_local(itheta, k) else R_ig(itheta) = oneoverdt*ee_ig(itheta, k) + cgprev_ig(itheta)*eeprev_ig(itheta)/ds(itheta, k) @@ -816,7 +816,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! A_ig(itheta) = -ctheta_ig(itheta - 1, k)*oneover2dtheta ! - if (ig_opt > 0 .and. ig_opt < 11) then + if (ig_opt > 0 .and. ig_opt < 12) then B_ig(itheta) = oneoverdt + cg_ig(k)/ds(itheta,k) + DoverE_ig(k) else B_ig(itheta) = oneoverdt + cg_ig(k)/ds(itheta,k) + DoverE_ig(k) + srcig_local(itheta, k) @@ -828,7 +828,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! if (ctheta_ig(1,k)<0) then A_ig(1) = 0.0 - if (ig_opt > 0 .and. ig_opt < 11) then + if (ig_opt > 0 .and. ig_opt < 12) then B_ig(1) = oneoverdt - ctheta_ig(1, k)/dtheta + cg_ig(k)/ds(1, k) + DoverE_ig(k) else B_ig(1) = oneoverdt - ctheta_ig(1, k)/dtheta + cg_ig(k)/ds(1, k) + DoverE_ig(k) + srcig_local(itheta, k) @@ -838,7 +838,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & else A_ig(1)=0.0 ! - if (ig_opt > 0 .and. ig_opt < 11) then + if (ig_opt > 0 .and. ig_opt < 12) then B_ig(1)=1.0/dt + cg_ig(k)/ds(1, k) + DoverE_ig(k) else B_ig(1)=1.0/dt + cg_ig(k)/ds(1, k) + DoverE_ig(k) + srcig_local(itheta, k) @@ -850,7 +850,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & if (ctheta_ig(ntheta, k)>0) then A_ig(ntheta) = -ctheta_ig(ntheta - 1, k)/dtheta ! - if (ig_opt > 0 .and. ig_opt < 11) then + if (ig_opt > 0 .and. ig_opt < 12) then B_ig(ntheta) = oneoverdt + ctheta_ig(ntheta, k)/dtheta + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) else B_ig(ntheta) = oneoverdt + ctheta_ig(ntheta, k)/dtheta + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) + srcig_local(itheta, k) @@ -860,7 +860,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & else A_ig(ntheta) = 0.0 ! - if (ig_opt > 0 .and. ig_opt < 11) then + if (ig_opt > 0 .and. ig_opt < 12) then B_ig(ntheta) = oneoverdt + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) else B_ig(ntheta) = oneoverdt + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) + srcig_local(itheta, k) @@ -1613,10 +1613,15 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta if (ig_opt == 11) then ! ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy - ! NOTE - in main script this is multiplied with ee(itheta,k) / E(k) to get directional energy ! - srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) /max(E_local(k), 1.0e-6) !* ee(itheta,k) + srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) /max(E_local(k), 1.0e-6) * ee(itheta,k) ! + elseif (ig_opt == 12) then + ! + ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy + ! NOTE - in main script this is multiplied with ee(itheta,k) to get directional energy + ! + srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) /max(E_local(k), 1.0e-6) !* ee(itheta,k) endif ! ! Limit srcig to only where incident waves are not maximum dissipated From 8759adac8fcc1a76d4a7b361fee2393d1d205688 Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 3 Mar 2026 14:14:20 +0100 Subject: [PATCH 018/118] - Add again suggestion of calculation beta in shorter way, to test --- source/src/snapwave/snapwave_solver.f90 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index ad11106af..4a5eaa67c 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1511,7 +1511,7 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta ! endif ! - ! Calculate Sxx for all point - FIXME double check correct also for not inner + ! Calculate Sxx for all points - FIXME double check correct also for not inner ! Sxx(k) = (((2.0 * max(0.0,min(1.0,nwav(k)))) - 0.5) * E_local(k)) ! @@ -1538,6 +1538,9 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta ! beta_local(itheta,k) = max((w(1, itheta, k)*(zb(k) - zb(k1)) + w(2, itheta, k)*(zb(k) - zb(k2)))/ds(itheta, k), 0.0) ! + ! FIXME - shorter, but also same result? + !beta_local(itheta,k) = max(zb(k) - (w(1, itheta, k) * zb(k1) + w(2, itheta, k) * zb(k2))/ds(itheta, k), 0.0) + ! ! Notes: ! - use actual bed level now for slope, because depth changes because of wave setup/tide/surge ! - in zb, depth is negative > therefore zb(k) minus zb(k1) From 9c4ff329c7b08bf31ca2a55f86cc3f27c8be8f43 Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 3 Mar 2026 16:01:30 +0100 Subject: [PATCH 019/118] - Latest version for ig_opt 12 wth srcif in B-term - Results don't look good yet, not sure whats wrong, it is like Snapwave trunk commit of Dano of 03-04-2025 --- source/src/snapwave/snapwave_solver.f90 | 35 ++++++++++++------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 4a5eaa67c..32d90e628 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -484,7 +484,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) ! - else + else ! ig_opt 11, 12 ! call determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) ! @@ -575,7 +575,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) ! - else + else ! ig_opt 11, 12 ! call determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) ! @@ -700,7 +700,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & if (ig_opt > 0 .and. ig_opt < 12) then B(itheta) = oneoverdt + cg(k)/ds(itheta,k) + DoverE(k) else - B(itheta) = oneoverdt + cg(k)/ds(itheta,k) + DoverE(k) - srcig_local(itheta, k) * shinc2ig + B(itheta) = oneoverdt + cg(k)/ds(itheta,k) + DoverE(k) + srcig_local(itheta, k) * shinc2ig endif ! C(itheta) = ctheta(itheta + 1, k)*oneover2dtheta @@ -717,8 +717,8 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & B(1) = oneoverdt + cg(k)/ds(1,k) + DoverE(k) B(ntheta) = oneoverdt + cg(k)/ds(ntheta,k) + DoverE(k) else - B(1) = oneoverdt + cg(k)/ds(1,k) + DoverE(k) - srcig_local(1, k) * shinc2ig - B(ntheta) = oneoverdt + cg(k)/ds(ntheta,k) + DoverE(k) - srcig_local(ntheta, k) * shinc2ig + B(1) = oneoverdt + cg(k)/ds(1,k) + DoverE(k) + srcig_local(1, k) * shinc2ig + B(ntheta) = oneoverdt + cg(k)/ds(ntheta,k) + DoverE(k) + srcig_local(ntheta, k) * shinc2ig endif ! ! Solve tridiagonal system per point @@ -819,7 +819,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & if (ig_opt > 0 .and. ig_opt < 12) then B_ig(itheta) = oneoverdt + cg_ig(k)/ds(itheta,k) + DoverE_ig(k) else - B_ig(itheta) = oneoverdt + cg_ig(k)/ds(itheta,k) + DoverE_ig(k) + srcig_local(itheta, k) + B_ig(itheta) = oneoverdt + cg_ig(k)/ds(itheta,k) + DoverE_ig(k) - srcig_local(itheta, k) endif ! C_ig(itheta) = ctheta_ig(itheta + 1, k)*oneover2dtheta @@ -831,7 +831,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & if (ig_opt > 0 .and. ig_opt < 12) then B_ig(1) = oneoverdt - ctheta_ig(1, k)/dtheta + cg_ig(k)/ds(1, k) + DoverE_ig(k) else - B_ig(1) = oneoverdt - ctheta_ig(1, k)/dtheta + cg_ig(k)/ds(1, k) + DoverE_ig(k) + srcig_local(itheta, k) + B_ig(1) = oneoverdt - ctheta_ig(1, k)/dtheta + cg_ig(k)/ds(1, k) + DoverE_ig(k) - srcig_local(itheta, k) endif ! C_ig(1) = ctheta_ig(2, k)/dtheta @@ -841,7 +841,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & if (ig_opt > 0 .and. ig_opt < 12) then B_ig(1)=1.0/dt + cg_ig(k)/ds(1, k) + DoverE_ig(k) else - B_ig(1)=1.0/dt + cg_ig(k)/ds(1, k) + DoverE_ig(k) + srcig_local(itheta, k) + B_ig(1)=1.0/dt + cg_ig(k)/ds(1, k) + DoverE_ig(k) - srcig_local(itheta, k) endif ! C_ig(1)=0.0 @@ -853,7 +853,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & if (ig_opt > 0 .and. ig_opt < 12) then B_ig(ntheta) = oneoverdt + ctheta_ig(ntheta, k)/dtheta + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) else - B_ig(ntheta) = oneoverdt + ctheta_ig(ntheta, k)/dtheta + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) + srcig_local(itheta, k) + B_ig(ntheta) = oneoverdt + ctheta_ig(ntheta, k)/dtheta + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) - srcig_local(itheta, k) endif ! C_ig(ntheta) = 0.0 @@ -863,7 +863,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & if (ig_opt > 0 .and. ig_opt < 12) then B_ig(ntheta) = oneoverdt + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) else - B_ig(ntheta) = oneoverdt + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) + srcig_local(itheta, k) + B_ig(ntheta) = oneoverdt + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) - srcig_local(itheta, k) endif ! C_ig(ntheta) = 0.0 @@ -1572,7 +1572,7 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta ! ! Adjust cg_ig for free infragravity waves release in surfzone ! TL - Note: cg_ig = cg - if (ig_opt == 11) then + if (ig_opt == 11 .or. ig_opt == 12) then ! if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then ! @@ -1580,12 +1580,11 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta ! endif ! - endif - + endif ! ! Determine dSxx and IG source/sink term 'srcig' ! - if (ig_opt == 11) then + if (ig_opt == 11 .or. ig_opt == 12) then ! ! Calculate shoaling parameter alpha_ig following Leijnse et al. (2024) ! @@ -1600,7 +1599,7 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta ! else ! - if (ig_opt == 11) then ! Option using conservative shoaling for dSxx/dx + if (ig_opt == 11 .or. ig_opt == 12) then ! Option using conservative shoaling for dSxx/dx ! ! Calculate Sxx based on conservative shoaling of upwind point's energy: ! Sxx_cons = E(i-1) * Cg(i-1) / Cg * (2 * n(i) - 0.5) @@ -1616,13 +1615,13 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta if (ig_opt == 11) then ! ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy - ! + ! NOTE - already here multiplied with ee(itheta,k), for direct inclusion in 'R'-term srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) /max(E_local(k), 1.0e-6) * ee(itheta,k) ! elseif (ig_opt == 12) then ! ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy - ! NOTE - in main script this is multiplied with ee(itheta,k) to get directional energy + ! NOTE - in main script this is multiplied with ee(itheta,k) to get directional energy, for direct inclusion in 'B'-term ! srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) /max(E_local(k), 1.0e-6) !* ee(itheta,k) endif @@ -1633,7 +1632,7 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta ! ! Ergo, it is assumed that after this point IG waves are free, and no bound wave forcing is happening anymore, so srcig should be 0 from here on ! - if (ig_opt == 11) then + if (ig_opt == 11 .or. ig_opt == 12) then ! ! Free waves if incident waves start breaking (defined here as gam=Hm0,inc / h > 0.5) ! From 498fa38a9f42e3dc7032f5b38a22a60c4151bb1a Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 3 Mar 2026 16:01:54 +0100 Subject: [PATCH 020/118] - Make ig_opt 11 default for now --- source/src/sfincs_lib.f90 | 2 +- source/src/sfincs_snapwave.f90 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/src/sfincs_lib.f90 b/source/src/sfincs_lib.f90 index 7e2bdc5f1..e0f2a9e0b 100644 --- a/source/src/sfincs_lib.f90 +++ b/source/src/sfincs_lib.f90 @@ -93,7 +93,7 @@ function sfincs_initialize() result(ierr) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! build_revision = "$Rev: v2.3.1 mt. Faber+:branch-281" - build_date = "$Date: 2026-02-02" + build_date = "$Date: 2026-03-03" ! call write_log('', 1) call write_log('------------ Welcome to SFINCS ------------', 1) diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index bf0c83bfa..8437b14c6 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -653,7 +653,7 @@ subroutine read_snapwave_input() call read_real_input(500,'snapwave_shinc2ig',shinc2ig,1.0) ! Ratio of how much of the calculated IG wave source term, is subtracted from the incident wave energy (0-1, 1=default=all energy as sink) call read_real_input(500,'snapwave_alphaigfac',alphaigfac,1.0) ! Multiplication factor for IG shoaling source/sink term call read_real_input(500,'snapwave_baldock_ratio_ig',baldock_ratio_ig,0.2) - call read_int_input(500,'snapwave_ig_opt',ig_opt,1) + call read_int_input(500,'snapwave_ig_opt',ig_opt,11) call read_int_input(500,'snapwave_iterative_srcig',iterative_srcig_opt,0) ! Option whether to calculate IG source/sink term in iterative lower (better, but potentially slower, 1=default), or effectively based on previous timestep (faster, potential mismatch, =0) ! ! IG boundary conditions options: From 962cbf26c35c2ee2541e43fcacae04c5a6d945ac Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 6 Mar 2026 09:12:05 +0100 Subject: [PATCH 021/118] - Commit comment of Maarten - to be checked later --- source/src/snapwave/snapwave_solver.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 32d90e628..a27d43d5b 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -619,7 +619,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! enddo ! - Ek = sum(eeprev)*dtheta ! to check + Ek = sum(eeprev)*dtheta ! to check - Maarten: should not be 'eeprev'? ! depthlimfac = max(1.0, (sqrt(Ek/rhog8)/(gammax*depth(k)))**2.0) Hk = min(sqrt(Ek/rhog8), gamma*depth(k)) @@ -782,7 +782,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! IG ! if (igwaves) then - Ek_ig = sum(eeprev_ig)*dtheta + Ek_ig = sum(eeprev_ig)*dtheta ! to check - Maarten: should not be 'eeprev_ig'? !Hk_ig = sqrt(Ek_ig/rhog8) !org trunk Hk_ig = min(sqrt(Ek_ig/rhog8), gamma_ig*depth(k)) !TL: Question - why not this one? Ek_ig = rhog8*Hk_ig**2 From bf406b6f33a031159be0ee45430bf94afd739cbd Mon Sep 17 00:00:00 2001 From: Leynse Date: Mon, 9 Mar 2026 09:40:09 +0100 Subject: [PATCH 022/118] - Change default snapwave_gammaig to 0.7 --- source/src/sfincs_snapwave.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index 8437b14c6..40a93d602 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -649,7 +649,7 @@ subroutine read_snapwave_input() ! Settings related to IG waves: call read_int_input(500,'snapwave_igwaves',igwaves_opt,1) call read_real_input(500,'snapwave_alpha_ig',alpha_ig,1.0) !TODO choose whether snapwave_alphaig or snapwave_gamma_ig - call read_real_input(500,'snapwave_gammaig',gamma_ig,0.2) + call read_real_input(500,'snapwave_gammaig',gamma_ig,0.7) call read_real_input(500,'snapwave_shinc2ig',shinc2ig,1.0) ! Ratio of how much of the calculated IG wave source term, is subtracted from the incident wave energy (0-1, 1=default=all energy as sink) call read_real_input(500,'snapwave_alphaigfac',alphaigfac,1.0) ! Multiplication factor for IG shoaling source/sink term call read_real_input(500,'snapwave_baldock_ratio_ig',baldock_ratio_ig,0.2) From 5aedb823a731f6e7ea3639bf214d30ea90948221 Mon Sep 17 00:00:00 2001 From: Leynse Date: Mon, 9 Mar 2026 11:50:52 +0100 Subject: [PATCH 023/118] - Add variable 'snapwave_gamma_fac_br' instead of the fixed 2.0/3.0 value to multiply with snapwave_gamma factor for estimating the incident wave breaking point initiation, and setting the srcig to 0 - description: factor times gamma that is used to determine the maximum incident wave breaking point in the surf zone using local incident wave height over water depth ratio, among others used to set the IG source term to 0 shallower than this point - Now include the /sqrt(2) so that value becomes gam (Hrms based) > 0.47 * gamma - used for ig_opt >= 11 --- source/src/sfincs_ncoutput.F90 | 5 ++-- source/src/sfincs_snapwave.f90 | 6 +++-- source/src/snapwave/snapwave_data.f90 | 1 + source/src/snapwave/snapwave_solver.f90 | 32 +++++++++++++++---------- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/source/src/sfincs_ncoutput.F90 b/source/src/sfincs_ncoutput.F90 index 4bea2f651..e82491b99 100644 --- a/source/src/sfincs_ncoutput.F90 +++ b/source/src/sfincs_ncoutput.F90 @@ -3723,7 +3723,7 @@ subroutine ncoutput_add_params(ncid, varid) ! ! Because of overlapping names, only important specific values from snapwave_data use snapwave_data, only: gamma, gammax, alpha, hmin, fw0, fw0_ig, dt, tol, dtheta, crit, nr_sweeps, baldock_opt, baldock_ratio, & - igwaves_opt, alpha_ig, gamma_ig, shinc2ig, alphaigfac, baldock_ratio_ig, ig_opt, herbers_opt, tpig_opt, eeinc2ig, tinc2ig, & + igwaves_opt, alpha_ig, gamma_ig, gamma_fac_br, shinc2ig, alphaigfac, baldock_ratio_ig, ig_opt, herbers_opt, tpig_opt, eeinc2ig, tinc2ig, & snapwave_jonswapfile, snapwave_encfile, snapwave_bndfile, snapwave_bhsfile, snapwave_btpfile, snapwave_bwdfile, snapwave_bdsfile, upwfile, gridfile ! @@ -3916,7 +3916,8 @@ subroutine ncoutput_add_params(ncid, varid) ! NF90(nf90_put_att(ncid, varid, 'snapwave_igwaves',igwaves_opt)) NF90(nf90_put_att(ncid, varid, 'snapwave_alpha_ig',alpha_ig)) - NF90(nf90_put_att(ncid, varid, 'snapwave_gammaig',gamma_ig)) + NF90(nf90_put_att(ncid, varid, 'snapwave_gammaig',gamma_ig)) + NF90(nf90_put_att(ncid, varid, 'snapwave_gamma_fac_br',gamma_fac_br)) NF90(nf90_put_att(ncid, varid, 'snapwave_shinc2ig',shinc2ig)) NF90(nf90_put_att(ncid, varid, 'snapwave_alphaigfac',alphaigfac)) NF90(nf90_put_att(ncid, varid, 'snapwave_baldock_ratio_ig',baldock_ratio_ig)) diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index 40a93d602..95b4f2c68 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -648,8 +648,10 @@ subroutine read_snapwave_input() ! ! Settings related to IG waves: call read_int_input(500,'snapwave_igwaves',igwaves_opt,1) - call read_real_input(500,'snapwave_alpha_ig',alpha_ig,1.0) !TODO choose whether snapwave_alphaig or snapwave_gamma_ig - call read_real_input(500,'snapwave_gammaig',gamma_ig,0.7) + call read_real_input(500,'snapwave_alpha_ig',alpha_ig,1.0) !FIXME choose whether snapwave_alphaig or snapwave_gamma_ig + call read_real_input(500,'snapwave_gammaig',gamma_ig,0.7) !FIXME choose whether snapwave_alphaig or snapwave_gamma_ig + !call read_real_input(500,'snapwave_gamma_fac_br',gamma_fac_br,2.0/3.0) ! factor times gamma that is used to determine the maximum incident wave breaking point in the surf zone using local incident wave height over water depth ratio, among others used to set the IG source term to 0 shallower than this point + call read_real_input(500,'snapwave_gamma_fac_br',gamma_fac_br,0.47) ! factor times gamma that is used to determine the maximum incident wave breaking point in the surf zone using local incident wave height over water depth ratio, among others used to set the IG source term to 0 shallower than this point call read_real_input(500,'snapwave_shinc2ig',shinc2ig,1.0) ! Ratio of how much of the calculated IG wave source term, is subtracted from the incident wave energy (0-1, 1=default=all energy as sink) call read_real_input(500,'snapwave_alphaigfac',alphaigfac,1.0) ! Multiplication factor for IG shoaling source/sink term call read_real_input(500,'snapwave_baldock_ratio_ig',baldock_ratio_ig,0.2) diff --git a/source/src/snapwave/snapwave_data.f90 b/source/src/snapwave/snapwave_data.f90 index e18b8a16b..94496482a 100644 --- a/source/src/snapwave/snapwave_data.f90 +++ b/source/src/snapwave/snapwave_data.f90 @@ -260,6 +260,7 @@ module snapwave_data ! integer :: ig_opt ! option of IG wave settings (1 = default = conservative shoaling based dSxx and Baldock breaking) real*4 :: alpha_ig,gamma_ig ! coefficients in Baldock wave breaking dissipation model for IG waves + real*4 :: gamma_fac_br ! factor times gamma that is used to determine the maximum incident wave breaking point in the surf zone using local incident wave height over water depth ratio, among others used to set the IG source term to 0 shallower than this point real*4 :: shinc2ig ! Ratio of how much of the calculated IG wave source term, is subtracted from the incident wave energy (0-1, 0=default) real*4 :: alphaigfac ! Multiplication factor for IG shoaling source/sink term, default = 1.0 real*4 :: eeinc2ig ! ratio of incident wave energy as first estimate of IG wave energy at boundary diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index a27d43d5b..6fa8d0e4f 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -136,7 +136,7 @@ subroutine compute_wave_field() igwaves,kwav_ig, cg_ig,H_ig,ctheta_ig,Hmx_ig, ee_ig,fw_ig, & beta, srcig, alphaig, Dw_ig, Df_ig, qb, gam, & vegetation, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, Dveg, & - zb, nwav, ig_opt, alpha_ig, gamma_ig, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) + zb, nwav, ig_opt, alpha_ig, gamma_ig, gamma_fac_br, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) ! call timer(t3) ! @@ -161,7 +161,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & igwaves,kwav_ig, cg_ig,H_ig,ctheta_ig,Hmx_ig, ee_ig,fw_ig, & betamean, srcig, alphaig, Dw_ig, Df_ig, qb, gam, & vegetation, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, Dveg, & - zb, nwav, ig_opt, alfa_ig, gamma_ig, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) + zb, nwav, ig_opt, alfa_ig, gamma_ig, gamma_fac_br, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) ! use snapwave_windsource !use snapwave_ncoutput ! TL: removed, we don't use this in SF+SW @@ -297,6 +297,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & real*4 :: Ek_ig real*4 :: Hk_ig real*4 :: alfa_ig,gamma_ig ! coefficients in Baldock wave breaking dissipation model for IG waves + real*4 :: gamma_fac_br ! factor times gamma that is used to determine the maximum incident wave breaking point in the surf zone using local incident wave height over water depth ratio, among others used to set the IG source term to 0 shallower than this point real*4 :: eeinc2ig ! ratio of incident wave energy as first estimate of IG wave energy at boundary real*4 :: Tinc2ig ! ratio compared to period Tinc to estimate Tig real*4 :: alphaigfac ! Multiplication factor for IG shoaling source/sink term, default = 1.0 @@ -486,7 +487,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! else ! ig_opt 11, 12 ! - call determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) + call determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br) ! endif ! @@ -577,7 +578,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! else ! ig_opt 11, 12 ! - call determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) + call determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br) ! endif ! @@ -1121,7 +1122,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d integer, intent(in) :: ig_opt ! option of IG wave settings (1 = default = conservative shoaling based dSxx and Baldock breaking) real*4, intent(in) :: alphaigfac ! Multiplication factor for IG shoaling source/sink term, default = 1.0 real*4, intent(in) :: dtheta ! directional resolution - real*4, intent(in) :: gamma ! coefficients in Baldock wave breaking dissipation + real*4, intent(in) :: gamma ! coefficients in Baldock wave breaking dissipation real*4, dimension(no_nodes), intent(in) :: Dw ! wave breaking dissipation real*4, dimension(no_nodes), intent(in) :: Hmx ! Hmax ! @@ -1278,7 +1279,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! elseif (ig_opt == 9 .or. ig_opt == 10) then ! - if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then + if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then ! cg_ig(k) = sqrt(9.81 * depth(k)) ! @@ -1404,7 +1405,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! gam is in Hrms, so multiply by sqrt(2) !if ((gam * sqrt(2.0)) > 0.5) then - if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then + if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then ! srcig_local(itheta, k) = 0.0 ! @@ -1431,7 +1432,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! end subroutine determine_infragravity_source_sink_term - subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) + subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br) ! implicit none ! @@ -1452,6 +1453,7 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta real*4, intent(in) :: alphaigfac ! Multiplication factor for IG shoaling source/sink term, default = 1.0 real*4, intent(in) :: dtheta ! directional resolution real*4, intent(in) :: gamma ! coefficients in Baldock wave breaking dissipation + real*4, intent(in) :: gamma_fac_br ! factor times gamma that is used to determine the maximum incident wave breaking point in the surf zone using local incident wave height over water depth ratio, among others used to set the IG source term to 0 shallower than this point real*4, dimension(no_nodes), intent(in) :: Dw ! wave breaking dissipation real*4, dimension(no_nodes), intent(in) :: Hmx ! Hmax ! @@ -1574,10 +1576,12 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta ! TL - Note: cg_ig = cg if (ig_opt == 11 .or. ig_opt == 12) then ! - if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then + !if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then + !if ((gam * sqrt(2.0)) > (gamma_fac_br * gamma)) then + if (gam > (gamma_fac_br * gamma)) then ! cg_ig(k) = sqrt(9.81 * depth(k)) - ! + ! endif ! endif @@ -1636,9 +1640,11 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta ! ! Free waves if incident waves start breaking (defined here as gam=Hm0,inc / h > 0.5) ! - ! gam is in Hrms, so multiply by sqrt(2) - if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then - ! + ! gam is in Hrms, so multiply by sqrt(2) for Hm0 + !if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then + !if ((gam * sqrt(2.0)) > (gamma_fac_br * gamma)) then + if (gam > (gamma_fac_br * gamma)) then + ! srcig_local(itheta, k) = 0.0 ! endif From 4894a9ae3be868ecf1ed3e8f57dc9e3bd9280827 Mon Sep 17 00:00:00 2001 From: Leynse Date: Mon, 9 Mar 2026 12:59:22 +0100 Subject: [PATCH 024/118] - For instance in shadow zone of Boers tests, changing the cg_ig did lead to issues, therefore remove for ig_opt 12&12 --- source/src/snapwave/snapwave_solver.f90 | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 6fa8d0e4f..b0a15f519 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1574,17 +1574,17 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta ! ! Adjust cg_ig for free infragravity waves release in surfzone ! TL - Note: cg_ig = cg - if (ig_opt == 11 .or. ig_opt == 12) then - ! - !if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then - !if ((gam * sqrt(2.0)) > (gamma_fac_br * gamma)) then - if (gam > (gamma_fac_br * gamma)) then - ! - cg_ig(k) = sqrt(9.81 * depth(k)) - ! - endif - ! - endif + !if (ig_opt == 11 .or. ig_opt == 12) then + ! ! + ! !if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then + ! !if ((gam * sqrt(2.0)) > (gamma_fac_br * gamma)) then + ! if (gam > (gamma_fac_br * gamma)) then + ! ! + ! cg_ig(k) = sqrt(9.81 * depth(k)) + ! ! + ! endif + ! ! + !endif ! ! Determine dSxx and IG source/sink term 'srcig' ! @@ -1638,7 +1638,7 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta ! if (ig_opt == 11 .or. ig_opt == 12) then ! - ! Free waves if incident waves start breaking (defined here as gam=Hm0,inc / h > 0.5) + ! Free waves if incident waves start breaking (defined here as gam=Hrms,inc / h > (gamma_fac_br * gamma)) ! ! gam is in Hrms, so multiply by sqrt(2) for Hm0 !if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then From 937c2067b42bf73fb8de6348e6c253fde1712233 Mon Sep 17 00:00:00 2001 From: Leynse Date: Mon, 9 Mar 2026 14:38:22 +0100 Subject: [PATCH 025/118] - bump date --- source/src/sfincs_lib.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/src/sfincs_lib.f90 b/source/src/sfincs_lib.f90 index e0f2a9e0b..763124678 100644 --- a/source/src/sfincs_lib.f90 +++ b/source/src/sfincs_lib.f90 @@ -92,8 +92,8 @@ function sfincs_initialize() result(ierr) ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! - build_revision = "$Rev: v2.3.1 mt. Faber+:branch-281" - build_date = "$Date: 2026-03-03" + build_revision = "$Rev: v2.3.0 mt. Faber+:branch-281" + build_date = "$Date: 2026-03-09" ! call write_log('', 1) call write_log('------------ Welcome to SFINCS ------------', 1) From 5a9512256e439f3cef8ae2598e7eb08bcb474d2e Mon Sep 17 00:00:00 2001 From: Leynse Date: Mon, 9 Mar 2026 14:49:16 +0100 Subject: [PATCH 026/118] - Big cleanup - Only keep the (already precleaned) ig_opt 11&12 version of subroutine determine_infragravity_source_sink_term - Add description qb_local, gam_local --- source/src/snapwave/snapwave_solver.f90 | 362 +----------------------- 1 file changed, 8 insertions(+), 354 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index b0a15f519..4b8f9078d 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -261,8 +261,8 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & real*4, dimension(:,:), allocatable :: beta_local ! Local bed slope based on bed level per direction real*4, dimension(:,:), allocatable :: alphaig_local ! Local infragravity wave shoaling parameter alpha real*4, dimension(:,:), allocatable :: depthprev ! water depth at upwind intersection point per direction - real*4, dimension(:,:), allocatable :: qb_local ! - real*4, dimension(:,:), allocatable :: gam_local ! + real*4, dimension(:,:), allocatable :: qb_local ! local percentage of breaking waves Qb + real*4, dimension(:,:), allocatable :: gam_local ! local incident wave height over water depth ratio real*4, dimension(:), allocatable :: dee ! difference with energy previous iteration real*4, dimension(:), allocatable :: eeprev, cgprev ! energy density and group velocity at upwind intersection point real*4, dimension(:), allocatable :: eeprev_ig, cgprev_ig ! energy density and group velocity at upwind intersection point @@ -481,17 +481,9 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term: ! - if (ig_opt > 0 .and. ig_opt < 11) then - ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) - ! - else ! ig_opt 11, 12 - ! - call determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br) - ! - endif + call determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br) ! - ! inout: alphaig_local, srcig_local - eeprev, eeprev_ig, cgprev, beta_local + ! inout: alphaig_local, srcig_local, cgprev, beta_local, qb_local, gam_local ! in: the rest ! ! NOTE - This is based on the energy in the precious SnapWave timestep 'ee' and 'ee_ig', and waveheight 'H', which should therefore be made available. @@ -572,15 +564,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term - every first sweep of iteration ! - if (ig_opt > 0 .and. ig_opt < 11) then - ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) - ! - else ! ig_opt 11, 12 - ! - call determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br) - ! - endif + call determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br) ! endif ! @@ -1101,337 +1085,7 @@ subroutine baldock (rho,g,alfa,gamma,depth,H,T,opt,Dw,Hmax) endif ! end subroutine baldock - - subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma) - ! - implicit none - ! - ! Incoming variables - logical, dimension(no_nodes), intent(in) :: inner ! mask of inner grid points (not on boundary) - integer, intent(in) :: no_nodes,ntheta ! number of grid points, number of directions - real*4, dimension(2,ntheta,no_nodes),intent(in) :: w ! weights of upwind grid points, 2 per grid point and per wave direction - real*4, dimension(ntheta,no_nodes), intent(in) :: ds ! distance to interpolated upwind point, per grid point and direction - integer, dimension(2,ntheta,no_nodes),intent(in) :: prev ! two upwind grid points per grid point and wave direction - real*4, dimension(no_nodes), intent(inout) :: cg_ig ! group velocity - real*4, dimension(no_nodes), intent(in) :: nwav ! wave number n - real*4, dimension(no_nodes), intent(in) :: depth ! water depth - real*4, dimension(no_nodes), intent(in) :: zb ! actual bed level - real*4, dimension(no_nodes), intent(in) :: H ! wave height - real*4, dimension(ntheta,no_nodes), intent(in) :: ee ! energy density - real*4, dimension(ntheta,no_nodes), intent(in) :: ee_ig ! energy density infragravity waves - integer, intent(in) :: ig_opt ! option of IG wave settings (1 = default = conservative shoaling based dSxx and Baldock breaking) - real*4, intent(in) :: alphaigfac ! Multiplication factor for IG shoaling source/sink term, default = 1.0 - real*4, intent(in) :: dtheta ! directional resolution - real*4, intent(in) :: gamma ! coefficients in Baldock wave breaking dissipation - real*4, dimension(no_nodes), intent(in) :: Dw ! wave breaking dissipation - real*4, dimension(no_nodes), intent(in) :: Hmx ! Hmax - ! - ! Inout variables - real*4, dimension(:,:), intent(inout) :: alphaig_local ! Local infragravity wave shoaling parameter alpha - real*4, dimension(:,:), intent(inout) :: srcig_local ! Energy source/sink term because of IG wave shoaling - real*4, dimension(:), intent(inout) :: eeprev, cgprev ! energy density and group velocity at upwind intersection point - real*4, dimension(:), intent(inout) :: eeprev_ig ! energy density at upwind intersection point - real*4, dimension(ntheta,no_nodes), intent(inout):: beta_local ! Local bed slope based on bed level per direction - real*4, dimension(ntheta,no_nodes), intent(inout):: qb_local ! - real*4, dimension(ntheta,no_nodes), intent(inout):: gam_local ! - ! - ! Internal variables - integer :: itheta ! directional counter - integer :: k ! counters (k is grid index) - integer :: k1,k2 ! upwind counters (k is grid index) - real*4 :: gam ! local gamma (Hinc / depth ratio) - real*4, dimension(ntheta,no_nodes) :: depthprev ! water depth at upwind intersection point - real*4, dimension(ntheta,no_nodes) :: Sxx ! Radiation Stress - real*4, dimension(:), allocatable :: Sxxprev ! radiation stress at upwind intersection point - real*4, dimension(:), allocatable :: Hprev ! Incident wave height at upwind intersection point - real*4, dimension(:), allocatable :: Eprev ! Mean incident wave energy at upwind intersection point - real*4, dimension(:), allocatable :: Eprev_ig ! Mean infragravity wave energy at upwind intersection point - real*4, dimension(no_nodes) :: E_local ! mean wave energy waves - just local - real*4, dimension(no_nodes) :: E_ig_local ! mean wave energy infragravity waves - just local - real*4, dimension(no_nodes) :: SxxoverE ! Sxx over E - real*4 :: dSxx ! difference in Radiation stress - real*4 :: Sxx_cons ! conservative estimate of radiation stress using conservative shoaling - real*4 :: delta_Dw ! difference of Dw compared to upwind point, to get sign for max breaking point - real*4 :: Dwprev - real*4 :: Qb ! Percentage of breaking incident waves - ! - ! Allocate internal variables - allocate(Sxxprev(ntheta)) - allocate(Hprev(ntheta)) - allocate(Eprev(ntheta)) - allocate(Eprev_ig(ntheta)) - ! - Sxx = 0.0 - Hprev = 0.0 - Eprev = 0.0 - Eprev_ig = 0.0 - ! - E_local = 0.0 - E_ig_local = 0.0 - SxxoverE = 0.0 - ! - ! Precompute all Sxx - if (ig_opt == 10) then - ! - do k = 1, no_nodes - ! - if (inner(k)) then - ! - ! Update E (not saved from previous timestep) - ! - E_local(k) = sum(ee(:,k))*dtheta - ! - ! As for dissipation calculate SxxoverE(k) - ! - SxxoverE(k) = (((2.0 * max(0.0,min(1.0,nwav(k)))) - 0.5) * E_local(k))/max(E_local(k), 1.0e-6) - ! as DoverE(k) = (Dwk + Dfk)/max(Ek, 1.0e-6) - ! - endif - enddo - ! - endif - ! - ! Actual computation of srcig - ! - do k = 1, no_nodes - ! - if (inner(k)) then - ! - ! Update E (not saved from previous timestep) - E_local(k) = sum(ee(:,k))*dtheta - ! - ! Update E_ig (not saved from previous timestep) - E_ig_local(k) = sum(ee_ig(:, k))*dtheta - ! - ! Compute exchange source term inc to ig waves - per direction - ! - do itheta = 1, ntheta - ! - k1 = prev(1, itheta, k) - k2 = prev(2, itheta, k) - ! - if (k1>0 .and. k2>0) then ! IMPORTANT - for some reason (k1*k2)>0 is not reliable always, resulting in directions being uncorrectly skipped!!! - ! - ! First calculate upwind direction dependent variables - depthprev(itheta,k) = w(1, itheta, k)*depth(k1) + w(2, itheta, k)*depth(k2) - ! - beta_local(itheta,k) = max((w(1, itheta, k)*(zb(k) - zb(k1)) + w(2, itheta, k)*(zb(k) - zb(k2)))/ds(itheta, k), 0.0) - ! - ! Notes: - ! - use actual bed level now for slope, because depth changes because of wave setup/tide/surge - ! - in zb, depth is negative > therefore zb(k) minus zb(k1) - ! - beta=0 means a horizontal or decreasing slope > need alphaig=0 then in IG src/sink term - ! - !betan_local(itheta,k) = (beta/sigm_ig)*sqrt(9.81/max(depth(k), hmin)) ! TL: in case in the future we would need the normalised bed slope again - ! - ! Fraction of breaking waves, based on H(k) - !Qb = min(max(exp(-(Hmx(k)/H(k))**2), 0.0), 1.0) ! Qb percentage of breaking waves according to Baldock's formulation, between 0 and 1 - ! Base on upwind point: - Qb = min(max(exp(-((w(1, itheta, k)*Hmx(k1) + w(2, itheta, k)*Hmx(k2)) / Hprev(itheta))**2), 0.0), 1.0) ! Qb percentage of breaking waves according to Baldock's formulation, between 0 and 1 - ! - qb_local(itheta, k) = Qb - ! - cgprev(itheta) = w(1, itheta, k)*cg_ig(k1) + w(2, itheta, k)*cg_ig(k2) - ! - if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7 .or. ig_opt == 8 .or. ig_opt == 9) then - Sxx(itheta,k1) = ((2.0 * max(0.0,min(1.0,nwav(k1)))) - 0.5) * ee(itheta, k1) ! limit so value of nwav is between 0 and 1 - Sxx(itheta,k2) = ((2.0 * max(0.0,min(1.0,nwav(k2)))) - 0.5) * ee(itheta, k2) ! limit so value of nwav is between 0 and 1 - elseif (ig_opt == 4) then - Sxx(itheta,k1) = ((2.0 * max(0.0,min(1.0,nwav(k1)))) - 0.5) * E_local(k1) ! limit so value of nwav is between 0 and 1 - Sxx(itheta,k2) = ((2.0 * max(0.0,min(1.0,nwav(k2)))) - 0.5) * E_local(k2) ! limit so value of nwav is between 0 and 1 - elseif (ig_opt == 10) then - ! - Sxx(itheta,k1) = SxxoverE(k1) * ee(itheta, k1) - Sxx(itheta,k2) = SxxoverE(k2) * ee(itheta, k2) - ! - endif - ! - Sxxprev(itheta) = w(1, itheta, k)*Sxx(itheta,k1) + w(2, itheta, k)*Sxx(itheta,k2) - ! - eeprev(itheta) = w(1, itheta, k)*ee(itheta, k1) + w(2, itheta, k)*ee(itheta, k2) - eeprev_ig(itheta) = w(1, itheta, k)*ee_ig(itheta, k1) + w(2, itheta, k)*ee_ig(itheta, k2) - ! - Eprev(itheta) = w(1, itheta, k)*E_local(k1) + w(2, itheta, k)*E_local(k2) - Eprev_ig(itheta) = w(1, itheta, k)*E_ig_local(k1) + w(2, itheta, k)*E_ig_local(k2) - ! - Hprev(itheta) = w(1, itheta, k)*H(k1) + w(2, itheta, k)*H(k2) - ! - ! Determine relative waterdepth 'gam' - ! - gam = max(0.5*(Hprev(itheta)/depthprev(itheta,k) + H(k)/depth(k)), 0.0) ! mean gamma over current and upwind point - ! - gam_local(itheta, k) = gam - ! - ! Adjust cg_ig for free infragravity waves release in surfzone - ! TL - Note: cg_ig = cg - if (ig_opt == 8 .or. ig_opt == 9 .or. ig_opt == 10) then - ! - if (ig_opt == 8 ) then - ! Free waves if incident waves start breaking (defined here as 1%) - ! - if (Qb > 0.01) then - ! - cg_ig(k) = sqrt(9.81 * depth(k)) - !cg_ig(k1) = sqrt(9.81 * depth(k1)) !TL - Note: if adjusted, then cgprev from above should also be updated - !cg_ig(k2) = sqrt(9.81 * depth(k2)) - ! - endif - ! - elseif (ig_opt == 9 .or. ig_opt == 10) then - ! - if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then - ! - cg_ig(k) = sqrt(9.81 * depth(k)) - ! - endif - ! - endif - ! - endif - ! - ! Determine dSxx and IG source/sink term 'srcig' - ! - if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7 .or. ig_opt == 8 .or. ig_opt == 9 .or. ig_opt == 10) then - ! - ! Calculate shoaling parameter alpha_ig following Leijnse et al. (2024) - ! - call estimate_shoaling_parameter_alphaig(beta_local(itheta,k), gam, alphaig_local(itheta,k)) ! [input, input, output] - ! - ! Now calculate source term component - ! - ! Newest dSxx/dx based method, using estimate of Sxx(k) using conservative shoaling - if (Sxxprev(itheta)<=0.0) then - ! - srcig_local(itheta, k) = 0.0 !Avoid big jumps in dSxx that can happen if a upwind point is a boundary point with Hinc=0 - ! - else - ! - if (ig_opt == 1 .or. ig_opt == 3 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 7 .or. ig_opt == 8 .or. ig_opt == 9) then ! Option using conservative shoaling for dSxx/dx - ! - ! Calculate Sxx based on conservative shoaling of upwind point's energy: - ! Sxx_cons = E(i-1) * Cg(i-1) / Cg * (2 * n(i) - 0.5) - Sxx_cons = eeprev(itheta) * cgprev(itheta) / cg_ig(k) * ((2.0 * max(0.0,min(1.0,nwav(k)))) - 0.5) - ! Note - limit so value of nwav is between 0 and 1, and Sxx therefore doesn't become NaN for nwav=Infinite - ! - dSxx = Sxx_cons - Sxxprev(itheta) - ! - elseif (ig_opt == 2) then ! Option taking actual difference for dSxx/dx - ! - dSxx = Sxx(itheta,k) - Sxxprev(itheta) - ! - elseif (ig_opt == 4) then ! Option using conservative shoaling for dSxx/dx - ! now using Eprev instead of eeprev - Sxx_cons = Eprev(itheta) * cgprev(itheta) / cg_ig(k) * ((2.0 * max(0.0,min(1.0,nwav(k)))) - 0.5) - ! - dSxx = Sxx_cons - Sxxprev(itheta) - ! - elseif (ig_opt == 10) then - ! - ! TODO: think whether using eeprev(itheta) rather than E_local is isue or not! - !Sxx_cons = eeprev(itheta) * cgprev(itheta) / cg_ig(k) * ((2.0 * max(0.0,min(1.0,nwav(k)))) - 0.5) - Sxx_cons = Eprev(itheta) /max(E_local(k), 1.0e-6) * ee(itheta,k) * cgprev(itheta) / cg_ig(k) * ((2.0 * max(0.0,min(1.0,nwav(k)))) - 0.5) - - ! - dSxx = Sxx_cons - Sxxprev(itheta) - ! - endif - ! - dSxx = max(dSxx, 0.0) - ! - if (ig_opt == 1 .or. ig_opt == 2) then - ! - srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(eeprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) - ! - elseif (ig_opt == 3 .or. ig_opt == 4 .or. ig_opt == 5 .or. ig_opt == 6 .or. ig_opt == 8 .or. ig_opt == 9 .or. ig_opt == 10) then - ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy - ! - srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) - ! - elseif (ig_opt == 7) then - ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy - ! - ! Now also reduced by fraction of breaking waves (1-Qb) - ! - srcig_local(itheta, k) = (1 - Qb) * alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) - ! - endif - ! - ! Limit srcig to only where incident waves are not maximum dissipated - ! Calculated by determining the sign of delta Dw (positive means not yet the max Dw reached, meaning not yet at approximately hbr=Hinc,0/h,i) - ! In this way, don't need to look along a transect and no Hinc,0 value needed - ! - ! Ergo, it is assumed that after this point IG waves are free, and no bound wave forcing is happening anymore, so srcig should be 0 from here on - ! - if (ig_opt == 5) then - ! - !write(*,*)'Dw', Dw - ! - Dwprev = w(1, itheta, k)*Dw(k1) + w(2, itheta, k)*Dw(k2) - delta_Dw = Dw(k) - Dwprev - ! - if (delta_Dw < 0.0) then - ! - !write(*,*)'delta_Dw', delta_Dw - srcig_local(itheta, k) = 0.0 - ! - endif - ! - elseif (ig_opt == 6) then - ! - ! Percentage of breaking waves Qb = exp(-(Hmx(k) / H(k))**2.0) - ! - ! Free waves if incident waves start breaking (defined here as 1%) - ! - if (Qb > 0.01) then - ! - srcig_local(itheta, k) = 0.0 - ! - endif - ! - elseif (ig_opt == 8) then - ! - ! Free waves if incident waves start breaking (defined here as 1%) - ! - if (Qb > 0.01) then - ! - !cg_ig(k) = SQRT(9.81 * depth(k)) - srcig_local(itheta, k) = 0.0 - ! - endif - ! - elseif (ig_opt == 9 .or. ig_opt == 10) then - ! - ! Free waves if incident waves start breaking (defined here as gam=Hm0,inc / h > 0.5) - ! - ! gam is in Hrms, so multiply by sqrt(2) - !if ((gam * sqrt(2.0)) > 0.5) then - if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then - ! - srcig_local(itheta, k) = 0.0 - ! - endif - endif - ! - endif - ! - else ! TL: option to add future parameterisations here for e.g. coral reef type coasts - ! - srcig_local(itheta, k) = 0.0 - ! - endif - ! - srcig_local(itheta, k) = max(srcig_local(itheta, k), 0.0) - ! - endif - ! - enddo - ! - endif - ! - enddo - ! - end subroutine determine_infragravity_source_sink_term - + subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br) ! implicit none @@ -1462,8 +1116,8 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta real*4, dimension(:,:), intent(inout) :: srcig_local ! Energy source/sink term because of IG wave shoaling real*4, dimension(:), intent(inout) :: cgprev ! group velocity at upwind intersection point real*4, dimension(ntheta,no_nodes), intent(inout):: beta_local ! Local bed slope based on bed level per direction - real*4, dimension(ntheta,no_nodes), intent(inout):: qb_local ! - real*4, dimension(ntheta,no_nodes), intent(inout):: gam_local ! + real*4, dimension(ntheta,no_nodes), intent(inout):: qb_local ! local percentage of breaking waves Qb + real*4, dimension(ntheta,no_nodes), intent(inout):: gam_local ! local incident wave height over water depth ratio ! ! Internal variables integer :: itheta ! directional counter From a1ede23765823417d6e5a6ac3398c19c8a9c0553 Mon Sep 17 00:00:00 2001 From: Leynse Date: Mon, 9 Mar 2026 15:01:07 +0100 Subject: [PATCH 027/118] - Rename subroutine to original name of 'determine_infragravity_source_sink_term' - Rename the main option 11 to ig_opt = 1 (=the default) - For now keep also option 11 for ease, but exactly the same as 1 - Option 2 is name the same as ig_opt 1, but without using the conservative shoaling (as before) - ig_opt = 3 is the same as option 1, but with including the cg_ig adjustment - turn off ig_opt 12 - currently does not work, need to further check moving from R- to B-term --- source/src/snapwave/snapwave_solver.f90 | 59 ++++++++++++------------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 4b8f9078d..12203830c 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -481,7 +481,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term: ! - call determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br) + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br) ! ! inout: alphaig_local, srcig_local, cgprev, beta_local, qb_local, gam_local ! in: the rest @@ -564,7 +564,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term - every first sweep of iteration ! - call determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br) + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br) ! endif ! @@ -1086,7 +1086,7 @@ subroutine baldock (rho,g,alfa,gamma,depth,H,T,opt,Dw,Hmax) ! end subroutine baldock - subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br) + subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br) ! implicit none ! @@ -1171,7 +1171,6 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta ! Sxx(k) = (((2.0 * max(0.0,min(1.0,nwav(k)))) - 0.5) * E_local(k)) ! - !endif enddo ! ! Actual computation of srcig @@ -1226,23 +1225,23 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta ! gam_local(itheta, k) = gam ! + ! Free waves and no IG source/sink term if incident waves start breaking + ! ! Adjust cg_ig for free infragravity waves release in surfzone ! TL - Note: cg_ig = cg - !if (ig_opt == 11 .or. ig_opt == 12) then - ! ! - ! !if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then - ! !if ((gam * sqrt(2.0)) > (gamma_fac_br * gamma)) then - ! if (gam > (gamma_fac_br * gamma)) then - ! ! - ! cg_ig(k) = sqrt(9.81 * depth(k)) - ! ! - ! endif - ! ! - !endif + if (ig_opt == 3) then + ! + if (gam > (gamma_fac_br * gamma)) then + ! + cg_ig(k) = sqrt(9.81 * depth(k)) + ! + endif + ! + endif ! ! Determine dSxx and IG source/sink term 'srcig' ! - if (ig_opt == 11 .or. ig_opt == 12) then + if (ig_opt == 1 .or. ig_opt == 11 .or. ig_opt == 2 .or. ig_opt == 3) then ! ! Calculate shoaling parameter alpha_ig following Leijnse et al. (2024) ! @@ -1257,7 +1256,7 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta ! else ! - if (ig_opt == 11 .or. ig_opt == 12) then ! Option using conservative shoaling for dSxx/dx + if (ig_opt == 1 .or. ig_opt == 11 .or. ig_opt == 3) then ! Option using conservative shoaling for dSxx/dx ! ! Calculate Sxx based on conservative shoaling of upwind point's energy: ! Sxx_cons = E(i-1) * Cg(i-1) / Cg * (2 * n(i) - 0.5) @@ -1265,38 +1264,36 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta ! Note - limit so value of nwav is between 0 and 1, and Sxx therefore doesn't become NaN for nwav=Infinite ! dSxx = Sxx_cons - Sxxprev(itheta) - ! + ! + elseif (ig_opt == 2) then ! Option taking actual difference for dSxx/dx + ! + dSxx = Sxx(itheta,k) - Sxxprev(itheta) endif ! dSxx = max(dSxx, 0.0) ! - if (ig_opt == 11) then + if (ig_opt == 1 .or. ig_opt == 11 .or. ig_opt == 2 .or. ig_opt == 3) then ! ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy ! NOTE - already here multiplied with ee(itheta,k), for direct inclusion in 'R'-term srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) /max(E_local(k), 1.0e-6) * ee(itheta,k) ! - elseif (ig_opt == 12) then + !elseif (ig_opt == 12) then ! - ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy ! NOTE - in main script this is multiplied with ee(itheta,k) to get directional energy, for direct inclusion in 'B'-term ! - srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) /max(E_local(k), 1.0e-6) !* ee(itheta,k) + !srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) /max(E_local(k), 1.0e-6) !* ee(itheta,k) endif ! - ! Limit srcig to only where incident waves are not maximum dissipated - ! Calculated by determining the sign of delta Dw (positive means not yet the max Dw reached, meaning not yet at approximately hbr=Hinc,0/h,i) - ! In this way, don't need to look along a transect and no Hinc,0 value needed + ! Limit srcig to 0 after waves start (significantly) breaking, as defined here as gam=Hrms,inc / h > (gamma_fac_br * gamma) ! ! Ergo, it is assumed that after this point IG waves are free, and no bound wave forcing is happening anymore, so srcig should be 0 from here on ! - if (ig_opt == 11 .or. ig_opt == 12) then + if (ig_opt == 1 .or. ig_opt == 11 .or. ig_opt == 2 .or. ig_opt == 3) then ! - ! Free waves if incident waves start breaking (defined here as gam=Hrms,inc / h > (gamma_fac_br * gamma)) + ! Free waves and no IG source/sink term if incident waves start breaking ! - ! gam is in Hrms, so multiply by sqrt(2) for Hm0 - !if ((gam * sqrt(2.0)) > (2.0 / 3.0 * gamma)) then - !if ((gam * sqrt(2.0)) > (gamma_fac_br * gamma)) then + ! Note - gam is in Hrms if (gam > (gamma_fac_br * gamma)) then ! srcig_local(itheta, k) = 0.0 @@ -1322,7 +1319,7 @@ subroutine determine_infragravity_source_sink_term_overE(inner, no_nodes, ntheta ! enddo ! - end subroutine determine_infragravity_source_sink_term_overE + end subroutine determine_infragravity_source_sink_term subroutine estimate_shoaling_parameter_alphaig(beta, gam, alphaig) real*4, intent(in) :: beta From 2971fdd23d152c3c0bf1aad4a8d19d09e4a9d15f Mon Sep 17 00:00:00 2001 From: Leynse Date: Mon, 9 Mar 2026 15:02:43 +0100 Subject: [PATCH 028/118] - Fix change indexing --- source/src/snapwave/snapwave_solver.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 12203830c..4987e9b85 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1267,7 +1267,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! elseif (ig_opt == 2) then ! Option taking actual difference for dSxx/dx ! - dSxx = Sxx(itheta,k) - Sxxprev(itheta) + dSxx = Sxx(itheta) - Sxxprev(itheta) endif ! dSxx = max(dSxx, 0.0) From 2519dafbdd9ee7745ab1265efd323a063690d585 Mon Sep 17 00:00:00 2001 From: Leynse Date: Mon, 9 Mar 2026 17:33:17 +0100 Subject: [PATCH 029/118] - Actually set default to 1 again --- source/src/sfincs_snapwave.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index 95b4f2c68..d54ef7293 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -655,7 +655,7 @@ subroutine read_snapwave_input() call read_real_input(500,'snapwave_shinc2ig',shinc2ig,1.0) ! Ratio of how much of the calculated IG wave source term, is subtracted from the incident wave energy (0-1, 1=default=all energy as sink) call read_real_input(500,'snapwave_alphaigfac',alphaigfac,1.0) ! Multiplication factor for IG shoaling source/sink term call read_real_input(500,'snapwave_baldock_ratio_ig',baldock_ratio_ig,0.2) - call read_int_input(500,'snapwave_ig_opt',ig_opt,11) + call read_int_input(500,'snapwave_ig_opt',ig_opt,1) call read_int_input(500,'snapwave_iterative_srcig',iterative_srcig_opt,0) ! Option whether to calculate IG source/sink term in iterative lower (better, but potentially slower, 1=default), or effectively based on previous timestep (faster, potential mismatch, =0) ! ! IG boundary conditions options: From 533fe33000b86b921fdc90dc715bbe7b1bc23e03 Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 10 Mar 2026 18:26:36 +0100 Subject: [PATCH 030/118] - Add a smooth transition function as suggested by Maarten. Now there is a more gradual decreasing of srcig to 0 . - 'transition_factor' is controled around 'gamma_fac_br * gamma' as center - And width controlled by transition_factor_width > 0.005 seems to work well - With this, found best gamma_fac_br to be 0.45 now - adjusted default value --- source/src/sfincs_lib.f90 | 4 ++-- source/src/sfincs_snapwave.f90 | 2 +- source/src/snapwave/snapwave_solver.f90 | 22 ++++++++++++++++++---- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/source/src/sfincs_lib.f90 b/source/src/sfincs_lib.f90 index 763124678..a27ebced1 100644 --- a/source/src/sfincs_lib.f90 +++ b/source/src/sfincs_lib.f90 @@ -92,8 +92,8 @@ function sfincs_initialize() result(ierr) ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! - build_revision = "$Rev: v2.3.0 mt. Faber+:branch-281" - build_date = "$Date: 2026-03-09" + build_revision = "$Rev: v2.3.0+ mt. Faber:branch-281" + build_date = "$Date: 2026-03-10" ! call write_log('', 1) call write_log('------------ Welcome to SFINCS ------------', 1) diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index d54ef7293..75673dec4 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -651,7 +651,7 @@ subroutine read_snapwave_input() call read_real_input(500,'snapwave_alpha_ig',alpha_ig,1.0) !FIXME choose whether snapwave_alphaig or snapwave_gamma_ig call read_real_input(500,'snapwave_gammaig',gamma_ig,0.7) !FIXME choose whether snapwave_alphaig or snapwave_gamma_ig !call read_real_input(500,'snapwave_gamma_fac_br',gamma_fac_br,2.0/3.0) ! factor times gamma that is used to determine the maximum incident wave breaking point in the surf zone using local incident wave height over water depth ratio, among others used to set the IG source term to 0 shallower than this point - call read_real_input(500,'snapwave_gamma_fac_br',gamma_fac_br,0.47) ! factor times gamma that is used to determine the maximum incident wave breaking point in the surf zone using local incident wave height over water depth ratio, among others used to set the IG source term to 0 shallower than this point + call read_real_input(500,'snapwave_gamma_fac_br',gamma_fac_br,0.45) ! factor times gamma that is used to determine the maximum incident wave breaking point in the surf zone using local incident wave height over water depth ratio, among others used to set the IG source term to 0 shallower than this point call read_real_input(500,'snapwave_shinc2ig',shinc2ig,1.0) ! Ratio of how much of the calculated IG wave source term, is subtracted from the incident wave energy (0-1, 1=default=all energy as sink) call read_real_input(500,'snapwave_alphaigfac',alphaigfac,1.0) ! Multiplication factor for IG shoaling source/sink term call read_real_input(500,'snapwave_baldock_ratio_ig',baldock_ratio_ig,0.2) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 4987e9b85..2a75e198b 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1135,8 +1135,9 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d real*4 :: dSxx ! difference in Radiation stress real*4 :: Sxx_cons ! conservative estimate of radiation stress using conservative shoaling real*4 :: delta_Dw ! difference of Dw compared to upwind point, to get sign for max breaking point - real*4 :: Dwprev real*4 :: Qb ! Percentage of breaking incident waves + real*4 :: transition_factor ! Transition factor for letting srcig go to zero smoothly, around gamma*gamma_fac_br + real*4 :: transition_factor_width ! Width factor of generalized (FermiDirac style) transfer function with adjustable midpoint and width ! ! Allocate internal variables allocate(Sxxprev(ntheta)) @@ -1152,6 +1153,10 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d E_local = 0.0 E_ig_local = 0.0 ! + ! Used is generalized (FermiDirac style) transfer function with adjustable midpoint and width + ! + transition_factor_width = 0.005 + ! ! Precompute all Sxx - FIXME - add parallellisation ! do k = 1, no_nodes @@ -1289,7 +1294,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! Ergo, it is assumed that after this point IG waves are free, and no bound wave forcing is happening anymore, so srcig should be 0 from here on ! - if (ig_opt == 1 .or. ig_opt == 11 .or. ig_opt == 2 .or. ig_opt == 3) then + if (ig_opt == 11 .or. ig_opt == 2 .or. ig_opt == 3) then ! ! Free waves and no IG source/sink term if incident waves start breaking ! @@ -1298,8 +1303,17 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! srcig_local(itheta, k) = 0.0 ! - endif - endif + endif + ! + elseif (ig_opt == 1) then + ! + ! Let srcig transition to 0 more smoothly using fac_transition that reduced from 1 to 0 around gamma_fac_br * snapwave_gamma + ! + transition_factor = 1.0 - (1.0 / (1.0 + exp(- (gam - (gamma_fac_br * gamma)) / transition_factor_width))) + ! + srcig_local(itheta, k) = transition_factor * srcig_local(itheta, k) + ! + endif ! endif ! From a475787503b7da2d7b8f710f10072db97b74cd7e Mon Sep 17 00:00:00 2001 From: MarliesA Date: Thu, 12 Mar 2026 10:47:59 +0100 Subject: [PATCH 031/118] merged veggie shortwave drag branch143 into current main --- source/src/sfincs_data.f90 | 2 + source/src/sfincs_domain.f90 | 2 +- source/src/sfincs_input.f90 | 17 + source/src/sfincs_momentum.f90 | 80 + source/src/sfincs_quadtree.F90 | 76 +- source/src/sfincs_snapwave.f90 | 2 +- source/src/snapwave/RFveg.inc | 3970 +++++++++++++++++++++ source/src/snapwave/snapwave_RFtable.f90 | 3990 ++++++++++++++++++++++ source/src/snapwave/snapwave_domain.f90 | 43 +- source/src/snapwave/snapwave_solver.f90 | 273 +- 10 files changed, 8418 insertions(+), 37 deletions(-) create mode 100644 source/src/snapwave/RFveg.inc create mode 100644 source/src/snapwave/snapwave_RFtable.f90 diff --git a/source/src/sfincs_data.f90 b/source/src/sfincs_data.f90 index 43a3918b9..852bf3d9d 100644 --- a/source/src/sfincs_data.f90 +++ b/source/src/sfincs_data.f90 @@ -202,6 +202,7 @@ module sfincs_data logical :: subgrid logical :: manning2d ! spatially-varying roughness logical :: coriolis + logical :: vegetation logical :: store_cumulative_precipitation logical :: store_maximum_waterlevel logical :: store_maximum_waterdepth @@ -216,6 +217,7 @@ module sfincs_data logical :: store_zvolume logical :: store_storagevolume logical :: store_meteo + logical :: store_vegetation logical :: store_wind logical :: store_wind_max logical :: store_wave_forces diff --git a/source/src/sfincs_domain.f90 b/source/src/sfincs_domain.f90 index f4b8fe1b1..c07b455d5 100644 --- a/source/src/sfincs_domain.f90 +++ b/source/src/sfincs_domain.f90 @@ -179,7 +179,7 @@ subroutine initialize_mesh() ! ! Read quadtree file ! - call quadtree_read_file(qtrfile, snapwave, nonhydrostatic) + call quadtree_read_file(qtrfile, snapwave, nonhydrostatic, store_vegetation) ! else ! diff --git a/source/src/sfincs_input.f90 b/source/src/sfincs_input.f90 index c07925752..edc4abbc6 100644 --- a/source/src/sfincs_input.f90 +++ b/source/src/sfincs_input.f90 @@ -25,6 +25,8 @@ subroutine read_sfincs_input() integer itsunamitime integer ispinupmeteo integer isnapwave + integer ivegetationsnapwave + integer ivegetationsfincs integer iwindmax integer iwind integer ioutfixed @@ -241,8 +243,11 @@ subroutine read_sfincs_input() ! Limit to range (0,100) percdoneval = max(min(percdoneval,100), 0) ! + call read_int_input(500,'vegetation',ivegetationsfincs,0) + ! ! Coupled SnapWave solver related call read_int_input(500,'snapwave_wind',iwind,0) + call read_int_input(500,'snapwave_vegetation',ivegetationsnapwave,0) ! ! Wind drag ! @@ -427,6 +432,13 @@ subroutine read_sfincs_input() endif endif ! + store_vegetation = .false. + if (ivegetationsnapwave==1 .or. ivegetationsfincs==1) then + ! + store_vegetation = .true. + ! vegetation can be used in SnapWave and/or SFINCS calculations + endif + ! store_twet = .false. if (storetwet==1) then store_twet = .true. @@ -523,6 +535,11 @@ subroutine read_sfincs_input() call write_log('Info : turning on process: Viscosity', 0) endif ! + vegetation = .false. + if (ivegetationsfincs>0) then + vegetation = .true. + endif + ! spinup_meteo = .true. if (ispinupmeteo==0) then spinup_meteo = .false. diff --git a/source/src/sfincs_momentum.f90 b/source/src/sfincs_momentum.f90 index c586b6a76..27ce7a61e 100644 --- a/source/src/sfincs_momentum.f90 +++ b/source/src/sfincs_momentum.f90 @@ -7,6 +7,8 @@ module sfincs_momentum contains ! subroutine compute_fluxes(dt, tloop) + ! + use quadtree ! TEMP - to get the veggie variables, not the final solution, should go through sfincs_domain.f90 ! ! Computes fluxes over subgrid u and v points ! @@ -23,6 +25,7 @@ subroutine compute_fluxes(dt, tloop) integer :: nmu integer :: n integer :: m + integer :: iveg integer :: idir integer :: iref @@ -115,6 +118,49 @@ subroutine compute_fluxes(dt, tloop) !$omp end do !$omp end parallel ! + !Precalculate veggie terms: + ! + if (vegetation) then + ! New : vegetation drag due to mean flow + ! + if (quadtree_no_secveg > 0) then + ! only in case vegetation is present + ! + !$omp parallel & + !$omp private ( ip, nm, iveg ) + !$omp do + !$acc loop independent, gang, vector + ! + do ip = 1, npuv + ! + !if (kcuv(ip)==1) then + ! + ! Regular UV point + ! + ! Indices of surrounding water level points + ! + nm = uv_index_z_nm(ip) + ! + !do iveg=1,quadtree_no_secveg ! for each vertical vegetation section + ! + iveg = 1 + ! + veg_fvm(nm, iveg) = 0.5 * veg_CdBNstems(nm, iveg) * uv0(ip) * abs(uv0(ip)) / rhow + ! in flux loop only still needs to be multiplied with 'hvegeff', which can still change + ! + ! NOTE: veg_CdBNstems = quadtree_snapwave_veg_Cd(nm, iveg) * quadtree_snapwave_veg_bstems(nm, iveg) * quadtree_snapwave_veg_Nstems(nm, iveg) + ! + !endif + enddo + !$omp end do + !$omp end parallel + else + ! + vegetation = .false. + ! + endif + endif + ! ! Copy flux and velocity from previous time step ! !$acc parallel, present( kcuv, kfuv, zs, q, q0, uv, uv0, zsderv, & @@ -581,6 +627,40 @@ subroutine compute_fluxes(dt, tloop) ! endif ! + if (vegetation) then + ! New : vegetation drag due to mean flow + + ! + + ! + !fvm = 0.0 + ! + !do iveg=1,quadtree_no_secveg ! for each vertical vegetation section + ! fvm = fvm + veg_fvm(nm,iveg) * min(quadtree_snapwave_veg_ah(ip,iveg), hu) + !enddo + ! + ! With all pre-calculateable terms already pre-determined for Fvm, beside effective depth: + iveg=1 !for testing keep at 1 + + + + + + + + + + + + ! + fvm = veg_fvm(nm,iveg) * min(quadtree_snapwave_veg_ah(ip,iveg), hu) + ! FIXME Question TL: water depth per layer, or always compared to lower bed level, or? + ! + frc = frc - fvm ! FIXME - minus OR plus? + !frc = frc + fvm ! FIXME - minus OR plus? + ! + endif + ! ! Compute flux qfr used for friction term ! if (kfuv(ip) == 0) then diff --git a/source/src/sfincs_quadtree.F90 b/source/src/sfincs_quadtree.F90 index 72a5397a9..a8a3c8849 100644 --- a/source/src/sfincs_quadtree.F90 +++ b/source/src/sfincs_quadtree.F90 @@ -47,27 +47,37 @@ module quadtree integer*1, dimension(:), allocatable :: quadtree_snapwave_mask integer*1, dimension(:), allocatable :: quadtree_nonh_mask ! + real*4, dimension(:,:), allocatable :: quadtree_snapwave_veg_Cd + real*4, dimension(:,:), allocatable :: quadtree_snapwave_veg_ah + real*4, dimension(:,:), allocatable :: quadtree_snapwave_veg_bstems + real*4, dimension(:,:), allocatable :: quadtree_snapwave_veg_Nstems + real*4, dimension(:,:), allocatable :: veg_CdBNstems, veg_fvm + real*4 :: fvm + ! + integer :: quadtree_no_secveg ! nr of vegetation sections in vertical + ! type net_type_qtr integer :: ncid - integer :: np_dimid + integer :: np_dimid, nsec_dimid integer :: n_varid, m_varid integer :: level_varid integer :: nu_varid, mu_varid, nd_varid, md_varid integer :: nu1_varid, mu1_varid, nd1_varid, md1_varid, nu2_varid, mu2_varid, nd2_varid, md2_varid integer :: z_varid, mask_varid, snapwave_mask_varid, nonh_mask_varid + integer :: snapwave_veg_Cd_varid, snapwave_veg_ah_varid, snapwave_veg_bstems_varid, snapwave_veg_Nstems_varid end type type(net_type_qtr) :: net_file_qtr ! contains ! - subroutine quadtree_read_file(qtrfile, snapwave, nonhydrostatic) + subroutine quadtree_read_file(qtrfile, snapwave, nonhydrostatic, store_vegetation) ! ! Reads quadtree file ! implicit none ! character*256, intent(in) :: qtrfile - logical, intent(in) :: snapwave, nonhydrostatic + logical, intent(in) :: snapwave, nonhydrostatic, store_vegetation ! real*4, dimension(:), allocatable :: dxr real*4, dimension(:), allocatable :: dyr @@ -90,7 +100,7 @@ subroutine quadtree_read_file(qtrfile, snapwave, nonhydrostatic) ok = check_file_exists(qtrfile, 'Quadtree qtr file', .true.) ! if (quadtree_netcdf) then - call quadtree_read_file_netcdf(qtrfile, snapwave, nonhydrostatic) + call quadtree_read_file_netcdf(qtrfile, snapwave, nonhydrostatic, store_vegetation) else call quadtree_read_file_binary(qtrfile) endif @@ -291,17 +301,17 @@ subroutine quadtree_read_file_binary(qtrfile) end subroutine - subroutine quadtree_read_file_netcdf(qtrfile, snapwave, nonhydrostatic) + subroutine quadtree_read_file_netcdf(qtrfile, snapwave, nonhydrostatic, store_vegetation) ! ! Reads quadtree file from netcdf file ! implicit none ! character*256, intent(in) :: qtrfile - logical, intent(in) :: snapwave, nonhydrostatic + logical, intent(in) :: snapwave, nonhydrostatic, store_vegetation ! integer*1 :: iversion - integer :: np, ip, iepsg, status + integer :: np, nm, ip, iveg, iepsg, status ! write(logstr,'(a,a)')'Info : reading QuadTree netCDF file ', trim(qtrfile) call write_log(logstr, 0) @@ -343,7 +353,34 @@ subroutine quadtree_read_file_netcdf(qtrfile, snapwave, nonhydrostatic) NF90(nf90_inq_varid(net_file_qtr%ncid, 'snapwave_mask', net_file_qtr%snapwave_mask_varid)) ! allocate(quadtree_snapwave_mask(np)) - ! + + if (store_vegetation) then ! only read snapwave_veg_Cd, _ah, _bstems, _Nstems if snapwave_vegetation turned on + ! + ! Get dimension of vertical sections + NF90(nf90_inq_dimid(net_file_qtr%ncid, "nsec", net_file_qtr%nsec_dimid)) + ! + NF90(nf90_inquire_dimension(net_file_qtr%ncid, net_file_qtr%nsec_dimid, len = quadtree_no_secveg)) + ! + ! get ids of variables + NF90(nf90_inq_varid(net_file_qtr%ncid, 'snapwave_veg_Cd', net_file_qtr%snapwave_veg_Cd_varid)) + NF90(nf90_inq_varid(net_file_qtr%ncid, 'snapwave_veg_ah', net_file_qtr%snapwave_veg_ah_varid)) + NF90(nf90_inq_varid(net_file_qtr%ncid, 'snapwave_veg_bstems', net_file_qtr%snapwave_veg_bstems_varid)) + NF90(nf90_inq_varid(net_file_qtr%ncid, 'snapwave_veg_Nstems', net_file_qtr%snapwave_veg_Nstems_varid)) + ! + ! allocate variables + allocate(quadtree_snapwave_veg_Cd(np, quadtree_no_secveg)) + allocate(quadtree_snapwave_veg_ah(np, quadtree_no_secveg)) + allocate(quadtree_snapwave_veg_bstems(np, quadtree_no_secveg)) + allocate(quadtree_snapwave_veg_Nstems(np, quadtree_no_secveg)) + ! + allocate(veg_CdBNstems(np, quadtree_no_secveg)) + allocate(veg_fvm(np, quadtree_no_secveg)) + ! + veg_CdBNstems = 0.0 + veg_fvm = 0.0 + fvm = 0.0 + ! + endif endif ! ! Allocate variables @@ -391,6 +428,29 @@ subroutine quadtree_read_file_netcdf(qtrfile, snapwave, nonhydrostatic) NF90(nf90_get_var(net_file_qtr%ncid, net_file_qtr%mask_varid, quadtree_mask(:))) ! if (snapwave) then +! + if (store_vegetation) then + + + + + + ! + NF90(nf90_get_var(net_file_qtr%ncid, net_file_qtr%snapwave_veg_Cd_varid, quadtree_snapwave_veg_Cd(:,:))) + NF90(nf90_get_var(net_file_qtr%ncid, net_file_qtr%snapwave_veg_ah_varid, quadtree_snapwave_veg_ah(:,:))) + NF90(nf90_get_var(net_file_qtr%ncid, net_file_qtr%snapwave_veg_bstems_varid, quadtree_snapwave_veg_bstems(:,:))) + NF90(nf90_get_var(net_file_qtr%ncid, net_file_qtr%snapwave_veg_Nstems_varid, quadtree_snapwave_veg_Nstems(:,:))) + ! + ! Directly determine the multiplication of Cd*bstems*nstems: + ! + do nm = 1, np + ! + do iveg = 1, quadtree_no_secveg + veg_CdBNstems(nm,iveg) = quadtree_snapwave_veg_Cd(nm,iveg) * quadtree_snapwave_veg_bstems(nm,iveg) * quadtree_snapwave_veg_Nstems(nm,iveg) + enddo + ! + enddo + endif NF90(nf90_get_var(net_file_qtr%ncid, net_file_qtr%snapwave_mask_varid, quadtree_snapwave_mask(:))) endif ! diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index 05281e4d2..4b9b9f0c7 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -642,7 +642,7 @@ subroutine read_snapwave_input() ! ! Vegetation input ! - call read_int_input(500, 'vegetation', vegetation_opt, 0) + call read_int_input(500, 'snapwave_vegetation', vegetation_opt, 0) ! ! Input files call read_char_input(500,'snapwave_jonswapfile',snapwave_jonswapfile,'') diff --git a/source/src/snapwave/RFveg.inc b/source/src/snapwave/RFveg.inc new file mode 100644 index 000000000..c231ba55d --- /dev/null +++ b/source/src/snapwave/RFveg.inc @@ -0,0 +1,3970 @@ +! This file is generated by 'scripts/generate.py' using +! /src/xbeachlibrary/variables.def +! /src/xbeachlibrary/params.def +! src/xbeachlibray/templates/RFveg.mako +! Advice: do not edit this file, but above mentioned files. + +real*8 , dimension(11,18,20),parameter :: RFveg=reshape((/ & +22.47180000000000 , & +0.22370000000000 , & +-0.00050000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +6.26960000000000 , & +0.40090000000000 , & +-0.00030000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +6.13660000000000 , & +0.40960000000000 , & +-0.00110000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +5.93530000000000 , & +0.42340000000000 , & +-0.00240000000000 , & +0.00060000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +5.67800000000000 , & +0.44260000000000 , & +-0.00420000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +2.82390000000000 , & +0.59330000000000 , & +-0.00020000000000 , & +0.00300000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +2.81430000000000 , & +0.59540000000000 , & +-0.00080000000000 , & +0.00600000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +2.79860000000000 , & +0.59870000000000 , & +-0.00170000000000 , & +0.00910000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +2.77700000000000 , & +0.60340000000000 , & +-0.00300000000000 , & +0.01230000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +2.74970000000000 , & +0.60930000000000 , & +-0.00460000000000 , & +0.01560000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +2.71710000000000 , & +0.61660000000000 , & +-0.00660000000000 , & +0.01910000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +2.67920000000000 , & +0.62540000000000 , & +-0.00890000000000 , & +0.02270000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +2.63520000000000 , & +0.63580000000000 , & +-0.01150000000000 , & +0.02650000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +2.58340000000000 , & +0.64860000000000 , & +-0.01440000000000 , & +0.03050000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.03050000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.03050000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.03050000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.03050000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.03050000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.03050000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.03050000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.03050000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.03050000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.68990000000000 , & +0.74360000000000 , & +-0.00020000000000 , & +0.00720000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.68850000000000 , & +0.74420000000000 , & +-0.00060000000000 , & +0.01440000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.68610000000000 , & +0.74530000000000 , & +-0.00140000000000 , & +0.02160000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.68270000000000 , & +0.74680000000000 , & +-0.00240000000000 , & +0.02880000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.67830000000000 , & +0.74870000000000 , & +-0.00380000000000 , & +0.03600000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.67290000000000 , & +0.75120000000000 , & +-0.00540000000000 , & +0.04320000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.66640000000000 , & +0.75410000000000 , & +-0.00730000000000 , & +0.05030000000000 , & +0.00050000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.65870000000000 , & +0.75760000000000 , & +-0.00960000000000 , & +0.05740000000000 , & +0.00070000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.64960000000000 , & +0.76180000000000 , & +-0.01210000000000 , & +0.06450000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.63910000000000 , & +0.76660000000000 , & +-0.01480000000000 , & +0.07160000000000 , & +0.00120000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.62690000000000 , & +0.77240000000000 , & +-0.01790000000000 , & +0.07850000000000 , & +0.00160000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.61250000000000 , & +0.77930000000000 , & +-0.02110000000000 , & +0.08530000000000 , & +0.00210000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.59500000000000 , & +0.78780000000000 , & +-0.02460000000000 , & +0.09180000000000 , & +0.00270000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.09180000000000 , & +0.00270000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.09180000000000 , & +0.00270000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.09180000000000 , & +0.00270000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.09180000000000 , & +0.00270000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.09180000000000 , & +0.00270000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.20840000000000 , & +0.83200000000000 , & +-0.00010000000000 , & +0.00990000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.20780000000000 , & +0.83230000000000 , & +-0.00050000000000 , & +0.01980000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.20690000000000 , & +0.83300000000000 , & +-0.00120000000000 , & +0.02960000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.20560000000000 , & +0.83380000000000 , & +-0.00220000000000 , & +0.03940000000000 , & +0.00060000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.20390000000000 , & +0.83500000000000 , & +-0.00340000000000 , & +0.04910000000000 , & +0.00100000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.20180000000000 , & +0.83650000000000 , & +-0.00490000000000 , & +0.05880000000000 , & +0.00140000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.19930000000000 , & +0.83830000000000 , & +-0.00660000000000 , & +0.06830000000000 , & +0.00200000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.19620000000000 , & +0.84040000000000 , & +-0.00860000000000 , & +0.07780000000000 , & +0.00260000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.19260000000000 , & +0.84290000000000 , & +-0.01090000000000 , & +0.08700000000000 , & +0.00330000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.18840000000000 , & +0.84590000000000 , & +-0.01340000000000 , & +0.09620000000000 , & +0.00420000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.18360000000000 , & +0.84940000000000 , & +-0.01620000000000 , & +0.10510000000000 , & +0.00520000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.17790000000000 , & +0.85350000000000 , & +-0.01920000000000 , & +0.11370000000000 , & +0.00640000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.17120000000000 , & +0.85840000000000 , & +-0.02240000000000 , & +0.12210000000000 , & +0.00770000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.16330000000000 , & +0.86420000000000 , & +-0.02590000000000 , & +0.13000000000000 , & +0.00920000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.15370000000000 , & +0.87140000000000 , & +-0.02960000000000 , & +0.13740000000000 , & +0.01100000000000 , & +0.00040000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +1.14090000000000 , & +0.88110000000000 , & +-0.03350000000000 , & +0.14380000000000 , & +0.01320000000000 , & +0.00070000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.14380000000000 , & +0.01320000000000 , & +0.00070000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.14380000000000 , & +0.01320000000000 , & +0.00070000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.94900000000000 , & +0.88270000000000 , & +-0.00010000000000 , & +0.01140000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.94860000000000 , & +0.88310000000000 , & +-0.00050000000000 , & +0.02280000000000 , & +0.00040000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.94790000000000 , & +0.88380000000000 , & +-0.00110000000000 , & +0.03420000000000 , & +0.00080000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.94690000000000 , & +0.88480000000000 , & +-0.00200000000000 , & +0.04550000000000 , & +0.00150000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.94550000000000 , & +0.88600000000000 , & +-0.00320000000000 , & +0.05670000000000 , & +0.00230000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.94390000000000 , & +0.88750000000000 , & +-0.00460000000000 , & +0.06770000000000 , & +0.00330000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.94190000000000 , & +0.88940000000000 , & +-0.00620000000000 , & +0.07860000000000 , & +0.00450000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.93960000000000 , & +0.89160000000000 , & +-0.00810000000000 , & +0.08920000000000 , & +0.00590000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.93690000000000 , & +0.89410000000000 , & +-0.01020000000000 , & +0.09970000000000 , & +0.00750000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.93380000000000 , & +0.89710000000000 , & +-0.01260000000000 , & +0.10990000000000 , & +0.00930000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.93030000000000 , & +0.90050000000000 , & +-0.01520000000000 , & +0.11980000000000 , & +0.01130000000000 , & +0.00050000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.92630000000000 , & +0.90450000000000 , & +-0.01810000000000 , & +0.12930000000000 , & +0.01350000000000 , & +0.00070000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.92160000000000 , & +0.90900000000000 , & +-0.02120000000000 , & +0.13850000000000 , & +0.01590000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.91630000000000 , & +0.91430000000000 , & +-0.02450000000000 , & +0.14710000000000 , & +0.01850000000000 , & +0.00120000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.91010000000000 , & +0.92050000000000 , & +-0.02800000000000 , & +0.15520000000000 , & +0.02140000000000 , & +0.00160000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.90260000000000 , & +0.92810000000000 , & +-0.03170000000000 , & +0.16240000000000 , & +0.02470000000000 , & +0.00210000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.16240000000000 , & +0.02470000000000 , & +0.00210000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.16240000000000 , & +0.02470000000000 , & +0.00210000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.78580000000000 , & +0.91390000000000 , & +-0.00010000000000 , & +0.01240000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.78530000000000 , & +0.91440000000000 , & +-0.00050000000000 , & +0.02470000000000 , & +0.00070000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.78450000000000 , & +0.91530000000000 , & +-0.00110000000000 , & +0.03700000000000 , & +0.00150000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.78350000000000 , & +0.91650000000000 , & +-0.00200000000000 , & +0.04910000000000 , & +0.00260000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.78210000000000 , & +0.91810000000000 , & +-0.00310000000000 , & +0.06110000000000 , & +0.00410000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.78040000000000 , & +0.92010000000000 , & +-0.00440000000000 , & +0.07290000000000 , & +0.00590000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.77840000000000 , & +0.92250000000000 , & +-0.00600000000000 , & +0.08440000000000 , & +0.00790000000000 , & +0.00040000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.77610000000000 , & +0.92520000000000 , & +-0.00780000000000 , & +0.09570000000000 , & +0.01030000000000 , & +0.00060000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.77350000000000 , & +0.92840000000000 , & +-0.00990000000000 , & +0.10660000000000 , & +0.01290000000000 , & +0.00080000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.77050000000000 , & +0.93190000000000 , & +-0.01220000000000 , & +0.11720000000000 , & +0.01580000000000 , & +0.00120000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.76720000000000 , & +0.93600000000000 , & +-0.01470000000000 , & +0.12740000000000 , & +0.01900000000000 , & +0.00160000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.76350000000000 , & +0.94060000000000 , & +-0.01740000000000 , & +0.13720000000000 , & +0.02230000000000 , & +0.00200000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.75930000000000 , & +0.94570000000000 , & +-0.02040000000000 , & +0.14640000000000 , & +0.02600000000000 , & +0.00260000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.75460000000000 , & +0.95160000000000 , & +-0.02360000000000 , & +0.15510000000000 , & +0.02980000000000 , & +0.00340000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.74930000000000 , & +0.95830000000000 , & +-0.02700000000000 , & +0.16310000000000 , & +0.03390000000000 , & +0.00430000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.74320000000000 , & +0.96620000000000 , & +-0.03050000000000 , & +0.17020000000000 , & +0.03820000000000 , & +0.00540000000000 , & +0.00050000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.73570000000000 , & +0.97600000000000 , & +-0.03430000000000 , & +0.17600000000000 , & +0.04280000000000 , & +0.00680000000000 , & +0.00080000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.17600000000000 , & +0.04280000000000 , & +0.00680000000000 , & +0.00080000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.67260000000000 , & +0.93420000000000 , & +-0.00010000000000 , & +0.01300000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.67210000000000 , & +0.93490000000000 , & +-0.00050000000000 , & +0.02590000000000 , & +0.00100000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.67120000000000 , & +0.93610000000000 , & +-0.00110000000000 , & +0.03870000000000 , & +0.00230000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.67000000000000 , & +0.93780000000000 , & +-0.00190000000000 , & +0.05140000000000 , & +0.00410000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.66850000000000 , & +0.93990000000000 , & +-0.00300000000000 , & +0.06380000000000 , & +0.00630000000000 , & +0.00040000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.66660000000000 , & +0.94250000000000 , & +-0.00430000000000 , & +0.07590000000000 , & +0.00890000000000 , & +0.00060000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.66450000000000 , & +0.94560000000000 , & +-0.00590000000000 , & +0.08770000000000 , & +0.01190000000000 , & +0.00100000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.66200000000000 , & +0.94910000000000 , & +-0.00760000000000 , & +0.09910000000000 , & +0.01530000000000 , & +0.00140000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.65930000000000 , & +0.95310000000000 , & +-0.00960000000000 , & +0.11010000000000 , & +0.01910000000000 , & +0.00200000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.65620000000000 , & +0.95750000000000 , & +-0.01190000000000 , & +0.12070000000000 , & +0.02310000000000 , & +0.00270000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.65280000000000 , & +0.96250000000000 , & +-0.01430000000000 , & +0.13080000000000 , & +0.02740000000000 , & +0.00350000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.64910000000000 , & +0.96800000000000 , & +-0.01700000000000 , & +0.14030000000000 , & +0.03190000000000 , & +0.00450000000000 , & +0.00040000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.64510000000000 , & +0.97410000000000 , & +-0.01990000000000 , & +0.14930000000000 , & +0.03660000000000 , & +0.00570000000000 , & +0.00060000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.64060000000000 , & +0.98090000000000 , & +-0.02300000000000 , & +0.15760000000000 , & +0.04150000000000 , & +0.00700000000000 , & +0.00080000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.63560000000000 , & +0.98850000000000 , & +-0.02620000000000 , & +0.16510000000000 , & +0.04660000000000 , & +0.00860000000000 , & +0.00110000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.63000000000000 , & +0.99740000000000 , & +-0.02970000000000 , & +0.17160000000000 , & +0.05180000000000 , & +0.01050000000000 , & +0.00160000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.62330000000000 , & +1.00810000000000 , & +-0.03340000000000 , & +0.17670000000000 , & +0.05710000000000 , & +0.01270000000000 , & +0.00220000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.17670000000000 , & +0.05710000000000 , & +0.01270000000000 , & +0.00220000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.58910000000000 , & +0.94810000000000 , & +-0.00010000000000 , & +0.01340000000000 , & +0.00040000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.58850000000000 , & +0.94910000000000 , & +-0.00050000000000 , & +0.02670000000000 , & +0.00150000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.58750000000000 , & +0.95070000000000 , & +-0.00110000000000 , & +0.03990000000000 , & +0.00320000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.58610000000000 , & +0.95290000000000 , & +-0.00190000000000 , & +0.05280000000000 , & +0.00570000000000 , & +0.00040000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.58440000000000 , & +0.95560000000000 , & +-0.00300000000000 , & +0.06540000000000 , & +0.00870000000000 , & +0.00070000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.58240000000000 , & +0.95900000000000 , & +-0.00420000000000 , & +0.07760000000000 , & +0.01230000000000 , & +0.00120000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.58010000000000 , & +0.96280000000000 , & +-0.00580000000000 , & +0.08940000000000 , & +0.01630000000000 , & +0.00190000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.57740000000000 , & +0.96720000000000 , & +-0.00750000000000 , & +0.10070000000000 , & +0.02070000000000 , & +0.00270000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.57450000000000 , & +0.97210000000000 , & +-0.00950000000000 , & +0.11150000000000 , & +0.02550000000000 , & +0.00380000000000 , & +0.00040000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.57130000000000 , & +0.97760000000000 , & +-0.01170000000000 , & +0.12180000000000 , & +0.03060000000000 , & +0.00500000000000 , & +0.00060000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.56790000000000 , & +0.98350000000000 , & +-0.01410000000000 , & +0.13150000000000 , & +0.03580000000000 , & +0.00640000000000 , & +0.00080000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.56410000000000 , & +0.99010000000000 , & +-0.01670000000000 , & +0.14050000000000 , & +0.04130000000000 , & +0.00810000000000 , & +0.00110000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.56010000000000 , & +0.99720000000000 , & +-0.01950000000000 , & +0.14900000000000 , & +0.04690000000000 , & +0.01000000000000 , & +0.00160000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.55570000000000 , & +1.00510000000000 , & +-0.02250000000000 , & +0.15660000000000 , & +0.05260000000000 , & +0.01210000000000 , & +0.00210000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.55090000000000 , & +1.01390000000000 , & +-0.02570000000000 , & +0.16350000000000 , & +0.05830000000000 , & +0.01440000000000 , & +0.00270000000000 , & +0.00040000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.54550000000000 , & +1.02390000000000 , & +-0.02910000000000 , & +0.16920000000000 , & +0.06400000000000 , & +0.01710000000000 , & +0.00360000000000 , & +0.00060000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.16920000000000 , & +0.06400000000000 , & +0.01710000000000 , & +0.00360000000000 , & +0.00060000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.16920000000000 , & +0.06400000000000 , & +0.01710000000000 , & +0.00360000000000 , & +0.00060000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.52460000000000 , & +0.95820000000000 , & +-0.00010000000000 , & +0.01370000000000 , & +0.00050000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.52390000000000 , & +0.95940000000000 , & +-0.00050000000000 , & +0.02730000000000 , & +0.00190000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.52280000000000 , & +0.96140000000000 , & +-0.00110000000000 , & +0.04060000000000 , & +0.00430000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.52130000000000 , & +0.96410000000000 , & +-0.00190000000000 , & +0.05360000000000 , & +0.00740000000000 , & +0.00070000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.51950000000000 , & +0.96760000000000 , & +-0.00290000000000 , & +0.06620000000000 , & +0.01130000000000 , & +0.00130000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.51730000000000 , & +0.97170000000000 , & +-0.00420000000000 , & +0.07830000000000 , & +0.01580000000000 , & +0.00210000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.51480000000000 , & +0.97650000000000 , & +-0.00570000000000 , & +0.08990000000000 , & +0.02080000000000 , & +0.00320000000000 , & +0.00040000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.51200000000000 , & +0.98180000000000 , & +-0.00740000000000 , & +0.10090000000000 , & +0.02620000000000 , & +0.00460000000000 , & +0.00060000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.50890000000000 , & +0.98770000000000 , & +-0.00940000000000 , & +0.11130000000000 , & +0.03180000000000 , & +0.00620000000000 , & +0.00090000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.50560000000000 , & +0.99410000000000 , & +-0.01150000000000 , & +0.12120000000000 , & +0.03770000000000 , & +0.00810000000000 , & +0.00130000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.50210000000000 , & +1.00110000000000 , & +-0.01390000000000 , & +0.13030000000000 , & +0.04380000000000 , & +0.01020000000000 , & +0.00180000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.49830000000000 , & +1.00870000000000 , & +-0.01640000000000 , & +0.13880000000000 , & +0.04990000000000 , & +0.01260000000000 , & +0.00240000000000 , & +0.00040000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.49430000000000 , & +1.01690000000000 , & +-0.01920000000000 , & +0.14660000000000 , & +0.05610000000000 , & +0.01520000000000 , & +0.00320000000000 , & +0.00050000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.49000000000000 , & +1.02590000000000 , & +-0.02210000000000 , & +0.15360000000000 , & +0.06230000000000 , & +0.01810000000000 , & +0.00410000000000 , & +0.00070000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.48530000000000 , & +1.03590000000000 , & +-0.02530000000000 , & +0.15970000000000 , & +0.06830000000000 , & +0.02120000000000 , & +0.00520000000000 , & +0.00110000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.48000000000000 , & +1.04720000000000 , & +-0.02860000000000 , & +0.16460000000000 , & +0.07420000000000 , & +0.02460000000000 , & +0.00660000000000 , & +0.00150000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.16460000000000 , & +0.07420000000000 , & +0.02460000000000 , & +0.00660000000000 , & +0.00150000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.16460000000000 , & +0.07420000000000 , & +0.02460000000000 , & +0.00660000000000 , & +0.00150000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.47320000000000 , & +0.96560000000000 , & +-0.00010000000000 , & +0.01390000000000 , & +0.00060000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.47250000000000 , & +0.96710000000000 , & +-0.00050000000000 , & +0.02770000000000 , & +0.00250000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.47130000000000 , & +0.96960000000000 , & +-0.00100000000000 , & +0.04110000000000 , & +0.00540000000000 , & +0.00050000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.46960000000000 , & +0.97300000000000 , & +-0.00190000000000 , & +0.05410000000000 , & +0.00930000000000 , & +0.00110000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.46760000000000 , & +0.97720000000000 , & +-0.00290000000000 , & +0.06650000000000 , & +0.01400000000000 , & +0.00200000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.46530000000000 , & +0.98210000000000 , & +-0.00420000000000 , & +0.07840000000000 , & +0.01940000000000 , & +0.00330000000000 , & +0.00040000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.46260000000000 , & +0.98770000000000 , & +-0.00560000000000 , & +0.08960000000000 , & +0.02520000000000 , & +0.00490000000000 , & +0.00070000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.45970000000000 , & +0.99400000000000 , & +-0.00730000000000 , & +0.10020000000000 , & +0.03140000000000 , & +0.00690000000000 , & +0.00120000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.45660000000000 , & +1.00080000000000 , & +-0.00930000000000 , & +0.11020000000000 , & +0.03780000000000 , & +0.00910000000000 , & +0.00170000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.45320000000000 , & +1.00830000000000 , & +-0.01140000000000 , & +0.11940000000000 , & +0.04430000000000 , & +0.01170000000000 , & +0.00240000000000 , & +0.00040000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.44960000000000 , & +1.01630000000000 , & +-0.01370000000000 , & +0.12800000000000 , & +0.05090000000000 , & +0.01450000000000 , & +0.00330000000000 , & +0.00060000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.44590000000000 , & +1.02490000000000 , & +-0.01620000000000 , & +0.13590000000000 , & +0.05750000000000 , & +0.01760000000000 , & +0.00430000000000 , & +0.00090000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.44190000000000 , & +1.03420000000000 , & +-0.01890000000000 , & +0.14300000000000 , & +0.06390000000000 , & +0.02100000000000 , & +0.00560000000000 , & +0.00120000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.43760000000000 , & +1.04430000000000 , & +-0.02180000000000 , & +0.14930000000000 , & +0.07020000000000 , & +0.02460000000000 , & +0.00700000000000 , & +0.00170000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.43300000000000 , & +1.05540000000000 , & +-0.02490000000000 , & +0.15460000000000 , & +0.07630000000000 , & +0.02830000000000 , & +0.00870000000000 , & +0.00220000000000 , & +0.00050000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.42780000000000 , & +1.06820000000000 , & +-0.02820000000000 , & +0.15860000000000 , & +0.08200000000000 , & +0.03240000000000 , & +0.01070000000000 , & +0.00300000000000 , & +0.00070000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.15860000000000 , & +0.08200000000000 , & +0.03240000000000 , & +0.01070000000000 , & +0.00300000000000 , & +0.00070000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.15860000000000 , & +0.08200000000000 , & +0.03240000000000 , & +0.01070000000000 , & +0.00300000000000 , & +0.00070000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.43130000000000 , & +0.97130000000000 , & +-0.00010000000000 , & +0.01410000000000 , & +0.00080000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.43040000000000 , & +0.97320000000000 , & +-0.00050000000000 , & +0.02790000000000 , & +0.00300000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.42910000000000 , & +0.97610000000000 , & +-0.00100000000000 , & +0.04140000000000 , & +0.00660000000000 , & +0.00070000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.42740000000000 , & +0.98020000000000 , & +-0.00180000000000 , & +0.05420000000000 , & +0.01130000000000 , & +0.00160000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.42520000000000 , & +0.98510000000000 , & +-0.00290000000000 , & +0.06650000000000 , & +0.01680000000000 , & +0.00300000000000 , & +0.00040000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.42270000000000 , & +0.99090000000000 , & +-0.00410000000000 , & +0.07800000000000 , & +0.02290000000000 , & +0.00470000000000 , & +0.00080000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.42000000000000 , & +0.99740000000000 , & +-0.00560000000000 , & +0.08880000000000 , & +0.02940000000000 , & +0.00700000000000 , & +0.00130000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.41700000000000 , & +1.00450000000000 , & +-0.00730000000000 , & +0.09890000000000 , & +0.03620000000000 , & +0.00950000000000 , & +0.00200000000000 , & +0.00040000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.41380000000000 , & +1.01230000000000 , & +-0.00920000000000 , & +0.10830000000000 , & +0.04310000000000 , & +0.01250000000000 , & +0.00290000000000 , & +0.00060000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.41040000000000 , & +1.02070000000000 , & +-0.01130000000000 , & +0.11700000000000 , & +0.05010000000000 , & +0.01570000000000 , & +0.00400000000000 , & +0.00090000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.40680000000000 , & +1.02970000000000 , & +-0.01360000000000 , & +0.12500000000000 , & +0.05700000000000 , & +0.01930000000000 , & +0.00530000000000 , & +0.00120000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.40300000000000 , & +1.03930000000000 , & +-0.01600000000000 , & +0.13230000000000 , & +0.06370000000000 , & +0.02300000000000 , & +0.00680000000000 , & +0.00170000000000 , & +0.00040000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.39910000000000 , & +1.04970000000000 , & +-0.01870000000000 , & +0.13880000000000 , & +0.07020000000000 , & +0.02700000000000 , & +0.00860000000000 , & +0.00230000000000 , & +0.00050000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.39480000000000 , & +1.06090000000000 , & +-0.02160000000000 , & +0.14440000000000 , & +0.07650000000000 , & +0.03110000000000 , & +0.01050000000000 , & +0.00310000000000 , & +0.00080000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.39030000000000 , & +1.07320000000000 , & +-0.02460000000000 , & +0.14890000000000 , & +0.08240000000000 , & +0.03540000000000 , & +0.01280000000000 , & +0.00400000000000 , & +0.00110000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.14890000000000 , & +0.08240000000000 , & +0.03540000000000 , & +0.01280000000000 , & +0.00400000000000 , & +0.00110000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.14890000000000 , & +0.08240000000000 , & +0.03540000000000 , & +0.01280000000000 , & +0.00400000000000 , & +0.00110000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.14890000000000 , & +0.08240000000000 , & +0.03540000000000 , & +0.01280000000000 , & +0.00400000000000 , & +0.00110000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.39630000000000 , & +0.97580000000000 , & +-0.00010000000000 , & +0.01420000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.39540000000000 , & +0.97800000000000 , & +-0.00050000000000 , & +0.02810000000000 , & +0.00360000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.39400000000000 , & +0.98150000000000 , & +-0.00100000000000 , & +0.04150000000000 , & +0.00780000000000 , & +0.00100000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.39210000000000 , & +0.98620000000000 , & +-0.00180000000000 , & +0.05410000000000 , & +0.01320000000000 , & +0.00230000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.38980000000000 , & +0.99190000000000 , & +-0.00290000000000 , & +0.06600000000000 , & +0.01950000000000 , & +0.00410000000000 , & +0.00070000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.38720000000000 , & +0.99850000000000 , & +-0.00410000000000 , & +0.07720000000000 , & +0.02620000000000 , & +0.00640000000000 , & +0.00130000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.38440000000000 , & +1.00580000000000 , & +-0.00560000000000 , & +0.08750000000000 , & +0.03330000000000 , & +0.00930000000000 , & +0.00210000000000 , & +0.00040000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.38140000000000 , & +1.01390000000000 , & +-0.00720000000000 , & +0.09710000000000 , & +0.04050000000000 , & +0.01250000000000 , & +0.00320000000000 , & +0.00070000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.37810000000000 , & +1.02260000000000 , & +-0.00910000000000 , & +0.10600000000000 , & +0.04780000000000 , & +0.01610000000000 , & +0.00450000000000 , & +0.00110000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.37470000000000 , & +1.03190000000000 , & +-0.01120000000000 , & +0.11410000000000 , & +0.05490000000000 , & +0.02000000000000 , & +0.00600000000000 , & +0.00150000000000 , & +0.00030000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.37110000000000 , & +1.04180000000000 , & +-0.01340000000000 , & +0.12160000000000 , & +0.06190000000000 , & +0.02410000000000 , & +0.00780000000000 , & +0.00220000000000 , & +0.00050000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.36740000000000 , & +1.05240000000000 , & +-0.01590000000000 , & +0.12820000000000 , & +0.06870000000000 , & +0.02840000000000 , & +0.00980000000000 , & +0.00290000000000 , & +0.00080000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.36350000000000 , & +1.06380000000000 , & +-0.01850000000000 , & +0.13410000000000 , & +0.07510000000000 , & +0.03280000000000 , & +0.01210000000000 , & +0.00390000000000 , & +0.00110000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.35930000000000 , & +1.07610000000000 , & +-0.02130000000000 , & +0.13910000000000 , & +0.08110000000000 , & +0.03730000000000 , & +0.01460000000000 , & +0.00500000000000 , & +0.00150000000000 , & +0.00040000000000 , & +0.00010000000000 , & +0.35480000000000 , & +1.08970000000000 , & +-0.02430000000000 , & +0.14290000000000 , & +0.08660000000000 , & +0.04190000000000 , & +0.01740000000000 , & +0.00640000000000 , & +0.00210000000000 , & +0.00060000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.14290000000000 , & +0.08660000000000 , & +0.04190000000000 , & +0.01740000000000 , & +0.00640000000000 , & +0.00210000000000 , & +0.00060000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.14290000000000 , & +0.08660000000000 , & +0.04190000000000 , & +0.01740000000000 , & +0.00640000000000 , & +0.00210000000000 , & +0.00060000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.14290000000000 , & +0.08660000000000 , & +0.04190000000000 , & +0.01740000000000 , & +0.00640000000000 , & +0.00210000000000 , & +0.00060000000000 , & +0.00020000000000 , & +0.36660000000000 , & +0.97940000000000 , & +-0.00010000000000 , & +0.01430000000000 , & +0.00110000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.36570000000000 , & +0.98190000000000 , & +-0.00050000000000 , & +0.02820000000000 , & +0.00430000000000 , & +0.00050000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.36410000000000 , & +0.98600000000000 , & +-0.00100000000000 , & +0.04140000000000 , & +0.00910000000000 , & +0.00140000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.36220000000000 , & +0.99140000000000 , & +-0.00180000000000 , & +0.05380000000000 , & +0.01520000000000 , & +0.00310000000000 , & +0.00050000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.35980000000000 , & +0.99780000000000 , & +-0.00280000000000 , & +0.06540000000000 , & +0.02200000000000 , & +0.00540000000000 , & +0.00110000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.35720000000000 , & +1.00520000000000 , & +-0.00410000000000 , & +0.07610000000000 , & +0.02930000000000 , & +0.00830000000000 , & +0.00200000000000 , & +0.00040000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.35430000000000 , & +1.01340000000000 , & +-0.00550000000000 , & +0.08600000000000 , & +0.03680000000000 , & +0.01180000000000 , & +0.00310000000000 , & +0.00070000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.35120000000000 , & +1.02230000000000 , & +-0.00720000000000 , & +0.09510000000000 , & +0.04430000000000 , & +0.01560000000000 , & +0.00460000000000 , & +0.00120000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.34790000000000 , & +1.03190000000000 , & +-0.00900000000000 , & +0.10340000000000 , & +0.05170000000000 , & +0.01980000000000 , & +0.00630000000000 , & +0.00180000000000 , & +0.00040000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.34450000000000 , & +1.04210000000000 , & +-0.01110000000000 , & +0.11100000000000 , & +0.05890000000000 , & +0.02420000000000 , & +0.00840000000000 , & +0.00250000000000 , & +0.00070000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.34100000000000 , & +1.05290000000000 , & +-0.01330000000000 , & +0.11790000000000 , & +0.06580000000000 , & +0.02880000000000 , & +0.01060000000000 , & +0.00340000000000 , & +0.00100000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.33730000000000 , & +1.06440000000000 , & +-0.01580000000000 , & +0.12400000000000 , & +0.07240000000000 , & +0.03350000000000 , & +0.01310000000000 , & +0.00450000000000 , & +0.00140000000000 , & +0.00040000000000 , & +0.00010000000000 , & +0.33340000000000 , & +1.07680000000000 , & +-0.01840000000000 , & +0.12930000000000 , & +0.07860000000000 , & +0.03820000000000 , & +0.01590000000000 , & +0.00590000000000 , & +0.00190000000000 , & +0.00060000000000 , & +0.00010000000000 , & +0.32930000000000 , & +1.09020000000000 , & +-0.02110000000000 , & +0.13370000000000 , & +0.08430000000000 , & +0.04300000000000 , & +0.01890000000000 , & +0.00740000000000 , & +0.00260000000000 , & +0.00080000000000 , & +0.00020000000000 , & +0.32490000000000 , & +1.10510000000000 , & +-0.02410000000000 , & +0.13680000000000 , & +0.08930000000000 , & +0.04770000000000 , & +0.02220000000000 , & +0.00920000000000 , & +0.00350000000000 , & +0.00120000000000 , & +0.00040000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.13680000000000 , & +0.08930000000000 , & +0.04770000000000 , & +0.02220000000000 , & +0.00920000000000 , & +0.00350000000000 , & +0.00120000000000 , & +0.00040000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.13680000000000 , & +0.08930000000000 , & +0.04770000000000 , & +0.02220000000000 , & +0.00920000000000 , & +0.00350000000000 , & +0.00120000000000 , & +0.00040000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.13680000000000 , & +0.08930000000000 , & +0.04770000000000 , & +0.02220000000000 , & +0.00920000000000 , & +0.00350000000000 , & +0.00120000000000 , & +0.00040000000000 , & +0.34120000000000 , & +0.98230000000000 , & +-0.00010000000000 , & +0.01430000000000 , & +0.00130000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.34010000000000 , & +0.98520000000000 , & +-0.00050000000000 , & +0.02820000000000 , & +0.00490000000000 , & +0.00060000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.33850000000000 , & +0.98990000000000 , & +-0.00100000000000 , & +0.04130000000000 , & +0.01040000000000 , & +0.00190000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.33650000000000 , & +0.99590000000000 , & +-0.00180000000000 , & +0.05340000000000 , & +0.01710000000000 , & +0.00400000000000 , & +0.00080000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.33410000000000 , & +1.00310000000000 , & +-0.00280000000000 , & +0.06460000000000 , & +0.02440000000000 , & +0.00680000000000 , & +0.00160000000000 , & +0.00030000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.33140000000000 , & +1.01130000000000 , & +-0.00410000000000 , & +0.07480000000000 , & +0.03210000000000 , & +0.01030000000000 , & +0.00280000000000 , & +0.00070000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.32840000000000 , & +1.02030000000000 , & +-0.00550000000000 , & +0.08420000000000 , & +0.03980000000000 , & +0.01430000000000 , & +0.00440000000000 , & +0.00120000000000 , & +0.00030000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.32530000000000 , & +1.03000000000000 , & +-0.00710000000000 , & +0.09280000000000 , & +0.04750000000000 , & +0.01870000000000 , & +0.00630000000000 , & +0.00180000000000 , & +0.00050000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.32210000000000 , & +1.04040000000000 , & +-0.00900000000000 , & +0.10060000000000 , & +0.05490000000000 , & +0.02340000000000 , & +0.00850000000000 , & +0.00270000000000 , & +0.00080000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.31870000000000 , & +1.05150000000000 , & +-0.01100000000000 , & +0.10780000000000 , & +0.06200000000000 , & +0.02820000000000 , & +0.01100000000000 , & +0.00380000000000 , & +0.00120000000000 , & +0.00030000000000 , & +0.00010000000000 , & +0.31520000000000 , & +1.06320000000000 , & +-0.01320000000000 , & +0.11410000000000 , & +0.06880000000000 , & +0.03320000000000 , & +0.01370000000000 , & +0.00500000000000 , & +0.00170000000000 , & +0.00050000000000 , & +0.00010000000000 , & +0.31150000000000 , & +1.07560000000000 , & +-0.01560000000000 , & +0.11980000000000 , & +0.07520000000000 , & +0.03810000000000 , & +0.01670000000000 , & +0.00650000000000 , & +0.00230000000000 , & +0.00070000000000 , & +0.00020000000000 , & +0.30770000000000 , & +1.08890000000000 , & +-0.01820000000000 , & +0.12460000000000 , & +0.08110000000000 , & +0.04310000000000 , & +0.01990000000000 , & +0.00820000000000 , & +0.00310000000000 , & +0.00100000000000 , & +0.00030000000000 , & +0.30370000000000 , & +1.10340000000000 , & +-0.02100000000000 , & +0.12840000000000 , & +0.08630000000000 , & +0.04800000000000 , & +0.02330000000000 , & +0.01020000000000 , & +0.00410000000000 , & +0.00150000000000 , & +0.00050000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.12840000000000 , & +0.08630000000000 , & +0.04800000000000 , & +0.02330000000000 , & +0.01020000000000 , & +0.00410000000000 , & +0.00150000000000 , & +0.00050000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.12840000000000 , & +0.08630000000000 , & +0.04800000000000 , & +0.02330000000000 , & +0.01020000000000 , & +0.00410000000000 , & +0.00150000000000 , & +0.00050000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.12840000000000 , & +0.08630000000000 , & +0.04800000000000 , & +0.02330000000000 , & +0.01020000000000 , & +0.00410000000000 , & +0.00150000000000 , & +0.00050000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.12840000000000 , & +0.08630000000000 , & +0.04800000000000 , & +0.02330000000000 , & +0.01020000000000 , & +0.00410000000000 , & +0.00150000000000 , & +0.00050000000000 , & +0.31900000000000 , & +0.98470000000000 , & +-0.00010000000000 , & +0.01440000000000 , & +0.00150000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.31800000000000 , & +0.98810000000000 , & +-0.00050000000000 , & +0.02820000000000 , & +0.00560000000000 , & +0.00080000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.31630000000000 , & +0.99330000000000 , & +-0.00100000000000 , & +0.04100000000000 , & +0.01170000000000 , & +0.00240000000000 , & +0.00040000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.31420000000000 , & +1.00000000000000 , & +-0.00180000000000 , & +0.05280000000000 , & +0.01890000000000 , & +0.00500000000000 , & +0.00110000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.31170000000000 , & +1.00790000000000 , & +-0.00280000000000 , & +0.06360000000000 , & +0.02660000000000 , & +0.00840000000000 , & +0.00220000000000 , & +0.00050000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.30890000000000 , & +1.01690000000000 , & +-0.00400000000000 , & +0.07340000000000 , & +0.03450000000000 , & +0.01240000000000 , & +0.00380000000000 , & +0.00100000000000 , & +0.00020000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.30600000000000 , & +1.02660000000000 , & +-0.00550000000000 , & +0.08230000000000 , & +0.04240000000000 , & +0.01690000000000 , & +0.00580000000000 , & +0.00170000000000 , & +0.00050000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.30290000000000 , & +1.03720000000000 , & +-0.00710000000000 , & +0.09040000000000 , & +0.05010000000000 , & +0.02180000000000 , & +0.00810000000000 , & +0.00270000000000 , & +0.00080000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.29970000000000 , & +1.04830000000000 , & +-0.00890000000000 , & +0.09780000000000 , & +0.05740000000000 , & +0.02680000000000 , & +0.01080000000000 , & +0.00390000000000 , & +0.00120000000000 , & +0.00040000000000 , & +0.00010000000000 , & +0.29630000000000 , & +1.06020000000000 , & +-0.01090000000000 , & +0.10450000000000 , & +0.06440000000000 , & +0.03200000000000 , & +0.01370000000000 , & +0.00530000000000 , & +0.00180000000000 , & +0.00060000000000 , & +0.00020000000000 , & +0.29280000000000 , & +1.07280000000000 , & +-0.01320000000000 , & +0.11040000000000 , & +0.07100000000000 , & +0.03720000000000 , & +0.01690000000000 , & +0.00690000000000 , & +0.00250000000000 , & +0.00090000000000 , & +0.00030000000000 , & +0.28930000000000 , & +1.08610000000000 , & +-0.01550000000000 , & +0.11560000000000 , & +0.07700000000000 , & +0.04230000000000 , & +0.02030000000000 , & +0.00870000000000 , & +0.00340000000000 , & +0.00120000000000 , & +0.00040000000000 , & +0.28550000000000 , & +1.10040000000000 , & +-0.01810000000000 , & +0.11990000000000 , & +0.08250000000000 , & +0.04740000000000 , & +0.02380000000000 , & +0.01080000000000 , & +0.00450000000000 , & +0.00170000000000 , & +0.00060000000000 , & +0.28150000000000 , & +1.11590000000000 , & +-0.02080000000000 , & +0.12320000000000 , & +0.08730000000000 , & +0.05220000000000 , & +0.02750000000000 , & +0.01320000000000 , & +0.00590000000000 , & +0.00240000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.12320000000000 , & +0.08730000000000 , & +0.05220000000000 , & +0.02750000000000 , & +0.01320000000000 , & +0.00590000000000 , & +0.00240000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.12320000000000 , & +0.08730000000000 , & +0.05220000000000 , & +0.02750000000000 , & +0.01320000000000 , & +0.00590000000000 , & +0.00240000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.12320000000000 , & +0.08730000000000 , & +0.05220000000000 , & +0.02750000000000 , & +0.01320000000000 , & +0.00590000000000 , & +0.00240000000000 , & +0.00090000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.12320000000000 , & +0.08730000000000 , & +0.05220000000000 , & +0.02750000000000 , & +0.01320000000000 , & +0.00590000000000 , & +0.00240000000000 , & +0.00090000000000 , & +0.29970000000000 , & +0.98670000000000 , & +-0.00010000000000 , & +0.01440000000000 , & +0.00170000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.29850000000000 , & +0.99050000000000 , & +-0.00050000000000 , & +0.02810000000000 , & +0.00630000000000 , & +0.00100000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.29680000000000 , & +0.99630000000000 , & +-0.00100000000000 , & +0.04070000000000 , & +0.01290000000000 , & +0.00300000000000 , & +0.00060000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.29460000000000 , & +1.00370000000000 , & +-0.00180000000000 , & +0.05220000000000 , & +0.02050000000000 , & +0.00610000000000 , & +0.00150000000000 , & +0.00030000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.29210000000000 , & +1.01240000000000 , & +-0.00280000000000 , & +0.06250000000000 , & +0.02860000000000 , & +0.01000000000000 , & +0.00300000000000 , & +0.00080000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.28930000000000 , & +1.02200000000000 , & +-0.00400000000000 , & +0.07190000000000 , & +0.03670000000000 , & +0.01450000000000 , & +0.00490000000000 , & +0.00150000000000 , & +0.00040000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.28640000000000 , & +1.03250000000000 , & +-0.00540000000000 , & +0.08040000000000 , & +0.04460000000000 , & +0.01950000000000 , & +0.00730000000000 , & +0.00250000000000 , & +0.00080000000000 , & +0.00020000000000 , & +0.00010000000000 , & +0.28330000000000 , & +1.04380000000000 , & +-0.00710000000000 , & +0.08810000000000 , & +0.05210000000000 , & +0.02470000000000 , & +0.01010000000000 , & +0.00370000000000 , & +0.00120000000000 , & +0.00040000000000 , & +0.00010000000000 , & +0.28010000000000 , & +1.05580000000000 , & +-0.00890000000000 , & +0.09500000000000 , & +0.05930000000000 , & +0.03010000000000 , & +0.01320000000000 , & +0.00520000000000 , & +0.00190000000000 , & +0.00060000000000 , & +0.00020000000000 , & +0.27670000000000 , & +1.06840000000000 , & +-0.01090000000000 , & +0.10130000000000 , & +0.06610000000000 , & +0.03540000000000 , & +0.01660000000000 , & +0.00700000000000 , & +0.00270000000000 , & +0.00090000000000 , & +0.00030000000000 , & +0.27330000000000 , & +1.08180000000000 , & +-0.01310000000000 , & +0.10680000000000 , & +0.07240000000000 , & +0.04080000000000 , & +0.02010000000000 , & +0.00900000000000 , & +0.00370000000000 , & +0.00140000000000 , & +0.00050000000000 , & +0.26980000000000 , & +1.09600000000000 , & +-0.01540000000000 , & +0.11150000000000 , & +0.07810000000000 , & +0.04600000000000 , & +0.02380000000000 , & +0.01120000000000 , & +0.00490000000000 , & +0.00190000000000 , & +0.00070000000000 , & +0.26610000000000 , & +1.11120000000000 , & +-0.01800000000000 , & +0.11540000000000 , & +0.08330000000000 , & +0.05100000000000 , & +0.02760000000000 , & +0.01370000000000 , & +0.00630000000000 , & +0.00270000000000 , & +0.00110000000000 , & +0.26220000000000 , & +1.12780000000000 , & +-0.02060000000000 , & +0.11810000000000 , & +0.08750000000000 , & +0.05560000000000 , & +0.03150000000000 , & +0.01640000000000 , & +0.00790000000000 , & +0.00360000000000 , & +0.00150000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.11810000000000 , & +0.08750000000000 , & +0.05560000000000 , & +0.03150000000000 , & +0.01640000000000 , & +0.00790000000000 , & +0.00360000000000 , & +0.00150000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.11810000000000 , & +0.08750000000000 , & +0.05560000000000 , & +0.03150000000000 , & +0.01640000000000 , & +0.00790000000000 , & +0.00360000000000 , & +0.00150000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.11810000000000 , & +0.08750000000000 , & +0.05560000000000 , & +0.03150000000000 , & +0.01640000000000 , & +0.00790000000000 , & +0.00360000000000 , & +0.00150000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.11810000000000 , & +0.08750000000000 , & +0.05560000000000 , & +0.03150000000000 , & +0.01640000000000 , & +0.00790000000000 , & +0.00360000000000 , & +0.00150000000000 , & +0.28250000000000 , & +0.98850000000000 , & +-0.00010000000000 , & +0.01440000000000 , & +0.00190000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.28130000000000 , & +0.99270000000000 , & +-0.00050000000000 , & +0.02800000000000 , & +0.00700000000000 , & +0.00130000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.27950000000000 , & +0.99910000000000 , & +-0.00100000000000 , & +0.04030000000000 , & +0.01410000000000 , & +0.00370000000000 , & +0.00080000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.27730000000000 , & +1.00710000000000 , & +-0.00180000000000 , & +0.05140000000000 , & +0.02210000000000 , & +0.00720000000000 , & +0.00200000000000 , & +0.00050000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.27470000000000 , & +1.01650000000000 , & +-0.00280000000000 , & +0.06130000000000 , & +0.03030000000000 , & +0.01160000000000 , & +0.00380000000000 , & +0.00110000000000 , & +0.00030000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.27200000000000 , & +1.02680000000000 , & +-0.00400000000000 , & +0.07030000000000 , & +0.03840000000000 , & +0.01660000000000 , & +0.00620000000000 , & +0.00210000000000 , & +0.00060000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.26900000000000 , & +1.03800000000000 , & +-0.00540000000000 , & +0.07840000000000 , & +0.04630000000000 , & +0.02190000000000 , & +0.00900000000000 , & +0.00330000000000 , & +0.00110000000000 , & +0.00040000000000 , & +0.00010000000000 , & +0.26590000000000 , & +1.05000000000000 , & +-0.00700000000000 , & +0.08570000000000 , & +0.05380000000000 , & +0.02740000000000 , & +0.01220000000000 , & +0.00490000000000 , & +0.00180000000000 , & +0.00060000000000 , & +0.00020000000000 , & +0.26280000000000 , & +1.06270000000000 , & +-0.00880000000000 , & +0.09220000000000 , & +0.06080000000000 , & +0.03300000000000 , & +0.01570000000000 , & +0.00670000000000 , & +0.00270000000000 , & +0.00100000000000 , & +0.00030000000000 , & +0.25950000000000 , & +1.07620000000000 , & +-0.01080000000000 , & +0.09810000000000 , & +0.06730000000000 , & +0.03850000000000 , & +0.01940000000000 , & +0.00880000000000 , & +0.00370000000000 , & +0.00150000000000 , & +0.00050000000000 , & +0.25610000000000 , & +1.09040000000000 , & +-0.01300000000000 , & +0.10320000000000 , & +0.07330000000000 , & +0.04390000000000 , & +0.02320000000000 , & +0.01120000000000 , & +0.00500000000000 , & +0.00210000000000 , & +0.00080000000000 , & +0.25260000000000 , & +1.10540000000000 , & +-0.01530000000000 , & +0.10760000000000 , & +0.07870000000000 , & +0.04910000000000 , & +0.02720000000000 , & +0.01380000000000 , & +0.00650000000000 , & +0.00280000000000 , & +0.00120000000000 , & +0.24900000000000 , & +1.12150000000000 , & +-0.01780000000000 , & +0.11100000000000 , & +0.08340000000000 , & +0.05390000000000 , & +0.03120000000000 , & +0.01660000000000 , & +0.00820000000000 , & +0.00380000000000 , & +0.00170000000000 , & +0.24520000000000 , & +1.13910000000000 , & +-0.02050000000000 , & +0.11320000000000 , & +0.08710000000000 , & +0.05830000000000 , & +0.03520000000000 , & +0.01960000000000 , & +0.01020000000000 , & +0.00500000000000 , & +0.00230000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.11320000000000 , & +0.08710000000000 , & +0.05830000000000 , & +0.03520000000000 , & +0.01960000000000 , & +0.01020000000000 , & +0.00500000000000 , & +0.00230000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.11320000000000 , & +0.08710000000000 , & +0.05830000000000 , & +0.03520000000000 , & +0.01960000000000 , & +0.01020000000000 , & +0.00500000000000 , & +0.00230000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.11320000000000 , & +0.08710000000000 , & +0.05830000000000 , & +0.03520000000000 , & +0.01960000000000 , & +0.01020000000000 , & +0.00500000000000 , & +0.00230000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.11320000000000 , & +0.08710000000000 , & +0.05830000000000 , & +0.03520000000000 , & +0.01960000000000 , & +0.01020000000000 , & +0.00500000000000 , & +0.00230000000000 , & +0.26720000000000 , & +0.99000000000000 , & +-0.00010000000000 , & +0.01440000000000 , & +0.00210000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.26600000000000 , & +0.99470000000000 , & +-0.00050000000000 , & +0.02790000000000 , & +0.00770000000000 , & +0.00160000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.26410000000000 , & +1.00160000000000 , & +-0.00100000000000 , & +0.03990000000000 , & +0.01520000000000 , & +0.00440000000000 , & +0.00110000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.26190000000000 , & +1.01030000000000 , & +-0.00180000000000 , & +0.05060000000000 , & +0.02350000000000 , & +0.00840000000000 , & +0.00260000000000 , & +0.00070000000000 , & +0.00020000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.25930000000000 , & +1.02030000000000 , & +-0.00280000000000 , & +0.06010000000000 , & +0.03180000000000 , & +0.01320000000000 , & +0.00480000000000 , & +0.00160000000000 , & +0.00050000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.25650000000000 , & +1.03130000000000 , & +-0.00400000000000 , & +0.06870000000000 , & +0.03990000000000 , & +0.01860000000000 , & +0.00750000000000 , & +0.00280000000000 , & +0.00090000000000 , & +0.00030000000000 , & +0.00010000000000 , & +0.25360000000000 , & +1.04320000000000 , & +-0.00540000000000 , & +0.07640000000000 , & +0.04770000000000 , & +0.02420000000000 , & +0.01070000000000 , & +0.00430000000000 , & +0.00160000000000 , & +0.00050000000000 , & +0.00020000000000 , & +0.25050000000000 , & +1.05590000000000 , & +-0.00700000000000 , & +0.08330000000000 , & +0.05500000000000 , & +0.02990000000000 , & +0.01430000000000 , & +0.00620000000000 , & +0.00250000000000 , & +0.00090000000000 , & +0.00030000000000 , & +0.24740000000000 , & +1.06940000000000 , & +-0.00880000000000 , & +0.08950000000000 , & +0.06170000000000 , & +0.03560000000000 , & +0.01810000000000 , & +0.00840000000000 , & +0.00360000000000 , & +0.00140000000000 , & +0.00050000000000 , & +0.24420000000000 , & +1.08350000000000 , & +-0.01080000000000 , & +0.09500000000000 , & +0.06800000000000 , & +0.04120000000000 , & +0.02210000000000 , & +0.01080000000000 , & +0.00490000000000 , & +0.00210000000000 , & +0.00080000000000 , & +0.24080000000000 , & +1.09850000000000 , & +-0.01290000000000 , & +0.09980000000000 , & +0.07360000000000 , & +0.04650000000000 , & +0.02620000000000 , & +0.01350000000000 , & +0.00650000000000 , & +0.00290000000000 , & +0.00120000000000 , & +0.23740000000000 , & +1.11430000000000 , & +-0.01520000000000 , & +0.10380000000000 , & +0.07870000000000 , & +0.05160000000000 , & +0.03030000000000 , & +0.01640000000000 , & +0.00830000000000 , & +0.00390000000000 , & +0.00180000000000 , & +0.23390000000000 , & +1.13130000000000 , & +-0.01770000000000 , & +0.10690000000000 , & +0.08300000000000 , & +0.05630000000000 , & +0.03440000000000 , & +0.01940000000000 , & +0.01030000000000 , & +0.00510000000000 , & +0.00240000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.10690000000000 , & +0.08300000000000 , & +0.05630000000000 , & +0.03440000000000 , & +0.01940000000000 , & +0.01030000000000 , & +0.00510000000000 , & +0.00240000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.10690000000000 , & +0.08300000000000 , & +0.05630000000000 , & +0.03440000000000 , & +0.01940000000000 , & +0.01030000000000 , & +0.00510000000000 , & +0.00240000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.10690000000000 , & +0.08300000000000 , & +0.05630000000000 , & +0.03440000000000 , & +0.01940000000000 , & +0.01030000000000 , & +0.00510000000000 , & +0.00240000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.10690000000000 , & +0.08300000000000 , & +0.05630000000000 , & +0.03440000000000 , & +0.01940000000000 , & +0.01030000000000 , & +0.00510000000000 , & +0.00240000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.10690000000000 , & +0.08300000000000 , & +0.05630000000000 , & +0.03440000000000 , & +0.01940000000000 , & +0.01030000000000 , & +0.00510000000000 , & +0.00240000000000 , & +0.25350000000000 , & +0.99130000000000 , & +-0.00010000000000 , & +0.01440000000000 , & +0.00240000000000 , & +0.00030000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.25220000000000 , & +0.99640000000000 , & +-0.00050000000000 , & +0.02770000000000 , & +0.00840000000000 , & +0.00190000000000 , & +0.00040000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.25030000000000 , & +1.00400000000000 , & +-0.00100000000000 , & +0.03940000000000 , & +0.01630000000000 , & +0.00510000000000 , & +0.00140000000000 , & +0.00030000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.24800000000000 , & +1.01320000000000 , & +-0.00180000000000 , & +0.04980000000000 , & +0.02470000000000 , & +0.00960000000000 , & +0.00320000000000 , & +0.00100000000000 , & +0.00030000000000 , & +0.00010000000000 , & +0.00000000000000 , & +0.24550000000000 , & +1.02390000000000 , & +-0.00280000000000 , & +0.05890000000000 , & +0.03310000000000 , & +0.01480000000000 , & +0.00580000000000 , & +0.00200000000000 , & +0.00070000000000 , & +0.00020000000000 , & +0.00010000000000 , & +0.24270000000000 , & +1.03560000000000 , & +-0.00400000000000 , & +0.06710000000000 , & +0.04110000000000 , & +0.02050000000000 , & +0.00890000000000 , & +0.00350000000000 , & +0.00130000000000 , & +0.00040000000000 , & +0.00010000000000 , & +0.23980000000000 , & +1.04810000000000 , & +-0.00540000000000 , & +0.07450000000000 , & +0.04870000000000 , & +0.02630000000000 , & +0.01250000000000 , & +0.00540000000000 , & +0.00220000000000 , & +0.00080000000000 , & +0.00030000000000 , & +0.23680000000000 , & +1.06150000000000 , & +-0.00700000000000 , & +0.08110000000000 , & +0.05580000000000 , & +0.03220000000000 , & +0.01640000000000 , & +0.00760000000000 , & +0.00330000000000 , & +0.00130000000000 , & +0.00050000000000 , & +0.23360000000000 , & +1.07570000000000 , & +-0.00880000000000 , & +0.08690000000000 , & +0.06230000000000 , & +0.03790000000000 , & +0.02050000000000 , & +0.01010000000000 , & +0.00470000000000 , & +0.00200000000000 , & +0.00080000000000 , & +0.23050000000000 , & +1.09060000000000 , & +-0.01070000000000 , & +0.09210000000000 , & +0.06830000000000 , & +0.04350000000000 , & +0.02470000000000 , & +0.01290000000000 , & +0.00630000000000 , & +0.00290000000000 , & +0.00120000000000 , & +0.22720000000000 , & +1.10630000000000 , & +-0.01290000000000 , & +0.09660000000000 , & +0.07360000000000 , & +0.04870000000000 , & +0.02900000000000 , & +0.01590000000000 , & +0.00810000000000 , & +0.00390000000000 , & +0.00180000000000 , & +0.22380000000000 , & +1.12290000000000 , & +-0.01520000000000 , & +0.10020000000000 , & +0.07830000000000 , & +0.05370000000000 , & +0.03320000000000 , & +0.01900000000000 , & +0.01020000000000 , & +0.00520000000000 , & +0.00250000000000 , & +0.22030000000000 , & +1.14060000000000 , & +-0.01760000000000 , & +0.10290000000000 , & +0.08220000000000 , & +0.05810000000000 , & +0.03730000000000 , & +0.02220000000000 , & +0.01250000000000 , & +0.00660000000000 , & +0.00340000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.10290000000000 , & +0.08220000000000 , & +0.05810000000000 , & +0.03730000000000 , & +0.02220000000000 , & +0.01250000000000 , & +0.00660000000000 , & +0.00340000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.10290000000000 , & +0.08220000000000 , & +0.05810000000000 , & +0.03730000000000 , & +0.02220000000000 , & +0.01250000000000 , & +0.00660000000000 , & +0.00340000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.10290000000000 , & +0.08220000000000 , & +0.05810000000000 , & +0.03730000000000 , & +0.02220000000000 , & +0.01250000000000 , & +0.00660000000000 , & +0.00340000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.10290000000000 , & +0.08220000000000 , & +0.05810000000000 , & +0.03730000000000 , & +0.02220000000000 , & +0.01250000000000 , & +0.00660000000000 , & +0.00340000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.00000000000000 , & +0.10290000000000 , & +0.08220000000000 , & +0.05810000000000 , & +0.03730000000000 , & +0.02220000000000 , & +0.01250000000000 , & +0.00660000000000 , & +0.00340000000000 & +/),(/11,18,20/)) + +! vim: filetype=fortran diff --git a/source/src/snapwave/snapwave_RFtable.f90 b/source/src/snapwave/snapwave_RFtable.f90 new file mode 100644 index 000000000..7ae97eea4 --- /dev/null +++ b/source/src/snapwave/snapwave_RFtable.f90 @@ -0,0 +1,3990 @@ +module snapwave_RFtable + + implicit none + + contains + + subroutine load_RFtable(RFveg) + + implicit none + ! + real*4, dimension(:,:,:), allocatable, intent(out) :: RFveg + real*8, dimension(:), allocatable :: RFvegtmp + ! + allocate(RFveg(11,18,20)) + ! + ! load Ad's RF-table (update for depth averaged velocities?) - XBeach: + !include 'RFveg.inc' + ! + ! Instead, include as hardcoded table that does not need to be compiled anymore: + RFvegtmp = (/ & + 22.47180000000000 , & + 0.22370000000000 , & + -0.00050000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 6.26960000000000 , & + 0.40090000000000 , & + -0.00030000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 6.13660000000000 , & + 0.40960000000000 , & + -0.00110000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 5.93530000000000 , & + 0.42340000000000 , & + -0.00240000000000 , & + 0.00060000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 5.67800000000000 , & + 0.44260000000000 , & + -0.00420000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 2.82390000000000 , & + 0.59330000000000 , & + -0.00020000000000 , & + 0.00300000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 2.81430000000000 , & + 0.59540000000000 , & + -0.00080000000000 , & + 0.00600000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 2.79860000000000 , & + 0.59870000000000 , & + -0.00170000000000 , & + 0.00910000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 2.77700000000000 , & + 0.60340000000000 , & + -0.00300000000000 , & + 0.01230000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 2.74970000000000 , & + 0.60930000000000 , & + -0.00460000000000 , & + 0.01560000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 2.71710000000000 , & + 0.61660000000000 , & + -0.00660000000000 , & + 0.01910000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 2.67920000000000 , & + 0.62540000000000 , & + -0.00890000000000 , & + 0.02270000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 2.63520000000000 , & + 0.63580000000000 , & + -0.01150000000000 , & + 0.02650000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 2.58340000000000 , & + 0.64860000000000 , & + -0.01440000000000 , & + 0.03050000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.03050000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.03050000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.03050000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.03050000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.03050000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.03050000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.03050000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.03050000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.03050000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.68990000000000 , & + 0.74360000000000 , & + -0.00020000000000 , & + 0.00720000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.68850000000000 , & + 0.74420000000000 , & + -0.00060000000000 , & + 0.01440000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.68610000000000 , & + 0.74530000000000 , & + -0.00140000000000 , & + 0.02160000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.68270000000000 , & + 0.74680000000000 , & + -0.00240000000000 , & + 0.02880000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.67830000000000 , & + 0.74870000000000 , & + -0.00380000000000 , & + 0.03600000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.67290000000000 , & + 0.75120000000000 , & + -0.00540000000000 , & + 0.04320000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.66640000000000 , & + 0.75410000000000 , & + -0.00730000000000 , & + 0.05030000000000 , & + 0.00050000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.65870000000000 , & + 0.75760000000000 , & + -0.00960000000000 , & + 0.05740000000000 , & + 0.00070000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.64960000000000 , & + 0.76180000000000 , & + -0.01210000000000 , & + 0.06450000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.63910000000000 , & + 0.76660000000000 , & + -0.01480000000000 , & + 0.07160000000000 , & + 0.00120000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.62690000000000 , & + 0.77240000000000 , & + -0.01790000000000 , & + 0.07850000000000 , & + 0.00160000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.61250000000000 , & + 0.77930000000000 , & + -0.02110000000000 , & + 0.08530000000000 , & + 0.00210000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.59500000000000 , & + 0.78780000000000 , & + -0.02460000000000 , & + 0.09180000000000 , & + 0.00270000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.09180000000000 , & + 0.00270000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.09180000000000 , & + 0.00270000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.09180000000000 , & + 0.00270000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.09180000000000 , & + 0.00270000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.09180000000000 , & + 0.00270000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.20840000000000 , & + 0.83200000000000 , & + -0.00010000000000 , & + 0.00990000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.20780000000000 , & + 0.83230000000000 , & + -0.00050000000000 , & + 0.01980000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.20690000000000 , & + 0.83300000000000 , & + -0.00120000000000 , & + 0.02960000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.20560000000000 , & + 0.83380000000000 , & + -0.00220000000000 , & + 0.03940000000000 , & + 0.00060000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.20390000000000 , & + 0.83500000000000 , & + -0.00340000000000 , & + 0.04910000000000 , & + 0.00100000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.20180000000000 , & + 0.83650000000000 , & + -0.00490000000000 , & + 0.05880000000000 , & + 0.00140000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.19930000000000 , & + 0.83830000000000 , & + -0.00660000000000 , & + 0.06830000000000 , & + 0.00200000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.19620000000000 , & + 0.84040000000000 , & + -0.00860000000000 , & + 0.07780000000000 , & + 0.00260000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.19260000000000 , & + 0.84290000000000 , & + -0.01090000000000 , & + 0.08700000000000 , & + 0.00330000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.18840000000000 , & + 0.84590000000000 , & + -0.01340000000000 , & + 0.09620000000000 , & + 0.00420000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.18360000000000 , & + 0.84940000000000 , & + -0.01620000000000 , & + 0.10510000000000 , & + 0.00520000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.17790000000000 , & + 0.85350000000000 , & + -0.01920000000000 , & + 0.11370000000000 , & + 0.00640000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.17120000000000 , & + 0.85840000000000 , & + -0.02240000000000 , & + 0.12210000000000 , & + 0.00770000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.16330000000000 , & + 0.86420000000000 , & + -0.02590000000000 , & + 0.13000000000000 , & + 0.00920000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.15370000000000 , & + 0.87140000000000 , & + -0.02960000000000 , & + 0.13740000000000 , & + 0.01100000000000 , & + 0.00040000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 1.14090000000000 , & + 0.88110000000000 , & + -0.03350000000000 , & + 0.14380000000000 , & + 0.01320000000000 , & + 0.00070000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.14380000000000 , & + 0.01320000000000 , & + 0.00070000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.14380000000000 , & + 0.01320000000000 , & + 0.00070000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.94900000000000 , & + 0.88270000000000 , & + -0.00010000000000 , & + 0.01140000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.94860000000000 , & + 0.88310000000000 , & + -0.00050000000000 , & + 0.02280000000000 , & + 0.00040000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.94790000000000 , & + 0.88380000000000 , & + -0.00110000000000 , & + 0.03420000000000 , & + 0.00080000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.94690000000000 , & + 0.88480000000000 , & + -0.00200000000000 , & + 0.04550000000000 , & + 0.00150000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.94550000000000 , & + 0.88600000000000 , & + -0.00320000000000 , & + 0.05670000000000 , & + 0.00230000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.94390000000000 , & + 0.88750000000000 , & + -0.00460000000000 , & + 0.06770000000000 , & + 0.00330000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.94190000000000 , & + 0.88940000000000 , & + -0.00620000000000 , & + 0.07860000000000 , & + 0.00450000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.93960000000000 , & + 0.89160000000000 , & + -0.00810000000000 , & + 0.08920000000000 , & + 0.00590000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.93690000000000 , & + 0.89410000000000 , & + -0.01020000000000 , & + 0.09970000000000 , & + 0.00750000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.93380000000000 , & + 0.89710000000000 , & + -0.01260000000000 , & + 0.10990000000000 , & + 0.00930000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.93030000000000 , & + 0.90050000000000 , & + -0.01520000000000 , & + 0.11980000000000 , & + 0.01130000000000 , & + 0.00050000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.92630000000000 , & + 0.90450000000000 , & + -0.01810000000000 , & + 0.12930000000000 , & + 0.01350000000000 , & + 0.00070000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.92160000000000 , & + 0.90900000000000 , & + -0.02120000000000 , & + 0.13850000000000 , & + 0.01590000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.91630000000000 , & + 0.91430000000000 , & + -0.02450000000000 , & + 0.14710000000000 , & + 0.01850000000000 , & + 0.00120000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.91010000000000 , & + 0.92050000000000 , & + -0.02800000000000 , & + 0.15520000000000 , & + 0.02140000000000 , & + 0.00160000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.90260000000000 , & + 0.92810000000000 , & + -0.03170000000000 , & + 0.16240000000000 , & + 0.02470000000000 , & + 0.00210000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.16240000000000 , & + 0.02470000000000 , & + 0.00210000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.16240000000000 , & + 0.02470000000000 , & + 0.00210000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.78580000000000 , & + 0.91390000000000 , & + -0.00010000000000 , & + 0.01240000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.78530000000000 , & + 0.91440000000000 , & + -0.00050000000000 , & + 0.02470000000000 , & + 0.00070000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.78450000000000 , & + 0.91530000000000 , & + -0.00110000000000 , & + 0.03700000000000 , & + 0.00150000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.78350000000000 , & + 0.91650000000000 , & + -0.00200000000000 , & + 0.04910000000000 , & + 0.00260000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.78210000000000 , & + 0.91810000000000 , & + -0.00310000000000 , & + 0.06110000000000 , & + 0.00410000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.78040000000000 , & + 0.92010000000000 , & + -0.00440000000000 , & + 0.07290000000000 , & + 0.00590000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.77840000000000 , & + 0.92250000000000 , & + -0.00600000000000 , & + 0.08440000000000 , & + 0.00790000000000 , & + 0.00040000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.77610000000000 , & + 0.92520000000000 , & + -0.00780000000000 , & + 0.09570000000000 , & + 0.01030000000000 , & + 0.00060000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.77350000000000 , & + 0.92840000000000 , & + -0.00990000000000 , & + 0.10660000000000 , & + 0.01290000000000 , & + 0.00080000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.77050000000000 , & + 0.93190000000000 , & + -0.01220000000000 , & + 0.11720000000000 , & + 0.01580000000000 , & + 0.00120000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.76720000000000 , & + 0.93600000000000 , & + -0.01470000000000 , & + 0.12740000000000 , & + 0.01900000000000 , & + 0.00160000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.76350000000000 , & + 0.94060000000000 , & + -0.01740000000000 , & + 0.13720000000000 , & + 0.02230000000000 , & + 0.00200000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.75930000000000 , & + 0.94570000000000 , & + -0.02040000000000 , & + 0.14640000000000 , & + 0.02600000000000 , & + 0.00260000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.75460000000000 , & + 0.95160000000000 , & + -0.02360000000000 , & + 0.15510000000000 , & + 0.02980000000000 , & + 0.00340000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.74930000000000 , & + 0.95830000000000 , & + -0.02700000000000 , & + 0.16310000000000 , & + 0.03390000000000 , & + 0.00430000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.74320000000000 , & + 0.96620000000000 , & + -0.03050000000000 , & + 0.17020000000000 , & + 0.03820000000000 , & + 0.00540000000000 , & + 0.00050000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.73570000000000 , & + 0.97600000000000 , & + -0.03430000000000 , & + 0.17600000000000 , & + 0.04280000000000 , & + 0.00680000000000 , & + 0.00080000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.17600000000000 , & + 0.04280000000000 , & + 0.00680000000000 , & + 0.00080000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.67260000000000 , & + 0.93420000000000 , & + -0.00010000000000 , & + 0.01300000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.67210000000000 , & + 0.93490000000000 , & + -0.00050000000000 , & + 0.02590000000000 , & + 0.00100000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.67120000000000 , & + 0.93610000000000 , & + -0.00110000000000 , & + 0.03870000000000 , & + 0.00230000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.67000000000000 , & + 0.93780000000000 , & + -0.00190000000000 , & + 0.05140000000000 , & + 0.00410000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.66850000000000 , & + 0.93990000000000 , & + -0.00300000000000 , & + 0.06380000000000 , & + 0.00630000000000 , & + 0.00040000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.66660000000000 , & + 0.94250000000000 , & + -0.00430000000000 , & + 0.07590000000000 , & + 0.00890000000000 , & + 0.00060000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.66450000000000 , & + 0.94560000000000 , & + -0.00590000000000 , & + 0.08770000000000 , & + 0.01190000000000 , & + 0.00100000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.66200000000000 , & + 0.94910000000000 , & + -0.00760000000000 , & + 0.09910000000000 , & + 0.01530000000000 , & + 0.00140000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.65930000000000 , & + 0.95310000000000 , & + -0.00960000000000 , & + 0.11010000000000 , & + 0.01910000000000 , & + 0.00200000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.65620000000000 , & + 0.95750000000000 , & + -0.01190000000000 , & + 0.12070000000000 , & + 0.02310000000000 , & + 0.00270000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.65280000000000 , & + 0.96250000000000 , & + -0.01430000000000 , & + 0.13080000000000 , & + 0.02740000000000 , & + 0.00350000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.64910000000000 , & + 0.96800000000000 , & + -0.01700000000000 , & + 0.14030000000000 , & + 0.03190000000000 , & + 0.00450000000000 , & + 0.00040000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.64510000000000 , & + 0.97410000000000 , & + -0.01990000000000 , & + 0.14930000000000 , & + 0.03660000000000 , & + 0.00570000000000 , & + 0.00060000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.64060000000000 , & + 0.98090000000000 , & + -0.02300000000000 , & + 0.15760000000000 , & + 0.04150000000000 , & + 0.00700000000000 , & + 0.00080000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.63560000000000 , & + 0.98850000000000 , & + -0.02620000000000 , & + 0.16510000000000 , & + 0.04660000000000 , & + 0.00860000000000 , & + 0.00110000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.63000000000000 , & + 0.99740000000000 , & + -0.02970000000000 , & + 0.17160000000000 , & + 0.05180000000000 , & + 0.01050000000000 , & + 0.00160000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.62330000000000 , & + 1.00810000000000 , & + -0.03340000000000 , & + 0.17670000000000 , & + 0.05710000000000 , & + 0.01270000000000 , & + 0.00220000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.17670000000000 , & + 0.05710000000000 , & + 0.01270000000000 , & + 0.00220000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.58910000000000 , & + 0.94810000000000 , & + -0.00010000000000 , & + 0.01340000000000 , & + 0.00040000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.58850000000000 , & + 0.94910000000000 , & + -0.00050000000000 , & + 0.02670000000000 , & + 0.00150000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.58750000000000 , & + 0.95070000000000 , & + -0.00110000000000 , & + 0.03990000000000 , & + 0.00320000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.58610000000000 , & + 0.95290000000000 , & + -0.00190000000000 , & + 0.05280000000000 , & + 0.00570000000000 , & + 0.00040000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.58440000000000 , & + 0.95560000000000 , & + -0.00300000000000 , & + 0.06540000000000 , & + 0.00870000000000 , & + 0.00070000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.58240000000000 , & + 0.95900000000000 , & + -0.00420000000000 , & + 0.07760000000000 , & + 0.01230000000000 , & + 0.00120000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.58010000000000 , & + 0.96280000000000 , & + -0.00580000000000 , & + 0.08940000000000 , & + 0.01630000000000 , & + 0.00190000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.57740000000000 , & + 0.96720000000000 , & + -0.00750000000000 , & + 0.10070000000000 , & + 0.02070000000000 , & + 0.00270000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.57450000000000 , & + 0.97210000000000 , & + -0.00950000000000 , & + 0.11150000000000 , & + 0.02550000000000 , & + 0.00380000000000 , & + 0.00040000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.57130000000000 , & + 0.97760000000000 , & + -0.01170000000000 , & + 0.12180000000000 , & + 0.03060000000000 , & + 0.00500000000000 , & + 0.00060000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.56790000000000 , & + 0.98350000000000 , & + -0.01410000000000 , & + 0.13150000000000 , & + 0.03580000000000 , & + 0.00640000000000 , & + 0.00080000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.56410000000000 , & + 0.99010000000000 , & + -0.01670000000000 , & + 0.14050000000000 , & + 0.04130000000000 , & + 0.00810000000000 , & + 0.00110000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.56010000000000 , & + 0.99720000000000 , & + -0.01950000000000 , & + 0.14900000000000 , & + 0.04690000000000 , & + 0.01000000000000 , & + 0.00160000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.55570000000000 , & + 1.00510000000000 , & + -0.02250000000000 , & + 0.15660000000000 , & + 0.05260000000000 , & + 0.01210000000000 , & + 0.00210000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.55090000000000 , & + 1.01390000000000 , & + -0.02570000000000 , & + 0.16350000000000 , & + 0.05830000000000 , & + 0.01440000000000 , & + 0.00270000000000 , & + 0.00040000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.54550000000000 , & + 1.02390000000000 , & + -0.02910000000000 , & + 0.16920000000000 , & + 0.06400000000000 , & + 0.01710000000000 , & + 0.00360000000000 , & + 0.00060000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.16920000000000 , & + 0.06400000000000 , & + 0.01710000000000 , & + 0.00360000000000 , & + 0.00060000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.16920000000000 , & + 0.06400000000000 , & + 0.01710000000000 , & + 0.00360000000000 , & + 0.00060000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.52460000000000 , & + 0.95820000000000 , & + -0.00010000000000 , & + 0.01370000000000 , & + 0.00050000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.52390000000000 , & + 0.95940000000000 , & + -0.00050000000000 , & + 0.02730000000000 , & + 0.00190000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.52280000000000 , & + 0.96140000000000 , & + -0.00110000000000 , & + 0.04060000000000 , & + 0.00430000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.52130000000000 , & + 0.96410000000000 , & + -0.00190000000000 , & + 0.05360000000000 , & + 0.00740000000000 , & + 0.00070000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.51950000000000 , & + 0.96760000000000 , & + -0.00290000000000 , & + 0.06620000000000 , & + 0.01130000000000 , & + 0.00130000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.51730000000000 , & + 0.97170000000000 , & + -0.00420000000000 , & + 0.07830000000000 , & + 0.01580000000000 , & + 0.00210000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.51480000000000 , & + 0.97650000000000 , & + -0.00570000000000 , & + 0.08990000000000 , & + 0.02080000000000 , & + 0.00320000000000 , & + 0.00040000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.51200000000000 , & + 0.98180000000000 , & + -0.00740000000000 , & + 0.10090000000000 , & + 0.02620000000000 , & + 0.00460000000000 , & + 0.00060000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.50890000000000 , & + 0.98770000000000 , & + -0.00940000000000 , & + 0.11130000000000 , & + 0.03180000000000 , & + 0.00620000000000 , & + 0.00090000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.50560000000000 , & + 0.99410000000000 , & + -0.01150000000000 , & + 0.12120000000000 , & + 0.03770000000000 , & + 0.00810000000000 , & + 0.00130000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.50210000000000 , & + 1.00110000000000 , & + -0.01390000000000 , & + 0.13030000000000 , & + 0.04380000000000 , & + 0.01020000000000 , & + 0.00180000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.49830000000000 , & + 1.00870000000000 , & + -0.01640000000000 , & + 0.13880000000000 , & + 0.04990000000000 , & + 0.01260000000000 , & + 0.00240000000000 , & + 0.00040000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.49430000000000 , & + 1.01690000000000 , & + -0.01920000000000 , & + 0.14660000000000 , & + 0.05610000000000 , & + 0.01520000000000 , & + 0.00320000000000 , & + 0.00050000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.49000000000000 , & + 1.02590000000000 , & + -0.02210000000000 , & + 0.15360000000000 , & + 0.06230000000000 , & + 0.01810000000000 , & + 0.00410000000000 , & + 0.00070000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.48530000000000 , & + 1.03590000000000 , & + -0.02530000000000 , & + 0.15970000000000 , & + 0.06830000000000 , & + 0.02120000000000 , & + 0.00520000000000 , & + 0.00110000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.48000000000000 , & + 1.04720000000000 , & + -0.02860000000000 , & + 0.16460000000000 , & + 0.07420000000000 , & + 0.02460000000000 , & + 0.00660000000000 , & + 0.00150000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.16460000000000 , & + 0.07420000000000 , & + 0.02460000000000 , & + 0.00660000000000 , & + 0.00150000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.16460000000000 , & + 0.07420000000000 , & + 0.02460000000000 , & + 0.00660000000000 , & + 0.00150000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.47320000000000 , & + 0.96560000000000 , & + -0.00010000000000 , & + 0.01390000000000 , & + 0.00060000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.47250000000000 , & + 0.96710000000000 , & + -0.00050000000000 , & + 0.02770000000000 , & + 0.00250000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.47130000000000 , & + 0.96960000000000 , & + -0.00100000000000 , & + 0.04110000000000 , & + 0.00540000000000 , & + 0.00050000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.46960000000000 , & + 0.97300000000000 , & + -0.00190000000000 , & + 0.05410000000000 , & + 0.00930000000000 , & + 0.00110000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.46760000000000 , & + 0.97720000000000 , & + -0.00290000000000 , & + 0.06650000000000 , & + 0.01400000000000 , & + 0.00200000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.46530000000000 , & + 0.98210000000000 , & + -0.00420000000000 , & + 0.07840000000000 , & + 0.01940000000000 , & + 0.00330000000000 , & + 0.00040000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.46260000000000 , & + 0.98770000000000 , & + -0.00560000000000 , & + 0.08960000000000 , & + 0.02520000000000 , & + 0.00490000000000 , & + 0.00070000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.45970000000000 , & + 0.99400000000000 , & + -0.00730000000000 , & + 0.10020000000000 , & + 0.03140000000000 , & + 0.00690000000000 , & + 0.00120000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.45660000000000 , & + 1.00080000000000 , & + -0.00930000000000 , & + 0.11020000000000 , & + 0.03780000000000 , & + 0.00910000000000 , & + 0.00170000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.45320000000000 , & + 1.00830000000000 , & + -0.01140000000000 , & + 0.11940000000000 , & + 0.04430000000000 , & + 0.01170000000000 , & + 0.00240000000000 , & + 0.00040000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.44960000000000 , & + 1.01630000000000 , & + -0.01370000000000 , & + 0.12800000000000 , & + 0.05090000000000 , & + 0.01450000000000 , & + 0.00330000000000 , & + 0.00060000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.44590000000000 , & + 1.02490000000000 , & + -0.01620000000000 , & + 0.13590000000000 , & + 0.05750000000000 , & + 0.01760000000000 , & + 0.00430000000000 , & + 0.00090000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.44190000000000 , & + 1.03420000000000 , & + -0.01890000000000 , & + 0.14300000000000 , & + 0.06390000000000 , & + 0.02100000000000 , & + 0.00560000000000 , & + 0.00120000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.43760000000000 , & + 1.04430000000000 , & + -0.02180000000000 , & + 0.14930000000000 , & + 0.07020000000000 , & + 0.02460000000000 , & + 0.00700000000000 , & + 0.00170000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.43300000000000 , & + 1.05540000000000 , & + -0.02490000000000 , & + 0.15460000000000 , & + 0.07630000000000 , & + 0.02830000000000 , & + 0.00870000000000 , & + 0.00220000000000 , & + 0.00050000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.42780000000000 , & + 1.06820000000000 , & + -0.02820000000000 , & + 0.15860000000000 , & + 0.08200000000000 , & + 0.03240000000000 , & + 0.01070000000000 , & + 0.00300000000000 , & + 0.00070000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.15860000000000 , & + 0.08200000000000 , & + 0.03240000000000 , & + 0.01070000000000 , & + 0.00300000000000 , & + 0.00070000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.15860000000000 , & + 0.08200000000000 , & + 0.03240000000000 , & + 0.01070000000000 , & + 0.00300000000000 , & + 0.00070000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.43130000000000 , & + 0.97130000000000 , & + -0.00010000000000 , & + 0.01410000000000 , & + 0.00080000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.43040000000000 , & + 0.97320000000000 , & + -0.00050000000000 , & + 0.02790000000000 , & + 0.00300000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.42910000000000 , & + 0.97610000000000 , & + -0.00100000000000 , & + 0.04140000000000 , & + 0.00660000000000 , & + 0.00070000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.42740000000000 , & + 0.98020000000000 , & + -0.00180000000000 , & + 0.05420000000000 , & + 0.01130000000000 , & + 0.00160000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.42520000000000 , & + 0.98510000000000 , & + -0.00290000000000 , & + 0.06650000000000 , & + 0.01680000000000 , & + 0.00300000000000 , & + 0.00040000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.42270000000000 , & + 0.99090000000000 , & + -0.00410000000000 , & + 0.07800000000000 , & + 0.02290000000000 , & + 0.00470000000000 , & + 0.00080000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.42000000000000 , & + 0.99740000000000 , & + -0.00560000000000 , & + 0.08880000000000 , & + 0.02940000000000 , & + 0.00700000000000 , & + 0.00130000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.41700000000000 , & + 1.00450000000000 , & + -0.00730000000000 , & + 0.09890000000000 , & + 0.03620000000000 , & + 0.00950000000000 , & + 0.00200000000000 , & + 0.00040000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.41380000000000 , & + 1.01230000000000 , & + -0.00920000000000 , & + 0.10830000000000 , & + 0.04310000000000 , & + 0.01250000000000 , & + 0.00290000000000 , & + 0.00060000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.41040000000000 , & + 1.02070000000000 , & + -0.01130000000000 , & + 0.11700000000000 , & + 0.05010000000000 , & + 0.01570000000000 , & + 0.00400000000000 , & + 0.00090000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.40680000000000 , & + 1.02970000000000 , & + -0.01360000000000 , & + 0.12500000000000 , & + 0.05700000000000 , & + 0.01930000000000 , & + 0.00530000000000 , & + 0.00120000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.40300000000000 , & + 1.03930000000000 , & + -0.01600000000000 , & + 0.13230000000000 , & + 0.06370000000000 , & + 0.02300000000000 , & + 0.00680000000000 , & + 0.00170000000000 , & + 0.00040000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.39910000000000 , & + 1.04970000000000 , & + -0.01870000000000 , & + 0.13880000000000 , & + 0.07020000000000 , & + 0.02700000000000 , & + 0.00860000000000 , & + 0.00230000000000 , & + 0.00050000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.39480000000000 , & + 1.06090000000000 , & + -0.02160000000000 , & + 0.14440000000000 , & + 0.07650000000000 , & + 0.03110000000000 , & + 0.01050000000000 , & + 0.00310000000000 , & + 0.00080000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.39030000000000 , & + 1.07320000000000 , & + -0.02460000000000 , & + 0.14890000000000 , & + 0.08240000000000 , & + 0.03540000000000 , & + 0.01280000000000 , & + 0.00400000000000 , & + 0.00110000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.14890000000000 , & + 0.08240000000000 , & + 0.03540000000000 , & + 0.01280000000000 , & + 0.00400000000000 , & + 0.00110000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.14890000000000 , & + 0.08240000000000 , & + 0.03540000000000 , & + 0.01280000000000 , & + 0.00400000000000 , & + 0.00110000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.14890000000000 , & + 0.08240000000000 , & + 0.03540000000000 , & + 0.01280000000000 , & + 0.00400000000000 , & + 0.00110000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.39630000000000 , & + 0.97580000000000 , & + -0.00010000000000 , & + 0.01420000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.39540000000000 , & + 0.97800000000000 , & + -0.00050000000000 , & + 0.02810000000000 , & + 0.00360000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.39400000000000 , & + 0.98150000000000 , & + -0.00100000000000 , & + 0.04150000000000 , & + 0.00780000000000 , & + 0.00100000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.39210000000000 , & + 0.98620000000000 , & + -0.00180000000000 , & + 0.05410000000000 , & + 0.01320000000000 , & + 0.00230000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.38980000000000 , & + 0.99190000000000 , & + -0.00290000000000 , & + 0.06600000000000 , & + 0.01950000000000 , & + 0.00410000000000 , & + 0.00070000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.38720000000000 , & + 0.99850000000000 , & + -0.00410000000000 , & + 0.07720000000000 , & + 0.02620000000000 , & + 0.00640000000000 , & + 0.00130000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.38440000000000 , & + 1.00580000000000 , & + -0.00560000000000 , & + 0.08750000000000 , & + 0.03330000000000 , & + 0.00930000000000 , & + 0.00210000000000 , & + 0.00040000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.38140000000000 , & + 1.01390000000000 , & + -0.00720000000000 , & + 0.09710000000000 , & + 0.04050000000000 , & + 0.01250000000000 , & + 0.00320000000000 , & + 0.00070000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.37810000000000 , & + 1.02260000000000 , & + -0.00910000000000 , & + 0.10600000000000 , & + 0.04780000000000 , & + 0.01610000000000 , & + 0.00450000000000 , & + 0.00110000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.37470000000000 , & + 1.03190000000000 , & + -0.01120000000000 , & + 0.11410000000000 , & + 0.05490000000000 , & + 0.02000000000000 , & + 0.00600000000000 , & + 0.00150000000000 , & + 0.00030000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.37110000000000 , & + 1.04180000000000 , & + -0.01340000000000 , & + 0.12160000000000 , & + 0.06190000000000 , & + 0.02410000000000 , & + 0.00780000000000 , & + 0.00220000000000 , & + 0.00050000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.36740000000000 , & + 1.05240000000000 , & + -0.01590000000000 , & + 0.12820000000000 , & + 0.06870000000000 , & + 0.02840000000000 , & + 0.00980000000000 , & + 0.00290000000000 , & + 0.00080000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.36350000000000 , & + 1.06380000000000 , & + -0.01850000000000 , & + 0.13410000000000 , & + 0.07510000000000 , & + 0.03280000000000 , & + 0.01210000000000 , & + 0.00390000000000 , & + 0.00110000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.35930000000000 , & + 1.07610000000000 , & + -0.02130000000000 , & + 0.13910000000000 , & + 0.08110000000000 , & + 0.03730000000000 , & + 0.01460000000000 , & + 0.00500000000000 , & + 0.00150000000000 , & + 0.00040000000000 , & + 0.00010000000000 , & + 0.35480000000000 , & + 1.08970000000000 , & + -0.02430000000000 , & + 0.14290000000000 , & + 0.08660000000000 , & + 0.04190000000000 , & + 0.01740000000000 , & + 0.00640000000000 , & + 0.00210000000000 , & + 0.00060000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.14290000000000 , & + 0.08660000000000 , & + 0.04190000000000 , & + 0.01740000000000 , & + 0.00640000000000 , & + 0.00210000000000 , & + 0.00060000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.14290000000000 , & + 0.08660000000000 , & + 0.04190000000000 , & + 0.01740000000000 , & + 0.00640000000000 , & + 0.00210000000000 , & + 0.00060000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.14290000000000 , & + 0.08660000000000 , & + 0.04190000000000 , & + 0.01740000000000 , & + 0.00640000000000 , & + 0.00210000000000 , & + 0.00060000000000 , & + 0.00020000000000 , & + 0.36660000000000 , & + 0.97940000000000 , & + -0.00010000000000 , & + 0.01430000000000 , & + 0.00110000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.36570000000000 , & + 0.98190000000000 , & + -0.00050000000000 , & + 0.02820000000000 , & + 0.00430000000000 , & + 0.00050000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.36410000000000 , & + 0.98600000000000 , & + -0.00100000000000 , & + 0.04140000000000 , & + 0.00910000000000 , & + 0.00140000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.36220000000000 , & + 0.99140000000000 , & + -0.00180000000000 , & + 0.05380000000000 , & + 0.01520000000000 , & + 0.00310000000000 , & + 0.00050000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.35980000000000 , & + 0.99780000000000 , & + -0.00280000000000 , & + 0.06540000000000 , & + 0.02200000000000 , & + 0.00540000000000 , & + 0.00110000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.35720000000000 , & + 1.00520000000000 , & + -0.00410000000000 , & + 0.07610000000000 , & + 0.02930000000000 , & + 0.00830000000000 , & + 0.00200000000000 , & + 0.00040000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.35430000000000 , & + 1.01340000000000 , & + -0.00550000000000 , & + 0.08600000000000 , & + 0.03680000000000 , & + 0.01180000000000 , & + 0.00310000000000 , & + 0.00070000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.35120000000000 , & + 1.02230000000000 , & + -0.00720000000000 , & + 0.09510000000000 , & + 0.04430000000000 , & + 0.01560000000000 , & + 0.00460000000000 , & + 0.00120000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.34790000000000 , & + 1.03190000000000 , & + -0.00900000000000 , & + 0.10340000000000 , & + 0.05170000000000 , & + 0.01980000000000 , & + 0.00630000000000 , & + 0.00180000000000 , & + 0.00040000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.34450000000000 , & + 1.04210000000000 , & + -0.01110000000000 , & + 0.11100000000000 , & + 0.05890000000000 , & + 0.02420000000000 , & + 0.00840000000000 , & + 0.00250000000000 , & + 0.00070000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.34100000000000 , & + 1.05290000000000 , & + -0.01330000000000 , & + 0.11790000000000 , & + 0.06580000000000 , & + 0.02880000000000 , & + 0.01060000000000 , & + 0.00340000000000 , & + 0.00100000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.33730000000000 , & + 1.06440000000000 , & + -0.01580000000000 , & + 0.12400000000000 , & + 0.07240000000000 , & + 0.03350000000000 , & + 0.01310000000000 , & + 0.00450000000000 , & + 0.00140000000000 , & + 0.00040000000000 , & + 0.00010000000000 , & + 0.33340000000000 , & + 1.07680000000000 , & + -0.01840000000000 , & + 0.12930000000000 , & + 0.07860000000000 , & + 0.03820000000000 , & + 0.01590000000000 , & + 0.00590000000000 , & + 0.00190000000000 , & + 0.00060000000000 , & + 0.00010000000000 , & + 0.32930000000000 , & + 1.09020000000000 , & + -0.02110000000000 , & + 0.13370000000000 , & + 0.08430000000000 , & + 0.04300000000000 , & + 0.01890000000000 , & + 0.00740000000000 , & + 0.00260000000000 , & + 0.00080000000000 , & + 0.00020000000000 , & + 0.32490000000000 , & + 1.10510000000000 , & + -0.02410000000000 , & + 0.13680000000000 , & + 0.08930000000000 , & + 0.04770000000000 , & + 0.02220000000000 , & + 0.00920000000000 , & + 0.00350000000000 , & + 0.00120000000000 , & + 0.00040000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.13680000000000 , & + 0.08930000000000 , & + 0.04770000000000 , & + 0.02220000000000 , & + 0.00920000000000 , & + 0.00350000000000 , & + 0.00120000000000 , & + 0.00040000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.13680000000000 , & + 0.08930000000000 , & + 0.04770000000000 , & + 0.02220000000000 , & + 0.00920000000000 , & + 0.00350000000000 , & + 0.00120000000000 , & + 0.00040000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.13680000000000 , & + 0.08930000000000 , & + 0.04770000000000 , & + 0.02220000000000 , & + 0.00920000000000 , & + 0.00350000000000 , & + 0.00120000000000 , & + 0.00040000000000 , & + 0.34120000000000 , & + 0.98230000000000 , & + -0.00010000000000 , & + 0.01430000000000 , & + 0.00130000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.34010000000000 , & + 0.98520000000000 , & + -0.00050000000000 , & + 0.02820000000000 , & + 0.00490000000000 , & + 0.00060000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.33850000000000 , & + 0.98990000000000 , & + -0.00100000000000 , & + 0.04130000000000 , & + 0.01040000000000 , & + 0.00190000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.33650000000000 , & + 0.99590000000000 , & + -0.00180000000000 , & + 0.05340000000000 , & + 0.01710000000000 , & + 0.00400000000000 , & + 0.00080000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.33410000000000 , & + 1.00310000000000 , & + -0.00280000000000 , & + 0.06460000000000 , & + 0.02440000000000 , & + 0.00680000000000 , & + 0.00160000000000 , & + 0.00030000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.33140000000000 , & + 1.01130000000000 , & + -0.00410000000000 , & + 0.07480000000000 , & + 0.03210000000000 , & + 0.01030000000000 , & + 0.00280000000000 , & + 0.00070000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.32840000000000 , & + 1.02030000000000 , & + -0.00550000000000 , & + 0.08420000000000 , & + 0.03980000000000 , & + 0.01430000000000 , & + 0.00440000000000 , & + 0.00120000000000 , & + 0.00030000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.32530000000000 , & + 1.03000000000000 , & + -0.00710000000000 , & + 0.09280000000000 , & + 0.04750000000000 , & + 0.01870000000000 , & + 0.00630000000000 , & + 0.00180000000000 , & + 0.00050000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.32210000000000 , & + 1.04040000000000 , & + -0.00900000000000 , & + 0.10060000000000 , & + 0.05490000000000 , & + 0.02340000000000 , & + 0.00850000000000 , & + 0.00270000000000 , & + 0.00080000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.31870000000000 , & + 1.05150000000000 , & + -0.01100000000000 , & + 0.10780000000000 , & + 0.06200000000000 , & + 0.02820000000000 , & + 0.01100000000000 , & + 0.00380000000000 , & + 0.00120000000000 , & + 0.00030000000000 , & + 0.00010000000000 , & + 0.31520000000000 , & + 1.06320000000000 , & + -0.01320000000000 , & + 0.11410000000000 , & + 0.06880000000000 , & + 0.03320000000000 , & + 0.01370000000000 , & + 0.00500000000000 , & + 0.00170000000000 , & + 0.00050000000000 , & + 0.00010000000000 , & + 0.31150000000000 , & + 1.07560000000000 , & + -0.01560000000000 , & + 0.11980000000000 , & + 0.07520000000000 , & + 0.03810000000000 , & + 0.01670000000000 , & + 0.00650000000000 , & + 0.00230000000000 , & + 0.00070000000000 , & + 0.00020000000000 , & + 0.30770000000000 , & + 1.08890000000000 , & + -0.01820000000000 , & + 0.12460000000000 , & + 0.08110000000000 , & + 0.04310000000000 , & + 0.01990000000000 , & + 0.00820000000000 , & + 0.00310000000000 , & + 0.00100000000000 , & + 0.00030000000000 , & + 0.30370000000000 , & + 1.10340000000000 , & + -0.02100000000000 , & + 0.12840000000000 , & + 0.08630000000000 , & + 0.04800000000000 , & + 0.02330000000000 , & + 0.01020000000000 , & + 0.00410000000000 , & + 0.00150000000000 , & + 0.00050000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.12840000000000 , & + 0.08630000000000 , & + 0.04800000000000 , & + 0.02330000000000 , & + 0.01020000000000 , & + 0.00410000000000 , & + 0.00150000000000 , & + 0.00050000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.12840000000000 , & + 0.08630000000000 , & + 0.04800000000000 , & + 0.02330000000000 , & + 0.01020000000000 , & + 0.00410000000000 , & + 0.00150000000000 , & + 0.00050000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.12840000000000 , & + 0.08630000000000 , & + 0.04800000000000 , & + 0.02330000000000 , & + 0.01020000000000 , & + 0.00410000000000 , & + 0.00150000000000 , & + 0.00050000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.12840000000000 , & + 0.08630000000000 , & + 0.04800000000000 , & + 0.02330000000000 , & + 0.01020000000000 , & + 0.00410000000000 , & + 0.00150000000000 , & + 0.00050000000000 , & + 0.31900000000000 , & + 0.98470000000000 , & + -0.00010000000000 , & + 0.01440000000000 , & + 0.00150000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.31800000000000 , & + 0.98810000000000 , & + -0.00050000000000 , & + 0.02820000000000 , & + 0.00560000000000 , & + 0.00080000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.31630000000000 , & + 0.99330000000000 , & + -0.00100000000000 , & + 0.04100000000000 , & + 0.01170000000000 , & + 0.00240000000000 , & + 0.00040000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.31420000000000 , & + 1.00000000000000 , & + -0.00180000000000 , & + 0.05280000000000 , & + 0.01890000000000 , & + 0.00500000000000 , & + 0.00110000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.31170000000000 , & + 1.00790000000000 , & + -0.00280000000000 , & + 0.06360000000000 , & + 0.02660000000000 , & + 0.00840000000000 , & + 0.00220000000000 , & + 0.00050000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.30890000000000 , & + 1.01690000000000 , & + -0.00400000000000 , & + 0.07340000000000 , & + 0.03450000000000 , & + 0.01240000000000 , & + 0.00380000000000 , & + 0.00100000000000 , & + 0.00020000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.30600000000000 , & + 1.02660000000000 , & + -0.00550000000000 , & + 0.08230000000000 , & + 0.04240000000000 , & + 0.01690000000000 , & + 0.00580000000000 , & + 0.00170000000000 , & + 0.00050000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.30290000000000 , & + 1.03720000000000 , & + -0.00710000000000 , & + 0.09040000000000 , & + 0.05010000000000 , & + 0.02180000000000 , & + 0.00810000000000 , & + 0.00270000000000 , & + 0.00080000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.29970000000000 , & + 1.04830000000000 , & + -0.00890000000000 , & + 0.09780000000000 , & + 0.05740000000000 , & + 0.02680000000000 , & + 0.01080000000000 , & + 0.00390000000000 , & + 0.00120000000000 , & + 0.00040000000000 , & + 0.00010000000000 , & + 0.29630000000000 , & + 1.06020000000000 , & + -0.01090000000000 , & + 0.10450000000000 , & + 0.06440000000000 , & + 0.03200000000000 , & + 0.01370000000000 , & + 0.00530000000000 , & + 0.00180000000000 , & + 0.00060000000000 , & + 0.00020000000000 , & + 0.29280000000000 , & + 1.07280000000000 , & + -0.01320000000000 , & + 0.11040000000000 , & + 0.07100000000000 , & + 0.03720000000000 , & + 0.01690000000000 , & + 0.00690000000000 , & + 0.00250000000000 , & + 0.00090000000000 , & + 0.00030000000000 , & + 0.28930000000000 , & + 1.08610000000000 , & + -0.01550000000000 , & + 0.11560000000000 , & + 0.07700000000000 , & + 0.04230000000000 , & + 0.02030000000000 , & + 0.00870000000000 , & + 0.00340000000000 , & + 0.00120000000000 , & + 0.00040000000000 , & + 0.28550000000000 , & + 1.10040000000000 , & + -0.01810000000000 , & + 0.11990000000000 , & + 0.08250000000000 , & + 0.04740000000000 , & + 0.02380000000000 , & + 0.01080000000000 , & + 0.00450000000000 , & + 0.00170000000000 , & + 0.00060000000000 , & + 0.28150000000000 , & + 1.11590000000000 , & + -0.02080000000000 , & + 0.12320000000000 , & + 0.08730000000000 , & + 0.05220000000000 , & + 0.02750000000000 , & + 0.01320000000000 , & + 0.00590000000000 , & + 0.00240000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.12320000000000 , & + 0.08730000000000 , & + 0.05220000000000 , & + 0.02750000000000 , & + 0.01320000000000 , & + 0.00590000000000 , & + 0.00240000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.12320000000000 , & + 0.08730000000000 , & + 0.05220000000000 , & + 0.02750000000000 , & + 0.01320000000000 , & + 0.00590000000000 , & + 0.00240000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.12320000000000 , & + 0.08730000000000 , & + 0.05220000000000 , & + 0.02750000000000 , & + 0.01320000000000 , & + 0.00590000000000 , & + 0.00240000000000 , & + 0.00090000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.12320000000000 , & + 0.08730000000000 , & + 0.05220000000000 , & + 0.02750000000000 , & + 0.01320000000000 , & + 0.00590000000000 , & + 0.00240000000000 , & + 0.00090000000000 , & + 0.29970000000000 , & + 0.98670000000000 , & + -0.00010000000000 , & + 0.01440000000000 , & + 0.00170000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.29850000000000 , & + 0.99050000000000 , & + -0.00050000000000 , & + 0.02810000000000 , & + 0.00630000000000 , & + 0.00100000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.29680000000000 , & + 0.99630000000000 , & + -0.00100000000000 , & + 0.04070000000000 , & + 0.01290000000000 , & + 0.00300000000000 , & + 0.00060000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.29460000000000 , & + 1.00370000000000 , & + -0.00180000000000 , & + 0.05220000000000 , & + 0.02050000000000 , & + 0.00610000000000 , & + 0.00150000000000 , & + 0.00030000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.29210000000000 , & + 1.01240000000000 , & + -0.00280000000000 , & + 0.06250000000000 , & + 0.02860000000000 , & + 0.01000000000000 , & + 0.00300000000000 , & + 0.00080000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.28930000000000 , & + 1.02200000000000 , & + -0.00400000000000 , & + 0.07190000000000 , & + 0.03670000000000 , & + 0.01450000000000 , & + 0.00490000000000 , & + 0.00150000000000 , & + 0.00040000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.28640000000000 , & + 1.03250000000000 , & + -0.00540000000000 , & + 0.08040000000000 , & + 0.04460000000000 , & + 0.01950000000000 , & + 0.00730000000000 , & + 0.00250000000000 , & + 0.00080000000000 , & + 0.00020000000000 , & + 0.00010000000000 , & + 0.28330000000000 , & + 1.04380000000000 , & + -0.00710000000000 , & + 0.08810000000000 , & + 0.05210000000000 , & + 0.02470000000000 , & + 0.01010000000000 , & + 0.00370000000000 , & + 0.00120000000000 , & + 0.00040000000000 , & + 0.00010000000000 , & + 0.28010000000000 , & + 1.05580000000000 , & + -0.00890000000000 , & + 0.09500000000000 , & + 0.05930000000000 , & + 0.03010000000000 , & + 0.01320000000000 , & + 0.00520000000000 , & + 0.00190000000000 , & + 0.00060000000000 , & + 0.00020000000000 , & + 0.27670000000000 , & + 1.06840000000000 , & + -0.01090000000000 , & + 0.10130000000000 , & + 0.06610000000000 , & + 0.03540000000000 , & + 0.01660000000000 , & + 0.00700000000000 , & + 0.00270000000000 , & + 0.00090000000000 , & + 0.00030000000000 , & + 0.27330000000000 , & + 1.08180000000000 , & + -0.01310000000000 , & + 0.10680000000000 , & + 0.07240000000000 , & + 0.04080000000000 , & + 0.02010000000000 , & + 0.00900000000000 , & + 0.00370000000000 , & + 0.00140000000000 , & + 0.00050000000000 , & + 0.26980000000000 , & + 1.09600000000000 , & + -0.01540000000000 , & + 0.11150000000000 , & + 0.07810000000000 , & + 0.04600000000000 , & + 0.02380000000000 , & + 0.01120000000000 , & + 0.00490000000000 , & + 0.00190000000000 , & + 0.00070000000000 , & + 0.26610000000000 , & + 1.11120000000000 , & + -0.01800000000000 , & + 0.11540000000000 , & + 0.08330000000000 , & + 0.05100000000000 , & + 0.02760000000000 , & + 0.01370000000000 , & + 0.00630000000000 , & + 0.00270000000000 , & + 0.00110000000000 , & + 0.26220000000000 , & + 1.12780000000000 , & + -0.02060000000000 , & + 0.11810000000000 , & + 0.08750000000000 , & + 0.05560000000000 , & + 0.03150000000000 , & + 0.01640000000000 , & + 0.00790000000000 , & + 0.00360000000000 , & + 0.00150000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.11810000000000 , & + 0.08750000000000 , & + 0.05560000000000 , & + 0.03150000000000 , & + 0.01640000000000 , & + 0.00790000000000 , & + 0.00360000000000 , & + 0.00150000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.11810000000000 , & + 0.08750000000000 , & + 0.05560000000000 , & + 0.03150000000000 , & + 0.01640000000000 , & + 0.00790000000000 , & + 0.00360000000000 , & + 0.00150000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.11810000000000 , & + 0.08750000000000 , & + 0.05560000000000 , & + 0.03150000000000 , & + 0.01640000000000 , & + 0.00790000000000 , & + 0.00360000000000 , & + 0.00150000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.11810000000000 , & + 0.08750000000000 , & + 0.05560000000000 , & + 0.03150000000000 , & + 0.01640000000000 , & + 0.00790000000000 , & + 0.00360000000000 , & + 0.00150000000000 , & + 0.28250000000000 , & + 0.98850000000000 , & + -0.00010000000000 , & + 0.01440000000000 , & + 0.00190000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.28130000000000 , & + 0.99270000000000 , & + -0.00050000000000 , & + 0.02800000000000 , & + 0.00700000000000 , & + 0.00130000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.27950000000000 , & + 0.99910000000000 , & + -0.00100000000000 , & + 0.04030000000000 , & + 0.01410000000000 , & + 0.00370000000000 , & + 0.00080000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.27730000000000 , & + 1.00710000000000 , & + -0.00180000000000 , & + 0.05140000000000 , & + 0.02210000000000 , & + 0.00720000000000 , & + 0.00200000000000 , & + 0.00050000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.27470000000000 , & + 1.01650000000000 , & + -0.00280000000000 , & + 0.06130000000000 , & + 0.03030000000000 , & + 0.01160000000000 , & + 0.00380000000000 , & + 0.00110000000000 , & + 0.00030000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.27200000000000 , & + 1.02680000000000 , & + -0.00400000000000 , & + 0.07030000000000 , & + 0.03840000000000 , & + 0.01660000000000 , & + 0.00620000000000 , & + 0.00210000000000 , & + 0.00060000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.26900000000000 , & + 1.03800000000000 , & + -0.00540000000000 , & + 0.07840000000000 , & + 0.04630000000000 , & + 0.02190000000000 , & + 0.00900000000000 , & + 0.00330000000000 , & + 0.00110000000000 , & + 0.00040000000000 , & + 0.00010000000000 , & + 0.26590000000000 , & + 1.05000000000000 , & + -0.00700000000000 , & + 0.08570000000000 , & + 0.05380000000000 , & + 0.02740000000000 , & + 0.01220000000000 , & + 0.00490000000000 , & + 0.00180000000000 , & + 0.00060000000000 , & + 0.00020000000000 , & + 0.26280000000000 , & + 1.06270000000000 , & + -0.00880000000000 , & + 0.09220000000000 , & + 0.06080000000000 , & + 0.03300000000000 , & + 0.01570000000000 , & + 0.00670000000000 , & + 0.00270000000000 , & + 0.00100000000000 , & + 0.00030000000000 , & + 0.25950000000000 , & + 1.07620000000000 , & + -0.01080000000000 , & + 0.09810000000000 , & + 0.06730000000000 , & + 0.03850000000000 , & + 0.01940000000000 , & + 0.00880000000000 , & + 0.00370000000000 , & + 0.00150000000000 , & + 0.00050000000000 , & + 0.25610000000000 , & + 1.09040000000000 , & + -0.01300000000000 , & + 0.10320000000000 , & + 0.07330000000000 , & + 0.04390000000000 , & + 0.02320000000000 , & + 0.01120000000000 , & + 0.00500000000000 , & + 0.00210000000000 , & + 0.00080000000000 , & + 0.25260000000000 , & + 1.10540000000000 , & + -0.01530000000000 , & + 0.10760000000000 , & + 0.07870000000000 , & + 0.04910000000000 , & + 0.02720000000000 , & + 0.01380000000000 , & + 0.00650000000000 , & + 0.00280000000000 , & + 0.00120000000000 , & + 0.24900000000000 , & + 1.12150000000000 , & + -0.01780000000000 , & + 0.11100000000000 , & + 0.08340000000000 , & + 0.05390000000000 , & + 0.03120000000000 , & + 0.01660000000000 , & + 0.00820000000000 , & + 0.00380000000000 , & + 0.00170000000000 , & + 0.24520000000000 , & + 1.13910000000000 , & + -0.02050000000000 , & + 0.11320000000000 , & + 0.08710000000000 , & + 0.05830000000000 , & + 0.03520000000000 , & + 0.01960000000000 , & + 0.01020000000000 , & + 0.00500000000000 , & + 0.00230000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.11320000000000 , & + 0.08710000000000 , & + 0.05830000000000 , & + 0.03520000000000 , & + 0.01960000000000 , & + 0.01020000000000 , & + 0.00500000000000 , & + 0.00230000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.11320000000000 , & + 0.08710000000000 , & + 0.05830000000000 , & + 0.03520000000000 , & + 0.01960000000000 , & + 0.01020000000000 , & + 0.00500000000000 , & + 0.00230000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.11320000000000 , & + 0.08710000000000 , & + 0.05830000000000 , & + 0.03520000000000 , & + 0.01960000000000 , & + 0.01020000000000 , & + 0.00500000000000 , & + 0.00230000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.11320000000000 , & + 0.08710000000000 , & + 0.05830000000000 , & + 0.03520000000000 , & + 0.01960000000000 , & + 0.01020000000000 , & + 0.00500000000000 , & + 0.00230000000000 , & + 0.26720000000000 , & + 0.99000000000000 , & + -0.00010000000000 , & + 0.01440000000000 , & + 0.00210000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.26600000000000 , & + 0.99470000000000 , & + -0.00050000000000 , & + 0.02790000000000 , & + 0.00770000000000 , & + 0.00160000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.26410000000000 , & + 1.00160000000000 , & + -0.00100000000000 , & + 0.03990000000000 , & + 0.01520000000000 , & + 0.00440000000000 , & + 0.00110000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.26190000000000 , & + 1.01030000000000 , & + -0.00180000000000 , & + 0.05060000000000 , & + 0.02350000000000 , & + 0.00840000000000 , & + 0.00260000000000 , & + 0.00070000000000 , & + 0.00020000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.25930000000000 , & + 1.02030000000000 , & + -0.00280000000000 , & + 0.06010000000000 , & + 0.03180000000000 , & + 0.01320000000000 , & + 0.00480000000000 , & + 0.00160000000000 , & + 0.00050000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.25650000000000 , & + 1.03130000000000 , & + -0.00400000000000 , & + 0.06870000000000 , & + 0.03990000000000 , & + 0.01860000000000 , & + 0.00750000000000 , & + 0.00280000000000 , & + 0.00090000000000 , & + 0.00030000000000 , & + 0.00010000000000 , & + 0.25360000000000 , & + 1.04320000000000 , & + -0.00540000000000 , & + 0.07640000000000 , & + 0.04770000000000 , & + 0.02420000000000 , & + 0.01070000000000 , & + 0.00430000000000 , & + 0.00160000000000 , & + 0.00050000000000 , & + 0.00020000000000 , & + 0.25050000000000 , & + 1.05590000000000 , & + -0.00700000000000 , & + 0.08330000000000 , & + 0.05500000000000 , & + 0.02990000000000 , & + 0.01430000000000 , & + 0.00620000000000 , & + 0.00250000000000 , & + 0.00090000000000 , & + 0.00030000000000 , & + 0.24740000000000 , & + 1.06940000000000 , & + -0.00880000000000 , & + 0.08950000000000 , & + 0.06170000000000 , & + 0.03560000000000 , & + 0.01810000000000 , & + 0.00840000000000 , & + 0.00360000000000 , & + 0.00140000000000 , & + 0.00050000000000 , & + 0.24420000000000 , & + 1.08350000000000 , & + -0.01080000000000 , & + 0.09500000000000 , & + 0.06800000000000 , & + 0.04120000000000 , & + 0.02210000000000 , & + 0.01080000000000 , & + 0.00490000000000 , & + 0.00210000000000 , & + 0.00080000000000 , & + 0.24080000000000 , & + 1.09850000000000 , & + -0.01290000000000 , & + 0.09980000000000 , & + 0.07360000000000 , & + 0.04650000000000 , & + 0.02620000000000 , & + 0.01350000000000 , & + 0.00650000000000 , & + 0.00290000000000 , & + 0.00120000000000 , & + 0.23740000000000 , & + 1.11430000000000 , & + -0.01520000000000 , & + 0.10380000000000 , & + 0.07870000000000 , & + 0.05160000000000 , & + 0.03030000000000 , & + 0.01640000000000 , & + 0.00830000000000 , & + 0.00390000000000 , & + 0.00180000000000 , & + 0.23390000000000 , & + 1.13130000000000 , & + -0.01770000000000 , & + 0.10690000000000 , & + 0.08300000000000 , & + 0.05630000000000 , & + 0.03440000000000 , & + 0.01940000000000 , & + 0.01030000000000 , & + 0.00510000000000 , & + 0.00240000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.10690000000000 , & + 0.08300000000000 , & + 0.05630000000000 , & + 0.03440000000000 , & + 0.01940000000000 , & + 0.01030000000000 , & + 0.00510000000000 , & + 0.00240000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.10690000000000 , & + 0.08300000000000 , & + 0.05630000000000 , & + 0.03440000000000 , & + 0.01940000000000 , & + 0.01030000000000 , & + 0.00510000000000 , & + 0.00240000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.10690000000000 , & + 0.08300000000000 , & + 0.05630000000000 , & + 0.03440000000000 , & + 0.01940000000000 , & + 0.01030000000000 , & + 0.00510000000000 , & + 0.00240000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.10690000000000 , & + 0.08300000000000 , & + 0.05630000000000 , & + 0.03440000000000 , & + 0.01940000000000 , & + 0.01030000000000 , & + 0.00510000000000 , & + 0.00240000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.10690000000000 , & + 0.08300000000000 , & + 0.05630000000000 , & + 0.03440000000000 , & + 0.01940000000000 , & + 0.01030000000000 , & + 0.00510000000000 , & + 0.00240000000000 , & + 0.25350000000000 , & + 0.99130000000000 , & + -0.00010000000000 , & + 0.01440000000000 , & + 0.00240000000000 , & + 0.00030000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.25220000000000 , & + 0.99640000000000 , & + -0.00050000000000 , & + 0.02770000000000 , & + 0.00840000000000 , & + 0.00190000000000 , & + 0.00040000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.25030000000000 , & + 1.00400000000000 , & + -0.00100000000000 , & + 0.03940000000000 , & + 0.01630000000000 , & + 0.00510000000000 , & + 0.00140000000000 , & + 0.00030000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.24800000000000 , & + 1.01320000000000 , & + -0.00180000000000 , & + 0.04980000000000 , & + 0.02470000000000 , & + 0.00960000000000 , & + 0.00320000000000 , & + 0.00100000000000 , & + 0.00030000000000 , & + 0.00010000000000 , & + 0.00000000000000 , & + 0.24550000000000 , & + 1.02390000000000 , & + -0.00280000000000 , & + 0.05890000000000 , & + 0.03310000000000 , & + 0.01480000000000 , & + 0.00580000000000 , & + 0.00200000000000 , & + 0.00070000000000 , & + 0.00020000000000 , & + 0.00010000000000 , & + 0.24270000000000 , & + 1.03560000000000 , & + -0.00400000000000 , & + 0.06710000000000 , & + 0.04110000000000 , & + 0.02050000000000 , & + 0.00890000000000 , & + 0.00350000000000 , & + 0.00130000000000 , & + 0.00040000000000 , & + 0.00010000000000 , & + 0.23980000000000 , & + 1.04810000000000 , & + -0.00540000000000 , & + 0.07450000000000 , & + 0.04870000000000 , & + 0.02630000000000 , & + 0.01250000000000 , & + 0.00540000000000 , & + 0.00220000000000 , & + 0.00080000000000 , & + 0.00030000000000 , & + 0.23680000000000 , & + 1.06150000000000 , & + -0.00700000000000 , & + 0.08110000000000 , & + 0.05580000000000 , & + 0.03220000000000 , & + 0.01640000000000 , & + 0.00760000000000 , & + 0.00330000000000 , & + 0.00130000000000 , & + 0.00050000000000 , & + 0.23360000000000 , & + 1.07570000000000 , & + -0.00880000000000 , & + 0.08690000000000 , & + 0.06230000000000 , & + 0.03790000000000 , & + 0.02050000000000 , & + 0.01010000000000 , & + 0.00470000000000 , & + 0.00200000000000 , & + 0.00080000000000 , & + 0.23050000000000 , & + 1.09060000000000 , & + -0.01070000000000 , & + 0.09210000000000 , & + 0.06830000000000 , & + 0.04350000000000 , & + 0.02470000000000 , & + 0.01290000000000 , & + 0.00630000000000 , & + 0.00290000000000 , & + 0.00120000000000 , & + 0.22720000000000 , & + 1.10630000000000 , & + -0.01290000000000 , & + 0.09660000000000 , & + 0.07360000000000 , & + 0.04870000000000 , & + 0.02900000000000 , & + 0.01590000000000 , & + 0.00810000000000 , & + 0.00390000000000 , & + 0.00180000000000 , & + 0.22380000000000 , & + 1.12290000000000 , & + -0.01520000000000 , & + 0.10020000000000 , & + 0.07830000000000 , & + 0.05370000000000 , & + 0.03320000000000 , & + 0.01900000000000 , & + 0.01020000000000 , & + 0.00520000000000 , & + 0.00250000000000 , & + 0.22030000000000 , & + 1.14060000000000 , & + -0.01760000000000 , & + 0.10290000000000 , & + 0.08220000000000 , & + 0.05810000000000 , & + 0.03730000000000 , & + 0.02220000000000 , & + 0.01250000000000 , & + 0.00660000000000 , & + 0.00340000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.10290000000000 , & + 0.08220000000000 , & + 0.05810000000000 , & + 0.03730000000000 , & + 0.02220000000000 , & + 0.01250000000000 , & + 0.00660000000000 , & + 0.00340000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.10290000000000 , & + 0.08220000000000 , & + 0.05810000000000 , & + 0.03730000000000 , & + 0.02220000000000 , & + 0.01250000000000 , & + 0.00660000000000 , & + 0.00340000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.10290000000000 , & + 0.08220000000000 , & + 0.05810000000000 , & + 0.03730000000000 , & + 0.02220000000000 , & + 0.01250000000000 , & + 0.00660000000000 , & + 0.00340000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.10290000000000 , & + 0.08220000000000 , & + 0.05810000000000 , & + 0.03730000000000 , & + 0.02220000000000 , & + 0.01250000000000 , & + 0.00660000000000 , & + 0.00340000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.00000000000000 , & + 0.10290000000000 , & + 0.08220000000000 , & + 0.05810000000000 , & + 0.03730000000000 , & + 0.02220000000000 , & + 0.01250000000000 , & + 0.00660000000000 , & + 0.00340000000000 & + /) + ! + RFveg = reshape(RFvegtmp ,(/11,18,20/)) + ! + !write(*,*)'RFveg= ',RFveg + ! + end subroutine load_RFtable + +end module snapwave_RFtable + \ No newline at end of file diff --git a/source/src/snapwave/snapwave_domain.f90 b/source/src/snapwave/snapwave_domain.f90 index bea58fa33..3100297ae 100644 --- a/source/src/snapwave/snapwave_domain.f90 +++ b/source/src/snapwave/snapwave_domain.f90 @@ -10,6 +10,7 @@ subroutine initialize_snapwave_domain() use snapwave_boundaries use interp use sfincs_error + use quadtree ! ! Local input variables ! @@ -89,10 +90,7 @@ subroutine initialize_snapwave_domain() !if (ja_vegetation==1) then ! call veggie_init() !else - allocate(veg_Cd(no_nodes, no_secveg)) - allocate(veg_ah(no_nodes, no_secveg)) - allocate(veg_bstems(no_nodes, no_secveg)) - allocate(veg_Nstems(no_nodes, no_secveg)) + !endif ! ntheta360 = nint(360./dtheta) @@ -2110,7 +2108,7 @@ subroutine read_snapwave_quadtree_mesh(load_quadtree) ! enddo ! - ! Loop through cells to re-maps the face nodes + ! STEP 8 - Loop through cells to re-maps the face nodes ! do iface = 1, no_faces do j = 1, 4 @@ -2122,6 +2120,41 @@ subroutine read_snapwave_quadtree_mesh(load_quadtree) enddo enddo ! + ! STEP 9 - if vegetation, re-map veggie input from quadtree netcdf file + ! Set 'no_secveg' from quadtree.F90 for use in snapwave_data + no_secveg = quadtree_no_secveg + allocate(veg_Cd(no_nodes, no_secveg)) + allocate(veg_ah(no_nodes, no_secveg)) + allocate(veg_bstems(no_nodes, no_secveg)) + allocate(veg_Nstems(no_nodes, no_secveg)) + veg_Cd = 0.0 + veg_ah = 0.0 + veg_bstems = 0.0 + veg_Nstems = 0.0 + ! + if (vegetation) then + ! copy from the quadtree snapwave_veg + nac = 0 + ! + do ip = 1, quadtree_nr_points + ! + if (msk_tmp2(ip)>0) then + ! + nac = nac + 1 + ! + ! Set node values for all points in the vertical + do iq = 1, no_secveg + veg_Cd(nac,iq) = quadtree_snapwave_veg_Cd(ip,iq) + veg_ah(nac,iq) = quadtree_snapwave_veg_ah(ip,iq) + veg_bstems(nac,iq) = quadtree_snapwave_veg_bstems(ip,iq) + veg_Nstems(nac,iq) = quadtree_snapwave_veg_Nstems(ip,iq) + enddo + ! + endif + enddo + ! + endif + ! end subroutine end module diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 409709f55..ff55123df 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -236,12 +236,15 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! logical, intent(in) :: vegetation ! logical yes/no real*4, dimension(no_nodes), intent(out) :: Dveg ! dissipation by vegetation: N.B. spatial field! - integer, intent(in) :: no_secveg + integer, intent(in) :: no_secveg ! number of sections in the vertical real*4, dimension(no_nodes,no_secveg), intent(in) :: veg_ah ! Height of vertical sections used in vegetation schematization [m wrt zb_ini (zb0)] real*4, dimension(no_nodes,no_secveg), intent(in) :: veg_bstems ! Width/diameter of individual vegetation stems [m] real*4, dimension(no_nodes,no_secveg), intent(in) :: veg_Nstems ! Number of vegetation stems per unit horizontal area [m-2] real*4, dimension(no_nodes,no_secveg), intent(in) :: veg_Cd ! Bulk drag coefficient [-] real*4 :: Dvegk ! dissipation by vegetation: N.B. scalar value! + real*4, dimension(no_nodes) :: Fvw ! vegetation wave drag force + real*4, dimension(no_nodes,50) :: unl ! non-linear wave orbital velocity time series, in 50 points per wave length + real*4, dimension(no_nodes,50) :: etaw0 ! non-linear sea surface time series, in 50 points per wave length ! ! ! Local variables and arrays @@ -378,6 +381,9 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & thetam = 0.0 !H = 0.0 ! TODO - TL: CHeck > needed for restart for IG > set to 0 now in snapwave_domain.f90 Dveg = 0.0 + Fvw = 0.0 + unl = 0.0 + etaw0 = 0.0 ! if (igwaves) then !T_ig = Tinc2ig*Tp @@ -637,6 +643,10 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & endif ! DoverE(k) = (Dwk + Dfk + Dvegk)/max(Ek, 1.0e-6) + !if (Dvegk > 0.0) then + ! write(logstr,*)'k ',k,'depth(k)',depth(k),'Hk ',Hk,'Ek ',Ek,'Dwk ', Dwk,'Dfk ', Dfk,'Dvegk ', Dvegk,'DoverE veggie ', DoverE(k),'DoverE org ', (Dwk + Dfk)/max(Ek, 1.0e-6) + ! call write_log(logstr, 0) + !endif ! if (wind) then ! @@ -887,6 +897,16 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! enddo ! + if (vegetation) then + ! + ! Compute the non-linear wave velocity time series (unl) using a wave shape model > only needs to be called once per calling SnapWave + !write(*,*)'Call swvegnonlin' + ! + call swvegnonlin(no_nodes, kwav, depth, H, g, Tp, unl, etaw0) + !write(*,*)'Finished swvegnonlin' + ! + endif + ! do k=1,no_nodes ! ! Compute directionally integrated parameters for output @@ -914,10 +934,39 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & endif ! if (vegetation) then + ! + ! Compute wave dissipation due to vegetation + !write(*,*)'Call vegatt' call vegatt(sig(k), no_nodes, kwav(k), no_secveg, veg_ah(k,:), veg_bstems(k,:), veg_Nstems(k,:), veg_Cd(k,:), depth(k), rho, g, H(k), Dveg(k)) + ! + ! Now also call 'momeqveg' to compute wave drag force due to vegetation + !write(*,*)'Call momeqveg' + call momeqveg(no_nodes, no_secveg, veg_ah(k,:), veg_bstems(k,:), veg_Nstems(k,:), veg_Cd(k,:), depth(k), rho, H(k), Tp(k), unl(k,:), Fvw(k)) + ! NOTE - TL: for now replaced 'Trep' by 'Tp(k)' + ! else Dveg(k) = 0. + Fvw(k) = 0. endif + ! + !F(k) = Dw(k)*kwav(k)/sig(k)/rho/depth(k) + !F(k) = (Dw(k) + Df(k))*kwav(k)/sig(k)/rho/depth(k) + F(k) = (Dw(k) + Dveg(k))*kwav(k)/sig(k)/rho/depth(k) + F(k) = F(k) + Fvw(k) ! FIXME - still *kwav(k)/sig(k) ??? + + !F(k) = (Dw(k) + Df(k))*kwav(k)/sigm ! TODO TL: before was this, now multiplied with rho*depth(k) in sfincs_snapwave.f90 + ! + !if (vegetation) then + ! if (Dveg(k) > 0.0) then + ! write(logstr,*)'k ',k,'depth(k)',depth(k),'H(k) ',H(k),'Dw(k) ', Dw(k),'Dveg(k) ', Dveg(k),'Hmx(k) ', Hmx(k),'kwav(k) ', kwav(k),'sig(k) ', sig(k), 'thetam(k)',thetam(k),'F(k) ',F(k) + ! call write_log(logstr, 0) + ! endif + !else + ! if (H(k) > 0.0) then + ! write(logstr,*)'k ',k,'depth(k)',depth(k),'H(k) ',H(k),'Dw(k) ', Dw(k),'Hmx(k) ', Hmx(k),'kwav(k) ', kwav(k),'sig(k) ', sig(k), 'thetam(k)',thetam(k),'F(k) ',F(k) + ! call write_log(logstr, 0) + ! endif + !endif ! if (igwaves) then ! @@ -1364,7 +1413,7 @@ subroutine vegatt(sigm, no_nodes, kwav, no_secveg, veg_ah, veg_bstems, veg_Nstem ! declare variables real*4, intent(in) :: sigm ! wave frequency (per cell) integer, intent(in) :: no_nodes ! number of unstructured grid nodes - integer, intent(in) :: no_secveg + integer, intent(in) :: no_secveg ! number of sections in the vertical real*4, dimension(no_secveg), intent(in) :: veg_ah ! Height of vertical sections used in vegetation schematization [m wrt zb_ini (zb0)] (per cell) real*4, dimension(no_secveg), intent(in) :: veg_bstems ! Width/diameter of individual vegetation stems [m] (per cell) real*4, dimension(no_secveg), intent(in) :: veg_Nstems ! Number of vegetation stems per unit horizontal area [m-2] (per cell) @@ -1377,7 +1426,7 @@ subroutine vegatt(sigm, no_nodes, kwav, no_secveg, veg_ah, veg_bstems, veg_Nstem integer :: m real*4, intent(in) :: kwav ! wave number (per cell) real*4, intent(out) :: Dveg ! dissipation by vegetation (per cell) - + ! Set dissipation in vegetation to zero everywhere for a start Dveg = 0.d0 @@ -1389,16 +1438,19 @@ subroutine vegatt(sigm, no_nodes, kwav, no_secveg, veg_ah, veg_bstems, veg_Nstem if (no_secveg > 0) then ! only in case vegetation is present do m=1,no_secveg ! for each vertical vegetation section if (veg_Cd(m) < 0.d0) then ! If Cd is not user specified: call subroutine of M. Bendoni (see below) - write(logstr,*)'Cd is not user specified: using subroutine bulkdragcoeff to compute Cd' - call write_log(logstr, 0) ! - call bulkdragcoeff(veg_ah(m),m,Cdterm,no_nodes,no_secveg,depth,H,kwav,veg_bstems(m),sigm) ! bulkdragcoeff(ahveg(k,m)+zb0(k)-zb(k),m,k,Cdterm) <- no bed level change implemented in Snapwave - !write(*,*)'Cd is not user specified: putting default value of 0.7' - !veg_Cd(k,m) = 0.7 + !call bulkdragcoeff(veg_ah(m),m,Cdterm,no_nodes,no_secveg,depth,H,kwav,veg_bstems(m),sigm) ! bulkdragcoeff(ahveg(k,m)+zb0(k)-zb(k),m,k,Cdterm) <- no bed level change implemented in Snapwave + !write(logstr,*)'Cd is not user specified: using m. bendoni bulkdragcoefficient to compute cd: ',cdterm + !veg_Cd(m) = Cdterm + ! + write(logstr,*)'SnapWave ERROR - Cd is not specified for layer: ',m + call write_log(logstr, 0) + ! + ! endif enddo endif - + ! ! Attenuation by vegetation is computed in wave action balance (swvegatt) and the momentum balance (momeqveg); ! 1) Short wave dissipation by vegetation @@ -1412,9 +1464,9 @@ end subroutine vegatt subroutine swvegatt(sigm, no_nodes, kwav, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, depth, rho, g, H, Dveg)! Short wave dissipation by vegetation !use snapwave_data !use snapwave_domain - + ! implicit none - + ! ! declare variables integer, intent(in) :: no_nodes ! number of unstructured grid nodes integer, intent(in) :: no_secveg @@ -1427,20 +1479,20 @@ subroutine swvegatt(sigm, no_nodes, kwav, no_secveg, veg_ah, veg_bstems, veg_Nst real*4, intent(in) :: rho real*4, intent(in) :: g real*4, intent(in) :: H ! wave height - + ! ! local variables real*4 :: pi ! 3.14159 integer :: k,m ! indices of actual x,y point - + ! real*4 :: aht,hterm,htermold,Dvgt,ahtold real*4 :: Dvg,kmr!,kwav real*4, intent(in) :: kwav!,k - + ! real*4, intent(out) :: Dveg - + ! pi = 4.d0*atan(1.d0) kmr = min(max(kwav, 0.01d0), 100.d0) - + ! ! Set dissipation in vegetation to zero everywhere for a start Dvg = 0.d0 Dvgt = 0.d0 @@ -1448,24 +1500,24 @@ subroutine swvegatt(sigm, no_nodes, kwav, no_secveg, veg_ah, veg_bstems, veg_Nst ahtold = 0.d0 if (no_secveg>0) then ! only if vegetation is present do m=1,no_secveg - + ! ! Determine height of vegetation section (restricted to current bed level) !aht = veg(ind)%ah(m)+ahtold !+s%zb0(k,j)-s%zb(k,j)!(max(veg(ind)%zv(m)+s%zb0(k,j),s%zb(k,j))) aht = veg_ah(m)+ahtold - + ! ! restrict vegetation height to local water depth aht = min(aht, depth) - + ! ! compute hterm based on ah hterm = (sinh(kmr*aht)**3+3*sinh(kmr*aht))/(3.d0*kmr*cosh(kmr* depth)**3) ! - + ! ! compute dissipation based on aht and correct for lower elevated dissipation layers (following Suzuki et al. 2012) Dvgt = 0.5d0/sqrt(pi)*rho*veg_Cd(m)*veg_bstems(m)*veg_Nstems(m)*(0.5d0*kmr*g/sigm)**3*(hterm-htermold)*H**3 - + ! ! save hterm to htermold to correct possibly in next vegetation section htermold = hterm ahtold = aht - + ! ! add dissipation current vegetation section Dvg = Dvg + Dvgt enddo @@ -1544,5 +1596,182 @@ subroutine bulkdragcoeff(ahh, m, Cdterm, no_nodes, no_secveg, depth, H, kwav, ve endif ! end subroutine bulkdragcoeff + +subroutine momeqveg(no_nodes, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, depth, rho, H, Trep, unl, Fvw) + ! INput: no_nodes, no_secveg, veg_ah(k,:), veg_bstems(k,:), veg_Nstems(k,:), veg_Cd(k,:), depth(k), rho, H(k), Tp(k), unl(k,:), Fvw(k) + ! + implicit none + ! + ! Inputs + integer, intent(in) :: no_nodes, no_secveg + real*4, intent(in) :: depth ,rho, H, Trep + real*4, dimension(no_secveg), intent(in) :: veg_ah, veg_bstems, veg_Nstems, veg_Cd + real*4, dimension(50), intent(in) :: unl + ! + ! Output + real*4, intent(out) :: Fvw + ! + ! Local variables + integer :: m, t + real*4 :: dt, hvegeff, Fvgnlt, integral + real*4 :: Cd, b, N + ! + !write(*,*)'Started momeqveg' + + ! Initialize output force + ! + Fvw = 0.0 + ! + ! Time step within wave period + ! + dt = Trep / 50.0 + ! + ! Loop over vertical vegetation sections + do m = 1 , no_secveg + ! Effective submerged height of vegetation section + hvegeff = min(veg_ah(m), depth) + ! Read vegetation parameters + Cd = veg_Cd(m) + b = veg_bstems(m) + N = veg_Nstems(m) + ! Integrate vegetation drag over wave period using unl + integral = 0.0 + do t = 1, 50 !50=PPWL + integral = integral + (0.5 * Cd * b * N * hvegeff * unl(t) * abs(unl(t) ) ) * dt + enddo + ! Convert to force per unit mass and sum + Fvgnlt = -integral / depth / Trep !> units match with F(k) m/s2 + + Fvw = Fvw + Fvgnlt + enddo + !write(*,*)'Ended momeqveg' + +end subroutine momeqveg +subroutine swvegnonlin(no_nodes, kwav, depth, H, g, Trep, unl, etaw0) + use snapwave_RFtable + ! + implicit none + ! + integer, intent(in) :: no_nodes + real*4, dimension(no_nodes), intent(in) :: kwav + real*4, dimension(no_nodes), intent(in) :: depth + real*4, dimension(no_nodes), intent(in) :: H + real*4, intent(in) :: g + real*4, dimension(no_nodes), intent(in) :: Trep + real*4, dimension(no_nodes, 50),intent(out) :: unl + real*4, dimension(no_nodes, 50),intent(out) :: etaw0 + + real*4, dimension(:), save , allocatable :: h0, t0 + integer, save :: nh , nt ! save as it only needs to be done at first call + real*4, save :: dh , dt + real*4, dimension(50 ,8), save :: cs , sn ! MvdL: what is this fixed dimension 8 and 50? + + real*4, dimension(8) :: urf0 + real*4, dimension(50) :: urf2 , urf + real*4, dimension(50, 8) :: urf1 + + real*4, dimension(no_nodes) :: kmr , Urs , phi , w1 , w2 + real*4 :: p ,q , f0 , f1 , f2 , f3 + + integer :: k, irf, ih0, it0, jrf, ih1, it1 + ! + real*4 :: pi = 4.*atan(1.0) + + real*4, dimension(:,:,:), allocatable :: RFveg + ! + allocate(RFveg(11,18,20)) + ! + ! Based on Deltares' XBeach SurfBeat' subroutine: swvegnonlin + ! Subroutine to compute a net drag force due to wave skewness. Based on (matlab based) roller model with veggies by Ad. + ! + ! Background: + ! The drag force (Fveg) is a function of u*abs(u), which is zero for linear waves. For non-linear, skewed waves the + ! depth-averaged velocity integrated over the wave period is zero. However, due to the sharp peaks and flat troughs + ! the integral of u*abs(u) is non-zero, and can significantly reduce wave setup, or even lead to set-down (e.g. Dean & Bender,2006). + ! + ! Here we use a method based on Rienecker & Fenton (1981), similar to the method used for onshore sediment transport due to wave asymmetry/ + ! skewness (see also morphevolution.F90 + Van Thiel de Vries Phd thesis par 6.2.3). + ! + ! load Ad's RF-table (update for depth averaged velocities?) + call load_RFtable(RFveg) + ! + ! Initialize/Prepare for interpolation of RF-value from RFveg-table + if (.not. allocated(h0)) then + allocate(h0(no_nodes)) + allocate(t0(no_nodes)) + dh = 0.03 + dt = 1.25 + nh = floor(0.54/ dh) + nt = floor(25 / dt ) + !construct velocity profile based on cosine/sine functions / Fourier components + do irf =1 ,8 + do jrf =1 ,50 + cs ( jrf , irf ) = cos (( jrf * 2 * pi / 50) * irf ) + sn ( jrf , irf ) = sin (( jrf * 2 * pi / 50) * irf ) + enddo + enddo + endif + ! + h0 = min(nh * dh, max(dh, min(H, depth) / depth) ) + t0 = min(nt * dt, max(dt, Trep * sqrt (g / depth) ) ) + ! + ! Initialize + urf0 = 0 + urf1 = 0 + urf2 = 0 + urf = 0 + w1 = 0 + w2 = 0 + phi = 0 + Urs = 0 + kmr = 0 + ! + ! Now compute weight factors (w1,w2) for relative contribution of cosine and sine functions (for w1 = 1: only cosines -> + ! fully skewed Stokes wave, for w2 = 1: only sines -> fully asymmetric wave) based on Ruessink. + kmr = min(max(kwav, 0.01), 100.0) + Urs = H / (kmr * kmr * (depth **3) ) + + ! Compute phase and weight factors + phi = pi /2 * (1 - tanh (0.815/(Urs **0.672) ) ) + w1 = 1 - phi /( pi /2) + w2 = 1 - w1 + ! + ! Interpolate RieneckerFenton velocity from RFveg table from Ad + ! in ftab-dimension, only read 4:11 and sum later + do k =1, no_nodes + ! + ih0 = floor( h0(k) / dh) + it0 = floor( t0(k) / dt) + ih1 = min(ih0 + 1, nh) + it1 = min(it0 + 1, nt) + p = ( h0(k) - ih0 * dh) / dh + q = ( t0(k) - it0 * dt) / dt + f0 = (1 - p) * (1 - q) + f1 = p * (1 - q) + f2 = q * (1 - p) + f3 = p * q + ! + ! Compute velocity amplitude per component + do irf = 1, 8 + urf0(irf) = f0 * RFveg(irf + 3, ih0, it0) + f1 * RFveg(irf + 3, ih1, it0) + f2 * RFveg(irf+3, ih0, it1) + f3 * RFveg(irf + 3, ih1, it1) + enddo + ! fill velocity amplitude matrix urf1([50 time points, 8 components]) + do irf = 1, 8 + urf1(:, irf) = urf0(irf) + enddo + ! + ! Compute velocity profile matrix per component + urf1 = urf1 * (w1(k) * cs + w2(k) * sn ) + ! + ! Add velocity components + urf2 = sum(urf1, 2) + ! + ! Scale the results to get velocity profile over wave period + unl(k,:) = urf2 * sqrt(g * depth(k) ) + etaw0(k,:) = unl(k,:)*sqrt(max(depth(k),0.d0)/g) + enddo + ! +end subroutine swvegnonlin + end module snapwave_solver From 683b73dfcbeaa3cd298e5cd8af7495b7a3adfdf7 Mon Sep 17 00:00:00 2001 From: MarliesA Date: Thu, 12 Mar 2026 10:48:44 +0100 Subject: [PATCH 032/118] added missing vfproj update --- source/sfincs_lib/sfincs_lib.vfproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/sfincs_lib/sfincs_lib.vfproj b/source/sfincs_lib/sfincs_lib.vfproj index f2ea825d4..34b9b0f84 100644 --- a/source/sfincs_lib/sfincs_lib.vfproj +++ b/source/sfincs_lib/sfincs_lib.vfproj @@ -31,6 +31,7 @@ + @@ -44,6 +45,7 @@ + From 85fd76685df3e7e6e3f4f532430d5160188744fc Mon Sep 17 00:00:00 2001 From: Maarten van Ormondt Date: Sat, 14 Mar 2026 01:52:57 +0100 Subject: [PATCH 033/118] some refactoring of snapwave solver --- source/src/sfincs_snapwave.f90 | 226 ++- source/src/snapwave/snapwave_data.f90 | 5 +- source/src/snapwave/snapwave_domain.f90 | 327 ++-- source/src/snapwave/snapwave_infragravity.f90 | 32 +- source/src/snapwave/snapwave_solver.f90 | 1067 +++++++----- source/src/snapwave/snapwave_solver.f90.ori | 1549 +++++++++++++++++ 6 files changed, 2513 insertions(+), 693 deletions(-) create mode 100644 source/src/snapwave/snapwave_solver.f90.ori diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index 05281e4d2..ef1a76e1c 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -703,7 +703,6 @@ subroutine read_snapwave_input() end subroutine - subroutine read_real_input(fileid,keyword,value,default) ! character(*), intent(in) :: keyword @@ -713,20 +712,28 @@ subroutine read_real_input(fileid,keyword,value,default) integer, intent(in) :: fileid real*4, intent(out) :: value real*4, intent(in) :: default - integer j,stat + integer j,stat,ilen ! value = default + ! rewind(fileid) + ! do while(.true.) + ! read(fileid,'(a)',iostat = stat)line - if (stat<0) exit - j=index(line,'=') - keystr = trim(line(1:j-1)) + ! + if (stat==-1) exit + ! + call read_line(line, keystr, valstr) + ! if (trim(keystr)==trim(keyword)) then - valstr = trim(line(j+1:256)) - read(valstr,*)value + ! + read(valstr,*)value + ! exit + ! endif + ! enddo ! end subroutine @@ -741,22 +748,30 @@ subroutine read_real_array_input(fileid,keyword,value,default,nr) integer, intent(in) :: nr real*4, dimension(:), intent(out), allocatable :: value real*4, intent(in) :: default - integer j,stat, m + integer j,stat, m,ilen ! allocate(value(nr)) ! value = default + ! rewind(fileid) + ! do while(.true.) + ! read(fileid,'(a)',iostat = stat)line - if (stat<0) exit - j=index(line,'=') - keystr = trim(line(1:j-1)) + ! + if (stat==-1) exit + ! + call read_line(line, keystr, valstr) + ! if (trim(keystr)==trim(keyword)) then - valstr = trim(line(j+1:256)) + ! read(valstr,*)(value(m), m = 1, nr) + ! exit + ! endif + ! enddo ! end subroutine @@ -771,20 +786,28 @@ subroutine read_int_input(fileid,keyword,value,default) integer, intent(in) :: fileid integer, intent(out) :: value integer, intent(in) :: default - integer j,stat + integer j,stat,ilen ! value = default + ! rewind(fileid) + ! do while(.true.) + ! read(fileid,'(a)',iostat = stat)line - if (stat<0) exit - j=index(line,'=') - keystr = trim(line(1:j-1)) + ! + if (stat==-1) exit + ! + call read_line(line, keystr, valstr) + ! if (trim(keystr)==trim(keyword)) then - valstr = trim(line(j+1:256)) + ! read(valstr,*)value + ! exit + ! endif + ! enddo ! end subroutine @@ -793,28 +816,187 @@ subroutine read_int_input(fileid,keyword,value,default) subroutine read_char_input(fileid,keyword,value,default) ! character(*), intent(in) :: keyword + character(len=256) :: keystr0 character(len=256) :: keystr character(len=256) :: valstr character(len=256) :: line integer, intent(in) :: fileid character(*), intent(in) :: default character(*), intent(out) :: value - integer j,stat + integer j,stat,ilen,jn ! value = default + ! rewind(fileid) + ! do while(.true.) + ! read(fileid,'(a)',iostat = stat)line - if (stat<0) exit - j=index(line,'=') - keystr = trim(line(1:j-1)) + ! + if (stat==-1) exit + ! + call read_line(line, keystr, valstr) + ! if (trim(keystr)==trim(keyword)) then - valstr = adjustl(trim(line(j+1:256))) + ! value = valstr + ! exit + ! endif + ! enddo ! end subroutine + + subroutine read_logical_input(fileid,keyword,value,default) + ! + character(*), intent(in) :: keyword + character(len=256) :: keystr0 + character(len=256) :: keystr + character(len=256) :: valstr + character(len=256) :: line + integer, intent(in) :: fileid + logical, intent(in) :: default + logical, intent(out) :: value + integer j,stat,ilen + ! + value = default + ! + rewind(fileid) + ! + do while(.true.) + ! + read(fileid,'(a)',iostat = stat)line + ! + if (stat==-1) exit + ! + call read_line(line, keystr, valstr) + ! + if (trim(keystr)==trim(keyword)) then + ! + if (valstr(1:1) == '1' .or. valstr(1:1) == 'y' .or. valstr(1:1) == 'Y' .or. valstr(1:1) == 't' .or. valstr(1:1) == 'T') then + value = .true. + else + value = .false. + endif + ! + exit + ! + endif + ! + enddo + ! + end subroutine + + subroutine read_line(line0, keystr, valstr) + ! + ! Reads line from input file, returns keyword and value strings + ! + character(*), intent(in) :: line0 + character(len=256) :: line + character(*), intent(out) :: keystr + character(*), intent(out) :: valstr + integer j, ilen, jn + ! + keystr = '' + valstr = '' + ! + ! Change tabs into spaces. + ! + call notabs(line0, line, ilen) + ! + ! Look for line ending character. Remove it if it exists. + ! + jn = index(line, '\r') + ! + if (jn > 0) then + ! + ! New line character detected (probably sfincs.inp with windows line endings, running in linux) + ! + line = line(1 : jn - 1) + ! + endif + ! + ! Remove leading and trailing spaces. + ! + line = trim(line) + ! + if (line(1:1) == '#' .or. line(1:1) == '!' .or. line(1:1) == '@') return + ! + ! Find "=" + ! + j = index(line, '=') + ! + if (j == 0) return + ! + keystr = trim(line(1:j-1)) + ! + valstr = trim(line(j+1:)) + ! + ! Remove comments + ! + jn = index(valstr, '#') + ! + if (jn > 0) then + ! + valstr = trim(valstr(1 : jn - 1)) + ! + endif + ! + valstr = adjustl(trim(valstr)) + ! + end subroutine + + + subroutine notabs(INSTR,OUTSTR,ILEN) + ! @(#) convert tabs in input to spaces in output while maintaining columns, assuming a tab is set every 8 characters + ! + ! USES: + ! It is often useful to expand tabs in input files to simplify further processing such as tokenizing an input line. + ! Some FORTRAN compilers hate tabs in input files; some printers; some editors will have problems with tabs + ! AUTHOR: + ! John S. Urban + ! + ! SEE ALSO: + ! GNU/Unix commands expand(1) and unexpand(1) + ! + use ISO_FORTRAN_ENV, only : ERROR_UNIT ! get unit for standard error. if not supported yet, define ERROR_UNIT for your system (typically 0) + character(len=*),intent(in) :: INSTR ! input line to scan for tab characters + character(len=*),intent(out) :: OUTSTR ! tab-expanded version of INSTR produced + integer,intent(out) :: ILEN ! column position of last character put into output string + + integer,parameter :: TABSIZE=8 ! assume a tab stop is set every 8th column + character(len=1) :: c ! character read from stdin + integer :: ipos ! position in OUTSTR to put next character of INSTR + integer :: lenin ! length of input string trimmed of trailing spaces + integer :: lenout ! number of characters output string can hold + integer :: i10 ! counter that advances thru input string INSTR one character at a time + ! + IPOS=1 ! where to put next character in output string OUTSTR + lenin=len(INSTR) ! length of character variable INSTR + lenin=len_trim(INSTR(1:lenin)) ! length of INSTR trimmed of trailing spaces + lenout=len(OUTSTR) ! number of characters output string OUTSTR can hold + OUTSTR=" " ! this SHOULD blank-fill string, a buggy machine required a loop to set all characters + ! + do i10=1,lenin ! look through input string one character at a time + c=INSTR(i10:i10) + if(ichar(c) == 9)then ! test if character is a tab (ADE (ASCII Decimal Equivalent) of tab character is 9) + IPOS = IPOS + (TABSIZE - (mod(IPOS-1,TABSIZE))) + else ! c is anything else other than a tab insert it in output string + if(IPOS > lenout)then + write(ERROR_UNIT,*)"*notabs* output string overflow" + exit + else + OUTSTR(IPOS:IPOS)=c + IPOS=IPOS+1 + endif + endif + enddo + ! + ILEN=len_trim(OUTSTR(:IPOS)) ! trim trailing spaces + return + ! + end subroutine notabs end module diff --git a/source/src/snapwave/snapwave_data.f90 b/source/src/snapwave/snapwave_data.f90 index d90cc331d..2fdae4b26 100644 --- a/source/src/snapwave/snapwave_data.f90 +++ b/source/src/snapwave/snapwave_data.f90 @@ -49,8 +49,8 @@ module snapwave_data real*4, dimension(:,:), allocatable :: ctheta360 ! refraction speed, per grid point and direction ! real*4, dimension(:), allocatable :: xn,yn,zn ! coordinates of nodes of unstructured grid real*4, dimension(:), allocatable :: dzdx,dzdy ! bed slopes at nodes of unstructured grid - integer, dimension(:,:), allocatable :: face_nodes ! node numbers connected to each cell - integer, dimension(:,:), allocatable :: edge_nodes ! node numbers connected to each edge + integer, dimension(:,:), allocatable :: face_nodes ! node numbers connected to each cell + integer, dimension(:,:), allocatable :: edge_nodes ! node numbers connected to each edge real*4, dimension(:), allocatable :: bndindx real*4, dimension(:), allocatable :: tau ! real*4, dimension(:,:), allocatable :: Fluxtab @@ -62,6 +62,7 @@ module snapwave_data real*4, dimension(:), allocatable :: Hmx_ig real*4, dimension(:,:), allocatable :: ee ! directional energy density real*4, dimension(:,:), allocatable :: ee_ig ! directional infragravity energy density + real*4, dimension(:), allocatable :: DoverE ! real*4, dimension(:,:), allocatable :: aa ! directional action density real*4, dimension(:), allocatable :: sig ! mean frequency diff --git a/source/src/snapwave/snapwave_domain.f90 b/source/src/snapwave/snapwave_domain.f90 index bea58fa33..9a04534f7 100644 --- a/source/src/snapwave/snapwave_domain.f90 +++ b/source/src/snapwave/snapwave_domain.f90 @@ -165,6 +165,7 @@ subroutine initialize_snapwave_domain() allocate(WsorA (ntheta,no_nodes)) allocate(SwE (no_nodes)) allocate(SwA (no_nodes)) + allocate(DoverE(no_nodes)) ! ! Spatially-uniform bottom friction coefficients ! @@ -172,10 +173,10 @@ subroutine initialize_snapwave_domain() fw_ig = fw0_ig ! do k=1,no_nodes - if (zb(k) > rghlevland) then - fw(k) = fw0 * fwratio - fw_ig(k) = fw0_ig * fwigratio - endif + if (zb(k) > rghlevland) then + fw(k) = fw0 * fwratio + fw_ig(k) = fw0_ig * fwigratio + endif enddo ! ! Initialization of reference tables @@ -206,7 +207,9 @@ subroutine initialize_snapwave_domain() WsorA = 0.0 SwE = 0.0 SwA = 0.0 - windspreadfac = 0.0 + DoverE = 0.0 + windspreadfac = 0.0 + Hmx_ig = 0.0 ! generate_upw = .true. exists = .true. @@ -303,26 +306,9 @@ subroutine initialize_snapwave_domain() if (any(msk == 3)) then ! ! We already have all msk=3 Neumann points, now find each their nearest cell 'neumannconnected' using new 'neuboundaries_light' - call neuboundaries_light(x,y,msk,no_nodes,tol,neumannconnected) - ! - if (ANY(neumannconnected > 0)) then - ! - write(logstr,*)'SnapWave: Neumann connected boundaries found ...' - call write_log(logstr, 0) - ! - do k=1,no_nodes - if (neumannconnected(k)>0) then - if (msk(k)==1) then - ! k is inner and can be neumannconnected - inner(neumannconnected(k))= .false. - msk(neumannconnected(k)) = 3 !TL: should already by 3, but left it like in SnapWave SVN - else - ! we don't allow neumannconnected links if the node is an open boundary - neumannconnected(k) = 0 - endif - endif - enddo - endif + ! + call neuboundaries_light(x, y, msk, no_nodes, neumannconnected) + ! else ! neumannconnected = 0 @@ -796,86 +782,66 @@ subroutine boundaries(x,y,no_nodes,xb,yb,nb,tol,bndpts,nobndpts,bndindx,bndweigh end subroutine boundaries - subroutine neuboundaries_light(x,y,msk,no_nodes,tol,neumannconnected) + + subroutine neuboundaries_light(x, y, msk, no_nodes, neumannconnected) ! - ! TL: Based on subroutine find_nearest_depth_for_boundary_points of snapwave_boundaries.f90 - ! implicit none ! integer, intent(in) :: no_nodes - real*8, dimension(no_nodes), intent(in) :: x,y + real*8, dimension(no_nodes), intent(in) :: x, y integer*1, dimension(no_nodes), intent(in) :: msk - real*4, intent(in) :: tol integer, dimension(no_nodes), intent(out) :: neumannconnected ! - real*4 :: h1, h2, fac - ! - real xgb, ygb, dst1, dst2, dst - integer k, ib1, ib2, ic, kmin - ! - ! Loop through all msk=3 cells - ! - do ic = 1, no_nodes - ! Loop through all grid points - ! - if (msk(ic)==3) then ! point ic is on the neumann boundary - ! - dst1 = tol - dst2 = tol - ib1 = 0 - ib2 = 0 - ! - do k = 1, no_nodes - ! - if (msk(k)==1) then - xgb = x(k) - ygb = y(k) - ! - dst = sqrt((x(ic) - xgb)**2 + (y(ic) - ygb)**2) - ! - if (dst 0) then ! - if ( (ib1 > 0) .and. (ib2 > 0) ) then - ! - ! Determine the index of the minimum value, if points found within 'tol' distance - ! - if (dst1 < dst2) then - kmin = ib1 - else - kmin = ib2 - endif - ! - neumannconnected(kmin)=ic - ! - !write(*,*)kmin,ic - ! - endif - ! - endif - enddo + neumannconnected(ic) = ib1 + ! + endif + ! + endif + ! + enddo ! end subroutine neuboundaries_light + - -subroutine neuboundaries(x,y,no_nodes,xneu,yneu,n_neu,tol,neumannconnected) + subroutine neuboundaries(x,y,no_nodes,xneu,yneu,n_neu,tol,neumannconnected) + ! + ! MvO: can this be removed ? ! implicit none ! @@ -1143,13 +1109,19 @@ subroutine read_snapwave_quadtree_mesh(load_quadtree) integer :: n integer :: nu1 integer :: nu2 + integer :: nd1 + integer :: nd2 integer :: m integer :: mu1 integer :: mu2 + integer :: md1 + integer :: md2 integer :: mnu1 integer :: nra integer*1 :: mu integer*1 :: nu + integer*1 :: md + integer*1 :: nd integer*1 :: mnu ! logical :: load_quadtree @@ -1166,7 +1138,7 @@ subroutine read_snapwave_quadtree_mesh(load_quadtree) ! 4) Loop through all points and make cells for points where msk==1. ! The node indices in the cells will point to the indices of the entire quadtree. ! In a second temporary mask array msk_tmp2, determine which nodes are actually active (being part a cell) - ! 5) Set back snapwave_mask = 2&3 values of wave boudnary and neumann cells + ! 5) Set back snapwave_mask = 2&3 values of wave boundary and neumann cells ! 6) Count actual number of active nodes and cells, and allocate arrays ! 7) Set node data and re-map indices ! @@ -1174,12 +1146,12 @@ subroutine read_snapwave_quadtree_mesh(load_quadtree) ! ! Check if qtr file has already been loaded by other model (sfincs) ! -! if (load_quadtree) then -! ! -! write(*,*)'Reading SnapWave quadtree file ', trim(gridfile), ' ...' -! call quadtree_read_file(gridfile) -! ! -! endif + ! if (load_quadtree) then + ! ! + ! write(*,*)'Reading SnapWave quadtree file ', trim(gridfile), ' ...' + ! call quadtree_read_file(gridfile) + ! ! + ! endif ! allocate(index_snapwave_in_quadtree(quadtree_nr_points)) ! Needed for mapping to sfincs ! @@ -1190,6 +1162,7 @@ subroutine read_snapwave_quadtree_mesh(load_quadtree) allocate(msk_tmp(quadtree_nr_points)) ! Make temporary mask with all quadtree points allocate(msk_tmp2(quadtree_nr_points)) ! Make second temporary mask with all quadtree points allocate(zb_tmp(quadtree_nr_points)) ! Make temporary array with bed level on all quadtree points + ! zb_tmp = -10.0 ! msk_tmp = 1 ! Without mask file, all points will be active @@ -1221,16 +1194,6 @@ subroutine read_snapwave_quadtree_mesh(load_quadtree) ! Count number of active points ! This is also the number of points in the dep file ! -! nra = 0 -! do ip = 1, quadtree_nr_points -! if (msk_tmp(ip)>0) then -! nra = nra + 1 -! endif -! enddo - ! -! allocate(zb_tmp2(nra)) ! Make (very) temporary array with bed level on all active quadtree points -! zb_tmp2 = -10.0 - ! if (depfile /= 'none') then ! write(logstr,*)'Reading SnapWave depth file ',trim(depfile),' ...' @@ -1243,19 +1206,11 @@ subroutine read_snapwave_quadtree_mesh(load_quadtree) ! ! Now loop through all quadtree points and set depth ! -! nra = 0 -! do ip = 1, quadtree_nr_points -! if (msk_tmp(ip)>0) then -! nra = nra + 1 -! zb_tmp(ip) = zb_tmp2(nra) -! endif -! enddo -! ! -! deallocate(zb_tmp2) - ! ! STEP 4 - Make faces ! - allocate(faces(4, 4*quadtree_nr_points)) ! max 4 nodes per faces, and max 4 faces per node + allocate(faces(4, 4 * quadtree_nr_points)) ! max 4 nodes per faces, and max 4 faces per node + ! + faces = 0 ! nfaces = 0 ! @@ -1415,47 +1370,6 @@ subroutine read_snapwave_quadtree_mesh(load_quadtree) endif endif ! - if (mnu1==0) then - ! Didn't find it going to the right, try via above -! if nu==0 -! ! same level above -! if nu1>0 -! if buq.mu(nu1)==0 -! ! same level above right -! if buq.mu1(nu1)>0 -! ! and it exists -! mnu=0; -! mnu1=buq.mu1(nu1); -! end -! end -! end -! elseif mu==-1 -! ! coarser above -! if nu1>0 -! if buq.mu(nu1)==0 -! ! same level above right -! if buq.mu1(nu1)>0 -! ! and it exists -! mnu=-1; -! mnu1=buq.mu1(nu1); -! end -! end -! end -! else -! ! finer above -! if nu2>0 -! if buq.mu(nu2)==0 -! ! same level above right -! if buq.mu1(nu2)>0 -! ! and it exists -! mnu=1; -! mnu1=buq.mu1(nu2); -! end -! end -! end -! end - endif - ! ! Okay, found all the neighbors! ! ! Now let's see what sort of cells we need @@ -1464,7 +1378,6 @@ subroutine read_snapwave_quadtree_mesh(load_quadtree) ! ! Type 1 - Most normal cell possible ! -! write(*,'(a,20i6)')'ip,mu,nu,mnu,mu1,nu1,mnu1',ip,mu,nu,mnu,mu1,nu1,mnu1 if (mu1>0 .and. nu1>0 .and. mnu1>0) then nfaces = nfaces + 1 faces(1, nfaces) = ip @@ -1679,14 +1592,6 @@ subroutine read_snapwave_quadtree_mesh(load_quadtree) msk_tmp2(nu1) = 1 endif ! -!% elseif (mu==-1 .and. nu==0 .and. mnu==0 .and. odd(buq.n(ip))) -!% % Type 9 -!% if mu1>0 .and. nu1>0 -!% nfaces=nfaces+1; -!% faces(1, nfaces) = ip; -!% faces(2, nfaces) = mu1; -!% faces(3, nfaces) = nu1; -!% end elseif (mu==-1 .and. nu==-1 .and. mnu==-1) then ! ! Type 10 @@ -2033,7 +1938,80 @@ subroutine read_snapwave_quadtree_mesh(load_quadtree) msk_tmp2(nu1) = 1 endif endif - endif + endif + ! + ! Add triangles around stair case boundaries + ! + ! Inactive cell top left + ! + mu = quadtree_mu(ip) + mu1 = quadtree_mu1(ip) + mu2 = quadtree_mu2(ip) + md = quadtree_md(ip) + md1 = quadtree_md1(ip) + md2 = quadtree_md2(ip) + nu = quadtree_nu(ip) + nu1 = quadtree_nu1(ip) + nu2 = quadtree_nu2(ip) + nd = quadtree_nd(ip) + nd1 = quadtree_nd1(ip) + nd2 = quadtree_nd2(ip) + ! + ! Check for inactive cell top left + ! + if (md == 0 .and. nu == 0 .and. md1 > 0 .and. nu1 > 0) then + if (msk_tmp(md1) == 2 .and. msk_tmp(nu1) == 2 .and. msk_tmp(ip) == 1 .and. quadtree_nu1(md1) == 0) then + ! + nfaces = nfaces + 1 + faces(1, nfaces) = md1 + faces(2, nfaces) = ip + faces(3, nfaces) = nu1 + ! + endif + ! + endif + ! + ! Check for inactive cell bottom left + ! + if (md == 0 .and. nd == 0 .and. md1 > 0 .and. nd1 > 0) then + if (msk_tmp(md1) == 2 .and. msk_tmp(nd1) == 2 .and. msk_tmp(ip) == 1 .and. quadtree_nd1(md1) == 0) then + ! + nfaces = nfaces + 1 + faces(1, nfaces) = md1 + faces(2, nfaces) = nd1 + faces(3, nfaces) = ip + ! + endif + ! + endif + ! + ! Check for inactive cell top right + ! + if (mu == 0 .and. nu == 0 .and. mu1 > 0 .and. nu1 > 0) then + if (msk_tmp(mu1) == 2 .and. msk_tmp(nu1) == 2 .and. msk_tmp(ip) == 1 .and. quadtree_nu1(mu1) == 0) then + ! + nfaces = nfaces + 1 + faces(1, nfaces) = ip + faces(2, nfaces) = mu1 + faces(3, nfaces) = nu1 + ! + endif + ! + endif + ! + ! Check for inactive cell bottom right + ! + if (mu == 0 .and. nd == 0 .and. mu1 > 0 .and. nd1 > 0) then + if (msk_tmp(mu1) == 2 .and. msk_tmp(nd1) == 2 .and. msk_tmp(ip) == 1 .and. quadtree_nd1(mu1) == 0) then + ! + nfaces = nfaces + 1 + faces(1, nfaces) = ip + faces(2, nfaces) = nd1 + faces(3, nfaces) = mu1 + ! + endif + ! + endif ! enddo ! @@ -2098,7 +2076,6 @@ subroutine read_snapwave_quadtree_mesh(load_quadtree) ! ! Set node values ! -! zb(nac) = zb_tmp(ip) zb(nac) = quadtree_zz(ip) x(nac) = quadtree_xz(ip) y(nac) = quadtree_yz(ip) @@ -2114,7 +2091,7 @@ subroutine read_snapwave_quadtree_mesh(load_quadtree) ! do iface = 1, no_faces do j = 1, 4 - if (faces(j, iface)>0) then + if (faces(j, iface) > 0) then ip0 = faces(j, iface) ! index in full quadtree ip1 = index_snapwave_in_quadtree(ip0) ! index in reduced quadtree face_nodes(j, iface) = ip1 ! set index to that of reduced mesh diff --git a/source/src/snapwave/snapwave_infragravity.f90 b/source/src/snapwave/snapwave_infragravity.f90 index 178f32843..592f653f0 100644 --- a/source/src/snapwave/snapwave_infragravity.f90 +++ b/source/src/snapwave/snapwave_infragravity.f90 @@ -46,19 +46,25 @@ subroutine determine_ig_bc(x_bwv, y_bwv, hsinc, tpinc, ds, jonswapgam, depth, Ti ! Loosely based on 3 step calculation in waveparams.F90 of XBeach (build_jonswap, build_etdir, build_boundw), here all in 1 subroutine calculate_herbers ! if (depth < 5.0) then - ! - write(logstr,*)'ERROR SnapWave - depth at boundary input point ',x_bwv, y_bwv,' dropped below 5 m: ',depth - call write_log(logstr, 1) - ! - write(logstr,*)'This might lead to large values of Hm0ig as bc, especially when directional spreading is low! Please specify input in deeper water. ' - call write_log(logstr, 1) - ! - write(logstr,*)'Depth set back to 5 meters for stability, simulation will continue.' - call write_log(logstr, 1) - ! - depth = 5.0 - ! - endif + ! + ! MvO - Is this really the best check? Does not seem very non-dimensional. Maybe something like hsig / depth > 0.5 ? + ! + write(logstr, *)'ERROR SnapWave - depth at boundary input point ', x_bwv, ',', y_bwv,' below 5 m: ', depth + call write_log(logstr, 0) + write(logstr, *)'This may lead to large values of Hm0ig as bc, especially when directional spreading is low! Please specify input in deeper water.' + call write_log(logstr, 0) + write(logstr,*)'Depth set back to 5 meters for stability, simulation will continue.' + call write_log(logstr, 0) + ! + depth = 5.0 + ! + elseif (depth > 200.0) then + ! + ! Limit depth to 200 m. Larger depth can result in NaNs. @Tim, why? + ! + depth = 200.0 + ! + endif ! call compute_herbers(hsig, Tm01, Tm10, Tp, Tpsmooth, hsinc, tpinc, scoeff, jonswapgam, depth, correctHm0) ![out,out,out,out,out, in,in,in,in,in,in] ! diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 409709f55..f8ba46dfd 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1,9 +1,10 @@ module snapwave_solver - use sfincs_log + use sfincs_log - implicit none - contains + implicit none + +contains subroutine compute_wave_field() ! @@ -13,10 +14,7 @@ subroutine compute_wave_field() ! !real*8, intent(in) :: time > TL: not used in this implementation ! - real*4 :: tpb - ! real*4, parameter :: waveps = 1e-5 - !real*4, dimension(:), allocatable :: sig real*4, dimension(:), allocatable :: sigm_ig real*4, dimension(:), allocatable :: expon ! @@ -27,7 +25,7 @@ subroutine compute_wave_field() allocate(sigm_ig(no_nodes)) ! g = 9.81 - pi = 4.*atan(1.) + pi = 4 * atan(1.0) ! call timer(t0) ! @@ -37,83 +35,105 @@ subroutine compute_wave_field() ! do k = 1, no_nodes if (inner(k)) then - ee(:,k) = waveps + ee(:, k) = waveps endif enddo ! ee_ig = waveps ! - restart=1 !TODO TL: CHECK > we need this turned on right now for IG... + restart = 1 !TODO TL: CHECK > we need this turned on right now for IG... ! endif ! ! Initialize wave period ! do k = 1, no_nodes + ! if (inner(k)) then + ! Tp(k) = Tpini + ! endif - if (neumannconnected(k)>0) then - Tp(neumannconnected(k))=Tpini + ! + if (neumannconnected(k) > 0) then + ! + Tp(neumannconnected(k)) = Tpini + ! endif + ! enddo ! ! Compute celerities and refraction speed ! - Tp = max(tpmean_bwv,Tpini) ! to check voor windgroei - sig = 2.0*pi/Tp + Tp = max(tpmean_bwv, Tpini) ! to check voor windgroei + sig = 2.0 * pi / Tp Tp_ig = tpmean_bwv_ig! TL: now determined in snapwave_boundaries.f90 instead of Tinc2ig*Tp - sigm_ig = 2.0*pi/Tp_ig !TODO - TL: Question do we want Tp_ig now as contant, or also spatially varying like Tp ? - ! - expon = -(sig*sqrt(depth/g))**(2.5) - kwav = sig**2/g*(1.0-exp(expon))**(-0.4) - C = sig/kwav - nwav = 0.5+kwav*depth/sinh(min(2*kwav*depth,50.0)) - Cg = nwav*C + sigm_ig = 2.0 * pi / Tp_ig !TODO - TL: Question do we want Tp_ig now as contant, or also spatially varying like Tp ? + expon = - (sig * sqrt(depth / g))**2.5 + kwav = sig**2 / g * (1.0 - exp(expon))**-0.4 + C = sig / kwav + nwav = 0.5 + kwav * depth / sinh(min(2 * kwav * depth, 50.0)) + Cg = nwav * C ! if (igwaves) then + ! cg_ig = Cg - expon = -(sigm_ig*sqrt(depth/g))**(2.5) - kwav_ig = sig**2/g*(1.0-exp(expon))**(-0.4) + expon = -(sigm_ig * sqrt(depth / g))**2.5 + kwav_ig = sig**2 / g * (1.0 - exp(expon))**-0.4 + ! else + ! cg_ig = 0.0 kwav_ig = 0.0 + ! endif ! + ! Set Hmx and sinh(kh) for regular waves, and Hmx_ig for IG waves. Note that we use the same gamma for regular and IG waves, but this can be easily changed if needed. + ! do k = 1, no_nodes - sinhkh(k) = sinh(min(kwav(k)*depth(k), 50.0)) - Hmx(k) = gamma*depth(k) + ! + sinhkh(k) = sinh(min(kwav(k) * depth(k), 50.0)) + Hmx(k) = 0.88 / kwav(k) * tanh(gamma * kwav(k) * depth(k) / 0.88) + Hmx(k) = gamma * depth(k) + ! + if (igwaves) then + ! + ! Why is this different from Hmx for regular waves where we use gamma * h? + ! + Hmx_ig(k) = 0.88 / kwav_ig(k) * tanh(gamma_ig * kwav_ig(k) * depth(k) / 0.88) ! Note - uses gamma_ig + ! + endif + ! enddo - if (igwaves) then - do k = 1, no_nodes - Hmx_ig(k) = 0.88/kwav_ig(k)*tanh(gamma_ig*kwav_ig(k)*depth(k)/0.88) ! Note - uses gamma_ig - enddo - else - Hmx_ig = 0.0 - endif ! do itheta = 1, ntheta - ctheta(itheta,:) = sig/sinh(min(2.0*kwav*depth, 50.0))*(dhdx*sin(theta(itheta)) - dhdy*cos(theta(itheta))) + ! + ctheta(itheta,:) = sig / sinh(min(2 * kwav * depth, 50.0)) * (dhdx * sin(theta(itheta)) - dhdy * cos(theta(itheta))) + ! enddo ! if (igwaves) then + ! do itheta = 1, ntheta - ctheta_ig(itheta,:) = sigm_ig/sinh(min(2.0*kwav_ig*depth, 50.0))*(dhdx*sin(theta(itheta)) - dhdy*cos(theta(itheta))) + ctheta_ig(itheta,:) = sigm_ig / sinh(min(2 * kwav_ig * depth, 50.0)) * (dhdx * sin(theta(itheta)) - dhdy * cos(theta(itheta))) enddo + ! else + ! ctheta_ig = 0.0 + ! endif ! ! Limit unrealistic refraction speed to 1/2 pi per wave period ! do k = 1, no_nodes - ctheta(:,k) = sign(1.0, ctheta(:,k))*min(abs(ctheta(:, k)), sig(k)/4) + ctheta(:,k) = sign(1.0, ctheta(:,k)) * min(abs(ctheta(:, k)), sig(k) / 4) enddo ! if (igwaves) then - do k=1, no_nodes - ctheta_ig(:,k) = sign(1.0, ctheta_ig(:,k))*min(abs(ctheta_ig(:, k)), sigm_ig(k)/4.0) - enddo + do k=1, no_nodes + ctheta_ig(:,k) = sign(1.0, ctheta_ig(:,k)) * min(abs(ctheta_ig(:, k)), sigm_ig(k) / 4) + enddo endif ! ! Solve the directional wave energy balance on an unstructured grid @@ -131,20 +151,21 @@ subroutine compute_wave_field() Hmx, ee, windspreadfac, u10, niter, crit, & hmin, baldock_ratio, baldock_ratio_ig, & aa, sig, jadcgdx, sigmin, sigmax,& - c_dispT, WsorE, WsorA, SwE, SwA, Tpini, & - igwaves,kwav_ig, cg_ig,H_ig,ctheta_ig,Hmx_ig, ee_ig,fw_ig, & + c_dispT, DoverE, WsorE, WsorA, SwE, SwA, Tpini, & + igwaves, kwav_ig, cg_ig,H_ig,ctheta_ig,Hmx_ig, ee_ig,fw_ig, & beta, srcig, alphaig, Dw_ig, Df_ig, & vegetation, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, Dveg, & zb, nwav, ig_opt, alpha_ig, gamma_ig, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) ! call timer(t3) ! - Fx = F*cos(thetam) - Fy = F*sin(thetam) + Fx = F * cos(thetam) + Fy = F * sin(thetam) ! end subroutine + subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & w, ds, prev, & neumannconnected, & @@ -156,14 +177,13 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & Hmx, ee, windspreadfac, u10, niter, crit, & hmin, baldock_ratio, baldock_ratio_ig, & aa, sig, jadcgdx, sigmin, sigmax,& - c_dispT, WsorE, WsorA, SwE, SwA, Tpini, & + c_dispT, DoverE, WsorE, WsorA, SwE, SwA, Tpini, & igwaves,kwav_ig, cg_ig,H_ig,ctheta_ig,Hmx_ig, ee_ig,fw_ig, & betamean, srcig, alphaig, Dw_ig, Df_ig, & vegetation, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, Dveg, & zb, nwav, ig_opt, alfa_ig, gamma_ig, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) ! use snapwave_windsource - !use snapwave_ncoutput ! TL: removed, we don't use this in SF+SW ! implicit none ! @@ -203,7 +223,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & real*4, intent(in) :: alfa,gamma, gammax ! coefficients in Baldock wave breaking dissipation real*4, intent(in) :: baldock_ratio ! option controlling from what depth wave breaking should take place: (Hk>baldock_ratio*Hmx(k)), default baldock_ratio=0.2 real*4, intent(in) :: baldock_ratio_ig ! option controlling from what depth wave breaking should take place for IG waves: (Hk_ig>baldock_ratio_ig*Hmx_ig(k)), default baldock_ratio_ig=0.2 - real*4, dimension(no_nodes), intent(inout) :: H ! wave height - TODO - TL - CHECK > inout needed to have updated 'H' for determining srcig + real*4, dimension(no_nodes), intent(out) :: H ! wave height real*4, dimension(no_nodes), intent(out) :: H_ig ! wave height real*4, dimension(no_nodes), intent(out) :: Dw ! wave breaking dissipation real*4, dimension(no_nodes), intent(out) :: Dw_ig ! wave breaking dissipation IG @@ -227,6 +247,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & real*4, intent(in) :: sigmin, sigmax, c_dispT real*4, dimension(ntheta, no_nodes), intent(in) :: windspreadfac !< [-] distribution array for wind input real*4, dimension(ntheta,no_nodes), intent(inout) :: aa + real*4, dimension(no_nodes), intent(inout) :: DoverE real*4, dimension(ntheta,no_nodes), intent(out) :: WsorE, WsorA real*4, dimension(no_nodes), intent(out) :: SwE, SwA real*4, dimension(no_nodes), intent(inout) :: sig @@ -264,20 +285,19 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & real*4, dimension(:), allocatable :: A,B,C,R ! coefficients in the tridiagonal matrix solved per point real*4, dimension(:), allocatable :: B_aa,R_aa,aaprev ! coefficients in the tridiagonal matrix solved per point real*4, dimension(:), allocatable :: A_ig,B_ig,C_ig,R_ig ! coefficients in the tridiagonal matrix solved per point - real*4, dimension(:), allocatable :: DoverE ! ratio of mean wave dissipation over mean wave energy real*4, dimension(:), allocatable :: DoverA ! ratio of mean wave dissipation over mean wave energy real*4, dimension(:), allocatable :: DoverE_ig ! ratio of mean wave dissipation over mean wave energy real*4, dimension(:), allocatable :: E ! mean wave energy real*4, dimension(:), allocatable :: E_ig ! mean wave energy real*4, dimension(:), allocatable :: diff ! maximum difference of wave energy relative to previous iteration real*4, dimension(:), allocatable :: ra ! coordinate in sweep direction - !real*4, dimension(:), allocatable :: sig real*4, dimension(:), allocatable :: sigm_ig integer, dimension(4) :: shift - real*4 :: pi = 4.*atan(1.0) - real*4 :: g=9.81 + real*4 :: pi = 4.0 * atan(1.0) + real*4 :: g = 9.81 real*4 :: hmin ! minimum water depth! TL: make user changeable also here according to 'snapwave_hmin' in sfincs.inp - real*4 :: fac=1.0 ! underrelaxation factor for DoverA + real*4 :: relax_factor_DoverA = 0.25 ! underrelaxation factor for DoverA (set to 1.0 to disable) + real*4 :: relax_factor_DoverE = 0.25 ! underrelaxation factor for DoverE (set to 1.0 to disable) real*4 :: oneoverdt real*4 :: oneover2dtheta real*4 :: rhog8 @@ -296,22 +316,31 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & real*4 :: Tinc2ig ! ratio compared to period Tinc to estimate Tig real*4 :: alphaigfac ! Multiplication factor for IG shoaling source/sink term, default = 1.0 real*4 :: shinc2ig ! Ratio of how much of the calculated IG wave source term, is subtracted from the incident wave energy (0-1, 0=default) + real*4 :: fdrspr ! Inc-IG reduction factor to account for directional spreading integer, save :: callno=1 + integer :: baldock_exponent ! 0, 1 or 2 ! - real*4, dimension(ntheta) :: sinth,costh ! distribution of wave angles and offshore wave energy density + real*4, dimension(ntheta) :: sinth, costh ! distribution of wave angles and offshore wave energy density ! - !local wind source vars + ! Local wind source vars ! real*4 :: Ak real*4 :: DwT real*4 :: DwAk - real*4 :: ndissip ! - real*4 :: depthlimfac=1.0 + real*4 :: ndissip + real*4 :: depthlimfac real*4 :: waveps=0.0001 ! ! Allocate local arrays ! - waveps = 0.0001 + waveps = 0.0001 + baldock_exponent = 2 ! exponent to enhance breaking when H > Hmax + ! + fdrspr = 1.0 ! This is a factor on the IG source term to account for directional spreading + ! of the incident wave energy, which reduces the IG wave energy generated. + ! Default is 1.0, but can be reduced to e.g. 0.65. A reduction leads to lowering + ! of the IG energy. + ! allocate(ok(no_nodes)); ok=0 allocate(indx(no_nodes,4)); indx=0 allocate(eeold(ntheta,no_nodes)); eeold=0.0 @@ -322,7 +351,6 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & allocate(B(ntheta)); B=0.0 allocate(C(ntheta)); C=0.0 allocate(R(ntheta)); R=0.0 - allocate(DoverE(no_nodes)); DoverE=0.0 allocate(E(no_nodes)); E=waveps allocate(Eold(no_nodes)); Eold=0.0 ! @@ -335,7 +363,6 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & allocate(cgprev_ig(ntheta)); cgprev_ig=0.0 allocate(DoverE_ig(no_nodes)); DoverE_ig=0.0 allocate(E_ig(no_nodes)); E_ig=waveps - !allocate(T_ig(no_nodes)); T_ig=0.0 allocate(sigm_ig(no_nodes)); sigm_ig=0.0 allocate(depthprev(ntheta,no_nodes)); depthprev=0.0 allocate(beta_local(ntheta,no_nodes)); beta_local=0.0 @@ -358,55 +385,61 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & costh(itheta) = cos(theta(itheta)) enddo ! - df = 0.0 - dw = 0.0 + Df = 0.0 + Dw = 0.0 + Dveg = 0.0 F = 0.0 ! - ok = 0 - indx = 0 - eemax = maxval(ee) - dtheta = theta(2) - theta(1) - if (dtheta<0.) dtheta = dtheta + 2.*pi + ok = 0 + indx = 0 + eemax = maxval(ee) + dtheta = theta(2) - theta(1) + ! + if (dtheta < 0.0) dtheta = dtheta + 2*pi + ! if (wind) then - sig = 2*pi/Tpini + sig = 2 * pi / Tpini else - sig = 2*pi/Tp + sig = 2 * pi / Tp endif - oneoverdt = 1.0/dt - oneover2dtheta = 1.0/2.0/dtheta - rhog8 = 0.125*rho*g + ! + oneoverdt = 1.0 / dt + oneover2dtheta = 1.0 / 2.0 / dtheta + rhog8 = 0.125 * rho * g thetam = 0.0 - !H = 0.0 ! TODO - TL: CHeck > needed for restart for IG > set to 0 now in snapwave_domain.f90 - Dveg = 0.0 ! if (igwaves) then - !T_ig = Tinc2ig*Tp - sigm_ig = 2*pi/T_ig + ! + sigm_ig = 2 * pi / T_ig DoverE_ig = 0.0 + ! endif ! if (wind) then + ! DoverA = 0.0 ndissip = 3.0 WsorE = 0.0 WsorA = 0.0 - Ak = waveps/sigmax + Ak = waveps / sigmax + ! endif ! - ! Sort coordinates in sweep directions + ! Sort coordinates in sweep directions (can we not do this already in snapwave_domain?) + ! + shift = [0, 1, -1, 2] ! - shift = [0,1,-1,2] do sweep = 1, 4 ! - ra = x*cos(thetamean + 0.5*pi*shift(sweep)) + y*sin(thetamean + 0.5*pi*shift(sweep)) + ra = x * cos(thetamean + 0.5 * pi * shift(sweep)) + y * sin(thetamean + 0.5 * pi * shift(sweep)) call hpsort_eps_epw(no_nodes, ra , indx(:, sweep), 1.0e-6) ! enddo - ! - ! Set inner to false for all points at grid edge or adjacent to dry point ! - do k=1,no_nodes - ! + ! Set inner to false for all points at grid edge + ! + do k = 1, no_nodes + ! do itheta = 1, ntheta ! k1 = prev(1, itheta, k) @@ -418,148 +451,116 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! inner(k) = .false. ! - elseif ((k1==1 .and. k2==1)) then ! TL: for now still needed for a working IG solver - inner(k)=.false. - exit - !elseif (depth(k1) < hmin .or. depth(k2) < hmin .or. (k1 == 1 .and. k2 == 1)) then - ! - ! Do not change inner here! It should be static! In a next update of the wave fields, these points may be wet. + elseif (k1==1 .and. k2==1) then ! TL: for now still needed for a working IG solver ! - !inner(k) = .false. - ! - !exit + inner(k) = .false. + exit ! endif + ! enddo enddo ! + ! Start iteration ! - ! 0-a) Set boundary and initial conditions - ! - do k = 1, no_nodes + do iter = 1, niter * 4 + ! + ! write(*,*)'iter=',iter + ! + sweep = mod(iter, 4) !TODO - TL: problem that we don't have option for sweep = 1 anymore? + ! + if (sweep == 0) then + sweep = 4 + endif + ! + ! At start of each sweep, compute E, H, E_ig and H_ig, and aa ! - ! Boundary condition at sea side (uniform) + ! This loop can be parallelized ! ! - if (.not.inner(k)) then + do k = 1, no_nodes + ! + if (ok(k) == 1) cycle ! - ee(:,k)=max(ee(:,k),waveps) - E(k) = sum(ee(:, k))*dtheta - H(k) = sqrt(8*E(k)/rho/g) - thetam(k) = atan2(sum(ee(:, k)*sin(theta)), sum(ee(:, k)*cos(theta))) + ee(:, k) = max(ee(:, k), waveps) ! - !ee_ig(:, k) = eeinc2ig*ee(:,k) !TODO TL: determined in snapwave_boundaries.f90 + E(k) = sum(ee(:, k)) * dtheta + H(k) = sqrt(8 * E(k) / rho / g) ! - if (igwaves) then - E_ig(k) = sum(ee_ig(:, k))*dtheta - H_ig(k) = sqrt(8*E_ig(k)/rho/g) + if (igwaves) then + ! + E_ig(k) = sum(ee_ig(:, k)) * dtheta + H_ig(k) = sqrt(8 * E_ig(k) / rho / g) + ! endif ! if (wind) then - sig(k) = 2*pi/Tp(k) - !aa(:,k) = max(aa(:,k),waveps/sig(k)) - aa(:,k) = max(ee(:,k),waveps)/sig(k) - Ak = E(k)/sig(k) - endif - ! - endif - enddo - ! - ! 0-b) Determine IG source/sink term - ! - if (igwaves) then - ! - ! As defined in Leijnse, van Ormondt, van Dongeren, Aerts & Muis et al. 2024 - ! - ! Actual determining of source term: - ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) - ! - ! inout: alphaig_local, srcig_local - eeprev, eeprev_ig, cgprev, beta_local - ! in: the rest - ! - ! NOTE - This is based on the energy in the precious SnapWave timestep 'ee' and 'ee_ig', and waveheight 'H', which should therefore be made available. - ! - endif - ! - ! 0-c) Set initial condition at inner cells - ! - do k = 1, no_nodes - ! - if (inner(k)) then - ! - if (wind) then - ee(:,k) = waveps - sig(k) = 2*pi/Tpini - aa(:,k) = ee(:,k)/sig(k) - else - ee(:,k) = waveps + ! + sig(k) = 2 * pi / Tp(k) + sig(k) = min(max(sig(k), sigmin), sigmax) + aa(:, k) = max(ee(:, k), waveps) / sig(k) + ! endif ! - ! Make sure DoverE is filled based on previous ee - Ek = sum(ee(:, k))*dtheta - Hk = min(sqrt(Ek/rhog8), gamma*depth(k)) - Ek = rhog8*Hk**2 - if (.not. wind) then - uorbi = 0.5*sig(k)*Hk/sinhkh(k) - Dfk = 0.28*rho*fw(k)*uorbi**3 - call baldock(rho, g, alfa, gamma, depth(k), Hk, Tp(k), 1, Dwk, Hmx(k)) - DoverE(k) = (Dwk + Dfk)/max(Ek, 1.0e-6) - endif + ! Set Neumann boundaries ! - if (wind) then - call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) - uorbi = 0.5*sig(k)*Hk/sinhkh(k) - Dfk = 0.28*rho*fw(k)*uorbi**3 - call baldock(rho, g, alfa, gamma, depth(k), Hk, 2.0*pi/sig(k), 1, Dwk, Hmx(k)) - DoverE(k) = (Dwk + Dfk)/max(Ek, 1.0e-6) + if (neumannconnected(k) /= 0) then + ! + ! Flip indices around compared to orginal implementation + ! + ! Do we really need all of these? + ! + kn = neumannconnected(k) ! Index of internal point + ! + sinhkh(k) = sinhkh(kn) + kwav(k) = kwav(kn) + Hmx(k) = Hmx(kn) + ee(:, k) = ee(:, kn) + ee_ig(:, k) = ee_ig(:, kn) + ctheta(:, k) = ctheta(:, kn) + cg(k) = cg(kn) + ! + if (wind) then + ! + sig(k) = sig(kn) + Tp(k) = 2 * pi / sig(kn) + WsorE(:,k) = WsorE(:,kn) + WsorA(:,k) = WsorA(:,kn) + aa(:,k) = aa(:,kn) + ! + endif + ! + Df(kn) = Df(kn) + Dw(kn) = Dw(kn) ! - ! initial conditions are not equal to bc conditions - DwT = - c_dispT/(1.0 -ndissip)*(2.*pi)/sig(k)**2*cg(k)*kwav(k) * DoverE(k) - DwAk = 0.5/pi * (E(k)*DwT+2.0*pi*Ak*DoverE(k) ) - DoverA(k) = DwAk/max(Ak,1e-6) endif ! - endif - ! - enddo - ! - ! Start iteration - ! - do iter=1,niter - ! - sweep = mod(iter, 4) !TODO - TL: problem that we don't have option for sweep = 1 anymore? - ! - if (sweep==0) then - sweep = 4 - endif + enddo ! - if (sweep==1) then + if (sweep == 1) then + ! eeold = ee + ! do k = 1, no_nodes + ! Eold(k) = sum(eeold(:, k)) + ! enddo ! - if (igwaves) then - ! - if (iterative_srcig) then - ! Update H(k) based on updated ee(:,k), as used in IG source term to determine alphaig - ! - do k = 1, no_nodes - ! - if (inner(k)) then - ! - H(k) = sqrt(8*sum(ee(:, k))*dtheta/rho/g) - ! - endif - enddo - ! - ! Actual determining of source term - every first sweep of iteration - ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) - ! - endif + endif + ! + ! Update IG source and sink terms + ! + if (igwaves) then + ! + ! Do this in each first sweep, or (in case of iterative_srcig) in every sweep + ! + if (sweep == 1 .or. iterative_srcig) then ! - endif + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, cg_ig, nwav, depth, zb, H, & + ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, & + alphaig_local, beta_local, srcig_local) + ! + endif ! endif ! @@ -567,233 +568,288 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! do count = 1, no_nodes ! - k=indx(count, sweep) + k = indx(count, sweep) ! - if (inner(k)) then - if (depth(k)>1.1*hmin) then + if (inner(k)) then ! Regular point + ! + ! Set Ek, Hk, Ek_ig, Hk_ig and Ak + ! + Ek = E(k) + Hk = H(k) + ! + if (igwaves) then + ! + Ek_ig = E_ig(k) + Hk_ig = H_ig(k) + ! + endif + ! + if (wind) then + ! + Ak = Ek / sig(k) + ! + endif + ! + if (depth(k) > hmin) then ! - if (ok(k) == 0) then + if (ok(k) == 0) then ! Only perform computations on wet inner points that are not yet converged (ok=1) ! - ! Only perform computations on wet inner points that are not yet converged (ok) + ! Get upwind data ! do itheta = 1, ntheta ! k1 = prev(1, itheta, k) k2 = prev(2, itheta, k) ! - eeprev(itheta) = w(1, itheta, k)*ee(itheta, k1) + w(2, itheta, k)*ee(itheta, k2) - cgprev(itheta) = w(1, itheta, k)*cg(k1) + w(2, itheta, k)*cg(k2) + eeprev(itheta) = w(1, itheta, k) * ee(itheta, k1) + w(2, itheta, k) * ee(itheta, k2) + cgprev(itheta) = w(1, itheta, k) * cg(k1) + w(2, itheta, k) * cg(k2) ! if (igwaves) then - eeprev_ig(itheta) = w(1, itheta, k)*ee_ig(itheta, k1) + w(2, itheta, k)*ee_ig(itheta, k2) - cgprev_ig(itheta) = w(1, itheta, k)*cg_ig(k1) + w(2, itheta, k)*cg_ig(k2) + ! + eeprev_ig(itheta) = w(1, itheta, k) * ee_ig(itheta, k1) + w(2, itheta, k) * ee_ig(itheta, k2) + cgprev_ig(itheta) = w(1, itheta, k) * cg_ig(k1) + w(2, itheta, k) * cg_ig(k2) + ! endif ! if (wind) then - aaprev(itheta) = w(1, itheta, k)*aa(itheta, k1) + w(2, itheta, k)*aa(itheta, k2) + ! + aaprev(itheta) = w(1, itheta, k) * aa(itheta, k1) + w(2, itheta, k) * aa(itheta, k2) + aaprev(itheta) = min(aaprev(itheta), eeprev(itheta) / sigmin) + aaprev(itheta) = max(aaprev(itheta), eeprev(itheta) / sigmax) + ! endif ! enddo ! - Ek = sum(eeprev)*dtheta ! to check + ! Fill DoverE ! - depthlimfac = max(1.0, (sqrt(Ek/rhog8)/(gammax*depth(k)))**2.0) - Hk = min(sqrt(Ek/rhog8), gamma*depth(k)) - Ek = Ek/depthlimfac + ! Bottom friction ! - if (wind) then - ! - Ak = sum(aaprev)*dtheta - ! - Ak = Ak/depthlimfac - ee(:,k) = ee(:,k) / depthlimfac - aa(:,k) = aa(:,k) / depthlimfac - sig(k) = Ek/Ak - sig(k) = max(sig(k),sigmin) - sig(k) = min(sig(k),sigmax) - Ak = Ek/sig(k) ! to avoid small T in windinput - if (wind) then - aaprev=min(aaprev,eeprev/sigmin) - aaprev=max(aaprev,eeprev/sigmax) - endif - ! - call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) - endif - ! - ! Fill DoverE - uorbi = 0.5*sig(k)*Hk/sinhkh(k) - Dfk = 0.28*rho*fw(k)*uorbi**3 - !if (Hk>0.) then ! - if (Hk>baldock_ratio*Hmx(k)) then - call baldock(rho, g, alfa, gamma, depth(k), Hk, 2*pi/sig(k) , 1, Dwk, Hmx(k)) - else - Dwk = 0. - endif - ! - if (vegetation) then - call vegatt(sig(k), no_nodes, kwav(k), no_secveg, veg_ah(k,:), veg_bstems(k,:), veg_Nstems(k,:), veg_Cd(k,:), depth(k), rho, g, Hk, Dvegk) + uorbi = 0.5 * sig(k) * Hk / sinhkh(k) + Dfk = 0.28 * rho * fw(k) * uorbi**3 + ! + ! Wave breaking + ! + ! First check if wave breaking could occur based on Baldock criterion (Hk > baldock_ratio * Hmx(k)) + ! + if (Hk > baldock_ratio * Hmx(k)) then + ! + ! Baldock + ! + call baldock(rho, g, alfa, gamma, depth(k), Hk, 2 * pi / sig(k) , baldock_exponent, Dwk, Hmx(k)) + ! else - Dvegk = 0. + ! + ! No breaking + ! + Dwk = 0.0 + ! endif ! - DoverE(k) = (Dwk + Dfk + Dvegk)/max(Ek, 1.0e-6) + ! Vegetation ! - if (wind) then + if (vegetation) then ! - if (iter==1) then - call windinput(u10(k), rho, g, depth(k), ntheta, windspreadfac(:,k), Ek, Ak, cg(k), eeprev, aaprev, ds(:,k), WsorE(:,k), WsorA(:,k), jadcgdx) - else - call windinput(u10(k), rho, g, depth(k), ntheta, windspreadfac(:,k), Ek, Ak, cg(k), ee(:,k), aa(:,k), ds(:,k), WsorE(:,k), WsorA(:,k), jadcgdx) - endif + call vegatt(sig(k), no_nodes, kwav(k), no_secveg, veg_ah(k,:), veg_bstems(k,:), veg_Nstems(k,:), veg_Cd(k,:), depth(k), rho, g, Hk, Dvegk) ! - DwT = - c_dispT/(1.0 -ndissip)*(2.0*pi)/sig(k)**2*cg(k)*kwav(k) * DoverE(k) - DwAk = 1/2.0/pi * (E(k)*DwT+2.0*pi*Ak*DoverE(k) ) + else ! - if (iter==1) then - DoverA(k) = DwAk/max(Ak,1e-6) - else - DoverA(k) = (1.0-fac)*DoverA(k)+fac*DwAk/max(Ak,1.e-6) - endif - ! - call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) + Dvegk = 0.0 ! endif ! - do itheta = 1, ntheta + ! Use some under relaxation (unless relax_factor_DoverE is set to 1.0) + ! + DoverE(k) = (1.0 - relax_factor_DoverE) * DoverE(k) + relax_factor_DoverE * (Dwk + Dfk + Dvegk) / max(Ek, 1.0e-6) + ! + ! Store dissipation terms for output + ! + Df(k) = Dfk + Dw(k) = Dwk + Dveg(k) = Dvegk + ! + do itheta = 1, ntheta ! - R(itheta) = oneoverdt*ee(itheta, k) + cgprev(itheta)*eeprev(itheta)/ds(itheta, k) - srcig_local(itheta, k) * shinc2ig + R(itheta) = oneoverdt*ee(itheta, k) + cgprev(itheta) * eeprev(itheta) / ds(itheta, k) - srcig_local(itheta, k) * shinc2ig * fdrspr ! enddo ! do itheta = 2, ntheta - 1 ! - A(itheta) = -ctheta(itheta - 1, k)*oneover2dtheta - B(itheta) = oneoverdt + cg(k)/ds(itheta,k) + DoverE(k) - C(itheta) = ctheta(itheta + 1, k)*oneover2dtheta + A(itheta) = -ctheta(itheta - 1, k) * oneover2dtheta + B(itheta) = oneoverdt + cg(k) / ds(itheta,k) + DoverE(k) + C(itheta) = ctheta(itheta + 1, k) * oneover2dtheta ! enddo ! - A(1) = -ctheta(ntheta, k)*oneover2dtheta - B(1) = oneoverdt + cg(k)/ds(1,k) + DoverE(k) - C(1) = ctheta(2, k)*oneover2dtheta + A(1) = -ctheta(ntheta, k) * oneover2dtheta + B(1) = oneoverdt + cg(k) / ds(1,k) + DoverE(k) + C(1) = ctheta(2, k) * oneover2dtheta ! - A(ntheta) = -ctheta(ntheta - 1, k)*oneover2dtheta - B(ntheta) = oneoverdt + cg(k)/ds(ntheta,k) + DoverE(k) - C(ntheta) = ctheta(1, k)*oneover2dtheta + A(ntheta) = -ctheta(ntheta - 1, k) * oneover2dtheta + B(ntheta) = oneoverdt + cg(k) / ds(ntheta,k) + DoverE(k) + C(ntheta) = ctheta(1, k) * oneover2dtheta ! ! Solve tridiagonal system per point ! if (wind) then + ! + ! MvO: in compute_celerities, Hmx is computed again. Why? + ! + call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) + ! + call windinput(u10(k), rho, g, depth(k), ntheta, windspreadfac(:,k), Ek, Ak, cg(k), ee(:,k), aa(:,k), ds(:,k), WsorE(:,k), WsorA(:,k), jadcgdx) + ! + DwT = - c_dispT / (1.0 - ndissip) * (2 * pi) / sig(k)**2 * cg(k) * kwav(k) * DoverE(k) + DwAk = 1.0 / 2.0 / pi * (E(k) * DwT + 2.0 * pi * Ak * DoverE(k) ) + ! + if (iter == 1) then + ! + DoverA(k) = DwAk / max(Ak, 1e-6) + ! + else + ! + DoverA(k) = (1.0 - relax_factor_DoverA) * DoverA(k) + relax_factor_DoverA * DwAk / max(Ak, 1.0e-6) + ! + endif + ! do itheta = 2, ntheta - 1 - B_aa(itheta) = oneoverdt + cg(k)/ds(itheta,k) + DoverA(k) - R_aa(itheta) = (oneoverdt)*aa(itheta, k) + cgprev(itheta)*aaprev(itheta)/ds(itheta, k) + ! + B_aa(itheta) = oneoverdt + cg(k) / ds(itheta,k) + DoverA(k) + R_aa(itheta) = (oneoverdt) * aa(itheta, k) + cgprev(itheta) * aaprev(itheta) / ds(itheta, k) + ! enddo ! - if (ctheta(1,k)<0) then - B_aa(1) = oneoverdt - ctheta(1, k)/dtheta + cg(k)/ds(1, k) + DoverA(k) - R_aa(1) = (oneoverdt)*aa(1, k) + cgprev(1)*aaprev(1)/ds(1, k) + if (ctheta(1, k) < 0) then + ! + B_aa(1) = oneoverdt - ctheta(1, k) / dtheta + cg(k) / ds(1, k) + DoverA(k) + R_aa(1) = (oneoverdt) * aa(1, k) + cgprev(1) * aaprev(1) / ds(1, k) + ! else - B_aa(1) = oneoverdt + cg(k)/ds(1, k) + DoverA(k) - R_aa(1) = (oneoverdt)*aa(1, k) + cgprev(1)*aaprev(1)/ds(1, k) + ! + B_aa(1) = oneoverdt + cg(k) / ds(1, k) + DoverA(k) + R_aa(1) = (oneoverdt) * aa(1, k) + cgprev(1) * aaprev(1) / ds(1, k) + ! endif ! - if (ctheta(ntheta, k)>0) then - B_aa(ntheta) = oneoverdt + ctheta(ntheta, k)/dtheta + cg(k)/ds(ntheta, k) + DoverA(k) - R_aa(ntheta) = (oneoverdt )*aa(ntheta,k) + cgprev(ntheta)*aaprev(ntheta)/ds(ntheta, k) + if (ctheta(ntheta, k) > 0) then + ! + B_aa(ntheta) = oneoverdt + ctheta(ntheta, k) / dtheta + cg(k) / ds(ntheta, k) + DoverA(k) + R_aa(ntheta) = oneoverdt * aa(ntheta,k) + cgprev(ntheta) * aaprev(ntheta) / ds(ntheta, k) + ! else - B_aa(ntheta) = oneoverdt + cg(k)/ds(ntheta, k) + DoverA(k) - R_aa(ntheta) = (oneoverdt)*aa(ntheta,k) + cgprev(ntheta)*aaprev(ntheta)/ds(ntheta, k) + ! + B_aa(ntheta) = oneoverdt + cg(k) / ds(ntheta, k) + DoverA(k) + R_aa(ntheta) = (oneoverdt) * aa(ntheta,k) + cgprev(ntheta) * aaprev(ntheta) / ds(ntheta, k) + ! endif + ! R(:) = R(:) + WsorE(:,k) R_aa(:) = R_aa(:) + WsorA(:,k) ! call solve_tridiag(A, B, C, R, ee(:,k), ntheta) - call solve_tridiag(A,B_aa,C,R_aa,aa(:,k),ntheta) - ee(:, k) = max(ee(:, k), waveps) - aa(:,k) = max(aa(:,k),waveps/sigmax) - aa(:,k) = max(aa(:,k),waveps/sig(k)) - ! - Ek = sum(ee(:, k))*dtheta - Ak = sum(aa(:,k))*dtheta + call solve_tridiag(A, B_aa, C, R_aa, aa(:,k), ntheta) ! - depthlimfac = max(1.0, (sqrt(Ek/rhog8)/(gammax*depth(k)))**2.0) - Hk = sqrt(Ek/rhog8/depthlimfac) - Ek = Ek/depthlimfac - Ak = Ak/depthlimfac - ee(:,k) = ee(:,k)/depthlimfac - aa(:,k) = aa(:,k)/depthlimfac + ee(:, k) = max(ee(:, k), waveps) + aa(:,k) = max(aa(:,k), waveps / sigmax) + aa(:,k) = max(aa(:,k), waveps / sig(k)) ! - sig(k) = Ek/Ak - sig(k) = max(sig(k),sigmin) - sig(k) = min(sig(k),sigmax) - call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) - if (sig(k)<0.1) then - a=1 - endif else ! ! Solve tridiagonal system per point ! - call solve_tridiag(A, B, C, R, ee(:,k), ntheta) - ee(:, k) = max(ee(:, k),waveps) + call solve_tridiag(A, B, C, R, ee(:, k), ntheta) ! - endif !wind + ee(:, k) = max(ee(:, k), waveps) + ! + endif ! wind + ! + if (gammax < 998.0) then + ! + ! Limit incident energy with gammax + ! + depthlimfac = max(1.0, (sqrt(sum(ee(:, k)) * dtheta / rhog8) / (gammax * depth(k)) )**2.0) + ee(:,k) = ee(:,k) / depthlimfac + ! + endif ! ! IG ! if (igwaves) then - Ek_ig = sum(eeprev_ig)*dtheta - !Hk_ig = sqrt(Ek_ig/rhog8) !org trunk - Hk_ig = min(sqrt(Ek_ig/rhog8), gamma_ig*depth(k)) !TL: Question - why not this one? - Ek_ig = rhog8*Hk_ig**2 + ! + ! Update Hk (because used in bottom friction) + ! + H(k) = sqrt(8 * sum(ee(:, k)) * dtheta / rho / g) ! ! Bottom friction Henderson and Bowen (2002) - D = 0.015*rhow*(9.81/depth(k))**1.5*(Hk/sqrt(8.0))*Hk_ig**2/8 ! - Dfk_ig = fw_ig(k)*0.0361*(9.81/depth(k))**1.5*Hk*Ek_ig + Dfk_ig = fw_ig(k) * 0.0361 * (9.81 / depth(k))**1.5 * Hk * Ek_ig ! ! Dissipation of infragravity waves ! - if (Hk_ig>baldock_ratio_ig*Hmx_ig(k)) then - call baldock(rho, g, alfa_ig, gamma_ig, depth(k), Hk_ig, T_ig(k), 1, Dwk_ig, Hmx_ig(k)) + if (Hk_ig > baldock_ratio_ig * Hmx_ig(k)) then + ! + ! MvO: gamma_ig is not used in Baldock, on Hmx_ig ! + ! + call baldock(rho, g, alfa_ig, gamma_ig, depth(k), Hk_ig, T_ig(k), baldock_exponent, Dwk_ig, Hmx_ig(k)) + ! else - Dwk_ig = 0. + ! + ! No wave breaking + ! + Dwk_ig = 0.0 + ! endif ! - DoverE_ig(k) = (Dwk_ig + Dfk_ig)/max(Ek_ig, 1.0e-6) ! org trunk - !DoverE_ig(k) = (1.0 - fac)*DoverE_ig(k) + fac*(Dwk_ig + Dfk_ig)/max(Ek_ig, 1.0e-6) ! TODO - TL CHECK - why not with relaxation anymore? + ! Store dissipation terms for output + ! + Df_ig(k) = Dfk_ig + Dw_ig(k) = Dwk_ig + ! + ! Not using underrelaxation for IG dissipation for now, but we could add this if needed (relax_factor_DoverE_ig) + ! + DoverE_ig(k) = (Dwk_ig + Dfk_ig) / max(Ek_ig, 1.0e-6) ! do itheta = 1, ntheta ! - R_ig(itheta) = oneoverdt*ee_ig(itheta, k) + cgprev_ig(itheta)*eeprev_ig(itheta)/ds(itheta, k) + srcig_local(itheta, k) !TL: new version + R_ig(itheta) = oneoverdt*ee_ig(itheta, k) + cgprev_ig(itheta) * eeprev_ig(itheta) / ds(itheta, k) + srcig_local(itheta, k) * fdrspr ! enddo ! do itheta = 2, ntheta - 1 ! - A_ig(itheta) = -ctheta_ig(itheta - 1, k)*oneover2dtheta - B_ig(itheta) = oneoverdt + cg_ig(k)/ds(itheta,k) + DoverE_ig(k) - C_ig(itheta) = ctheta_ig(itheta + 1, k)*oneover2dtheta + A_ig(itheta) = - ctheta_ig(itheta - 1, k) * oneover2dtheta + B_ig(itheta) = oneoverdt + cg_ig(k) / ds(itheta,k) + DoverE_ig(k) + C_ig(itheta) = ctheta_ig(itheta + 1, k) * oneover2dtheta ! enddo ! - if (ctheta_ig(1,k)<0) then + if (ctheta_ig(1,k) < 0) then + ! A_ig(1) = 0.0 - B_ig(1) = oneoverdt - ctheta_ig(1, k)/dtheta + cg_ig(k)/ds(1, k) + DoverE_ig(k) - C_ig(1) = ctheta_ig(2, k)/dtheta + B_ig(1) = oneoverdt - ctheta_ig(1, k) / dtheta + cg_ig(k) / ds(1, k) + DoverE_ig(k) + C_ig(1) = ctheta_ig(2, k) / dtheta + ! else - A_ig(1)=0.0 - B_ig(1)=1.0/dt + cg_ig(k)/ds(1, k) + DoverE_ig(k) - C_ig(1)=0.0 + ! + A_ig(1) = 0.0 + B_ig(1) = 1.0 / dt + cg_ig(k) / ds(1, k) + DoverE_ig(k) + C_ig(1) = 0.0 + ! endif ! - if (ctheta_ig(ntheta, k)>0) then - A_ig(ntheta) = -ctheta_ig(ntheta - 1, k)/dtheta - B_ig(ntheta) = oneoverdt + ctheta_ig(ntheta, k)/dtheta + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) + if (ctheta_ig(ntheta, k) > 0) then + ! + A_ig(ntheta) = -ctheta_ig(ntheta - 1, k) / dtheta + B_ig(ntheta) = oneoverdt + ctheta_ig(ntheta, k) / dtheta + cg_ig(k) / ds(ntheta, k) + DoverE_ig(k) C_ig(ntheta) = 0.0 + ! else + ! A_ig(ntheta) = 0.0 - B_ig(ntheta) = oneoverdt + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) + B_ig(ntheta) = oneoverdt + cg_ig(k) / ds(ntheta, k) + DoverE_ig(k) C_ig(ntheta) = 0.0 + ! endif ! ! Solve tridiagonal system per point @@ -807,40 +863,31 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! endif ! + if (gammax < 998.0) then + ! + ! Limit IG energy with gammax + ! + depthlimfac = max(1.0, (sqrt(sum(ee_ig(:, k)) * dtheta / rhog8) / (gammax * depth(k)) )**2.0) + ee_ig(:, k) = ee_ig(:,k) / depthlimfac + ! + endif + ! endif ! else ! ee(:, k) = 0.0 + ! if (wind) then aa(:,k) = 0.0 endif + ! ee_ig(:, k) = 0.0 ! endif ! endif ! - if (neumannconnected(k)/=0) then - kn = neumannconnected(k) - sinhkh(kn) = sinhkh(k) - kwav(kn) = kwav(k) - Hmx(kn) = Hmx(k) - ee(:, kn) = ee(:, k) - ee_ig(:, kn) = ee_ig(:, k) ! TL: Added Neumann option for IG - ctheta(:, kn) = ctheta(:, k) - cg(kn) = cg(k) - if (wind) then - sig(kn) = sig(k) - Tp(kn) = 2.0*pi/sig(k) - WsorE(:,kn) = WsorE(:,k) - WsorA(:,kn) = WsorA(:,k) - aa(:,kn) = aa(:,k) - endif - Df(kn) = Df(k) - Dw(kn) = Dw(k) - endif - ! enddo ! if (sweep==4) then @@ -852,7 +899,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & dee = ee(:, k) - eeold(:, k) diff(k) = maxval(abs(dee)) ! - if (diff(k)/eemax Ozeren et al. (2013); 2 => Mendez and Losada (2004) ! myflag = 2 - pi = 4.d0*atan(1.d0) + pi = 4.d0*atan(1.d0) ! ! Representative wave period + ! Tp = 2*pi/sigm ! ! Coefficient alfa + ! if (ahh>=depth) then alfav = 1.d0 else @@ -1521,6 +1622,7 @@ subroutine bulkdragcoeff(ahh, m, Cdterm, no_nodes, no_secveg, depth, H, kwav, ve KC = um*Tp/veg_bstems ! ! Bulk drag coefficient + ! if (myflag == 1) then ! ! Approach from Ozeren et al. (2013), eq? @@ -1530,17 +1632,20 @@ subroutine bulkdragcoeff(ahh, m, Cdterm, no_nodes, no_secveg, depth, H, kwav, ve else Cdterm = 0.036d0+50.d0/(10.d0**0.926d0) endif + ! elseif (myflag == 2) then ! ! Approach from Mendez and Losada (2004), eq. 40 ! Only applicable for Laminaria Hyperborea (kelp)??? ! Q = KC/(alfav**0.76d0) + ! if (Q>=7) then Cdterm = exp(-0.0138*Q)/(Q**0.3d0) else Cdterm = exp(-0.0138*7)/(7**0.3d0) endif + ! endif ! end subroutine bulkdragcoeff diff --git a/source/src/snapwave/snapwave_solver.f90.ori b/source/src/snapwave/snapwave_solver.f90.ori new file mode 100644 index 000000000..7260894b0 --- /dev/null +++ b/source/src/snapwave/snapwave_solver.f90.ori @@ -0,0 +1,1549 @@ +module snapwave_solver + + use sfincs_log + + implicit none + +contains + + subroutine compute_wave_field() + ! + use snapwave_data + ! + implicit none + ! + !real*8, intent(in) :: time > TL: not used in this implementation + ! + real*4 :: tpb + ! + real*4, parameter :: waveps = 1e-5 + !real*4, dimension(:), allocatable :: sig + real*4, dimension(:), allocatable :: sigm_ig + real*4, dimension(:), allocatable :: expon + ! + integer :: itheta + integer :: k + ! + !allocate(sig(no_nodes)) + allocate(sigm_ig(no_nodes)) + ! + g = 9.81 + pi = 4.*atan(1.) + ! + call timer(t0) + ! + if (.not.restart) then + ! + ! Set energies to 0.0; note that boundary values have been set in update_boundaries + ! + do k = 1, no_nodes + if (inner(k)) then + ee(:,k) = waveps + endif + enddo + ! + ee_ig = waveps + ! + restart=1 !TODO TL: CHECK > we need this turned on right now for IG... + ! + endif + ! + ! Initialize wave period + ! + do k = 1, no_nodes + if (inner(k)) then + Tp(k) = Tpini + endif + if (neumannconnected(k)>0) then + Tp(neumannconnected(k))=Tpini + endif + enddo + ! + ! Compute celerities and refraction speed + ! + Tp = max(tpmean_bwv,Tpini) ! to check voor windgroei + sig = 2.0*pi/Tp + Tp_ig = tpmean_bwv_ig! TL: now determined in snapwave_boundaries.f90 instead of Tinc2ig*Tp + sigm_ig = 2.0*pi/Tp_ig !TODO - TL: Question do we want Tp_ig now as contant, or also spatially varying like Tp ? + ! + expon = -(sig*sqrt(depth/g))**(2.5) + kwav = sig**2/g*(1.0-exp(expon))**(-0.4) + C = sig/kwav + nwav = 0.5+kwav*depth/sinh(min(2*kwav*depth,50.0)) + Cg = nwav*C + ! + if (igwaves) then + cg_ig = Cg + expon = -(sigm_ig*sqrt(depth/g))**(2.5) + kwav_ig = sig**2/g*(1.0-exp(expon))**(-0.4) + else + cg_ig = 0.0 + kwav_ig = 0.0 + endif + ! + do k = 1, no_nodes + sinhkh(k) = sinh(min(kwav(k)*depth(k), 50.0)) + Hmx(k) = gamma*depth(k) + enddo + if (igwaves) then + do k = 1, no_nodes + Hmx_ig(k) = 0.88/kwav_ig(k)*tanh(gamma_ig*kwav_ig(k)*depth(k)/0.88) ! Note - uses gamma_ig + enddo + else + Hmx_ig = 0.0 + endif + ! + do itheta = 1, ntheta + ctheta(itheta,:) = sig/sinh(min(2.0*kwav*depth, 50.0))*(dhdx*sin(theta(itheta)) - dhdy*cos(theta(itheta))) + enddo + ! + if (igwaves) then + do itheta = 1, ntheta + ctheta_ig(itheta,:) = sigm_ig/sinh(min(2.0*kwav_ig*depth, 50.0))*(dhdx*sin(theta(itheta)) - dhdy*cos(theta(itheta))) + enddo + else + ctheta_ig = 0.0 + endif + ! + ! Limit unrealistic refraction speed to 1/2 pi per wave period + ! + do k = 1, no_nodes + ctheta(:,k) = sign(1.0, ctheta(:,k))*min(abs(ctheta(:, k)), sig(k)/4) + enddo + ! + if (igwaves) then + do k=1, no_nodes + ctheta_ig(:,k) = sign(1.0, ctheta_ig(:,k))*min(abs(ctheta_ig(:, k)), sigm_ig(k)/4.0) + enddo + endif + ! + ! Solve the directional wave energy balance on an unstructured grid + ! + call timer(t2) + ! + call solve_energy_balance2Dstat (x,y,dhdx, dhdy, no_nodes,inner, & + w, ds, prev, & + neumannconnected, & + theta,ntheta,thetamean, & + depth,kwav,cg,ctheta,fw, & + Tp,Tp_ig,dt,rho,alpha,gamma, gammax, & + wind, & + H,Dw,F,Df,thetam,sinhkh,& + Hmx, ee, windspreadfac, u10, niter, crit, & + hmin, baldock_ratio, baldock_ratio_ig, & + aa, sig, jadcgdx, sigmin, sigmax,& + c_dispT, WsorE, WsorA, SwE, SwA, Tpini, & + igwaves,kwav_ig, cg_ig,H_ig,ctheta_ig,Hmx_ig, ee_ig,fw_ig, & + beta, srcig, alphaig, Dw_ig, Df_ig, & + vegetation, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, Dveg, & + zb, nwav, ig_opt, alpha_ig, gamma_ig, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) + ! + call timer(t3) + ! + Fx = F*cos(thetam) + Fy = F*sin(thetam) + ! + end subroutine + + + subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & + w, ds, prev, & + neumannconnected, & + theta,ntheta,thetamean, & + depth,kwav,cg,ctheta,fw, & + Tp,T_ig,dt,rho,alfa,gamma, gammax, & + wind, & + H,Dw,F,Df,thetam,sinhkh,& + Hmx, ee, windspreadfac, u10, niter, crit, & + hmin, baldock_ratio, baldock_ratio_ig, & + aa, sig, jadcgdx, sigmin, sigmax,& + c_dispT, WsorE, WsorA, SwE, SwA, Tpini, & + igwaves,kwav_ig, cg_ig,H_ig,ctheta_ig,Hmx_ig, ee_ig,fw_ig, & + betamean, srcig, alphaig, Dw_ig, Df_ig, & + vegetation, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, Dveg, & + zb, nwav, ig_opt, alfa_ig, gamma_ig, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) + ! + use snapwave_windsource + !use snapwave_ncoutput ! TL: removed, we don't use this in SF+SW + ! + implicit none + ! + ! In/output variables and arrays + ! + real*8, dimension(no_nodes),intent(in) :: x,y ! x,y coordinates of grid + real*4, dimension(no_nodes),intent(in) :: dhdx, dhdy ! bed level gradients in x and y direction + integer, intent(in) :: no_nodes,ntheta ! number of grid points, number of directions + real*4, dimension(2,ntheta,no_nodes),intent(in) :: w ! weights of upwind grid points, 2 per grid point and per wave direction + integer, dimension(2,ntheta,no_nodes),intent(in) :: prev ! two upwind grid points per grid point and wave direction + real*4, dimension(ntheta,no_nodes), intent(in) :: ds ! distance to interpolated upwind point, per grid point and direction + real*4, intent(in) :: thetamean ! mean offshore wave direction (rad) + real*4, dimension(ntheta), intent(in) :: theta ! distribution of wave angles and offshore wave energy density + logical, dimension(no_nodes), intent(inout) :: inner ! mask of inner grid points (not on boundary) + logical, intent(in) :: wind ! logical wind on/off + logical, intent(in) :: igwaves ! logical IG waves on/off + logical, intent(in) :: iterative_srcig ! option whether IG source/sink term should be calculated implicitly (iterative_srcig = 1), or just a priori based on effectively incident wave energy from previous timestep only (iterative_srcig=0, explicitly, bit faster) + integer, dimension(no_nodes),intent(in) :: neumannconnected ! number of neumann boundary point if connected to inner point + real*4, dimension(no_nodes), intent(in) :: depth ! water depth + real*4, dimension(no_nodes), intent(in) :: zb ! actual bed level + real*4, dimension(no_nodes), intent(inout) :: kwav ! wave number + real*4, dimension(no_nodes), intent(in) :: kwav_ig ! wave number + real*4, dimension(no_nodes), intent(inout) :: cg ! group velocity + real*4, dimension(ntheta,no_nodes), intent(inout):: ctheta ! refractioon speed + real*4, dimension(no_nodes), intent(in) :: cg_ig ! group velocity + real*4, dimension(no_nodes), intent(in) :: nwav ! wave number n + real*4, dimension(ntheta,no_nodes), intent(inout):: ee ! + real*4, dimension(ntheta,no_nodes), intent(inout):: ee_ig ! + real*4, dimension(ntheta,no_nodes), intent(in) :: ctheta_ig ! refractioon speed + real*4, dimension(no_nodes), intent(in) :: fw ! wave friction factor + real*4, dimension(no_nodes), intent(in) :: fw_ig ! wave friction factor + real*4, dimension(no_nodes), intent(out) :: betamean ! Mean local bed slope parameter + real*4, dimension(no_nodes), intent(out) :: srcig ! Directionally averaged incident wave sink/infragravity source term + real*4, dimension(no_nodes), intent(out) :: alphaig ! Mean IG shoaling parameter alpha + real*4, intent(in) :: dt ! time step (s) + real*4, intent(in) :: rho ! water density + real*4, intent(in) :: alfa,gamma, gammax ! coefficients in Baldock wave breaking dissipation + real*4, intent(in) :: baldock_ratio ! option controlling from what depth wave breaking should take place: (Hk>baldock_ratio*Hmx(k)), default baldock_ratio=0.2 + real*4, intent(in) :: baldock_ratio_ig ! option controlling from what depth wave breaking should take place for IG waves: (Hk_ig>baldock_ratio_ig*Hmx_ig(k)), default baldock_ratio_ig=0.2 + real*4, dimension(no_nodes), intent(inout) :: H ! wave height - TODO - TL - CHECK > inout needed to have updated 'H' for determining srcig + real*4, dimension(no_nodes), intent(out) :: H_ig ! wave height + real*4, dimension(no_nodes), intent(out) :: Dw ! wave breaking dissipation + real*4, dimension(no_nodes), intent(out) :: Dw_ig ! wave breaking dissipation IG + real*4, dimension(no_nodes), intent(out) :: F ! wave force Dw/C/rho/h + real*4, dimension(no_nodes), intent(out) :: Df ! wave friction dissipation + real*4, dimension(no_nodes), intent(out) :: Df_ig ! wave friction dissipation IG + real*4, dimension(no_nodes), intent(out) :: thetam ! mean wave direction + real*4, dimension(no_nodes), intent(inout) :: sinhkh ! sinh(k*depth) + real*4, dimension(no_nodes), intent(inout) :: Hmx ! Hmax + real*4, dimension(no_nodes), intent(inout) :: Tp ! Peak wave period + real*4, dimension(no_nodes), intent(in) :: T_ig ! IG wave period + real*4, dimension(no_nodes), intent(in) :: Hmx_ig ! Hmax + real*4, dimension(no_nodes), intent(in) :: u10 ! wind speed and direction + integer, intent(in) :: niter ! max number of iterations + real*4, intent(in) :: crit ! relative accuracy for stopping criterion + integer :: ig_opt ! option of IG wave settings (1 = default = conservative shoaling based dSxx and Baldock breaking) + ! + ! wind source vars + ! + integer, intent(in) :: jadcgdx ! logical yes/no ! logical yes/no + real*4, intent(in) :: sigmin, sigmax, c_dispT + real*4, dimension(ntheta, no_nodes), intent(in) :: windspreadfac !< [-] distribution array for wind input + real*4, dimension(ntheta,no_nodes), intent(inout) :: aa + real*4, dimension(ntheta,no_nodes), intent(out) :: WsorE, WsorA + real*4, dimension(no_nodes), intent(out) :: SwE, SwA + real*4, dimension(no_nodes), intent(inout) :: sig + real*4, intent(in) :: Tpini + ! + ! vegetation vars + ! + logical, intent(in) :: vegetation ! logical yes/no + real*4, dimension(no_nodes), intent(out) :: Dveg ! dissipation by vegetation: N.B. spatial field! + integer, intent(in) :: no_secveg + real*4, dimension(no_nodes,no_secveg), intent(in) :: veg_ah ! Height of vertical sections used in vegetation schematization [m wrt zb_ini (zb0)] + real*4, dimension(no_nodes,no_secveg), intent(in) :: veg_bstems ! Width/diameter of individual vegetation stems [m] + real*4, dimension(no_nodes,no_secveg), intent(in) :: veg_Nstems ! Number of vegetation stems per unit horizontal area [m-2] + real*4, dimension(no_nodes,no_secveg), intent(in) :: veg_Cd ! Bulk drag coefficient [-] + real*4 :: Dvegk ! dissipation by vegetation: N.B. scalar value! + ! + ! + ! Local variables and arrays + ! + integer, dimension(:), allocatable :: ok ! mask for fully iterated points + real*4 :: eemax,dtheta ! maximum wave energy density, directional resolution + real*4 :: uorbi + integer :: sweep,iter ! sweep number, number of iterations + integer :: k,k1,k2,count,kn,itheta ! counters (k is grid index) + integer, dimension(:,:), allocatable :: indx ! index for grid sorted per sweep direction + real*4, dimension(:,:), allocatable :: eeold ! wave energy density, energy density previous iteration + real*4, dimension(:), allocatable :: Eold ! mean wave energy, previous iteration + real*4, dimension(:,:), allocatable :: srcig_local ! Energy source/sink term because of IG wave energy transfer from incident waves + real*4, dimension(:,:), allocatable :: beta_local ! Local bed slope based on bed level per direction + real*4, dimension(:,:), allocatable :: alphaig_local ! Local infragravity wave shoaling parameter alpha + real*4, dimension(:,:), allocatable :: depthprev ! water depth at upwind intersection point per direction + real*4, dimension(:), allocatable :: dee ! difference with energy previous iteration + real*4, dimension(:), allocatable :: eeprev, cgprev ! energy density and group velocity at upwind intersection point + real*4, dimension(:), allocatable :: eeprev_ig, cgprev_ig ! energy density and group velocity at upwind intersection point + real*4, dimension(:), allocatable :: A,B,C,R ! coefficients in the tridiagonal matrix solved per point + real*4, dimension(:), allocatable :: B_aa,R_aa,aaprev ! coefficients in the tridiagonal matrix solved per point + real*4, dimension(:), allocatable :: A_ig,B_ig,C_ig,R_ig ! coefficients in the tridiagonal matrix solved per point + real*4, dimension(:), allocatable :: DoverE ! ratio of mean wave dissipation over mean wave energy + real*4, dimension(:), allocatable :: DoverA ! ratio of mean wave dissipation over mean wave energy + real*4, dimension(:), allocatable :: DoverE_ig ! ratio of mean wave dissipation over mean wave energy + real*4, dimension(:), allocatable :: E ! mean wave energy + real*4, dimension(:), allocatable :: E_ig ! mean wave energy + real*4, dimension(:), allocatable :: diff ! maximum difference of wave energy relative to previous iteration + real*4, dimension(:), allocatable :: ra ! coordinate in sweep direction + !real*4, dimension(:), allocatable :: sig + real*4, dimension(:), allocatable :: sigm_ig + integer, dimension(4) :: shift + real*4 :: pi = 4.*atan(1.0) + real*4 :: g=9.81 + real*4 :: hmin ! minimum water depth! TL: make user changeable also here according to 'snapwave_hmin' in sfincs.inp + real*4 :: fac=1.0 ! underrelaxation factor for DoverA + real*4 :: oneoverdt + real*4 :: oneover2dtheta + real*4 :: rhog8 + real*4 :: Dfk + real*4 :: Dwk + real*4 :: Ek + real*4 :: Hk + real*4 :: percok + real*4 :: error + real*4 :: Dfk_ig + real*4 :: Dwk_ig + real*4 :: Ek_ig + real*4 :: Hk_ig + real*4 :: alfa_ig,gamma_ig ! coefficients in Baldock wave breaking dissipation model for IG waves + real*4 :: eeinc2ig ! ratio of incident wave energy as first estimate of IG wave energy at boundary + real*4 :: Tinc2ig ! ratio compared to period Tinc to estimate Tig + real*4 :: alphaigfac ! Multiplication factor for IG shoaling source/sink term, default = 1.0 + real*4 :: shinc2ig ! Ratio of how much of the calculated IG wave source term, is subtracted from the incident wave energy (0-1, 0=default) + integer, save :: callno=1 + ! + real*4, dimension(ntheta) :: sinth,costh ! distribution of wave angles and offshore wave energy density + ! + !local wind source vars + ! + real*4 :: Ak + real*4 :: DwT + real*4 :: DwAk + real*4 :: ndissip ! + real*4 :: depthlimfac=1.0 + real*4 :: waveps=0.0001 + ! + ! Allocate local arrays + ! + waveps = 0.0001 + allocate(ok(no_nodes)); ok=0 + allocate(indx(no_nodes,4)); indx=0 + allocate(eeold(ntheta,no_nodes)); eeold=0.0 + allocate(dee(ntheta)); dee=0.0 + allocate(eeprev(ntheta)); eeprev=0.0 + allocate(cgprev(ntheta)); cgprev=0.0 + allocate(A(ntheta)); A=0.0 + allocate(B(ntheta)); B=0.0 + allocate(C(ntheta)); C=0.0 + allocate(R(ntheta)); R=0.0 + allocate(DoverE(no_nodes)); DoverE=0.0 + allocate(E(no_nodes)); E=waveps + allocate(Eold(no_nodes)); Eold=0.0 + ! + if (igwaves) then + allocate(A_ig(ntheta)); A_ig=0.0 + allocate(B_ig(ntheta)); B_ig=0.0 + allocate(C_ig(ntheta)); C_ig=0.0 + allocate(R_ig(ntheta)); R_ig=0.0 + allocate(eeprev_ig(ntheta)); eeprev_ig=0.0 + allocate(cgprev_ig(ntheta)); cgprev_ig=0.0 + allocate(DoverE_ig(no_nodes)); DoverE_ig=0.0 + allocate(E_ig(no_nodes)); E_ig=waveps + !allocate(T_ig(no_nodes)); T_ig=0.0 + allocate(sigm_ig(no_nodes)); sigm_ig=0.0 + allocate(depthprev(ntheta,no_nodes)); depthprev=0.0 + allocate(beta_local(ntheta,no_nodes)); beta_local=0.0 + allocate(alphaig_local(ntheta,no_nodes)); alphaig_local=0.0 + endif + ! + if (wind) then + allocate(B_aa(ntheta)); B_aa=0.0 + allocate(R_aa(ntheta)); R_aa=0.0 + allocate(DoverA(no_nodes)); DoverA=0.0 + allocate(aaprev(ntheta)); aaprev=0.0 + endif + ! + allocate(diff(no_nodes)); diff=0.0 + allocate(ra(no_nodes)); ra=0.0 + allocate(srcig_local(ntheta,no_nodes)); srcig_local = 0.0 + ! + do itheta = 1, ntheta + sinth(itheta) = sin(theta(itheta)) + costh(itheta) = cos(theta(itheta)) + enddo + ! + df = 0.0 + dw = 0.0 + F = 0.0 + ! + ok = 0 + indx = 0 + eemax = maxval(ee) + dtheta = theta(2) - theta(1) + if (dtheta<0.) dtheta = dtheta + 2.*pi + if (wind) then + sig = 2*pi/Tpini + else + sig = 2*pi/Tp + endif + oneoverdt = 1.0/dt + oneover2dtheta = 1.0/2.0/dtheta + rhog8 = 0.125*rho*g + thetam = 0.0 + !H = 0.0 ! TODO - TL: CHeck > needed for restart for IG > set to 0 now in snapwave_domain.f90 + Dveg = 0.0 + ! + if (igwaves) then + !T_ig = Tinc2ig*Tp + sigm_ig = 2*pi/T_ig + DoverE_ig = 0.0 + endif + ! + if (wind) then + DoverA = 0.0 + ndissip = 3.0 + WsorE = 0.0 + WsorA = 0.0 + Ak = waveps/sigmax + endif + ! + ! Sort coordinates in sweep directions + ! + shift = [0,1,-1,2] + do sweep = 1, 4 + ! + ra = x*cos(thetamean + 0.5*pi*shift(sweep)) + y*sin(thetamean + 0.5*pi*shift(sweep)) + call hpsort_eps_epw(no_nodes, ra , indx(:, sweep), 1.0e-6) + ! + enddo + ! + ! Set inner to false for all points at grid edge or adjacent to dry point + ! + do k=1,no_nodes + ! + do itheta = 1, ntheta + ! + k1 = prev(1, itheta, k) + k2 = prev(2, itheta, k) + ! + if (k1 * k2 == 0) then + ! + ! No upwind point (is this check not already done somewhere before?) + ! + inner(k) = .false. + ! + elseif ((k1==1 .and. k2==1)) then ! TL: for now still needed for a working IG solver + inner(k)=.false. + exit + !elseif (depth(k1) < hmin .or. depth(k2) < hmin .or. (k1 == 1 .and. k2 == 1)) then + ! + ! Do not change inner here! It should be static! In a next update of the wave fields, these points may be wet. + ! + !inner(k) = .false. + ! + !exit + ! + endif + enddo + enddo + ! + ! + ! 0-a) Set boundary and initial conditions + ! + do k = 1, no_nodes + ! + ! Boundary condition at sea side (uniform) + ! + if (.not.inner(k)) then + ! + ee(:,k)=max(ee(:,k),waveps) + E(k) = sum(ee(:, k))*dtheta + H(k) = sqrt(8*E(k)/rho/g) + thetam(k) = atan2(sum(ee(:, k)*sin(theta)), sum(ee(:, k)*cos(theta))) + ! + !ee_ig(:, k) = eeinc2ig*ee(:,k) !TODO TL: determined in snapwave_boundaries.f90 + ! + if (igwaves) then + E_ig(k) = sum(ee_ig(:, k))*dtheta + H_ig(k) = sqrt(8*E_ig(k)/rho/g) + endif + ! + if (wind) then + sig(k) = 2*pi/Tp(k) + !aa(:,k) = max(aa(:,k),waveps/sig(k)) + aa(:,k) = max(ee(:,k),waveps)/sig(k) + Ak = E(k)/sig(k) + endif + ! + endif + enddo + ! + ! 0-b) Determine IG source/sink term + ! + if (igwaves) then + ! + ! As defined in Leijnse, van Ormondt, van Dongeren, Aerts & Muis et al. 2024 + ! + ! Actual determining of source term: + ! + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) + ! + ! inout: alphaig_local, srcig_local - eeprev, eeprev_ig, cgprev, beta_local + ! in: the rest + ! + ! NOTE - This is based on the energy in the precious SnapWave timestep 'ee' and 'ee_ig', and waveheight 'H', which should therefore be made available. + ! + endif + ! + ! 0-c) Set initial condition at inner cells + ! + do k = 1, no_nodes + ! + if (inner(k)) then + ! + if (wind) then + ee(:,k) = waveps + sig(k) = 2*pi/Tpini + aa(:,k) = ee(:,k)/sig(k) + else + ee(:,k) = waveps + endif + ! + ! Make sure DoverE is filled based on previous ee + Ek = sum(ee(:, k))*dtheta + Hk = min(sqrt(Ek/rhog8), gamma*depth(k)) + Ek = rhog8*Hk**2 + if (.not. wind) then + uorbi = 0.5*sig(k)*Hk/sinhkh(k) + Dfk = 0.28*rho*fw(k)*uorbi**3 + call baldock(rho, g, alfa, gamma, depth(k), Hk, Tp(k), 1, Dwk, Hmx(k)) + DoverE(k) = (Dwk + Dfk)/max(Ek, 1.0e-6) + endif + ! + if (wind) then + call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) + uorbi = 0.5*sig(k)*Hk/sinhkh(k) + Dfk = 0.28*rho*fw(k)*uorbi**3 + call baldock(rho, g, alfa, gamma, depth(k), Hk, 2.0*pi/sig(k), 1, Dwk, Hmx(k)) + DoverE(k) = (Dwk + Dfk)/max(Ek, 1.0e-6) + ! + ! initial conditions are not equal to bc conditions + DwT = - c_dispT/(1.0 -ndissip)*(2.*pi)/sig(k)**2*cg(k)*kwav(k) * DoverE(k) + DwAk = 0.5/pi * (E(k)*DwT+2.0*pi*Ak*DoverE(k) ) + DoverA(k) = DwAk/max(Ak,1e-6) + endif + ! + endif + ! + enddo + ! + ! Start iteration + ! + do iter=1,niter + ! + sweep = mod(iter, 4) !TODO - TL: problem that we don't have option for sweep = 1 anymore? + ! + if (sweep==0) then + sweep = 4 + endif + ! + if (sweep==1) then + eeold = ee + do k = 1, no_nodes + Eold(k) = sum(eeold(:, k)) + enddo + ! + if (igwaves) then + ! + if (iterative_srcig) then + ! Update H(k) based on updated ee(:,k), as used in IG source term to determine alphaig + ! + do k = 1, no_nodes + ! + if (inner(k)) then + ! + H(k) = sqrt(8*sum(ee(:, k))*dtheta/rho/g) + ! + endif + enddo + ! + ! Actual determining of source term - every first sweep of iteration + ! + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) + ! + endif + ! + endif + ! + endif + ! + ! Loop over all points depending on sweep direction + ! + do count = 1, no_nodes + ! + k=indx(count, sweep) + ! + if (inner(k)) then + if (depth(k)>1.1*hmin) then + ! + if (ok(k) == 0) then + ! + ! Only perform computations on wet inner points that are not yet converged (ok) + ! + do itheta = 1, ntheta + ! + k1 = prev(1, itheta, k) + k2 = prev(2, itheta, k) + ! + eeprev(itheta) = w(1, itheta, k)*ee(itheta, k1) + w(2, itheta, k)*ee(itheta, k2) + cgprev(itheta) = w(1, itheta, k)*cg(k1) + w(2, itheta, k)*cg(k2) + ! + if (igwaves) then + eeprev_ig(itheta) = w(1, itheta, k)*ee_ig(itheta, k1) + w(2, itheta, k)*ee_ig(itheta, k2) + cgprev_ig(itheta) = w(1, itheta, k)*cg_ig(k1) + w(2, itheta, k)*cg_ig(k2) + endif + ! + if (wind) then + aaprev(itheta) = w(1, itheta, k)*aa(itheta, k1) + w(2, itheta, k)*aa(itheta, k2) + endif + ! + enddo + ! + Ek = sum(eeprev)*dtheta ! to check + ! + depthlimfac = max(1.0, (sqrt(Ek/rhog8)/(gammax*depth(k)))**2.0) + Hk = min(sqrt(Ek/rhog8), gamma*depth(k)) + Ek = Ek/depthlimfac + ! + if (wind) then + ! + Ak = sum(aaprev)*dtheta + ! + Ak = Ak/depthlimfac + ee(:,k) = ee(:,k) / depthlimfac + aa(:,k) = aa(:,k) / depthlimfac + sig(k) = Ek/Ak + sig(k) = max(sig(k),sigmin) + sig(k) = min(sig(k),sigmax) + Ak = Ek/sig(k) ! to avoid small T in windinput + if (wind) then + aaprev=min(aaprev,eeprev/sigmin) + aaprev=max(aaprev,eeprev/sigmax) + endif + ! + call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) + endif + ! + ! Fill DoverE + uorbi = 0.5*sig(k)*Hk/sinhkh(k) + Dfk = 0.28*rho*fw(k)*uorbi**3 + !if (Hk>0.) then ! + if (Hk>baldock_ratio*Hmx(k)) then + call baldock(rho, g, alfa, gamma, depth(k), Hk, 2*pi/sig(k) , 1, Dwk, Hmx(k)) + else + Dwk = 0. + endif + ! + if (vegetation) then + call vegatt(sig(k), no_nodes, kwav(k), no_secveg, veg_ah(k,:), veg_bstems(k,:), veg_Nstems(k,:), veg_Cd(k,:), depth(k), rho, g, Hk, Dvegk) + else + Dvegk = 0. + endif + ! + DoverE(k) = (Dwk + Dfk + Dvegk)/max(Ek, 1.0e-6) + ! + if (wind) then + ! + if (iter==1) then + call windinput(u10(k), rho, g, depth(k), ntheta, windspreadfac(:,k), Ek, Ak, cg(k), eeprev, aaprev, ds(:,k), WsorE(:,k), WsorA(:,k), jadcgdx) + else + call windinput(u10(k), rho, g, depth(k), ntheta, windspreadfac(:,k), Ek, Ak, cg(k), ee(:,k), aa(:,k), ds(:,k), WsorE(:,k), WsorA(:,k), jadcgdx) + endif + ! + DwT = - c_dispT/(1.0 -ndissip)*(2.0*pi)/sig(k)**2*cg(k)*kwav(k) * DoverE(k) + DwAk = 1/2.0/pi * (E(k)*DwT+2.0*pi*Ak*DoverE(k) ) + ! + if (iter==1) then + DoverA(k) = DwAk/max(Ak,1e-6) + else + DoverA(k) = (1.0-fac)*DoverA(k)+fac*DwAk/max(Ak,1.e-6) + endif + ! + call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) + ! + endif + ! + do itheta = 1, ntheta + ! + R(itheta) = oneoverdt*ee(itheta, k) + cgprev(itheta)*eeprev(itheta)/ds(itheta, k) - srcig_local(itheta, k) * shinc2ig + ! + enddo + ! + do itheta = 2, ntheta - 1 + ! + A(itheta) = -ctheta(itheta - 1, k)*oneover2dtheta + B(itheta) = oneoverdt + cg(k)/ds(itheta,k) + DoverE(k) + C(itheta) = ctheta(itheta + 1, k)*oneover2dtheta + ! + enddo + ! + A(1) = -ctheta(ntheta, k)*oneover2dtheta + B(1) = oneoverdt + cg(k)/ds(1,k) + DoverE(k) + C(1) = ctheta(2, k)*oneover2dtheta + ! + A(ntheta) = -ctheta(ntheta - 1, k)*oneover2dtheta + B(ntheta) = oneoverdt + cg(k)/ds(ntheta,k) + DoverE(k) + C(ntheta) = ctheta(1, k)*oneover2dtheta + ! + ! Solve tridiagonal system per point + ! + if (wind) then + do itheta = 2, ntheta - 1 + B_aa(itheta) = oneoverdt + cg(k)/ds(itheta,k) + DoverA(k) + R_aa(itheta) = (oneoverdt)*aa(itheta, k) + cgprev(itheta)*aaprev(itheta)/ds(itheta, k) + enddo + ! + if (ctheta(1,k)<0) then + B_aa(1) = oneoverdt - ctheta(1, k)/dtheta + cg(k)/ds(1, k) + DoverA(k) + R_aa(1) = (oneoverdt)*aa(1, k) + cgprev(1)*aaprev(1)/ds(1, k) + else + B_aa(1) = oneoverdt + cg(k)/ds(1, k) + DoverA(k) + R_aa(1) = (oneoverdt)*aa(1, k) + cgprev(1)*aaprev(1)/ds(1, k) + endif + ! + if (ctheta(ntheta, k)>0) then + B_aa(ntheta) = oneoverdt + ctheta(ntheta, k)/dtheta + cg(k)/ds(ntheta, k) + DoverA(k) + R_aa(ntheta) = (oneoverdt )*aa(ntheta,k) + cgprev(ntheta)*aaprev(ntheta)/ds(ntheta, k) + else + B_aa(ntheta) = oneoverdt + cg(k)/ds(ntheta, k) + DoverA(k) + R_aa(ntheta) = (oneoverdt)*aa(ntheta,k) + cgprev(ntheta)*aaprev(ntheta)/ds(ntheta, k) + endif + R(:) = R(:) + WsorE(:,k) + R_aa(:) = R_aa(:) + WsorA(:,k) + ! + call solve_tridiag(A, B, C, R, ee(:,k), ntheta) + call solve_tridiag(A,B_aa,C,R_aa,aa(:,k),ntheta) + ee(:, k) = max(ee(:, k), waveps) + aa(:,k) = max(aa(:,k),waveps/sigmax) + aa(:,k) = max(aa(:,k),waveps/sig(k)) + ! + Ek = sum(ee(:, k))*dtheta + Ak = sum(aa(:,k))*dtheta + ! + depthlimfac = max(1.0, (sqrt(Ek/rhog8)/(gammax*depth(k)))**2.0) + Hk = sqrt(Ek/rhog8/depthlimfac) + Ek = Ek/depthlimfac + Ak = Ak/depthlimfac + ee(:,k) = ee(:,k)/depthlimfac + aa(:,k) = aa(:,k)/depthlimfac + ! + sig(k) = Ek/Ak + sig(k) = max(sig(k),sigmin) + sig(k) = min(sig(k),sigmax) + call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) + if (sig(k)<0.1) then + a=1 + endif + else + ! + ! Solve tridiagonal system per point + ! + call solve_tridiag(A, B, C, R, ee(:,k), ntheta) + ee(:, k) = max(ee(:, k),waveps) + ! + endif !wind + ! + ! IG + ! + if (igwaves) then + Ek_ig = sum(eeprev_ig)*dtheta + !Hk_ig = sqrt(Ek_ig/rhog8) !org trunk + Hk_ig = min(sqrt(Ek_ig/rhog8), gamma_ig*depth(k)) !TL: Question - why not this one? + Ek_ig = rhog8*Hk_ig**2 + ! + ! Bottom friction Henderson and Bowen (2002) - D = 0.015*rhow*(9.81/depth(k))**1.5*(Hk/sqrt(8.0))*Hk_ig**2/8 + ! + Dfk_ig = fw_ig(k)*0.0361*(9.81/depth(k))**1.5*Hk*Ek_ig + ! + ! Dissipation of infragravity waves + ! + if (Hk_ig>baldock_ratio_ig*Hmx_ig(k)) then + call baldock(rho, g, alfa_ig, gamma_ig, depth(k), Hk_ig, T_ig(k), 1, Dwk_ig, Hmx_ig(k)) + else + Dwk_ig = 0. + endif + ! + DoverE_ig(k) = (Dwk_ig + Dfk_ig)/max(Ek_ig, 1.0e-6) ! org trunk + !DoverE_ig(k) = (1.0 - fac)*DoverE_ig(k) + fac*(Dwk_ig + Dfk_ig)/max(Ek_ig, 1.0e-6) ! TODO - TL CHECK - why not with relaxation anymore? + ! + do itheta = 1, ntheta + ! + R_ig(itheta) = oneoverdt*ee_ig(itheta, k) + cgprev_ig(itheta)*eeprev_ig(itheta)/ds(itheta, k) + srcig_local(itheta, k) !TL: new version + ! + enddo + ! + do itheta = 2, ntheta - 1 + ! + A_ig(itheta) = -ctheta_ig(itheta - 1, k)*oneover2dtheta + B_ig(itheta) = oneoverdt + cg_ig(k)/ds(itheta,k) + DoverE_ig(k) + C_ig(itheta) = ctheta_ig(itheta + 1, k)*oneover2dtheta + ! + enddo + ! + if (ctheta_ig(1,k)<0) then + A_ig(1) = 0.0 + B_ig(1) = oneoverdt - ctheta_ig(1, k)/dtheta + cg_ig(k)/ds(1, k) + DoverE_ig(k) + C_ig(1) = ctheta_ig(2, k)/dtheta + else + A_ig(1)=0.0 + B_ig(1)=1.0/dt + cg_ig(k)/ds(1, k) + DoverE_ig(k) + C_ig(1)=0.0 + endif + ! + if (ctheta_ig(ntheta, k)>0) then + A_ig(ntheta) = -ctheta_ig(ntheta - 1, k)/dtheta + B_ig(ntheta) = oneoverdt + ctheta_ig(ntheta, k)/dtheta + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) + C_ig(ntheta) = 0.0 + else + A_ig(ntheta) = 0.0 + B_ig(ntheta) = oneoverdt + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) + C_ig(ntheta) = 0.0 + endif + ! + ! Solve tridiagonal system per point + ! + call solve_tridiag(A_ig, B_ig, C_ig, R_ig, ee_ig(:,k), ntheta) + ee_ig(:, k) = max(ee_ig(:, k), 0.0) + ! + else + ! + ee_ig(:, k) = 0.0 + ! + endif + ! + endif + ! + else + ! + ee(:, k) = 0.0 + if (wind) then + aa(:,k) = 0.0 + endif + ee_ig(:, k) = 0.0 + ! + endif + ! + endif + ! + if (neumannconnected(k)/=0) then + kn = neumannconnected(k) + sinhkh(kn) = sinhkh(k) + kwav(kn) = kwav(k) + Hmx(kn) = Hmx(k) + ee(:, kn) = ee(:, k) + ee_ig(:, kn) = ee_ig(:, k) ! TL: Added Neumann option for IG + ctheta(:, kn) = ctheta(:, k) + cg(kn) = cg(k) + if (wind) then + sig(kn) = sig(k) + Tp(kn) = 2.0*pi/sig(k) + WsorE(:,kn) = WsorE(:,k) + WsorA(:,kn) = WsorA(:,k) + aa(:,kn) = aa(:,k) + endif + Df(kn) = Df(k) + Dw(kn) = Dw(k) + endif + ! + enddo + ! + if (sweep==4) then + ! + ! Check convergence after all 4 sweeps + ! + do k = 1, no_nodes + ! + dee = ee(:, k) - eeold(:, k) + diff(k) = maxval(abs(dee)) + ! + if (diff(k)/eemax 0.0 .and. gam < beta7) then !deep water + ! + alphaig = exp(-beta3 * beta ** beta4) * ((beta5 - gam) * beta6 + (beta7 - gam) * (beta1 / beta ** beta2)) + ! + elseif (gam >= beta7) then ! shallow water - for gam>0.7 the fit automatically goes to 0 + ! + alphaig = exp(-beta3 * beta ** beta4) * (max(beta5 - gam, 0.0)) * beta6 + ! + else ! for safety, but negative gamma should not occur + ! + alphaig = 0.0 + ! + endif + ! + endif + ! + ! Limit alphaig between [0, 1] to prevent large overshoots in case of low gamma and very small beta + ! + alphaig = max(alphaig, 0.0) + alphaig = min(alphaig, 1.0) + ! + end subroutine estimate_shoaling_parameter_alphaig + + subroutine hpsort_eps_epw (n, ra, ind, eps) + !--------------------------------------------------------------------- + ! sort an array ra(1:n) into ascending order using heapsort algorithm, + ! and considering two elements being equal if their values differ + ! for less than "eps". + ! n is input, ra is replaced on output by its sorted rearrangement. + ! create an index table (ind) by making an exchange in the index array + ! whenever an exchange is made on the sorted data array (ra). + ! in case of equal values in the data array (ra) the values in the + ! index array (ind) are used to order the entries. + ! if on input ind(1) = 0 then indices are initialized in the routine, + ! if on input ind(1) != 0 then indices are assumed to have been + ! initialized before entering the routine and these + ! indices are carried around during the sorting process + ! + ! no work space needed ! + ! free us from machine-dependent sorting-routines ! + ! + ! adapted from Numerical Recipes pg. 329 (new edition) + ! + ! Copyright (C) 2010-2016 Samuel Ponce', Roxana Margine, Carla Verdi, Feliciano Giustino + ! Copyright (C) 2007-2009 Jesse Noffsinger, Brad Malone, Feliciano Giustino + ! + ! This file is distributed under the terms of the GNU General Public + ! License. See the file `LICENSE' in the root directory of the + ! present distribution, or http://www.gnu.org/copyleft.gpl.txt . + ! + ! Adapted from flib/hpsort_eps + !--------------------------------------------------------------------- + implicit none + !-input/output variables + integer, intent(in) :: n + real*4, intent(in) :: eps + integer :: ind (n) + real*4 :: ra (n) + !-local variables + integer :: i, ir, j, l, iind + real*4 :: rra + ! + ! initialize index array + IF (ind (1) .eq.0) then + DO i = 1, n + ind (i) = i + ENDDO + ENDIF + ! nothing to order + IF (n.lt.2) return + ! initialize indices for hiring and retirement-promotion phase + l = n / 2 + 1 + + ir = n + + sorting: do + + ! still in hiring phase + IF ( l .gt. 1 ) then + l = l - 1 + rra = ra (l) + iind = ind (l) + ! in retirement-promotion phase. + ELSE + ! clear a space at the end of the array + rra = ra (ir) + ! + iind = ind (ir) + ! retire the top of the heap into it + ra (ir) = ra (1) + ! + ind (ir) = ind (1) + ! decrease the size of the corporation + ir = ir - 1 + ! done with the last promotion + IF ( ir .eq. 1 ) then + ! the least competent worker at all ! + ra (1) = rra + ! + ind (1) = iind + exit sorting + ENDIF + ENDIF + ! wheter in hiring or promotion phase, we + i = l + ! set up to place rra in its proper level + j = l + l + ! + DO while ( j .le. ir ) + IF ( j .lt. ir ) then + ! compare to better underling + IF ( hslt( ra (j), ra (j + 1) ) ) then + j = j + 1 + !else if ( .not. hslt( ra (j+1), ra (j) ) ) then + ! this means ra(j) == ra(j+1) within tolerance + ! if (ind (j) .lt.ind (j + 1) ) j = j + 1 + ENDIF + ENDIF + ! demote rra + IF ( hslt( rra, ra (j) ) ) then + ra (i) = ra (j) + ind (i) = ind (j) + i = j + j = j + j + !else if ( .not. hslt ( ra(j) , rra ) ) then + !this means rra == ra(j) within tolerance + ! demote rra + ! if (iind.lt.ind (j) ) then + ! ra (i) = ra (j) + ! ind (i) = ind (j) + ! i = j + ! j = j + j + ! else + ! set j to terminate do-while loop + ! j = ir + 1 + ! endif + ! this is the right place for rra + ELSE + ! set j to terminate do-while loop + j = ir + 1 + ENDIF + ENDDO + ra (i) = rra + ind (i) = iind + + END DO sorting + + contains + + ! internal function + ! compare two real number and return the result + + logical function hslt( a, b ) + real*4 :: a, b + IF( abs(a-b) < eps ) then + hslt = .false. + ELSE + hslt = ( a < b ) + end if + end function hslt + + ! + end subroutine hpsort_eps_epw + + subroutine timer(t) + real*4,intent(out) :: t + integer*4 :: count,count_rate,count_max + call system_clock (count,count_rate,count_max) + t = real(count)/count_rate + end subroutine timer + + subroutine vegatt(sigm, no_nodes, kwav, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, depth, rho, g, H, Dveg) + use snapwave_domain + + implicit none + + ! declare variables + real*4, intent(in) :: sigm ! wave frequency (per cell) + integer, intent(in) :: no_nodes ! number of unstructured grid nodes + integer, intent(in) :: no_secveg + real*4, dimension(no_secveg), intent(in) :: veg_ah ! Height of vertical sections used in vegetation schematization [m wrt zb_ini (zb0)] (per cell) + real*4, dimension(no_secveg), intent(in) :: veg_bstems ! Width/diameter of individual vegetation stems [m] (per cell) + real*4, dimension(no_secveg), intent(in) :: veg_Nstems ! Number of vegetation stems per unit horizontal area [m-2] (per cell) + real*4, dimension(no_secveg), intent(in) :: veg_Cd ! Bulk drag coefficient [-] (per cell) + real*4, intent(in) :: depth ! bed level, water depth (per cell) + real*4, intent(in) :: rho + real*4, intent(in) :: g + real*4, intent(in) :: H ! wave height (per cell) + real*4 :: Cdterm + integer :: m + real*4, intent(in) :: kwav ! wave number (per cell) + real*4, intent(out) :: Dveg ! dissipation by vegetation (per cell) + + ! Set dissipation in vegetation to zero everywhere for a start + Dveg = 0.d0 + + ! XB contains a check for porous in-canopy model -> not relevant for Snapwave? + ! ... + + ! First compute drag coefficient (if not user-defined) + + if (no_secveg > 0) then ! only in case vegetation is present + do m=1,no_secveg ! for each vertical vegetation section + if (veg_Cd(m) < 0.d0) then ! If Cd is not user specified: call subroutine of M. Bendoni (see below) + write(logstr,*)'Cd is not user specified: using subroutine bulkdragcoeff to compute Cd' + call write_log(logstr, 0) + ! + call bulkdragcoeff(veg_ah(m),m,Cdterm,no_nodes,no_secveg,depth,H,kwav,veg_bstems(m),sigm) ! bulkdragcoeff(ahveg(k,m)+zb0(k)-zb(k),m,k,Cdterm) <- no bed level change implemented in Snapwave + !write(*,*)'Cd is not user specified: putting default value of 0.7' + !veg_Cd(k,m) = 0.7 + endif + enddo + endif + + + ! Attenuation by vegetation is computed in wave action balance (swvegatt) and the momentum balance (momeqveg); + ! 1) Short wave dissipation by vegetation + call swvegatt(sigm, no_nodes, kwav, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, depth, rho, g, H, Dveg) + ! + ! 2) Mom.Eq.: Long wave dissipation, mean flow dissipation, nonlinear short wave effects, effect of emerged vegetation -> not implemented + ! call momeqveg(zb0) !< not relevant in Snapwave because no long waves and currents computed + ! + end subroutine vegatt + + subroutine swvegatt(sigm, no_nodes, kwav, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, depth, rho, g, H, Dveg)! Short wave dissipation by vegetation + !use snapwave_data + !use snapwave_domain + + implicit none + + ! declare variables + integer, intent(in) :: no_nodes ! number of unstructured grid nodes + integer, intent(in) :: no_secveg + real*4,intent(in) :: sigm ! + real*4, dimension(no_secveg), intent(in) :: veg_ah ! Height of vertical sections used in vegetation schematization [m wrt zb_ini (zb0)] + real*4, dimension(no_secveg), intent(in) :: veg_bstems ! Width/diameter of individual vegetation stems [m] + real*4, dimension(no_secveg), intent(in) :: veg_Nstems ! Number of vegetation stems per unit horizontal area [m-2] + real*4, dimension(no_secveg), intent(in) :: veg_Cd ! Bulk drag coefficient [-] + real*4, intent(in) :: depth ! bed level, water depth + real*4, intent(in) :: rho + real*4, intent(in) :: g + real*4, intent(in) :: H ! wave height + + ! local variables + real*4 :: pi ! 3.14159 + integer :: k,m ! indices of actual x,y point + + real*4 :: aht,hterm,htermold,Dvgt,ahtold + real*4 :: Dvg,kmr!,kwav + real*4, intent(in) :: kwav!,k + + real*4, intent(out) :: Dveg + + pi = 4.d0*atan(1.d0) + kmr = min(max(kwav, 0.01d0), 100.d0) + + ! Set dissipation in vegetation to zero everywhere for a start + Dvg = 0.d0 + Dvgt = 0.d0 + htermold = 0.d0 + ahtold = 0.d0 + if (no_secveg>0) then ! only if vegetation is present + do m=1,no_secveg + + ! Determine height of vegetation section (restricted to current bed level) + !aht = veg(ind)%ah(m)+ahtold !+s%zb0(k,j)-s%zb(k,j)!(max(veg(ind)%zv(m)+s%zb0(k,j),s%zb(k,j))) + aht = veg_ah(m)+ahtold + + ! restrict vegetation height to local water depth + aht = min(aht, depth) + + ! compute hterm based on ah + hterm = (sinh(kmr*aht)**3+3*sinh(kmr*aht))/(3.d0*kmr*cosh(kmr* depth)**3) ! + + ! compute dissipation based on aht and correct for lower elevated dissipation layers (following Suzuki et al. 2012) + Dvgt = 0.5d0/sqrt(pi)*rho*veg_Cd(m)*veg_bstems(m)*veg_Nstems(m)*(0.5d0*kmr*g/sigm)**3*(hterm-htermold)*H**3 + + ! save hterm to htermold to correct possibly in next vegetation section + htermold = hterm + ahtold = aht + + ! add dissipation current vegetation section + Dvg = Dvg + Dvgt + enddo + endif + Dveg = Dvg + end subroutine swvegatt + + subroutine bulkdragcoeff(ahh, m, Cdterm, no_nodes, no_secveg, depth, H, kwav, veg_bstems, sigm)!(ahh,m,i,Cdterm) + ! Michele Bendoni: subroutine to calculate bulk drag coefficient for short wave + ! energy dissipation based on the Keulegan-Carpenter number (adapted from XBeach) + ! Ozeren et al. (2013) or Mendez and Losada (2004) + ! + implicit none + ! + real*4, intent(out) :: Cdterm + real*4, intent(in) :: ahh ! [m] plant (total) height + integer, intent(in) :: m + integer, intent(in) :: no_nodes ! number of unstructured grid nodes + integer, intent(in) :: no_secveg + real*4, intent(in) :: depth ! bed level, water depth + real*4, intent(in) :: H ! wave height + real*4, intent(in) :: kwav ! wave number + real*4, intent(in) :: veg_bstems ! Width/diameter of individual vegetation stems [m] + real*4, intent(in) :: sigm ! [rad/s] mean frequency + ! + ! Local variables + real*4 :: pi ! 3.14159 + real*4 :: alfav ! [-] ratio between plant height and water depth + real*4 :: um ! [m/s] typical velocity acting on the plant + real*4 :: Tp ! [s] reference wave period + real*4 :: KC ! [-] Keulegan-Carpenter number + real*4 :: Q ! [-] modified Keulegan-Carpenter number + integer :: myflag ! 1 => Ozeren et al. (2013); 2 => Mendez and Losada (2004) + ! + myflag = 2 + pi = 4.d0*atan(1.d0) + ! + ! Representative wave period + Tp = 2*pi/sigm + ! + ! Coefficient alfa + if (ahh>=depth) then + alfav = 1.d0 + else + alfav = ahh/depth + endif + ! + ! Representative orbital velocity + ! (Could we also use urms here?) + um = 0.5d0*H*sigm*cosh(kwav*alfav*depth)/sinh(kwav*depth) + ! + ! Keulegan-Carpenter number + KC = um*Tp/veg_bstems + ! + ! Bulk drag coefficient + if (myflag == 1) then + ! + ! Approach from Ozeren et al. (2013), eq? + ! + if (KC>=10.d0) then + Cdterm = 0.036d0+50.d0/(KC**0.926d0) + else + Cdterm = 0.036d0+50.d0/(10.d0**0.926d0) + endif + elseif (myflag == 2) then + ! + ! Approach from Mendez and Losada (2004), eq. 40 + ! Only applicable for Laminaria Hyperborea (kelp)??? + ! + Q = KC/(alfav**0.76d0) + if (Q>=7) then + Cdterm = exp(-0.0138*Q)/(Q**0.3d0) + else + Cdterm = exp(-0.0138*7)/(7**0.3d0) + endif + endif + ! + end subroutine bulkdragcoeff + +end module snapwave_solver From 3e6e51c2574fd90d9df8c7eeee78486d2a0b449c Mon Sep 17 00:00:00 2001 From: Maarten van Ormondt Date: Sat, 14 Mar 2026 02:08:04 +0100 Subject: [PATCH 034/118] minor stuff --- source/src/snapwave/snapwave_solver.f90 | 28 ++++++++----------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index f8ba46dfd..bda3c9724 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -505,9 +505,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! if (neumannconnected(k) /= 0) then ! - ! Flip indices around compared to orginal implementation - ! - ! Do we really need all of these? + ! Do we really need all of these? Hmx? ! kn = neumannconnected(k) ! Index of internal point ! @@ -764,14 +762,10 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! endif ! wind ! - if (gammax < 998.0) then - ! - ! Limit incident energy with gammax - ! - depthlimfac = max(1.0, (sqrt(sum(ee(:, k)) * dtheta / rhog8) / (gammax * depth(k)) )**2.0) - ee(:,k) = ee(:,k) / depthlimfac - ! - endif + ! Limit incident energy with gammax + ! + depthlimfac = max(1.0, (sqrt(sum(ee(:, k)) * dtheta / rhog8) / (gammax * depth(k)) )**2.0) + ee(:,k) = ee(:,k) / depthlimfac ! ! IG ! @@ -863,14 +857,10 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! endif ! - if (gammax < 998.0) then - ! - ! Limit IG energy with gammax - ! - depthlimfac = max(1.0, (sqrt(sum(ee_ig(:, k)) * dtheta / rhog8) / (gammax * depth(k)) )**2.0) - ee_ig(:, k) = ee_ig(:,k) / depthlimfac - ! - endif + ! Limit IG energy with gammax + ! + depthlimfac = max(1.0, (sqrt(sum(ee_ig(:, k)) * dtheta / rhog8) / (gammax * depth(k)) )**2.0) + ee_ig(:, k) = ee_ig(:,k) / depthlimfac ! endif ! From 7cd84e36b0a3f32c6ec11193cc0052fd4c5dd945 Mon Sep 17 00:00:00 2001 From: Maarten van Ormondt Date: Mon, 16 Mar 2026 09:46:21 +0100 Subject: [PATCH 035/118] deleted snapwave_solver.f90.ori --- source/src/snapwave/snapwave_solver.f90.ori | 1549 ------------------- 1 file changed, 1549 deletions(-) delete mode 100644 source/src/snapwave/snapwave_solver.f90.ori diff --git a/source/src/snapwave/snapwave_solver.f90.ori b/source/src/snapwave/snapwave_solver.f90.ori deleted file mode 100644 index 7260894b0..000000000 --- a/source/src/snapwave/snapwave_solver.f90.ori +++ /dev/null @@ -1,1549 +0,0 @@ -module snapwave_solver - - use sfincs_log - - implicit none - -contains - - subroutine compute_wave_field() - ! - use snapwave_data - ! - implicit none - ! - !real*8, intent(in) :: time > TL: not used in this implementation - ! - real*4 :: tpb - ! - real*4, parameter :: waveps = 1e-5 - !real*4, dimension(:), allocatable :: sig - real*4, dimension(:), allocatable :: sigm_ig - real*4, dimension(:), allocatable :: expon - ! - integer :: itheta - integer :: k - ! - !allocate(sig(no_nodes)) - allocate(sigm_ig(no_nodes)) - ! - g = 9.81 - pi = 4.*atan(1.) - ! - call timer(t0) - ! - if (.not.restart) then - ! - ! Set energies to 0.0; note that boundary values have been set in update_boundaries - ! - do k = 1, no_nodes - if (inner(k)) then - ee(:,k) = waveps - endif - enddo - ! - ee_ig = waveps - ! - restart=1 !TODO TL: CHECK > we need this turned on right now for IG... - ! - endif - ! - ! Initialize wave period - ! - do k = 1, no_nodes - if (inner(k)) then - Tp(k) = Tpini - endif - if (neumannconnected(k)>0) then - Tp(neumannconnected(k))=Tpini - endif - enddo - ! - ! Compute celerities and refraction speed - ! - Tp = max(tpmean_bwv,Tpini) ! to check voor windgroei - sig = 2.0*pi/Tp - Tp_ig = tpmean_bwv_ig! TL: now determined in snapwave_boundaries.f90 instead of Tinc2ig*Tp - sigm_ig = 2.0*pi/Tp_ig !TODO - TL: Question do we want Tp_ig now as contant, or also spatially varying like Tp ? - ! - expon = -(sig*sqrt(depth/g))**(2.5) - kwav = sig**2/g*(1.0-exp(expon))**(-0.4) - C = sig/kwav - nwav = 0.5+kwav*depth/sinh(min(2*kwav*depth,50.0)) - Cg = nwav*C - ! - if (igwaves) then - cg_ig = Cg - expon = -(sigm_ig*sqrt(depth/g))**(2.5) - kwav_ig = sig**2/g*(1.0-exp(expon))**(-0.4) - else - cg_ig = 0.0 - kwav_ig = 0.0 - endif - ! - do k = 1, no_nodes - sinhkh(k) = sinh(min(kwav(k)*depth(k), 50.0)) - Hmx(k) = gamma*depth(k) - enddo - if (igwaves) then - do k = 1, no_nodes - Hmx_ig(k) = 0.88/kwav_ig(k)*tanh(gamma_ig*kwav_ig(k)*depth(k)/0.88) ! Note - uses gamma_ig - enddo - else - Hmx_ig = 0.0 - endif - ! - do itheta = 1, ntheta - ctheta(itheta,:) = sig/sinh(min(2.0*kwav*depth, 50.0))*(dhdx*sin(theta(itheta)) - dhdy*cos(theta(itheta))) - enddo - ! - if (igwaves) then - do itheta = 1, ntheta - ctheta_ig(itheta,:) = sigm_ig/sinh(min(2.0*kwav_ig*depth, 50.0))*(dhdx*sin(theta(itheta)) - dhdy*cos(theta(itheta))) - enddo - else - ctheta_ig = 0.0 - endif - ! - ! Limit unrealistic refraction speed to 1/2 pi per wave period - ! - do k = 1, no_nodes - ctheta(:,k) = sign(1.0, ctheta(:,k))*min(abs(ctheta(:, k)), sig(k)/4) - enddo - ! - if (igwaves) then - do k=1, no_nodes - ctheta_ig(:,k) = sign(1.0, ctheta_ig(:,k))*min(abs(ctheta_ig(:, k)), sigm_ig(k)/4.0) - enddo - endif - ! - ! Solve the directional wave energy balance on an unstructured grid - ! - call timer(t2) - ! - call solve_energy_balance2Dstat (x,y,dhdx, dhdy, no_nodes,inner, & - w, ds, prev, & - neumannconnected, & - theta,ntheta,thetamean, & - depth,kwav,cg,ctheta,fw, & - Tp,Tp_ig,dt,rho,alpha,gamma, gammax, & - wind, & - H,Dw,F,Df,thetam,sinhkh,& - Hmx, ee, windspreadfac, u10, niter, crit, & - hmin, baldock_ratio, baldock_ratio_ig, & - aa, sig, jadcgdx, sigmin, sigmax,& - c_dispT, WsorE, WsorA, SwE, SwA, Tpini, & - igwaves,kwav_ig, cg_ig,H_ig,ctheta_ig,Hmx_ig, ee_ig,fw_ig, & - beta, srcig, alphaig, Dw_ig, Df_ig, & - vegetation, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, Dveg, & - zb, nwav, ig_opt, alpha_ig, gamma_ig, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) - ! - call timer(t3) - ! - Fx = F*cos(thetam) - Fy = F*sin(thetam) - ! - end subroutine - - - subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & - w, ds, prev, & - neumannconnected, & - theta,ntheta,thetamean, & - depth,kwav,cg,ctheta,fw, & - Tp,T_ig,dt,rho,alfa,gamma, gammax, & - wind, & - H,Dw,F,Df,thetam,sinhkh,& - Hmx, ee, windspreadfac, u10, niter, crit, & - hmin, baldock_ratio, baldock_ratio_ig, & - aa, sig, jadcgdx, sigmin, sigmax,& - c_dispT, WsorE, WsorA, SwE, SwA, Tpini, & - igwaves,kwav_ig, cg_ig,H_ig,ctheta_ig,Hmx_ig, ee_ig,fw_ig, & - betamean, srcig, alphaig, Dw_ig, Df_ig, & - vegetation, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, Dveg, & - zb, nwav, ig_opt, alfa_ig, gamma_ig, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) - ! - use snapwave_windsource - !use snapwave_ncoutput ! TL: removed, we don't use this in SF+SW - ! - implicit none - ! - ! In/output variables and arrays - ! - real*8, dimension(no_nodes),intent(in) :: x,y ! x,y coordinates of grid - real*4, dimension(no_nodes),intent(in) :: dhdx, dhdy ! bed level gradients in x and y direction - integer, intent(in) :: no_nodes,ntheta ! number of grid points, number of directions - real*4, dimension(2,ntheta,no_nodes),intent(in) :: w ! weights of upwind grid points, 2 per grid point and per wave direction - integer, dimension(2,ntheta,no_nodes),intent(in) :: prev ! two upwind grid points per grid point and wave direction - real*4, dimension(ntheta,no_nodes), intent(in) :: ds ! distance to interpolated upwind point, per grid point and direction - real*4, intent(in) :: thetamean ! mean offshore wave direction (rad) - real*4, dimension(ntheta), intent(in) :: theta ! distribution of wave angles and offshore wave energy density - logical, dimension(no_nodes), intent(inout) :: inner ! mask of inner grid points (not on boundary) - logical, intent(in) :: wind ! logical wind on/off - logical, intent(in) :: igwaves ! logical IG waves on/off - logical, intent(in) :: iterative_srcig ! option whether IG source/sink term should be calculated implicitly (iterative_srcig = 1), or just a priori based on effectively incident wave energy from previous timestep only (iterative_srcig=0, explicitly, bit faster) - integer, dimension(no_nodes),intent(in) :: neumannconnected ! number of neumann boundary point if connected to inner point - real*4, dimension(no_nodes), intent(in) :: depth ! water depth - real*4, dimension(no_nodes), intent(in) :: zb ! actual bed level - real*4, dimension(no_nodes), intent(inout) :: kwav ! wave number - real*4, dimension(no_nodes), intent(in) :: kwav_ig ! wave number - real*4, dimension(no_nodes), intent(inout) :: cg ! group velocity - real*4, dimension(ntheta,no_nodes), intent(inout):: ctheta ! refractioon speed - real*4, dimension(no_nodes), intent(in) :: cg_ig ! group velocity - real*4, dimension(no_nodes), intent(in) :: nwav ! wave number n - real*4, dimension(ntheta,no_nodes), intent(inout):: ee ! - real*4, dimension(ntheta,no_nodes), intent(inout):: ee_ig ! - real*4, dimension(ntheta,no_nodes), intent(in) :: ctheta_ig ! refractioon speed - real*4, dimension(no_nodes), intent(in) :: fw ! wave friction factor - real*4, dimension(no_nodes), intent(in) :: fw_ig ! wave friction factor - real*4, dimension(no_nodes), intent(out) :: betamean ! Mean local bed slope parameter - real*4, dimension(no_nodes), intent(out) :: srcig ! Directionally averaged incident wave sink/infragravity source term - real*4, dimension(no_nodes), intent(out) :: alphaig ! Mean IG shoaling parameter alpha - real*4, intent(in) :: dt ! time step (s) - real*4, intent(in) :: rho ! water density - real*4, intent(in) :: alfa,gamma, gammax ! coefficients in Baldock wave breaking dissipation - real*4, intent(in) :: baldock_ratio ! option controlling from what depth wave breaking should take place: (Hk>baldock_ratio*Hmx(k)), default baldock_ratio=0.2 - real*4, intent(in) :: baldock_ratio_ig ! option controlling from what depth wave breaking should take place for IG waves: (Hk_ig>baldock_ratio_ig*Hmx_ig(k)), default baldock_ratio_ig=0.2 - real*4, dimension(no_nodes), intent(inout) :: H ! wave height - TODO - TL - CHECK > inout needed to have updated 'H' for determining srcig - real*4, dimension(no_nodes), intent(out) :: H_ig ! wave height - real*4, dimension(no_nodes), intent(out) :: Dw ! wave breaking dissipation - real*4, dimension(no_nodes), intent(out) :: Dw_ig ! wave breaking dissipation IG - real*4, dimension(no_nodes), intent(out) :: F ! wave force Dw/C/rho/h - real*4, dimension(no_nodes), intent(out) :: Df ! wave friction dissipation - real*4, dimension(no_nodes), intent(out) :: Df_ig ! wave friction dissipation IG - real*4, dimension(no_nodes), intent(out) :: thetam ! mean wave direction - real*4, dimension(no_nodes), intent(inout) :: sinhkh ! sinh(k*depth) - real*4, dimension(no_nodes), intent(inout) :: Hmx ! Hmax - real*4, dimension(no_nodes), intent(inout) :: Tp ! Peak wave period - real*4, dimension(no_nodes), intent(in) :: T_ig ! IG wave period - real*4, dimension(no_nodes), intent(in) :: Hmx_ig ! Hmax - real*4, dimension(no_nodes), intent(in) :: u10 ! wind speed and direction - integer, intent(in) :: niter ! max number of iterations - real*4, intent(in) :: crit ! relative accuracy for stopping criterion - integer :: ig_opt ! option of IG wave settings (1 = default = conservative shoaling based dSxx and Baldock breaking) - ! - ! wind source vars - ! - integer, intent(in) :: jadcgdx ! logical yes/no ! logical yes/no - real*4, intent(in) :: sigmin, sigmax, c_dispT - real*4, dimension(ntheta, no_nodes), intent(in) :: windspreadfac !< [-] distribution array for wind input - real*4, dimension(ntheta,no_nodes), intent(inout) :: aa - real*4, dimension(ntheta,no_nodes), intent(out) :: WsorE, WsorA - real*4, dimension(no_nodes), intent(out) :: SwE, SwA - real*4, dimension(no_nodes), intent(inout) :: sig - real*4, intent(in) :: Tpini - ! - ! vegetation vars - ! - logical, intent(in) :: vegetation ! logical yes/no - real*4, dimension(no_nodes), intent(out) :: Dveg ! dissipation by vegetation: N.B. spatial field! - integer, intent(in) :: no_secveg - real*4, dimension(no_nodes,no_secveg), intent(in) :: veg_ah ! Height of vertical sections used in vegetation schematization [m wrt zb_ini (zb0)] - real*4, dimension(no_nodes,no_secveg), intent(in) :: veg_bstems ! Width/diameter of individual vegetation stems [m] - real*4, dimension(no_nodes,no_secveg), intent(in) :: veg_Nstems ! Number of vegetation stems per unit horizontal area [m-2] - real*4, dimension(no_nodes,no_secveg), intent(in) :: veg_Cd ! Bulk drag coefficient [-] - real*4 :: Dvegk ! dissipation by vegetation: N.B. scalar value! - ! - ! - ! Local variables and arrays - ! - integer, dimension(:), allocatable :: ok ! mask for fully iterated points - real*4 :: eemax,dtheta ! maximum wave energy density, directional resolution - real*4 :: uorbi - integer :: sweep,iter ! sweep number, number of iterations - integer :: k,k1,k2,count,kn,itheta ! counters (k is grid index) - integer, dimension(:,:), allocatable :: indx ! index for grid sorted per sweep direction - real*4, dimension(:,:), allocatable :: eeold ! wave energy density, energy density previous iteration - real*4, dimension(:), allocatable :: Eold ! mean wave energy, previous iteration - real*4, dimension(:,:), allocatable :: srcig_local ! Energy source/sink term because of IG wave energy transfer from incident waves - real*4, dimension(:,:), allocatable :: beta_local ! Local bed slope based on bed level per direction - real*4, dimension(:,:), allocatable :: alphaig_local ! Local infragravity wave shoaling parameter alpha - real*4, dimension(:,:), allocatable :: depthprev ! water depth at upwind intersection point per direction - real*4, dimension(:), allocatable :: dee ! difference with energy previous iteration - real*4, dimension(:), allocatable :: eeprev, cgprev ! energy density and group velocity at upwind intersection point - real*4, dimension(:), allocatable :: eeprev_ig, cgprev_ig ! energy density and group velocity at upwind intersection point - real*4, dimension(:), allocatable :: A,B,C,R ! coefficients in the tridiagonal matrix solved per point - real*4, dimension(:), allocatable :: B_aa,R_aa,aaprev ! coefficients in the tridiagonal matrix solved per point - real*4, dimension(:), allocatable :: A_ig,B_ig,C_ig,R_ig ! coefficients in the tridiagonal matrix solved per point - real*4, dimension(:), allocatable :: DoverE ! ratio of mean wave dissipation over mean wave energy - real*4, dimension(:), allocatable :: DoverA ! ratio of mean wave dissipation over mean wave energy - real*4, dimension(:), allocatable :: DoverE_ig ! ratio of mean wave dissipation over mean wave energy - real*4, dimension(:), allocatable :: E ! mean wave energy - real*4, dimension(:), allocatable :: E_ig ! mean wave energy - real*4, dimension(:), allocatable :: diff ! maximum difference of wave energy relative to previous iteration - real*4, dimension(:), allocatable :: ra ! coordinate in sweep direction - !real*4, dimension(:), allocatable :: sig - real*4, dimension(:), allocatable :: sigm_ig - integer, dimension(4) :: shift - real*4 :: pi = 4.*atan(1.0) - real*4 :: g=9.81 - real*4 :: hmin ! minimum water depth! TL: make user changeable also here according to 'snapwave_hmin' in sfincs.inp - real*4 :: fac=1.0 ! underrelaxation factor for DoverA - real*4 :: oneoverdt - real*4 :: oneover2dtheta - real*4 :: rhog8 - real*4 :: Dfk - real*4 :: Dwk - real*4 :: Ek - real*4 :: Hk - real*4 :: percok - real*4 :: error - real*4 :: Dfk_ig - real*4 :: Dwk_ig - real*4 :: Ek_ig - real*4 :: Hk_ig - real*4 :: alfa_ig,gamma_ig ! coefficients in Baldock wave breaking dissipation model for IG waves - real*4 :: eeinc2ig ! ratio of incident wave energy as first estimate of IG wave energy at boundary - real*4 :: Tinc2ig ! ratio compared to period Tinc to estimate Tig - real*4 :: alphaigfac ! Multiplication factor for IG shoaling source/sink term, default = 1.0 - real*4 :: shinc2ig ! Ratio of how much of the calculated IG wave source term, is subtracted from the incident wave energy (0-1, 0=default) - integer, save :: callno=1 - ! - real*4, dimension(ntheta) :: sinth,costh ! distribution of wave angles and offshore wave energy density - ! - !local wind source vars - ! - real*4 :: Ak - real*4 :: DwT - real*4 :: DwAk - real*4 :: ndissip ! - real*4 :: depthlimfac=1.0 - real*4 :: waveps=0.0001 - ! - ! Allocate local arrays - ! - waveps = 0.0001 - allocate(ok(no_nodes)); ok=0 - allocate(indx(no_nodes,4)); indx=0 - allocate(eeold(ntheta,no_nodes)); eeold=0.0 - allocate(dee(ntheta)); dee=0.0 - allocate(eeprev(ntheta)); eeprev=0.0 - allocate(cgprev(ntheta)); cgprev=0.0 - allocate(A(ntheta)); A=0.0 - allocate(B(ntheta)); B=0.0 - allocate(C(ntheta)); C=0.0 - allocate(R(ntheta)); R=0.0 - allocate(DoverE(no_nodes)); DoverE=0.0 - allocate(E(no_nodes)); E=waveps - allocate(Eold(no_nodes)); Eold=0.0 - ! - if (igwaves) then - allocate(A_ig(ntheta)); A_ig=0.0 - allocate(B_ig(ntheta)); B_ig=0.0 - allocate(C_ig(ntheta)); C_ig=0.0 - allocate(R_ig(ntheta)); R_ig=0.0 - allocate(eeprev_ig(ntheta)); eeprev_ig=0.0 - allocate(cgprev_ig(ntheta)); cgprev_ig=0.0 - allocate(DoverE_ig(no_nodes)); DoverE_ig=0.0 - allocate(E_ig(no_nodes)); E_ig=waveps - !allocate(T_ig(no_nodes)); T_ig=0.0 - allocate(sigm_ig(no_nodes)); sigm_ig=0.0 - allocate(depthprev(ntheta,no_nodes)); depthprev=0.0 - allocate(beta_local(ntheta,no_nodes)); beta_local=0.0 - allocate(alphaig_local(ntheta,no_nodes)); alphaig_local=0.0 - endif - ! - if (wind) then - allocate(B_aa(ntheta)); B_aa=0.0 - allocate(R_aa(ntheta)); R_aa=0.0 - allocate(DoverA(no_nodes)); DoverA=0.0 - allocate(aaprev(ntheta)); aaprev=0.0 - endif - ! - allocate(diff(no_nodes)); diff=0.0 - allocate(ra(no_nodes)); ra=0.0 - allocate(srcig_local(ntheta,no_nodes)); srcig_local = 0.0 - ! - do itheta = 1, ntheta - sinth(itheta) = sin(theta(itheta)) - costh(itheta) = cos(theta(itheta)) - enddo - ! - df = 0.0 - dw = 0.0 - F = 0.0 - ! - ok = 0 - indx = 0 - eemax = maxval(ee) - dtheta = theta(2) - theta(1) - if (dtheta<0.) dtheta = dtheta + 2.*pi - if (wind) then - sig = 2*pi/Tpini - else - sig = 2*pi/Tp - endif - oneoverdt = 1.0/dt - oneover2dtheta = 1.0/2.0/dtheta - rhog8 = 0.125*rho*g - thetam = 0.0 - !H = 0.0 ! TODO - TL: CHeck > needed for restart for IG > set to 0 now in snapwave_domain.f90 - Dveg = 0.0 - ! - if (igwaves) then - !T_ig = Tinc2ig*Tp - sigm_ig = 2*pi/T_ig - DoverE_ig = 0.0 - endif - ! - if (wind) then - DoverA = 0.0 - ndissip = 3.0 - WsorE = 0.0 - WsorA = 0.0 - Ak = waveps/sigmax - endif - ! - ! Sort coordinates in sweep directions - ! - shift = [0,1,-1,2] - do sweep = 1, 4 - ! - ra = x*cos(thetamean + 0.5*pi*shift(sweep)) + y*sin(thetamean + 0.5*pi*shift(sweep)) - call hpsort_eps_epw(no_nodes, ra , indx(:, sweep), 1.0e-6) - ! - enddo - ! - ! Set inner to false for all points at grid edge or adjacent to dry point - ! - do k=1,no_nodes - ! - do itheta = 1, ntheta - ! - k1 = prev(1, itheta, k) - k2 = prev(2, itheta, k) - ! - if (k1 * k2 == 0) then - ! - ! No upwind point (is this check not already done somewhere before?) - ! - inner(k) = .false. - ! - elseif ((k1==1 .and. k2==1)) then ! TL: for now still needed for a working IG solver - inner(k)=.false. - exit - !elseif (depth(k1) < hmin .or. depth(k2) < hmin .or. (k1 == 1 .and. k2 == 1)) then - ! - ! Do not change inner here! It should be static! In a next update of the wave fields, these points may be wet. - ! - !inner(k) = .false. - ! - !exit - ! - endif - enddo - enddo - ! - ! - ! 0-a) Set boundary and initial conditions - ! - do k = 1, no_nodes - ! - ! Boundary condition at sea side (uniform) - ! - if (.not.inner(k)) then - ! - ee(:,k)=max(ee(:,k),waveps) - E(k) = sum(ee(:, k))*dtheta - H(k) = sqrt(8*E(k)/rho/g) - thetam(k) = atan2(sum(ee(:, k)*sin(theta)), sum(ee(:, k)*cos(theta))) - ! - !ee_ig(:, k) = eeinc2ig*ee(:,k) !TODO TL: determined in snapwave_boundaries.f90 - ! - if (igwaves) then - E_ig(k) = sum(ee_ig(:, k))*dtheta - H_ig(k) = sqrt(8*E_ig(k)/rho/g) - endif - ! - if (wind) then - sig(k) = 2*pi/Tp(k) - !aa(:,k) = max(aa(:,k),waveps/sig(k)) - aa(:,k) = max(ee(:,k),waveps)/sig(k) - Ak = E(k)/sig(k) - endif - ! - endif - enddo - ! - ! 0-b) Determine IG source/sink term - ! - if (igwaves) then - ! - ! As defined in Leijnse, van Ormondt, van Dongeren, Aerts & Muis et al. 2024 - ! - ! Actual determining of source term: - ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) - ! - ! inout: alphaig_local, srcig_local - eeprev, eeprev_ig, cgprev, beta_local - ! in: the rest - ! - ! NOTE - This is based on the energy in the precious SnapWave timestep 'ee' and 'ee_ig', and waveheight 'H', which should therefore be made available. - ! - endif - ! - ! 0-c) Set initial condition at inner cells - ! - do k = 1, no_nodes - ! - if (inner(k)) then - ! - if (wind) then - ee(:,k) = waveps - sig(k) = 2*pi/Tpini - aa(:,k) = ee(:,k)/sig(k) - else - ee(:,k) = waveps - endif - ! - ! Make sure DoverE is filled based on previous ee - Ek = sum(ee(:, k))*dtheta - Hk = min(sqrt(Ek/rhog8), gamma*depth(k)) - Ek = rhog8*Hk**2 - if (.not. wind) then - uorbi = 0.5*sig(k)*Hk/sinhkh(k) - Dfk = 0.28*rho*fw(k)*uorbi**3 - call baldock(rho, g, alfa, gamma, depth(k), Hk, Tp(k), 1, Dwk, Hmx(k)) - DoverE(k) = (Dwk + Dfk)/max(Ek, 1.0e-6) - endif - ! - if (wind) then - call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) - uorbi = 0.5*sig(k)*Hk/sinhkh(k) - Dfk = 0.28*rho*fw(k)*uorbi**3 - call baldock(rho, g, alfa, gamma, depth(k), Hk, 2.0*pi/sig(k), 1, Dwk, Hmx(k)) - DoverE(k) = (Dwk + Dfk)/max(Ek, 1.0e-6) - ! - ! initial conditions are not equal to bc conditions - DwT = - c_dispT/(1.0 -ndissip)*(2.*pi)/sig(k)**2*cg(k)*kwav(k) * DoverE(k) - DwAk = 0.5/pi * (E(k)*DwT+2.0*pi*Ak*DoverE(k) ) - DoverA(k) = DwAk/max(Ak,1e-6) - endif - ! - endif - ! - enddo - ! - ! Start iteration - ! - do iter=1,niter - ! - sweep = mod(iter, 4) !TODO - TL: problem that we don't have option for sweep = 1 anymore? - ! - if (sweep==0) then - sweep = 4 - endif - ! - if (sweep==1) then - eeold = ee - do k = 1, no_nodes - Eold(k) = sum(eeold(:, k)) - enddo - ! - if (igwaves) then - ! - if (iterative_srcig) then - ! Update H(k) based on updated ee(:,k), as used in IG source term to determine alphaig - ! - do k = 1, no_nodes - ! - if (inner(k)) then - ! - H(k) = sqrt(8*sum(ee(:, k))*dtheta/rho/g) - ! - endif - enddo - ! - ! Actual determining of source term - every first sweep of iteration - ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) - ! - endif - ! - endif - ! - endif - ! - ! Loop over all points depending on sweep direction - ! - do count = 1, no_nodes - ! - k=indx(count, sweep) - ! - if (inner(k)) then - if (depth(k)>1.1*hmin) then - ! - if (ok(k) == 0) then - ! - ! Only perform computations on wet inner points that are not yet converged (ok) - ! - do itheta = 1, ntheta - ! - k1 = prev(1, itheta, k) - k2 = prev(2, itheta, k) - ! - eeprev(itheta) = w(1, itheta, k)*ee(itheta, k1) + w(2, itheta, k)*ee(itheta, k2) - cgprev(itheta) = w(1, itheta, k)*cg(k1) + w(2, itheta, k)*cg(k2) - ! - if (igwaves) then - eeprev_ig(itheta) = w(1, itheta, k)*ee_ig(itheta, k1) + w(2, itheta, k)*ee_ig(itheta, k2) - cgprev_ig(itheta) = w(1, itheta, k)*cg_ig(k1) + w(2, itheta, k)*cg_ig(k2) - endif - ! - if (wind) then - aaprev(itheta) = w(1, itheta, k)*aa(itheta, k1) + w(2, itheta, k)*aa(itheta, k2) - endif - ! - enddo - ! - Ek = sum(eeprev)*dtheta ! to check - ! - depthlimfac = max(1.0, (sqrt(Ek/rhog8)/(gammax*depth(k)))**2.0) - Hk = min(sqrt(Ek/rhog8), gamma*depth(k)) - Ek = Ek/depthlimfac - ! - if (wind) then - ! - Ak = sum(aaprev)*dtheta - ! - Ak = Ak/depthlimfac - ee(:,k) = ee(:,k) / depthlimfac - aa(:,k) = aa(:,k) / depthlimfac - sig(k) = Ek/Ak - sig(k) = max(sig(k),sigmin) - sig(k) = min(sig(k),sigmax) - Ak = Ek/sig(k) ! to avoid small T in windinput - if (wind) then - aaprev=min(aaprev,eeprev/sigmin) - aaprev=max(aaprev,eeprev/sigmax) - endif - ! - call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) - endif - ! - ! Fill DoverE - uorbi = 0.5*sig(k)*Hk/sinhkh(k) - Dfk = 0.28*rho*fw(k)*uorbi**3 - !if (Hk>0.) then ! - if (Hk>baldock_ratio*Hmx(k)) then - call baldock(rho, g, alfa, gamma, depth(k), Hk, 2*pi/sig(k) , 1, Dwk, Hmx(k)) - else - Dwk = 0. - endif - ! - if (vegetation) then - call vegatt(sig(k), no_nodes, kwav(k), no_secveg, veg_ah(k,:), veg_bstems(k,:), veg_Nstems(k,:), veg_Cd(k,:), depth(k), rho, g, Hk, Dvegk) - else - Dvegk = 0. - endif - ! - DoverE(k) = (Dwk + Dfk + Dvegk)/max(Ek, 1.0e-6) - ! - if (wind) then - ! - if (iter==1) then - call windinput(u10(k), rho, g, depth(k), ntheta, windspreadfac(:,k), Ek, Ak, cg(k), eeprev, aaprev, ds(:,k), WsorE(:,k), WsorA(:,k), jadcgdx) - else - call windinput(u10(k), rho, g, depth(k), ntheta, windspreadfac(:,k), Ek, Ak, cg(k), ee(:,k), aa(:,k), ds(:,k), WsorE(:,k), WsorA(:,k), jadcgdx) - endif - ! - DwT = - c_dispT/(1.0 -ndissip)*(2.0*pi)/sig(k)**2*cg(k)*kwav(k) * DoverE(k) - DwAk = 1/2.0/pi * (E(k)*DwT+2.0*pi*Ak*DoverE(k) ) - ! - if (iter==1) then - DoverA(k) = DwAk/max(Ak,1e-6) - else - DoverA(k) = (1.0-fac)*DoverA(k)+fac*DwAk/max(Ak,1.e-6) - endif - ! - call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) - ! - endif - ! - do itheta = 1, ntheta - ! - R(itheta) = oneoverdt*ee(itheta, k) + cgprev(itheta)*eeprev(itheta)/ds(itheta, k) - srcig_local(itheta, k) * shinc2ig - ! - enddo - ! - do itheta = 2, ntheta - 1 - ! - A(itheta) = -ctheta(itheta - 1, k)*oneover2dtheta - B(itheta) = oneoverdt + cg(k)/ds(itheta,k) + DoverE(k) - C(itheta) = ctheta(itheta + 1, k)*oneover2dtheta - ! - enddo - ! - A(1) = -ctheta(ntheta, k)*oneover2dtheta - B(1) = oneoverdt + cg(k)/ds(1,k) + DoverE(k) - C(1) = ctheta(2, k)*oneover2dtheta - ! - A(ntheta) = -ctheta(ntheta - 1, k)*oneover2dtheta - B(ntheta) = oneoverdt + cg(k)/ds(ntheta,k) + DoverE(k) - C(ntheta) = ctheta(1, k)*oneover2dtheta - ! - ! Solve tridiagonal system per point - ! - if (wind) then - do itheta = 2, ntheta - 1 - B_aa(itheta) = oneoverdt + cg(k)/ds(itheta,k) + DoverA(k) - R_aa(itheta) = (oneoverdt)*aa(itheta, k) + cgprev(itheta)*aaprev(itheta)/ds(itheta, k) - enddo - ! - if (ctheta(1,k)<0) then - B_aa(1) = oneoverdt - ctheta(1, k)/dtheta + cg(k)/ds(1, k) + DoverA(k) - R_aa(1) = (oneoverdt)*aa(1, k) + cgprev(1)*aaprev(1)/ds(1, k) - else - B_aa(1) = oneoverdt + cg(k)/ds(1, k) + DoverA(k) - R_aa(1) = (oneoverdt)*aa(1, k) + cgprev(1)*aaprev(1)/ds(1, k) - endif - ! - if (ctheta(ntheta, k)>0) then - B_aa(ntheta) = oneoverdt + ctheta(ntheta, k)/dtheta + cg(k)/ds(ntheta, k) + DoverA(k) - R_aa(ntheta) = (oneoverdt )*aa(ntheta,k) + cgprev(ntheta)*aaprev(ntheta)/ds(ntheta, k) - else - B_aa(ntheta) = oneoverdt + cg(k)/ds(ntheta, k) + DoverA(k) - R_aa(ntheta) = (oneoverdt)*aa(ntheta,k) + cgprev(ntheta)*aaprev(ntheta)/ds(ntheta, k) - endif - R(:) = R(:) + WsorE(:,k) - R_aa(:) = R_aa(:) + WsorA(:,k) - ! - call solve_tridiag(A, B, C, R, ee(:,k), ntheta) - call solve_tridiag(A,B_aa,C,R_aa,aa(:,k),ntheta) - ee(:, k) = max(ee(:, k), waveps) - aa(:,k) = max(aa(:,k),waveps/sigmax) - aa(:,k) = max(aa(:,k),waveps/sig(k)) - ! - Ek = sum(ee(:, k))*dtheta - Ak = sum(aa(:,k))*dtheta - ! - depthlimfac = max(1.0, (sqrt(Ek/rhog8)/(gammax*depth(k)))**2.0) - Hk = sqrt(Ek/rhog8/depthlimfac) - Ek = Ek/depthlimfac - Ak = Ak/depthlimfac - ee(:,k) = ee(:,k)/depthlimfac - aa(:,k) = aa(:,k)/depthlimfac - ! - sig(k) = Ek/Ak - sig(k) = max(sig(k),sigmin) - sig(k) = min(sig(k),sigmax) - call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) - if (sig(k)<0.1) then - a=1 - endif - else - ! - ! Solve tridiagonal system per point - ! - call solve_tridiag(A, B, C, R, ee(:,k), ntheta) - ee(:, k) = max(ee(:, k),waveps) - ! - endif !wind - ! - ! IG - ! - if (igwaves) then - Ek_ig = sum(eeprev_ig)*dtheta - !Hk_ig = sqrt(Ek_ig/rhog8) !org trunk - Hk_ig = min(sqrt(Ek_ig/rhog8), gamma_ig*depth(k)) !TL: Question - why not this one? - Ek_ig = rhog8*Hk_ig**2 - ! - ! Bottom friction Henderson and Bowen (2002) - D = 0.015*rhow*(9.81/depth(k))**1.5*(Hk/sqrt(8.0))*Hk_ig**2/8 - ! - Dfk_ig = fw_ig(k)*0.0361*(9.81/depth(k))**1.5*Hk*Ek_ig - ! - ! Dissipation of infragravity waves - ! - if (Hk_ig>baldock_ratio_ig*Hmx_ig(k)) then - call baldock(rho, g, alfa_ig, gamma_ig, depth(k), Hk_ig, T_ig(k), 1, Dwk_ig, Hmx_ig(k)) - else - Dwk_ig = 0. - endif - ! - DoverE_ig(k) = (Dwk_ig + Dfk_ig)/max(Ek_ig, 1.0e-6) ! org trunk - !DoverE_ig(k) = (1.0 - fac)*DoverE_ig(k) + fac*(Dwk_ig + Dfk_ig)/max(Ek_ig, 1.0e-6) ! TODO - TL CHECK - why not with relaxation anymore? - ! - do itheta = 1, ntheta - ! - R_ig(itheta) = oneoverdt*ee_ig(itheta, k) + cgprev_ig(itheta)*eeprev_ig(itheta)/ds(itheta, k) + srcig_local(itheta, k) !TL: new version - ! - enddo - ! - do itheta = 2, ntheta - 1 - ! - A_ig(itheta) = -ctheta_ig(itheta - 1, k)*oneover2dtheta - B_ig(itheta) = oneoverdt + cg_ig(k)/ds(itheta,k) + DoverE_ig(k) - C_ig(itheta) = ctheta_ig(itheta + 1, k)*oneover2dtheta - ! - enddo - ! - if (ctheta_ig(1,k)<0) then - A_ig(1) = 0.0 - B_ig(1) = oneoverdt - ctheta_ig(1, k)/dtheta + cg_ig(k)/ds(1, k) + DoverE_ig(k) - C_ig(1) = ctheta_ig(2, k)/dtheta - else - A_ig(1)=0.0 - B_ig(1)=1.0/dt + cg_ig(k)/ds(1, k) + DoverE_ig(k) - C_ig(1)=0.0 - endif - ! - if (ctheta_ig(ntheta, k)>0) then - A_ig(ntheta) = -ctheta_ig(ntheta - 1, k)/dtheta - B_ig(ntheta) = oneoverdt + ctheta_ig(ntheta, k)/dtheta + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) - C_ig(ntheta) = 0.0 - else - A_ig(ntheta) = 0.0 - B_ig(ntheta) = oneoverdt + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) - C_ig(ntheta) = 0.0 - endif - ! - ! Solve tridiagonal system per point - ! - call solve_tridiag(A_ig, B_ig, C_ig, R_ig, ee_ig(:,k), ntheta) - ee_ig(:, k) = max(ee_ig(:, k), 0.0) - ! - else - ! - ee_ig(:, k) = 0.0 - ! - endif - ! - endif - ! - else - ! - ee(:, k) = 0.0 - if (wind) then - aa(:,k) = 0.0 - endif - ee_ig(:, k) = 0.0 - ! - endif - ! - endif - ! - if (neumannconnected(k)/=0) then - kn = neumannconnected(k) - sinhkh(kn) = sinhkh(k) - kwav(kn) = kwav(k) - Hmx(kn) = Hmx(k) - ee(:, kn) = ee(:, k) - ee_ig(:, kn) = ee_ig(:, k) ! TL: Added Neumann option for IG - ctheta(:, kn) = ctheta(:, k) - cg(kn) = cg(k) - if (wind) then - sig(kn) = sig(k) - Tp(kn) = 2.0*pi/sig(k) - WsorE(:,kn) = WsorE(:,k) - WsorA(:,kn) = WsorA(:,k) - aa(:,kn) = aa(:,k) - endif - Df(kn) = Df(k) - Dw(kn) = Dw(k) - endif - ! - enddo - ! - if (sweep==4) then - ! - ! Check convergence after all 4 sweeps - ! - do k = 1, no_nodes - ! - dee = ee(:, k) - eeold(:, k) - diff(k) = maxval(abs(dee)) - ! - if (diff(k)/eemax 0.0 .and. gam < beta7) then !deep water - ! - alphaig = exp(-beta3 * beta ** beta4) * ((beta5 - gam) * beta6 + (beta7 - gam) * (beta1 / beta ** beta2)) - ! - elseif (gam >= beta7) then ! shallow water - for gam>0.7 the fit automatically goes to 0 - ! - alphaig = exp(-beta3 * beta ** beta4) * (max(beta5 - gam, 0.0)) * beta6 - ! - else ! for safety, but negative gamma should not occur - ! - alphaig = 0.0 - ! - endif - ! - endif - ! - ! Limit alphaig between [0, 1] to prevent large overshoots in case of low gamma and very small beta - ! - alphaig = max(alphaig, 0.0) - alphaig = min(alphaig, 1.0) - ! - end subroutine estimate_shoaling_parameter_alphaig - - subroutine hpsort_eps_epw (n, ra, ind, eps) - !--------------------------------------------------------------------- - ! sort an array ra(1:n) into ascending order using heapsort algorithm, - ! and considering two elements being equal if their values differ - ! for less than "eps". - ! n is input, ra is replaced on output by its sorted rearrangement. - ! create an index table (ind) by making an exchange in the index array - ! whenever an exchange is made on the sorted data array (ra). - ! in case of equal values in the data array (ra) the values in the - ! index array (ind) are used to order the entries. - ! if on input ind(1) = 0 then indices are initialized in the routine, - ! if on input ind(1) != 0 then indices are assumed to have been - ! initialized before entering the routine and these - ! indices are carried around during the sorting process - ! - ! no work space needed ! - ! free us from machine-dependent sorting-routines ! - ! - ! adapted from Numerical Recipes pg. 329 (new edition) - ! - ! Copyright (C) 2010-2016 Samuel Ponce', Roxana Margine, Carla Verdi, Feliciano Giustino - ! Copyright (C) 2007-2009 Jesse Noffsinger, Brad Malone, Feliciano Giustino - ! - ! This file is distributed under the terms of the GNU General Public - ! License. See the file `LICENSE' in the root directory of the - ! present distribution, or http://www.gnu.org/copyleft.gpl.txt . - ! - ! Adapted from flib/hpsort_eps - !--------------------------------------------------------------------- - implicit none - !-input/output variables - integer, intent(in) :: n - real*4, intent(in) :: eps - integer :: ind (n) - real*4 :: ra (n) - !-local variables - integer :: i, ir, j, l, iind - real*4 :: rra - ! - ! initialize index array - IF (ind (1) .eq.0) then - DO i = 1, n - ind (i) = i - ENDDO - ENDIF - ! nothing to order - IF (n.lt.2) return - ! initialize indices for hiring and retirement-promotion phase - l = n / 2 + 1 - - ir = n - - sorting: do - - ! still in hiring phase - IF ( l .gt. 1 ) then - l = l - 1 - rra = ra (l) - iind = ind (l) - ! in retirement-promotion phase. - ELSE - ! clear a space at the end of the array - rra = ra (ir) - ! - iind = ind (ir) - ! retire the top of the heap into it - ra (ir) = ra (1) - ! - ind (ir) = ind (1) - ! decrease the size of the corporation - ir = ir - 1 - ! done with the last promotion - IF ( ir .eq. 1 ) then - ! the least competent worker at all ! - ra (1) = rra - ! - ind (1) = iind - exit sorting - ENDIF - ENDIF - ! wheter in hiring or promotion phase, we - i = l - ! set up to place rra in its proper level - j = l + l - ! - DO while ( j .le. ir ) - IF ( j .lt. ir ) then - ! compare to better underling - IF ( hslt( ra (j), ra (j + 1) ) ) then - j = j + 1 - !else if ( .not. hslt( ra (j+1), ra (j) ) ) then - ! this means ra(j) == ra(j+1) within tolerance - ! if (ind (j) .lt.ind (j + 1) ) j = j + 1 - ENDIF - ENDIF - ! demote rra - IF ( hslt( rra, ra (j) ) ) then - ra (i) = ra (j) - ind (i) = ind (j) - i = j - j = j + j - !else if ( .not. hslt ( ra(j) , rra ) ) then - !this means rra == ra(j) within tolerance - ! demote rra - ! if (iind.lt.ind (j) ) then - ! ra (i) = ra (j) - ! ind (i) = ind (j) - ! i = j - ! j = j + j - ! else - ! set j to terminate do-while loop - ! j = ir + 1 - ! endif - ! this is the right place for rra - ELSE - ! set j to terminate do-while loop - j = ir + 1 - ENDIF - ENDDO - ra (i) = rra - ind (i) = iind - - END DO sorting - - contains - - ! internal function - ! compare two real number and return the result - - logical function hslt( a, b ) - real*4 :: a, b - IF( abs(a-b) < eps ) then - hslt = .false. - ELSE - hslt = ( a < b ) - end if - end function hslt - - ! - end subroutine hpsort_eps_epw - - subroutine timer(t) - real*4,intent(out) :: t - integer*4 :: count,count_rate,count_max - call system_clock (count,count_rate,count_max) - t = real(count)/count_rate - end subroutine timer - - subroutine vegatt(sigm, no_nodes, kwav, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, depth, rho, g, H, Dveg) - use snapwave_domain - - implicit none - - ! declare variables - real*4, intent(in) :: sigm ! wave frequency (per cell) - integer, intent(in) :: no_nodes ! number of unstructured grid nodes - integer, intent(in) :: no_secveg - real*4, dimension(no_secveg), intent(in) :: veg_ah ! Height of vertical sections used in vegetation schematization [m wrt zb_ini (zb0)] (per cell) - real*4, dimension(no_secveg), intent(in) :: veg_bstems ! Width/diameter of individual vegetation stems [m] (per cell) - real*4, dimension(no_secveg), intent(in) :: veg_Nstems ! Number of vegetation stems per unit horizontal area [m-2] (per cell) - real*4, dimension(no_secveg), intent(in) :: veg_Cd ! Bulk drag coefficient [-] (per cell) - real*4, intent(in) :: depth ! bed level, water depth (per cell) - real*4, intent(in) :: rho - real*4, intent(in) :: g - real*4, intent(in) :: H ! wave height (per cell) - real*4 :: Cdterm - integer :: m - real*4, intent(in) :: kwav ! wave number (per cell) - real*4, intent(out) :: Dveg ! dissipation by vegetation (per cell) - - ! Set dissipation in vegetation to zero everywhere for a start - Dveg = 0.d0 - - ! XB contains a check for porous in-canopy model -> not relevant for Snapwave? - ! ... - - ! First compute drag coefficient (if not user-defined) - - if (no_secveg > 0) then ! only in case vegetation is present - do m=1,no_secveg ! for each vertical vegetation section - if (veg_Cd(m) < 0.d0) then ! If Cd is not user specified: call subroutine of M. Bendoni (see below) - write(logstr,*)'Cd is not user specified: using subroutine bulkdragcoeff to compute Cd' - call write_log(logstr, 0) - ! - call bulkdragcoeff(veg_ah(m),m,Cdterm,no_nodes,no_secveg,depth,H,kwav,veg_bstems(m),sigm) ! bulkdragcoeff(ahveg(k,m)+zb0(k)-zb(k),m,k,Cdterm) <- no bed level change implemented in Snapwave - !write(*,*)'Cd is not user specified: putting default value of 0.7' - !veg_Cd(k,m) = 0.7 - endif - enddo - endif - - - ! Attenuation by vegetation is computed in wave action balance (swvegatt) and the momentum balance (momeqveg); - ! 1) Short wave dissipation by vegetation - call swvegatt(sigm, no_nodes, kwav, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, depth, rho, g, H, Dveg) - ! - ! 2) Mom.Eq.: Long wave dissipation, mean flow dissipation, nonlinear short wave effects, effect of emerged vegetation -> not implemented - ! call momeqveg(zb0) !< not relevant in Snapwave because no long waves and currents computed - ! - end subroutine vegatt - - subroutine swvegatt(sigm, no_nodes, kwav, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, depth, rho, g, H, Dveg)! Short wave dissipation by vegetation - !use snapwave_data - !use snapwave_domain - - implicit none - - ! declare variables - integer, intent(in) :: no_nodes ! number of unstructured grid nodes - integer, intent(in) :: no_secveg - real*4,intent(in) :: sigm ! - real*4, dimension(no_secveg), intent(in) :: veg_ah ! Height of vertical sections used in vegetation schematization [m wrt zb_ini (zb0)] - real*4, dimension(no_secveg), intent(in) :: veg_bstems ! Width/diameter of individual vegetation stems [m] - real*4, dimension(no_secveg), intent(in) :: veg_Nstems ! Number of vegetation stems per unit horizontal area [m-2] - real*4, dimension(no_secveg), intent(in) :: veg_Cd ! Bulk drag coefficient [-] - real*4, intent(in) :: depth ! bed level, water depth - real*4, intent(in) :: rho - real*4, intent(in) :: g - real*4, intent(in) :: H ! wave height - - ! local variables - real*4 :: pi ! 3.14159 - integer :: k,m ! indices of actual x,y point - - real*4 :: aht,hterm,htermold,Dvgt,ahtold - real*4 :: Dvg,kmr!,kwav - real*4, intent(in) :: kwav!,k - - real*4, intent(out) :: Dveg - - pi = 4.d0*atan(1.d0) - kmr = min(max(kwav, 0.01d0), 100.d0) - - ! Set dissipation in vegetation to zero everywhere for a start - Dvg = 0.d0 - Dvgt = 0.d0 - htermold = 0.d0 - ahtold = 0.d0 - if (no_secveg>0) then ! only if vegetation is present - do m=1,no_secveg - - ! Determine height of vegetation section (restricted to current bed level) - !aht = veg(ind)%ah(m)+ahtold !+s%zb0(k,j)-s%zb(k,j)!(max(veg(ind)%zv(m)+s%zb0(k,j),s%zb(k,j))) - aht = veg_ah(m)+ahtold - - ! restrict vegetation height to local water depth - aht = min(aht, depth) - - ! compute hterm based on ah - hterm = (sinh(kmr*aht)**3+3*sinh(kmr*aht))/(3.d0*kmr*cosh(kmr* depth)**3) ! - - ! compute dissipation based on aht and correct for lower elevated dissipation layers (following Suzuki et al. 2012) - Dvgt = 0.5d0/sqrt(pi)*rho*veg_Cd(m)*veg_bstems(m)*veg_Nstems(m)*(0.5d0*kmr*g/sigm)**3*(hterm-htermold)*H**3 - - ! save hterm to htermold to correct possibly in next vegetation section - htermold = hterm - ahtold = aht - - ! add dissipation current vegetation section - Dvg = Dvg + Dvgt - enddo - endif - Dveg = Dvg - end subroutine swvegatt - - subroutine bulkdragcoeff(ahh, m, Cdterm, no_nodes, no_secveg, depth, H, kwav, veg_bstems, sigm)!(ahh,m,i,Cdterm) - ! Michele Bendoni: subroutine to calculate bulk drag coefficient for short wave - ! energy dissipation based on the Keulegan-Carpenter number (adapted from XBeach) - ! Ozeren et al. (2013) or Mendez and Losada (2004) - ! - implicit none - ! - real*4, intent(out) :: Cdterm - real*4, intent(in) :: ahh ! [m] plant (total) height - integer, intent(in) :: m - integer, intent(in) :: no_nodes ! number of unstructured grid nodes - integer, intent(in) :: no_secveg - real*4, intent(in) :: depth ! bed level, water depth - real*4, intent(in) :: H ! wave height - real*4, intent(in) :: kwav ! wave number - real*4, intent(in) :: veg_bstems ! Width/diameter of individual vegetation stems [m] - real*4, intent(in) :: sigm ! [rad/s] mean frequency - ! - ! Local variables - real*4 :: pi ! 3.14159 - real*4 :: alfav ! [-] ratio between plant height and water depth - real*4 :: um ! [m/s] typical velocity acting on the plant - real*4 :: Tp ! [s] reference wave period - real*4 :: KC ! [-] Keulegan-Carpenter number - real*4 :: Q ! [-] modified Keulegan-Carpenter number - integer :: myflag ! 1 => Ozeren et al. (2013); 2 => Mendez and Losada (2004) - ! - myflag = 2 - pi = 4.d0*atan(1.d0) - ! - ! Representative wave period - Tp = 2*pi/sigm - ! - ! Coefficient alfa - if (ahh>=depth) then - alfav = 1.d0 - else - alfav = ahh/depth - endif - ! - ! Representative orbital velocity - ! (Could we also use urms here?) - um = 0.5d0*H*sigm*cosh(kwav*alfav*depth)/sinh(kwav*depth) - ! - ! Keulegan-Carpenter number - KC = um*Tp/veg_bstems - ! - ! Bulk drag coefficient - if (myflag == 1) then - ! - ! Approach from Ozeren et al. (2013), eq? - ! - if (KC>=10.d0) then - Cdterm = 0.036d0+50.d0/(KC**0.926d0) - else - Cdterm = 0.036d0+50.d0/(10.d0**0.926d0) - endif - elseif (myflag == 2) then - ! - ! Approach from Mendez and Losada (2004), eq. 40 - ! Only applicable for Laminaria Hyperborea (kelp)??? - ! - Q = KC/(alfav**0.76d0) - if (Q>=7) then - Cdterm = exp(-0.0138*Q)/(Q**0.3d0) - else - Cdterm = exp(-0.0138*7)/(7**0.3d0) - endif - endif - ! - end subroutine bulkdragcoeff - -end module snapwave_solver From 46486364253fbf4a3c0f9c3237c2dd39d38998d3 Mon Sep 17 00:00:00 2001 From: Leynse Date: Mon, 16 Mar 2026 11:35:28 +0100 Subject: [PATCH 036/118] - Redo ig_opt 12 to be same as ig_opt 1 (current best default), with with limiting beta_local to 0.07, as suggested by Maarten for steep slopes --- source/src/sfincs_lib.f90 | 2 +- source/src/snapwave/snapwave_solver.f90 | 38 ++++++++++++++++--------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/source/src/sfincs_lib.f90 b/source/src/sfincs_lib.f90 index a27ebced1..36628b1c7 100644 --- a/source/src/sfincs_lib.f90 +++ b/source/src/sfincs_lib.f90 @@ -93,7 +93,7 @@ function sfincs_initialize() result(ierr) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! build_revision = "$Rev: v2.3.0+ mt. Faber:branch-281" - build_date = "$Date: 2026-03-10" + build_date = "$Date: 2026-03-16" ! call write_log('', 1) call write_log('------------ Welcome to SFINCS ------------', 1) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 2a75e198b..69a9f1286 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -670,7 +670,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! do itheta = 1, ntheta ! - if (ig_opt > 0 .and. ig_opt < 12) then + if (ig_opt > 0 .and. ig_opt < 20) then R(itheta) = oneoverdt*ee(itheta, k) + cgprev(itheta)*eeprev(itheta)/ds(itheta, k) - srcig_local(itheta, k) * shinc2ig else R(itheta) = oneoverdt*ee(itheta, k) + cgprev(itheta)*eeprev(itheta)/ds(itheta, k) @@ -682,7 +682,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! A(itheta) = -ctheta(itheta - 1, k)*oneover2dtheta ! - if (ig_opt > 0 .and. ig_opt < 12) then + if (ig_opt > 0 .and. ig_opt < 20) then B(itheta) = oneoverdt + cg(k)/ds(itheta,k) + DoverE(k) else B(itheta) = oneoverdt + cg(k)/ds(itheta,k) + DoverE(k) + srcig_local(itheta, k) * shinc2ig @@ -698,7 +698,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & A(ntheta) = -ctheta(ntheta - 1, k)*oneover2dtheta C(ntheta) = ctheta(1, k)*oneover2dtheta ! - if (ig_opt > 0 .and. ig_opt < 12) then + if (ig_opt > 0 .and. ig_opt < 20) then B(1) = oneoverdt + cg(k)/ds(1,k) + DoverE(k) B(ntheta) = oneoverdt + cg(k)/ds(ntheta,k) + DoverE(k) else @@ -789,7 +789,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! do itheta = 1, ntheta ! - if (ig_opt > 0 .and. ig_opt < 12) then + if (ig_opt > 0 .and. ig_opt < 20) then R_ig(itheta) = oneoverdt*ee_ig(itheta, k) + cgprev_ig(itheta)*eeprev_ig(itheta)/ds(itheta, k) + srcig_local(itheta, k) else R_ig(itheta) = oneoverdt*ee_ig(itheta, k) + cgprev_ig(itheta)*eeprev_ig(itheta)/ds(itheta, k) @@ -801,7 +801,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! A_ig(itheta) = -ctheta_ig(itheta - 1, k)*oneover2dtheta ! - if (ig_opt > 0 .and. ig_opt < 12) then + if (ig_opt > 0 .and. ig_opt < 20) then B_ig(itheta) = oneoverdt + cg_ig(k)/ds(itheta,k) + DoverE_ig(k) else B_ig(itheta) = oneoverdt + cg_ig(k)/ds(itheta,k) + DoverE_ig(k) - srcig_local(itheta, k) @@ -813,7 +813,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! if (ctheta_ig(1,k)<0) then A_ig(1) = 0.0 - if (ig_opt > 0 .and. ig_opt < 12) then + if (ig_opt > 0 .and. ig_opt < 20) then B_ig(1) = oneoverdt - ctheta_ig(1, k)/dtheta + cg_ig(k)/ds(1, k) + DoverE_ig(k) else B_ig(1) = oneoverdt - ctheta_ig(1, k)/dtheta + cg_ig(k)/ds(1, k) + DoverE_ig(k) - srcig_local(itheta, k) @@ -823,7 +823,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & else A_ig(1)=0.0 ! - if (ig_opt > 0 .and. ig_opt < 12) then + if (ig_opt > 0 .and. ig_opt < 20) then B_ig(1)=1.0/dt + cg_ig(k)/ds(1, k) + DoverE_ig(k) else B_ig(1)=1.0/dt + cg_ig(k)/ds(1, k) + DoverE_ig(k) - srcig_local(itheta, k) @@ -835,7 +835,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & if (ctheta_ig(ntheta, k)>0) then A_ig(ntheta) = -ctheta_ig(ntheta - 1, k)/dtheta ! - if (ig_opt > 0 .and. ig_opt < 12) then + if (ig_opt > 0 .and. ig_opt < 20) then B_ig(ntheta) = oneoverdt + ctheta_ig(ntheta, k)/dtheta + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) else B_ig(ntheta) = oneoverdt + ctheta_ig(ntheta, k)/dtheta + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) - srcig_local(itheta, k) @@ -845,7 +845,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & else A_ig(ntheta) = 0.0 ! - if (ig_opt > 0 .and. ig_opt < 12) then + if (ig_opt > 0 .and. ig_opt < 20) then B_ig(ntheta) = oneoverdt + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) else B_ig(ntheta) = oneoverdt + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) - srcig_local(itheta, k) @@ -1246,10 +1246,20 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! Determine dSxx and IG source/sink term 'srcig' ! - if (ig_opt == 1 .or. ig_opt == 11 .or. ig_opt == 2 .or. ig_opt == 3) then + if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 11 .or. ig_opt == 12) then ! ! Calculate shoaling parameter alpha_ig following Leijnse et al. (2024) ! + if (ig_opt == 12) then + ! + ! Limit beta to max 0.1 before going into alphaig parametrisation + ! + !beta_local(itheta,k) = min(beta_local(itheta,k), 0.1) + beta_local(itheta,k) = min(beta_local(itheta,k), 0.07) + + ! + endif + ! call estimate_shoaling_parameter_alphaig(beta_local(itheta,k), gam, alphaig_local(itheta,k)) ! [input, input, output] ! ! Now calculate source term component @@ -1261,7 +1271,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! else ! - if (ig_opt == 1 .or. ig_opt == 11 .or. ig_opt == 3) then ! Option using conservative shoaling for dSxx/dx + if (ig_opt == 1 .or. ig_opt == 3 .or. ig_opt == 11 .or. ig_opt == 12) then ! Option using conservative shoaling for dSxx/dx ! ! Calculate Sxx based on conservative shoaling of upwind point's energy: ! Sxx_cons = E(i-1) * Cg(i-1) / Cg * (2 * n(i) - 0.5) @@ -1277,13 +1287,13 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! dSxx = max(dSxx, 0.0) ! - if (ig_opt == 1 .or. ig_opt == 11 .or. ig_opt == 2 .or. ig_opt == 3) then + if (ig_opt == 1 .or. ig_opt == 11 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 12) then ! ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy ! NOTE - already here multiplied with ee(itheta,k), for direct inclusion in 'R'-term srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) /max(E_local(k), 1.0e-6) * ee(itheta,k) ! - !elseif (ig_opt == 12) then + !elseif (ig_opt == 20) then ! ! NOTE - in main script this is multiplied with ee(itheta,k) to get directional energy, for direct inclusion in 'B'-term ! @@ -1305,7 +1315,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! endif ! - elseif (ig_opt == 1) then + elseif (ig_opt == 1 .or. ig_opt == 12) then ! ! Let srcig transition to 0 more smoothly using fac_transition that reduced from 1 to 0 around gamma_fac_br * snapwave_gamma ! From 53ecdfc1381c5f4b9f94cceef199e1227cadf8ca Mon Sep 17 00:00:00 2001 From: Leynse Date: Mon, 16 Mar 2026 16:52:52 +0100 Subject: [PATCH 037/118] - Add ig_opt 13, where based on beta_local, snapwave_gamma_fac_br is transitioned so that for beta 0.05 the factor is 0.45 (default snapwave_gamma_fac_br), but for steeper coasts (beta > 0.07) it is fully 1.0 (no reduction of srcig) because then driven by breakpoint forcing --- source/src/snapwave/snapwave_solver.f90 | 38 ++++++++++++++++++------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 69a9f1286..253fee42c 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1137,7 +1137,11 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d real*4 :: delta_Dw ! difference of Dw compared to upwind point, to get sign for max breaking point real*4 :: Qb ! Percentage of breaking incident waves real*4 :: transition_factor ! Transition factor for letting srcig go to zero smoothly, around gamma*gamma_fac_br - real*4 :: transition_factor_width ! Width factor of generalized (FermiDirac style) transfer function with adjustable midpoint and width + real*4 :: transition_factor_width_1 ! Width factor of generalized (FermiDirac style) transfer function with adjustable midpoint and width + real*4 :: transition_factor_width_2 ! Width factor of generalized (FermiDirac style) transfer function with adjustable midpoint and width + real*4 :: gamma_fac_br_transition ! Transitioned version of gamma_fac_br, so that for steep slopes it remains 1.0 + real*4 :: beta_limit_1 ! Cut-off beta_local for end of validity alphaig formulation of Leijnse et al. 2024 + real*4 :: beta_limit_2 ! Beta_local limit for transition function ! ! Allocate internal variables allocate(Sxxprev(ntheta)) @@ -1155,7 +1159,10 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! Used is generalized (FermiDirac style) transfer function with adjustable midpoint and width ! - transition_factor_width = 0.005 + transition_factor_width_1 = 0.005 + transition_factor_width_2 = 0.002 + beta_limit_1 = 0.07 + beta_limit_2 = beta_limit_1 - 0.01 ! ! Precompute all Sxx - FIXME - add parallellisation ! @@ -1246,17 +1253,16 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! Determine dSxx and IG source/sink term 'srcig' ! - if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 11 .or. ig_opt == 12) then + if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 11 .or. ig_opt == 12 .or. ig_opt == 13) then ! ! Calculate shoaling parameter alpha_ig following Leijnse et al. (2024) ! - if (ig_opt == 12) then + if (ig_opt == 12 .or. ig_opt == 13) then ! ! Limit beta to max 0.1 before going into alphaig parametrisation ! - !beta_local(itheta,k) = min(beta_local(itheta,k), 0.1) - beta_local(itheta,k) = min(beta_local(itheta,k), 0.07) - + !beta_local(itheta,k) = min(beta_local(itheta,k), 0.07) + beta_local(itheta,k) = min(beta_local(itheta,k), beta_limit_1) ! endif ! @@ -1271,7 +1277,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! else ! - if (ig_opt == 1 .or. ig_opt == 3 .or. ig_opt == 11 .or. ig_opt == 12) then ! Option using conservative shoaling for dSxx/dx + if (ig_opt == 1 .or. ig_opt == 3 .or. ig_opt == 11 .or. ig_opt == 12 .or. ig_opt == 13) then ! Option using conservative shoaling for dSxx/dx ! ! Calculate Sxx based on conservative shoaling of upwind point's energy: ! Sxx_cons = E(i-1) * Cg(i-1) / Cg * (2 * n(i) - 0.5) @@ -1287,7 +1293,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! dSxx = max(dSxx, 0.0) ! - if (ig_opt == 1 .or. ig_opt == 11 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 12) then + if (ig_opt == 1 .or. ig_opt == 11 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 12 .or. ig_opt == 13) then ! ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy ! NOTE - already here multiplied with ee(itheta,k), for direct inclusion in 'R'-term @@ -1319,10 +1325,22 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! Let srcig transition to 0 more smoothly using fac_transition that reduced from 1 to 0 around gamma_fac_br * snapwave_gamma ! - transition_factor = 1.0 - (1.0 / (1.0 + exp(- (gam - (gamma_fac_br * gamma)) / transition_factor_width))) + transition_factor = 1.0 - (1.0 / (1.0 + exp(- (gam - (gamma_fac_br * gamma)) / transition_factor_width_1))) ! srcig_local(itheta, k) = transition_factor * srcig_local(itheta, k) ! + elseif (ig_opt == 13) then + ! + ! Let srcig transition to 0 more smoothly using fac_transition that reduced from 1 to 0 around gamma_fac_br * snapwave_gamma + ! + ! But, only for beta_local < 0.07, so adjust based on beta_local so that transition_factor = 1.0 for Beta_local = 0.07 + ! + gamma_fac_br_transition = gamma_fac_br + ((1-gamma_fac_br) / (1 + exp(- (beta_local(itheta,k) - beta_limit_2) / transition_factor_width_2))) + ! + transition_factor = 1.0 - (1.0 / (1.0 + exp(- (gam - (gamma_fac_br_transition * gamma)) / transition_factor_width_1))) + ! + srcig_local(itheta, k) = transition_factor * srcig_local(itheta, k) + ! endif ! endif From 7b643b9f15d172c5e87b28944fd5aadf65cc935f Mon Sep 17 00:00:00 2001 From: Leynse Date: Mon, 16 Mar 2026 17:07:44 +0100 Subject: [PATCH 038/118] - Better result for 1:20 slope if beta_limit_2 = 0.005 --- source/src/snapwave/snapwave_solver.f90 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 253fee42c..56ea24bb2 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1162,7 +1162,8 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d transition_factor_width_1 = 0.005 transition_factor_width_2 = 0.002 beta_limit_1 = 0.07 - beta_limit_2 = beta_limit_1 - 0.01 + !beta_limit_2 = beta_limit_1 - 0.01 + beta_limit_2 = beta_limit_1 - 0.02 ! ! Precompute all Sxx - FIXME - add parallellisation ! From 8712589b1fc40408dcde3bf44068bd22be9220fe Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 17 Mar 2026 14:12:28 +0100 Subject: [PATCH 039/118] - Bump version --- source/src/sfincs_lib.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/src/sfincs_lib.f90 b/source/src/sfincs_lib.f90 index 36628b1c7..0eaa1dc8e 100644 --- a/source/src/sfincs_lib.f90 +++ b/source/src/sfincs_lib.f90 @@ -92,7 +92,7 @@ function sfincs_initialize() result(ierr) ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! - build_revision = "$Rev: v2.3.0+ mt. Faber:branch-281" + build_revision = "$Rev: v2.3.0+ mt. Faber:branch-281+292" build_date = "$Date: 2026-03-16" ! call write_log('', 1) From c3f14f7a69381386b186d23e7caf814d96dce2b5 Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 17 Mar 2026 14:14:10 +0100 Subject: [PATCH 040/118] - First step to making mean flow correct on the uv points --- source/src/sfincs_momentum.f90 | 16 ++++++++++++++-- source/src/sfincs_quadtree.F90 | 4 +++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/source/src/sfincs_momentum.f90 b/source/src/sfincs_momentum.f90 index 27ce7a61e..9ff78125b 100644 --- a/source/src/sfincs_momentum.f90 +++ b/source/src/sfincs_momentum.f90 @@ -140,12 +140,17 @@ subroutine compute_fluxes(dt, tloop) ! Indices of surrounding water level points ! nm = uv_index_z_nm(ip) + nmu = uv_index_z_nmu(ip) + ! + veg_CdBNstems = 0.5*(veg_CdBNstems(nm,iveg)+veg_CdBNstems(nmu,iveg)) ! !do iveg=1,quadtree_no_secveg ! for each vertical vegetation section ! iveg = 1 ! - veg_fvm(nm, iveg) = 0.5 * veg_CdBNstems(nm, iveg) * uv0(ip) * abs(uv0(ip)) / rhow + !veg_fvm(nm, iveg) = 0.5 * veg_CdBNstems(nm, iveg) * uv0(ip) * abs(uv0(ip)) / rhow + veg_fvm(ip, iveg) = 0.5 * veg_CdBNstems * uv0(ip) * abs(uv0(ip)) / rhow + ! in flux loop only still needs to be multiplied with 'hvegeff', which can still change ! ! NOTE: veg_CdBNstems = quadtree_snapwave_veg_Cd(nm, iveg) * quadtree_snapwave_veg_bstems(nm, iveg) * quadtree_snapwave_veg_Nstems(nm, iveg) @@ -651,9 +656,16 @@ subroutine compute_fluxes(dt, tloop) + nm = uv_index_z_nm(ip) + nmu = uv_index_z_nmu(ip) + ! + veg_ah = 0.5*(quadtree_snapwave_veg_ah(nm,iveg)+quadtree_snapwave_veg_ah(nmu,iveg)) + + fvm = veg_fvm(ip,iveg) * min(veg_ah, hu) + ! - fvm = veg_fvm(nm,iveg) * min(quadtree_snapwave_veg_ah(ip,iveg), hu) + !fvm = veg_fvm(nm,iveg) * min(quadtree_snapwave_veg_ah(ip,iveg), hu) ! FIXME Question TL: water depth per layer, or always compared to lower bed level, or? ! frc = frc - fvm ! FIXME - minus OR plus? diff --git a/source/src/sfincs_quadtree.F90 b/source/src/sfincs_quadtree.F90 index a8a3c8849..f8c6a6cb5 100644 --- a/source/src/sfincs_quadtree.F90 +++ b/source/src/sfincs_quadtree.F90 @@ -374,7 +374,9 @@ subroutine quadtree_read_file_netcdf(qtrfile, snapwave, nonhydrostatic, store_ve allocate(quadtree_snapwave_veg_Nstems(np, quadtree_no_secveg)) ! allocate(veg_CdBNstems(np, quadtree_no_secveg)) - allocate(veg_fvm(np, quadtree_no_secveg)) + !allocate(veg_fvm(np, quadtree_no_secveg)) + allocate(veg_fvm(npuv, quadtree_no_secveg)) !TODO - CHeck npuv + ! veg_CdBNstems = 0.0 veg_fvm = 0.0 From e702a530faf78d5c6b3cbd037edf2c14afdfa228 Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 24 Mar 2026 11:34:46 +0100 Subject: [PATCH 041/118] - Make exponent for multiplying for extra dissipation user defineable with 'snapwave_baldock_exponent', with 0 meaning unused as default. - can be set to 1 or 2 for more dissipation for steep coasts - baldock_opt not used anymore I see --- source/src/sfincs_snapwave.f90 | 3 ++- source/src/snapwave/snapwave_data.f90 | 5 ++--- source/src/snapwave/snapwave_solver.f90 | 7 +++---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index ef1a76e1c..b7eab1708 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -606,8 +606,9 @@ subroutine read_snapwave_input() call read_real_input(500,'snapwave_crit',crit,0.00001) !TL: Old default was 0.01 call read_int_input(500,'snapwave_nrsweeps',nr_sweeps,4) call read_int_input(500,'snapwave_niter',niter, 10) !TL: Old default was 40 - call read_int_input(500,'snapwave_baldock_opt',baldock_opt,1) + !call read_int_input(500,'snapwave_baldock_opt',baldock_opt,1) call read_real_input(500,'snapwave_baldock_ratio',baldock_ratio,0.2) + call read_int_input(500,'snapwave_baldock_exponent',baldock_exponent,0) ! Exponent for multiplying the Baldock dissipation with a factor 'f = (Hloc / Hmax)**iexp' to enhance breaking when H > Hmax, with iexp = 0 (default, means unused), 1 or 2 call read_real_input(500,'rgh_lev_land',rghlevland,0.0) call read_real_input(500,'snapwave_fw_ratio',fwratio,1.0) call read_real_input(500,'snapwave_fwig_ratio',fwigratio,1.0) diff --git a/source/src/snapwave/snapwave_data.f90 b/source/src/snapwave/snapwave_data.f90 index 2fdae4b26..7f6c8230f 100644 --- a/source/src/snapwave/snapwave_data.f90 +++ b/source/src/snapwave/snapwave_data.f90 @@ -172,10 +172,9 @@ module snapwave_data real*4 :: fwcutoff ! depth below which to apply space-varying fw real*4 :: alpha,gamma ! coefficients in Baldock wave breaking dissipation model real*4 :: gammax ! max wave height/water depth ratio - integer :: baldock_opt ! option of Baldock wave breaking dissipation model (opt=1 is without gamma&depth, else is including) + !integer :: baldock_opt ! option of Baldock wave breaking dissipation model (opt=1 is without gamma&depth, else is including) real*4 :: baldock_ratio ! option controlling from what depth wave breaking should take place: (Hk>baldock_ratio*Hmx(k)), default baldock_ratio=0.2 - ! TODO - TL: bring back baldock_ratio? - + integer :: baldock_exponent! Exponent for multiplying the Baldock dissipation with a factor 'f = (Hloc / Hmax)**iexp' to enhance breaking when H > Hmax, with iexp = 0 (default, means unused), 1 or 2 real*4 :: hmin ! minimum water depth character*256 :: gridfile ! name of gridfile (Delft3D .grd format) integer :: sferic ! sferical (1) or cartesian (0) grid diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index bda3c9724..2d492003f 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -149,7 +149,7 @@ subroutine compute_wave_field() wind, & H,Dw,F,Df,thetam,sinhkh,& Hmx, ee, windspreadfac, u10, niter, crit, & - hmin, baldock_ratio, baldock_ratio_ig, & + hmin, baldock_ratio, baldock_ratio_ig, baldock_exponent, & aa, sig, jadcgdx, sigmin, sigmax,& c_dispT, DoverE, WsorE, WsorA, SwE, SwA, Tpini, & igwaves, kwav_ig, cg_ig,H_ig,ctheta_ig,Hmx_ig, ee_ig,fw_ig, & @@ -175,7 +175,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & wind, & H,Dw,F,Df,thetam,sinhkh,& Hmx, ee, windspreadfac, u10, niter, crit, & - hmin, baldock_ratio, baldock_ratio_ig, & + hmin, baldock_ratio, baldock_ratio_ig, baldock_exponent, & aa, sig, jadcgdx, sigmin, sigmax,& c_dispT, DoverE, WsorE, WsorA, SwE, SwA, Tpini, & igwaves,kwav_ig, cg_ig,H_ig,ctheta_ig,Hmx_ig, ee_ig,fw_ig, & @@ -318,7 +318,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & real*4 :: shinc2ig ! Ratio of how much of the calculated IG wave source term, is subtracted from the incident wave energy (0-1, 0=default) real*4 :: fdrspr ! Inc-IG reduction factor to account for directional spreading integer, save :: callno=1 - integer :: baldock_exponent ! 0, 1 or 2 + integer, intent(in) :: baldock_exponent ! Exponent for multiplying the Baldock dissipation with a factor 'f = (Hloc / Hmax)**iexp' to enhance breaking when H > Hmax, with iexp = 0 (default, means unused), 1 or 2 ! real*4, dimension(ntheta) :: sinth, costh ! distribution of wave angles and offshore wave energy density ! @@ -334,7 +334,6 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! Allocate local arrays ! waveps = 0.0001 - baldock_exponent = 2 ! exponent to enhance breaking when H > Hmax ! fdrspr = 1.0 ! This is a factor on the IG source term to account for directional spreading ! of the incident wave energy, which reduces the IG wave energy generated. From 54075ab59372aac55ae345be74d1e515e53f88d5 Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 24 Mar 2026 11:39:30 +0100 Subject: [PATCH 042/118] - Bump version for clarity - nc output fix --- source/src/sfincs_lib.f90 | 4 ++-- source/src/sfincs_ncoutput.F90 | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/src/sfincs_lib.f90 b/source/src/sfincs_lib.f90 index d1881be4d..0b0cb5773 100644 --- a/source/src/sfincs_lib.f90 +++ b/source/src/sfincs_lib.f90 @@ -92,8 +92,8 @@ function sfincs_initialize() result(ierr) ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! - build_revision = "$Rev: v2.3.1 mt. Faber" - build_date = "$Date: 2025-12-18" + build_revision = "$Rev: v2.3.2 mt. Faber+branch:snapwave_domain_update" + build_date = "$Date: 2026-03-24" ! call write_log('', 1) call write_log('------------ Welcome to SFINCS ------------', 1) diff --git a/source/src/sfincs_ncoutput.F90 b/source/src/sfincs_ncoutput.F90 index a2decb661..9b3d16835 100644 --- a/source/src/sfincs_ncoutput.F90 +++ b/source/src/sfincs_ncoutput.F90 @@ -3689,7 +3689,7 @@ subroutine ncoutput_add_params(ncid, varid) use sfincs_data ! ! Because of overlapping names, only important specific values from snapwave_data - use snapwave_data, only: gamma, gammax, alpha, hmin, fw0, fw0_ig, dt, tol, dtheta, crit, nr_sweeps, baldock_opt, baldock_ratio, & + use snapwave_data, only: gamma, gammax, alpha, hmin, fw0, fw0_ig, dt, tol, dtheta, crit, nr_sweeps, baldock_exponent, baldock_ratio, & igwaves_opt, alpha_ig, gamma_ig, shinc2ig, alphaigfac, baldock_ratio_ig, ig_opt, herbers_opt, tpig_opt, eeinc2ig, tinc2ig, & snapwave_jonswapfile, snapwave_encfile, snapwave_bndfile, snapwave_bhsfile, snapwave_btpfile, snapwave_bwdfile, snapwave_bdsfile, upwfile, gridfile @@ -3876,7 +3876,7 @@ subroutine ncoutput_add_params(ncid, varid) NF90(nf90_put_att(ncid, varid, 'snapwave_dtheta',dtheta)) NF90(nf90_put_att(ncid, varid, 'snapwave_crit',crit)) NF90(nf90_put_att(ncid, varid, 'snapwave_nrsweeps',nr_sweeps)) - NF90(nf90_put_att(ncid, varid, 'snapwave_baldock_opt',baldock_opt)) + NF90(nf90_put_att(ncid, varid, 'snapwave_baldock_exponent',baldock_exponent)) NF90(nf90_put_att(ncid, varid, 'snapwave_baldock_ratio',baldock_ratio)) ! ! SnapWave IG From 989af68e39a802a6fa4f95114df912ef57ce5728 Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 24 Mar 2026 15:15:56 +0100 Subject: [PATCH 043/118] - clean repo --- .gitignore | 7 ++++ source/Dockerfile.gpu | 31 ----------------- source/Dockerfile.gpu.25.5.ccall | 32 ------------------ source/Dockerfile.gpu.test | 15 --------- source/Dockerfile.gpu.update01 | 32 ------------------ source/Singularityfile-gpu.def | 58 -------------------------------- source/build_nvfortran_gpu.sh | 35 ------------------- source/build_nvfortran_gpu_h7.sh | 21 ------------ 8 files changed, 7 insertions(+), 224 deletions(-) delete mode 100644 source/Dockerfile.gpu delete mode 100644 source/Dockerfile.gpu.25.5.ccall delete mode 100644 source/Dockerfile.gpu.test delete mode 100644 source/Dockerfile.gpu.update01 delete mode 100644 source/Singularityfile-gpu.def delete mode 100644 source/build_nvfortran_gpu.sh delete mode 100644 source/build_nvfortran_gpu_h7.sh diff --git a/.gitignore b/.gitignore index 22752d026..4ccdc3b3d 100644 --- a/.gitignore +++ b/.gitignore @@ -65,3 +65,10 @@ source/third_party_open/netcdf/x64 source/sfincs/sfincs.opt.yaml /source/sfincs_lib/*.yaml /source/third_party_open/netcdf/netcdf-fortran-4.6.1/Debug +/source/build_nvfortran_gpu_h7.sh +/source/build_nvfortran_gpu.sh +/source/Singularityfile-gpu.def +/source/Dockerfile.gpu.update01 +/source/Dockerfile.gpu.test +/source/Dockerfile.gpu.25.5.ccall +/source/Dockerfile.gpu diff --git a/source/Dockerfile.gpu b/source/Dockerfile.gpu deleted file mode 100644 index 24da778bc..000000000 --- a/source/Dockerfile.gpu +++ /dev/null @@ -1,31 +0,0 @@ -FROM nvcr.io/nvidia/nvhpc:20.11-devel-cuda_multi-ubuntu20.04 -ENV DEBIAN_FRONTEND=noninteractive -RUN apt update && apt install -y dos2unix -RUN apt update && apt install -y libnetcdf-dev build-essential autoconf automake libtool pkg-config tzdata -# copy the compilers -RUN cd /opt/nvidia/hpc_sdk/Linux_x86_64/20.11/REDIST/compilers && tar -czvhf /root/nvidia-20.11.tar.gz * && cd - -COPY . /usr/src/sfincs -WORKDIR /usr/src/sfincs - -RUN find . -name \*.m4|xargs dos2unix && find . -name \*.ac|xargs dos2unix && find . -name \*.am|xargs dos2unix -RUN find . -name \*.f90|xargs dos2unix -RUN find . -name \*.F90|xargs dos2unix -RUN find . -name \*.am|xargs dos2unix -# ccall -> Generate code for all compute capabilities supported by this platform and by the selected or default CUDA Toolkit. -RUN autoreconf -vif && FCFLAGS="-acc -Minfo=accel -fast -O3 -gpu=ccall -DSIZEOF_PTRDIFF_T=8" FC=nvfortran ./configure --disable-shared --disable-openmp && make && make install - -FROM nvidia/cuda:11.2.2-runtime-ubuntu20.04 -ENV DEBIAN_FRONTEND=noninteractive -RUN apt update && apt install -y libnetcdf-dev tzdata -# copy nvidia SDK (REDIST folder contains symlinks) -COPY --from=0 /root/nvidia-20.11.tar.gz . -# copy software -COPY --from=0 /usr/local /usr/local -RUN mkdir -p /opt/nvidia/compilers -RUN tar -xzf nvidia-20.11.tar.gz -C /opt/nvidia/compilers -# add the REDIST libs to the environment -ENV LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64:/opt/nvidia/compilers/lib -VOLUME /data -WORKDIR /data -CMD ["sfincs"] - diff --git a/source/Dockerfile.gpu.25.5.ccall b/source/Dockerfile.gpu.25.5.ccall deleted file mode 100644 index fb8e25234..000000000 --- a/source/Dockerfile.gpu.25.5.ccall +++ /dev/null @@ -1,32 +0,0 @@ -FROM nvcr.io/nvidia/nvhpc:25.5-devel-cuda_multi-ubuntu22.04 -ENV DEBIAN_FRONTEND=noninteractive -RUN apt update && apt install -y dos2unix -RUN apt update && apt install -y libnetcdf-dev build-essential autoconf automake libtool pkg-config tzdata -# copy the compilers -RUN cd /opt/nvidia/hpc_sdk/Linux_x86_64/2025/REDIST/compilers && tar -czvhf /root/nvidia-25.5.tar.gz * && cd - -COPY . /usr/src/sfincs -WORKDIR /usr/src/sfincs - -RUN find . -name \*.m4|xargs dos2unix && find . -name \*.ac|xargs dos2unix && find . -name \*.am|xargs dos2unix -RUN find . -name \*.f90|xargs dos2unix -RUN find . -name \*.F90|xargs dos2unix -RUN find . -name \*.am|xargs dos2unix -# ccall -> Generate code for all compute capabilities supported by this platform and by the selected or default CUDA Toolkit. -RUN autoreconf -vif && FCFLAGS="-acc -Minfo=accel -fast -O3 -gpu=ccall -DSIZEOF_PTRDIFF_T=8" FC=nvfortran ./configure --disable-shared --disable-openmp && make && make install -#RUN autoreconf -vif && FCFLAGS="-acc -Minfo=accel -fast -O3 -gpu=ccall" FC=nvfortran ./configure --disable-shared --disable-openmp && make && make install - -FROM nvidia/cuda:12.5.0-runtime-ubuntu22.04 -ENV DEBIAN_FRONTEND=noninteractive -RUN apt update && apt install -y libnetcdf-dev tzdata -# copy nvidia SDK (REDIST folder contains symlinks) -COPY --from=0 /root/nvidia-25.5.tar.gz . -# copy software -COPY --from=0 /usr/local /usr/local -RUN mkdir -p /opt/nvidia/compilers -RUN tar -xzf nvidia-25.5.tar.gz -C /opt/nvidia/compilers -# add the REDIST libs to the environment -ENV LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64:/opt/nvidia/compilers/lib -VOLUME /data -WORKDIR /data -CMD ["sfincs"] - diff --git a/source/Dockerfile.gpu.test b/source/Dockerfile.gpu.test deleted file mode 100644 index 87870c2ac..000000000 --- a/source/Dockerfile.gpu.test +++ /dev/null @@ -1,15 +0,0 @@ -FROM nvcr.io/nvidia/nvhpc:20.11-devel-cuda_multi-ubuntu20.04 -ENV DEBIAN_FRONTEND=noninteractive -RUN apt update && apt install -y libnetcdf-dev build-essential autoconf automake libtool pkg-config tzdata -# copy the compilers -RUN cd /opt/nvidia/hpc_sdk/Linux_x86_64/20.11/REDIST/compilers && tar -czvhf /root/nvidia-20.11.tar.gz * && cd - -WORKDIR /usr/src/sfincs -COPY . /usr/src/sfincs -# ccall -> Generate code for all compute capabilities supported by this platform and by the selected or default CUDA Toolkit. -# create a debug version -RUN autoreconf -vif && FCFLAGS="-acc -Minfo=accel -fast -g -O0 -gpu=ccall" FC=nvfortran ./configure --disable-shared --disable-openmp && make && make install - -ENV LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64:/opt/nvidia/compilers/lib -VOLUME /data -WORKDIR /data -CMD ["sfincs"] diff --git a/source/Dockerfile.gpu.update01 b/source/Dockerfile.gpu.update01 deleted file mode 100644 index bd54b6412..000000000 --- a/source/Dockerfile.gpu.update01 +++ /dev/null @@ -1,32 +0,0 @@ -FROM nvcr.io/nvidia/nvhpc:24.3-devel-cuda_multi-ubuntu22.04 -ENV DEBIAN_FRONTEND=noninteractive -RUN apt update && apt install -y dos2unix -RUN apt update && apt install -y libnetcdf-dev build-essential autoconf automake libtool pkg-config tzdata -# copy the compilers -RUN cd /opt/nvidia/hpc_sdk/Linux_x86_64/2024/REDIST/compilers && tar -czvhf /root/nvidia-24.5.tar.gz * && cd - -COPY . /usr/src/sfincs -WORKDIR /usr/src/sfincs - -RUN find . -name \*.m4|xargs dos2unix && find . -name \*.ac|xargs dos2unix && find . -name \*.am|xargs dos2unix -RUN find . -name \*.f90|xargs dos2unix -RUN find . -name \*.F90|xargs dos2unix -RUN find . -name \*.am|xargs dos2unix -# ccall -> Generate code for all compute capabilities supported by this platform and by the selected or default CUDA Toolkit. -RUN autoreconf -vif && FCFLAGS="-acc -Minfo=accel -fast -O3 -gpu=ccall -DSIZEOF_PTRDIFF_T=8" FC=nvfortran ./configure --disable-shared --disable-openmp && make && make install -#RUN autoreconf -vif && FCFLAGS="-acc -Minfo=accel -fast -O3 -gpu=ccall" FC=nvfortran ./configure --disable-shared --disable-openmp && make && make install - -FROM nvidia/cuda:12.5.0-runtime-ubuntu22.04 -ENV DEBIAN_FRONTEND=noninteractive -RUN apt update && apt install -y libnetcdf-dev tzdata -# copy nvidia SDK (REDIST folder contains symlinks) -COPY --from=0 /root/nvidia-24.5.tar.gz . -# copy software -COPY --from=0 /usr/local /usr/local -RUN mkdir -p /opt/nvidia/compilers -RUN tar -xzf nvidia-24.5.tar.gz -C /opt/nvidia/compilers -# add the REDIST libs to the environment -ENV LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64:/opt/nvidia/compilers/lib -VOLUME /data -WORKDIR /data -CMD ["sfincs"] - diff --git a/source/Singularityfile-gpu.def b/source/Singularityfile-gpu.def deleted file mode 100644 index 69ab0a258..000000000 --- a/source/Singularityfile-gpu.def +++ /dev/null @@ -1,58 +0,0 @@ -BootStrap: library -From: library://library/default/ubuntu:jammy -Stage: build - -# -# The source files of sfincs -# - -%files - . /usr/src/sfincs - -# -# Compiler flags -# -fallow-argument-mismatch needed for https://github.com/Unidata/netcdf-fortran/issues/212 -# - -%environment - FCFLAGS="-fopenmp -O3 -fallow-argument-mismatch -w" - FFLAGS="-fopenmp -O3 -fallow-argument-mismatch -w" - -# -# Installing compilers -# Compiling sfincs -# - -%post - apt clean && apt autoclean && apt -y update --fix-missing && apt -y upgrade -y && apt install -y libnetcdf-dev build-essential autoconf automake libtool pkg-config gfortran gdb m4 - -# Install software into /usr/local by default - - cd /usr/src/sfincs - export CONFIG_SHELL=/bin/bash - autoreconf -vif - ./autogen.sh - ./configure FCFLAGS="-acc -Minfo=accel -fast -O3 -gpu=ccall -DSIZEOF_PTRDIFF_T=999" FC=nvfortran --disable-shared --disable-openmp --program-suffix="_async" - - make clean - make - make install - -# Install binary in a much smaller image - -BootStrap: library -From: library://library/default/ubuntu:jammy -Stage: final - -# install binary from stage one -%files from build - /usr/local/bin/sfincs /usr/local/bin/sfincs - -%files - run-sfincs.sh /usr/local/bin/run-sfincs.sh - -%post - apt clean && apt autoclean && apt update --fix-missing && apt upgrade -y - apt install -y libnetcdf19 libgfortran5 libgomp1 - apt clean && apt autoclean - chmod +x /usr/local/bin/run-sfincs.sh diff --git a/source/build_nvfortran_gpu.sh b/source/build_nvfortran_gpu.sh deleted file mode 100644 index a38ae8a7e..000000000 --- a/source/build_nvfortran_gpu.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -LOGFILE=build_$(date +%Y%m%d_%H%M%S).log -exec > >(tee "$LOGFILE") 2>&1 - -echo "Starting build at $(date)" -echo "Saving log to $LOGFILE" - -find . -name \*.m4|xargs dos2unix && find . -name \*.ac|xargs dos2unix && find . -name \*.am|xargs dos2unix -find . -name \*.f90|xargs dos2unix -find . -name \*.F90|xargs dos2unix -find . -name \*.am|xargs dos2unix -find . -name \*.sh|xargs dos2unix - -MANPATH=$MANPATH:/opt/nvidia/hpc_sdk/Linux_x86_64/24.5/compilers/man; export MANPATH -PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/24.5/compilers/bin:$PATH; export PATH - -LD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH - -apt install -y libnetcdf-dev build-essential autoconf automake libtool pkg-config tzdata -export CONFIG_SHELL=/bin/bash - -autoreconf -vif - -./autogen.sh - -./configure FCFLAGS="-acc=gpu -Minfo=accel -fast -O3 -gpu=ccall -DSIZEOF_PTRDIFF_T=999" FC=nvfortran --disable-shared --disable-openmp --prefix=/usr/local/bin/sfincs/nvfortran_gpu_ccall - -make clean - -make - -make install - -echo "Build finished at $(date)" diff --git a/source/build_nvfortran_gpu_h7.sh b/source/build_nvfortran_gpu_h7.sh deleted file mode 100644 index c50fb36a6..000000000 --- a/source/build_nvfortran_gpu_h7.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh - -module load nvidia/nvhpc/24.1 -module load netcdf - -export LDFLAGS="-L${NETCDF_C_LIBRARY}" - -find . -name \*.m4|xargs dos2unix && find . -name \*.ac|xargs dos2unix && find . -name \*.am|xargs dos2unix -find . -name \*.f90|xargs dos2unix -find . -name \*.F90|xargs dos2unix -find . -name \*.am|xargs dos2unix - -./autogen.sh - -./configure FCFLAGS="-acc -Minfo=accel -fast -O3 -gpu=ccall -DSIZEOF_PTRDIFF_T=999" FC=nvfortran --disable-shared --disable-openmp --prefix /u/${USER}/bin/sfincs_nvfortran_gpu - -make clean - -make - -make install From fba786c744feffc2adadc22954efe351243fec9b Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 24 Mar 2026 15:19:58 +0100 Subject: [PATCH 044/118] - clean repo --- .gitignore | 8 +++++ source/Dockerfile.gpu | 31 ----------------- source/Dockerfile.gpu.25.5.ccall | 32 ------------------ source/Dockerfile.gpu.test | 15 --------- source/Dockerfile.gpu.update01 | 32 ------------------ source/Dockerfile.xpu | 21 ------------ source/Singularityfile-gpu.def | 58 -------------------------------- source/build_nvfortran_gpu.sh | 35 ------------------- source/build_nvfortran_gpu_h7.sh | 21 ------------ 9 files changed, 8 insertions(+), 245 deletions(-) delete mode 100644 source/Dockerfile.gpu delete mode 100644 source/Dockerfile.gpu.25.5.ccall delete mode 100644 source/Dockerfile.gpu.test delete mode 100644 source/Dockerfile.gpu.update01 delete mode 100644 source/Dockerfile.xpu delete mode 100644 source/Singularityfile-gpu.def delete mode 100644 source/build_nvfortran_gpu.sh delete mode 100644 source/build_nvfortran_gpu_h7.sh diff --git a/.gitignore b/.gitignore index 22752d026..1dbfdee70 100644 --- a/.gitignore +++ b/.gitignore @@ -65,3 +65,11 @@ source/third_party_open/netcdf/x64 source/sfincs/sfincs.opt.yaml /source/sfincs_lib/*.yaml /source/third_party_open/netcdf/netcdf-fortran-4.6.1/Debug +/source/build_nvfortran_gpu_h7.sh +/source/build_nvfortran_gpu.sh +/source/Singularityfile-gpu.def +/source/Dockerfile.xpu +/source/Dockerfile.gpu.test +/source/Dockerfile.gpu.update01 +/source/Dockerfile.gpu +/source/Dockerfile.gpu.25.5.ccall diff --git a/source/Dockerfile.gpu b/source/Dockerfile.gpu deleted file mode 100644 index 24da778bc..000000000 --- a/source/Dockerfile.gpu +++ /dev/null @@ -1,31 +0,0 @@ -FROM nvcr.io/nvidia/nvhpc:20.11-devel-cuda_multi-ubuntu20.04 -ENV DEBIAN_FRONTEND=noninteractive -RUN apt update && apt install -y dos2unix -RUN apt update && apt install -y libnetcdf-dev build-essential autoconf automake libtool pkg-config tzdata -# copy the compilers -RUN cd /opt/nvidia/hpc_sdk/Linux_x86_64/20.11/REDIST/compilers && tar -czvhf /root/nvidia-20.11.tar.gz * && cd - -COPY . /usr/src/sfincs -WORKDIR /usr/src/sfincs - -RUN find . -name \*.m4|xargs dos2unix && find . -name \*.ac|xargs dos2unix && find . -name \*.am|xargs dos2unix -RUN find . -name \*.f90|xargs dos2unix -RUN find . -name \*.F90|xargs dos2unix -RUN find . -name \*.am|xargs dos2unix -# ccall -> Generate code for all compute capabilities supported by this platform and by the selected or default CUDA Toolkit. -RUN autoreconf -vif && FCFLAGS="-acc -Minfo=accel -fast -O3 -gpu=ccall -DSIZEOF_PTRDIFF_T=8" FC=nvfortran ./configure --disable-shared --disable-openmp && make && make install - -FROM nvidia/cuda:11.2.2-runtime-ubuntu20.04 -ENV DEBIAN_FRONTEND=noninteractive -RUN apt update && apt install -y libnetcdf-dev tzdata -# copy nvidia SDK (REDIST folder contains symlinks) -COPY --from=0 /root/nvidia-20.11.tar.gz . -# copy software -COPY --from=0 /usr/local /usr/local -RUN mkdir -p /opt/nvidia/compilers -RUN tar -xzf nvidia-20.11.tar.gz -C /opt/nvidia/compilers -# add the REDIST libs to the environment -ENV LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64:/opt/nvidia/compilers/lib -VOLUME /data -WORKDIR /data -CMD ["sfincs"] - diff --git a/source/Dockerfile.gpu.25.5.ccall b/source/Dockerfile.gpu.25.5.ccall deleted file mode 100644 index fb8e25234..000000000 --- a/source/Dockerfile.gpu.25.5.ccall +++ /dev/null @@ -1,32 +0,0 @@ -FROM nvcr.io/nvidia/nvhpc:25.5-devel-cuda_multi-ubuntu22.04 -ENV DEBIAN_FRONTEND=noninteractive -RUN apt update && apt install -y dos2unix -RUN apt update && apt install -y libnetcdf-dev build-essential autoconf automake libtool pkg-config tzdata -# copy the compilers -RUN cd /opt/nvidia/hpc_sdk/Linux_x86_64/2025/REDIST/compilers && tar -czvhf /root/nvidia-25.5.tar.gz * && cd - -COPY . /usr/src/sfincs -WORKDIR /usr/src/sfincs - -RUN find . -name \*.m4|xargs dos2unix && find . -name \*.ac|xargs dos2unix && find . -name \*.am|xargs dos2unix -RUN find . -name \*.f90|xargs dos2unix -RUN find . -name \*.F90|xargs dos2unix -RUN find . -name \*.am|xargs dos2unix -# ccall -> Generate code for all compute capabilities supported by this platform and by the selected or default CUDA Toolkit. -RUN autoreconf -vif && FCFLAGS="-acc -Minfo=accel -fast -O3 -gpu=ccall -DSIZEOF_PTRDIFF_T=8" FC=nvfortran ./configure --disable-shared --disable-openmp && make && make install -#RUN autoreconf -vif && FCFLAGS="-acc -Minfo=accel -fast -O3 -gpu=ccall" FC=nvfortran ./configure --disable-shared --disable-openmp && make && make install - -FROM nvidia/cuda:12.5.0-runtime-ubuntu22.04 -ENV DEBIAN_FRONTEND=noninteractive -RUN apt update && apt install -y libnetcdf-dev tzdata -# copy nvidia SDK (REDIST folder contains symlinks) -COPY --from=0 /root/nvidia-25.5.tar.gz . -# copy software -COPY --from=0 /usr/local /usr/local -RUN mkdir -p /opt/nvidia/compilers -RUN tar -xzf nvidia-25.5.tar.gz -C /opt/nvidia/compilers -# add the REDIST libs to the environment -ENV LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64:/opt/nvidia/compilers/lib -VOLUME /data -WORKDIR /data -CMD ["sfincs"] - diff --git a/source/Dockerfile.gpu.test b/source/Dockerfile.gpu.test deleted file mode 100644 index 87870c2ac..000000000 --- a/source/Dockerfile.gpu.test +++ /dev/null @@ -1,15 +0,0 @@ -FROM nvcr.io/nvidia/nvhpc:20.11-devel-cuda_multi-ubuntu20.04 -ENV DEBIAN_FRONTEND=noninteractive -RUN apt update && apt install -y libnetcdf-dev build-essential autoconf automake libtool pkg-config tzdata -# copy the compilers -RUN cd /opt/nvidia/hpc_sdk/Linux_x86_64/20.11/REDIST/compilers && tar -czvhf /root/nvidia-20.11.tar.gz * && cd - -WORKDIR /usr/src/sfincs -COPY . /usr/src/sfincs -# ccall -> Generate code for all compute capabilities supported by this platform and by the selected or default CUDA Toolkit. -# create a debug version -RUN autoreconf -vif && FCFLAGS="-acc -Minfo=accel -fast -g -O0 -gpu=ccall" FC=nvfortran ./configure --disable-shared --disable-openmp && make && make install - -ENV LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64:/opt/nvidia/compilers/lib -VOLUME /data -WORKDIR /data -CMD ["sfincs"] diff --git a/source/Dockerfile.gpu.update01 b/source/Dockerfile.gpu.update01 deleted file mode 100644 index bd54b6412..000000000 --- a/source/Dockerfile.gpu.update01 +++ /dev/null @@ -1,32 +0,0 @@ -FROM nvcr.io/nvidia/nvhpc:24.3-devel-cuda_multi-ubuntu22.04 -ENV DEBIAN_FRONTEND=noninteractive -RUN apt update && apt install -y dos2unix -RUN apt update && apt install -y libnetcdf-dev build-essential autoconf automake libtool pkg-config tzdata -# copy the compilers -RUN cd /opt/nvidia/hpc_sdk/Linux_x86_64/2024/REDIST/compilers && tar -czvhf /root/nvidia-24.5.tar.gz * && cd - -COPY . /usr/src/sfincs -WORKDIR /usr/src/sfincs - -RUN find . -name \*.m4|xargs dos2unix && find . -name \*.ac|xargs dos2unix && find . -name \*.am|xargs dos2unix -RUN find . -name \*.f90|xargs dos2unix -RUN find . -name \*.F90|xargs dos2unix -RUN find . -name \*.am|xargs dos2unix -# ccall -> Generate code for all compute capabilities supported by this platform and by the selected or default CUDA Toolkit. -RUN autoreconf -vif && FCFLAGS="-acc -Minfo=accel -fast -O3 -gpu=ccall -DSIZEOF_PTRDIFF_T=8" FC=nvfortran ./configure --disable-shared --disable-openmp && make && make install -#RUN autoreconf -vif && FCFLAGS="-acc -Minfo=accel -fast -O3 -gpu=ccall" FC=nvfortran ./configure --disable-shared --disable-openmp && make && make install - -FROM nvidia/cuda:12.5.0-runtime-ubuntu22.04 -ENV DEBIAN_FRONTEND=noninteractive -RUN apt update && apt install -y libnetcdf-dev tzdata -# copy nvidia SDK (REDIST folder contains symlinks) -COPY --from=0 /root/nvidia-24.5.tar.gz . -# copy software -COPY --from=0 /usr/local /usr/local -RUN mkdir -p /opt/nvidia/compilers -RUN tar -xzf nvidia-24.5.tar.gz -C /opt/nvidia/compilers -# add the REDIST libs to the environment -ENV LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64:/opt/nvidia/compilers/lib -VOLUME /data -WORKDIR /data -CMD ["sfincs"] - diff --git a/source/Dockerfile.xpu b/source/Dockerfile.xpu deleted file mode 100644 index c311d2e67..000000000 --- a/source/Dockerfile.xpu +++ /dev/null @@ -1,21 +0,0 @@ -FROM ubuntu:latest -ENV DEBIAN_FRONTEND=noninteractive -RUN apt update && apt install -y libnetcdf-dev build-essential autoconf automake libtool pkg-config tzdata -# copy the compilers -COPY aocc-compiler-4.0.0_1_amd64.deb . -RUN apt install -y ./aocc-compiler-4.0.0_1_amd64.deb -WORKDIR /usr/src/sfincs -COPY . /usr/src/sfincs -# Compile with the AMD fortran compiler -ENV PATH="/opt/AMD/aocc-compiler-4.0.0/bin:${PATH}" -RUN autoreconf -vif && FCFLAGS="-O3" FC=flang ./configure --disable-shared --disable-openmp && make && make install - -# Copy the files to empty docker container -FROM ubuntu:latest -ENV DEBIAN_FRONTEND=noninteractive -RUN apt update && apt install -y libnetcdf-dev tzdata -# copy nvidia SDK (REDIST folder contains symlinks) -COPY --from=0 /usr/local /usr/local -VOLUME /data -WORKDIR /data -CMD ["sfincs"] diff --git a/source/Singularityfile-gpu.def b/source/Singularityfile-gpu.def deleted file mode 100644 index 69ab0a258..000000000 --- a/source/Singularityfile-gpu.def +++ /dev/null @@ -1,58 +0,0 @@ -BootStrap: library -From: library://library/default/ubuntu:jammy -Stage: build - -# -# The source files of sfincs -# - -%files - . /usr/src/sfincs - -# -# Compiler flags -# -fallow-argument-mismatch needed for https://github.com/Unidata/netcdf-fortran/issues/212 -# - -%environment - FCFLAGS="-fopenmp -O3 -fallow-argument-mismatch -w" - FFLAGS="-fopenmp -O3 -fallow-argument-mismatch -w" - -# -# Installing compilers -# Compiling sfincs -# - -%post - apt clean && apt autoclean && apt -y update --fix-missing && apt -y upgrade -y && apt install -y libnetcdf-dev build-essential autoconf automake libtool pkg-config gfortran gdb m4 - -# Install software into /usr/local by default - - cd /usr/src/sfincs - export CONFIG_SHELL=/bin/bash - autoreconf -vif - ./autogen.sh - ./configure FCFLAGS="-acc -Minfo=accel -fast -O3 -gpu=ccall -DSIZEOF_PTRDIFF_T=999" FC=nvfortran --disable-shared --disable-openmp --program-suffix="_async" - - make clean - make - make install - -# Install binary in a much smaller image - -BootStrap: library -From: library://library/default/ubuntu:jammy -Stage: final - -# install binary from stage one -%files from build - /usr/local/bin/sfincs /usr/local/bin/sfincs - -%files - run-sfincs.sh /usr/local/bin/run-sfincs.sh - -%post - apt clean && apt autoclean && apt update --fix-missing && apt upgrade -y - apt install -y libnetcdf19 libgfortran5 libgomp1 - apt clean && apt autoclean - chmod +x /usr/local/bin/run-sfincs.sh diff --git a/source/build_nvfortran_gpu.sh b/source/build_nvfortran_gpu.sh deleted file mode 100644 index a38ae8a7e..000000000 --- a/source/build_nvfortran_gpu.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -LOGFILE=build_$(date +%Y%m%d_%H%M%S).log -exec > >(tee "$LOGFILE") 2>&1 - -echo "Starting build at $(date)" -echo "Saving log to $LOGFILE" - -find . -name \*.m4|xargs dos2unix && find . -name \*.ac|xargs dos2unix && find . -name \*.am|xargs dos2unix -find . -name \*.f90|xargs dos2unix -find . -name \*.F90|xargs dos2unix -find . -name \*.am|xargs dos2unix -find . -name \*.sh|xargs dos2unix - -MANPATH=$MANPATH:/opt/nvidia/hpc_sdk/Linux_x86_64/24.5/compilers/man; export MANPATH -PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/24.5/compilers/bin:$PATH; export PATH - -LD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH - -apt install -y libnetcdf-dev build-essential autoconf automake libtool pkg-config tzdata -export CONFIG_SHELL=/bin/bash - -autoreconf -vif - -./autogen.sh - -./configure FCFLAGS="-acc=gpu -Minfo=accel -fast -O3 -gpu=ccall -DSIZEOF_PTRDIFF_T=999" FC=nvfortran --disable-shared --disable-openmp --prefix=/usr/local/bin/sfincs/nvfortran_gpu_ccall - -make clean - -make - -make install - -echo "Build finished at $(date)" diff --git a/source/build_nvfortran_gpu_h7.sh b/source/build_nvfortran_gpu_h7.sh deleted file mode 100644 index c50fb36a6..000000000 --- a/source/build_nvfortran_gpu_h7.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh - -module load nvidia/nvhpc/24.1 -module load netcdf - -export LDFLAGS="-L${NETCDF_C_LIBRARY}" - -find . -name \*.m4|xargs dos2unix && find . -name \*.ac|xargs dos2unix && find . -name \*.am|xargs dos2unix -find . -name \*.f90|xargs dos2unix -find . -name \*.F90|xargs dos2unix -find . -name \*.am|xargs dos2unix - -./autogen.sh - -./configure FCFLAGS="-acc -Minfo=accel -fast -O3 -gpu=ccall -DSIZEOF_PTRDIFF_T=999" FC=nvfortran --disable-shared --disable-openmp --prefix /u/${USER}/bin/sfincs_nvfortran_gpu - -make clean - -make - -make install From 328a46ad1dfae6888f5d4731c7c0351e8c55a8f4 Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 25 Mar 2026 10:19:17 +0100 Subject: [PATCH 045/118] - As done in PR of jre/snapwave_sfincs, use the SFINCS input routines directly in SnapWave - Made clearer by putting the read functions in new filed 'sfincs_read', and only call those in sfincs_snapwave.f90 --- source/sfincs_lib/sfincs_lib.vfproj | 20 +- source/src/Makefile.am | 5 +- source/src/sfincs_input.f90 | 302 +-------------------------- source/src/sfincs_read.f90 | 303 ++++++++++++++++++++++++++++ source/src/sfincs_snapwave.f90 | 299 +-------------------------- 5 files changed, 324 insertions(+), 605 deletions(-) create mode 100644 source/src/sfincs_read.f90 diff --git a/source/sfincs_lib/sfincs_lib.vfproj b/source/sfincs_lib/sfincs_lib.vfproj index f2ea825d4..57d511c7d 100644 --- a/source/sfincs_lib/sfincs_lib.vfproj +++ b/source/sfincs_lib/sfincs_lib.vfproj @@ -33,7 +33,8 @@ - + + @@ -44,16 +45,19 @@ - + + - + + - + + @@ -61,7 +65,8 @@ - + + @@ -94,8 +99,11 @@ + + - + + diff --git a/source/src/Makefile.am b/source/src/Makefile.am index bc8a2b9f9..58a18d6d0 100644 --- a/source/src/Makefile.am +++ b/source/src/Makefile.am @@ -19,7 +19,8 @@ libsfincs_la_SOURCES = \ sfincs_date.f90 \ sfincs_spiderweb.f90 \ sfincs_data.f90 \ - ../third_party_open/Delft3D/astro.f90 \ + sfincs_read.f90 \ + ../third_party_open/Delft3D/astro.f90 \ ../third_party_open/utils/geometry.f90 \ sfincs_error.f90 \ sfincs_quadtree.f90 \ @@ -48,7 +49,7 @@ libsfincs_la_SOURCES = \ sfincs_snapwave.f90 \ ../third_party_open/utils/deg2utm.f90 \ sfincs_meteo.f90 \ - ../third_party_open/bicgstab/bicgstab_solver_ilu.f90 \ + ../third_party_open/bicgstab/bicgstab_solver_ilu.f90 \ sfincs_nonhydrostatic.f90 \ sfincs_ncoutput.F90 \ sfincs_output.f90 \ diff --git a/source/src/sfincs_input.f90 b/source/src/sfincs_input.f90 index c07925752..e70736f93 100644 --- a/source/src/sfincs_input.f90 +++ b/source/src/sfincs_input.f90 @@ -10,6 +10,7 @@ subroutine read_sfincs_input() use sfincs_date use sfincs_log use sfincs_error + use sfincs_read ! implicit none ! @@ -637,303 +638,4 @@ subroutine read_sfincs_input() end subroutine - - subroutine read_real_input(fileid,keyword,value,default) - ! - character(*), intent(in) :: keyword - character(len=256) :: keystr - character(len=256) :: valstr - character(len=256) :: line - integer, intent(in) :: fileid - real*4, intent(out) :: value - real*4, intent(in) :: default - integer j,stat,ilen - ! - value = default - ! - rewind(fileid) - ! - do while(.true.) - ! - read(fileid,'(a)',iostat = stat)line - ! - if (stat==-1) exit - ! - call read_line(line, keystr, valstr) - ! - if (trim(keystr)==trim(keyword)) then - ! - read(valstr,*)value - ! - exit - ! - endif - ! - enddo - ! - end subroutine - - subroutine read_real_array_input(fileid,keyword,value,default,nr) - ! - character(*), intent(in) :: keyword - character(len=256) :: keystr - character(len=256) :: valstr - character(len=256) :: line - integer, intent(in) :: fileid - integer, intent(in) :: nr - real*4, dimension(:), intent(out), allocatable :: value - real*4, intent(in) :: default - integer j,stat, m,ilen - ! - allocate(value(nr)) - ! - value = default - ! - rewind(fileid) - ! - do while(.true.) - ! - read(fileid,'(a)',iostat = stat)line - ! - if (stat==-1) exit - ! - call read_line(line, keystr, valstr) - ! - if (trim(keystr)==trim(keyword)) then - ! - read(valstr,*)(value(m), m = 1, nr) - ! - exit - ! - endif - ! - enddo - ! - end subroutine - - - subroutine read_int_input(fileid,keyword,value,default) - ! - character(*), intent(in) :: keyword - character(len=256) :: keystr - character(len=256) :: valstr - character(len=256) :: line - integer, intent(in) :: fileid - integer, intent(out) :: value - integer, intent(in) :: default - integer j,stat,ilen - ! - value = default - ! - rewind(fileid) - ! - do while(.true.) - ! - read(fileid,'(a)',iostat = stat)line - ! - if (stat==-1) exit - ! - call read_line(line, keystr, valstr) - ! - if (trim(keystr)==trim(keyword)) then - ! - read(valstr,*)value - ! - exit - ! - endif - ! - enddo - ! - end subroutine - - - subroutine read_char_input(fileid,keyword,value,default) - ! - character(*), intent(in) :: keyword - character(len=256) :: keystr0 - character(len=256) :: keystr - character(len=256) :: valstr - character(len=256) :: line - integer, intent(in) :: fileid - character(*), intent(in) :: default - character(*), intent(out) :: value - integer j,stat,ilen,jn - ! - value = default - ! - rewind(fileid) - ! - do while(.true.) - ! - read(fileid,'(a)',iostat = stat)line - ! - if (stat==-1) exit - ! - call read_line(line, keystr, valstr) - ! - if (trim(keystr)==trim(keyword)) then - ! - value = valstr - ! - exit - ! - endif - ! - enddo - ! - end subroutine - - - subroutine read_logical_input(fileid,keyword,value,default) - ! - character(*), intent(in) :: keyword - character(len=256) :: keystr0 - character(len=256) :: keystr - character(len=256) :: valstr - character(len=256) :: line - integer, intent(in) :: fileid - logical, intent(in) :: default - logical, intent(out) :: value - integer j,stat,ilen - ! - value = default - ! - rewind(fileid) - ! - do while(.true.) - ! - read(fileid,'(a)',iostat = stat)line - ! - if (stat==-1) exit - ! - call read_line(line, keystr, valstr) - ! - if (trim(keystr)==trim(keyword)) then - ! - if (valstr(1:1) == '1' .or. valstr(1:1) == 'y' .or. valstr(1:1) == 'Y' .or. valstr(1:1) == 't' .or. valstr(1:1) == 'T') then - value = .true. - else - value = .false. - endif - ! - exit - ! - endif - ! - enddo - ! - end subroutine - - subroutine read_line(line0, keystr, valstr) - ! - ! Reads line from input file, returns keyword and value strings - ! - character(*), intent(in) :: line0 - character(len=256) :: line - character(*), intent(out) :: keystr - character(*), intent(out) :: valstr - integer j, ilen, jn - ! - keystr = '' - valstr = '' - ! - ! Change tabs into spaces. - ! - call notabs(line0, line, ilen) - ! - ! Look for line ending character. Remove it if it exists. - ! - jn = index(line, '\r') - ! - if (jn > 0) then - ! - ! New line character detected (probably sfincs.inp with windows line endings, running in linux) - ! - line = line(1 : jn - 1) - ! - endif - ! - ! Remove leading and trailing spaces. - ! - line = trim(line) - ! - if (line(1:1) == '#' .or. line(1:1) == '!' .or. line(1:1) == '@') return - ! - ! Find "=" - ! - j = index(line, '=') - ! - if (j == 0) return - ! - keystr = trim(line(1:j-1)) - ! - valstr = trim(line(j+1:)) - ! - ! Remove comments - ! - jn = index(valstr, '#') - ! - if (jn > 0) then - ! - valstr = trim(valstr(1 : jn - 1)) - ! - endif - ! - valstr = adjustl(trim(valstr)) - ! - end subroutine - - - subroutine notabs(INSTR,OUTSTR,ILEN) - ! @(#) convert tabs in input to spaces in output while maintaining columns, assuming a tab is set every 8 characters - ! - ! USES: - ! It is often useful to expand tabs in input files to simplify further processing such as tokenizing an input line. - ! Some FORTRAN compilers hate tabs in input files; some printers; some editors will have problems with tabs - ! AUTHOR: - ! John S. Urban - ! - ! SEE ALSO: - ! GNU/Unix commands expand(1) and unexpand(1) - ! - use ISO_FORTRAN_ENV, only : ERROR_UNIT ! get unit for standard error. if not supported yet, define ERROR_UNIT for your system (typically 0) - character(len=*),intent(in) :: INSTR ! input line to scan for tab characters - character(len=*),intent(out) :: OUTSTR ! tab-expanded version of INSTR produced - integer,intent(out) :: ILEN ! column position of last character put into output string - - integer,parameter :: TABSIZE=8 ! assume a tab stop is set every 8th column - character(len=1) :: c ! character read from stdin - integer :: ipos ! position in OUTSTR to put next character of INSTR - integer :: lenin ! length of input string trimmed of trailing spaces - integer :: lenout ! number of characters output string can hold - integer :: i10 ! counter that advances thru input string INSTR one character at a time - ! - IPOS=1 ! where to put next character in output string OUTSTR - lenin=len(INSTR) ! length of character variable INSTR - lenin=len_trim(INSTR(1:lenin)) ! length of INSTR trimmed of trailing spaces - lenout=len(OUTSTR) ! number of characters output string OUTSTR can hold - OUTSTR=" " ! this SHOULD blank-fill string, a buggy machine required a loop to set all characters - ! - do i10=1,lenin ! look through input string one character at a time - c=INSTR(i10:i10) - if(ichar(c) == 9)then ! test if character is a tab (ADE (ASCII Decimal Equivalent) of tab character is 9) - IPOS = IPOS + (TABSIZE - (mod(IPOS-1,TABSIZE))) - else ! c is anything else other than a tab insert it in output string - if(IPOS > lenout)then - write(ERROR_UNIT,*)"*notabs* output string overflow" - exit - else - OUTSTR(IPOS:IPOS)=c - IPOS=IPOS+1 - endif - endif - enddo - ! - ILEN=len_trim(OUTSTR(:IPOS)) ! trim trailing spaces - return - ! - end subroutine notabs - - -end module +end module \ No newline at end of file diff --git a/source/src/sfincs_read.f90 b/source/src/sfincs_read.f90 new file mode 100644 index 000000000..553c82fac --- /dev/null +++ b/source/src/sfincs_read.f90 @@ -0,0 +1,303 @@ +module sfincs_read + +contains + + subroutine read_real_input(fileid,keyword,value,default) + ! + character(*), intent(in) :: keyword + character(len=256) :: keystr + character(len=256) :: valstr + character(len=256) :: line + integer, intent(in) :: fileid + real*4, intent(out) :: value + real*4, intent(in) :: default + integer j,stat,ilen + ! + value = default + ! + rewind(fileid) + ! + do while(.true.) + ! + read(fileid,'(a)',iostat = stat)line + ! + if (stat==-1) exit + ! + call read_line(line, keystr, valstr) + ! + if (trim(keystr)==trim(keyword)) then + ! + read(valstr,*)value + ! + exit + ! + endif + ! + enddo + ! + end subroutine + + subroutine read_real_array_input(fileid,keyword,value,default,nr) + ! + character(*), intent(in) :: keyword + character(len=256) :: keystr + character(len=256) :: valstr + character(len=256) :: line + integer, intent(in) :: fileid + integer, intent(in) :: nr + real*4, dimension(:), intent(out), allocatable :: value + real*4, intent(in) :: default + integer j,stat, m,ilen + ! + allocate(value(nr)) + ! + value = default + ! + rewind(fileid) + ! + do while(.true.) + ! + read(fileid,'(a)',iostat = stat)line + ! + if (stat==-1) exit + ! + call read_line(line, keystr, valstr) + ! + if (trim(keystr)==trim(keyword)) then + ! + read(valstr,*)(value(m), m = 1, nr) + ! + exit + ! + endif + ! + enddo + ! + end subroutine + + + subroutine read_int_input(fileid,keyword,value,default) + ! + character(*), intent(in) :: keyword + character(len=256) :: keystr + character(len=256) :: valstr + character(len=256) :: line + integer, intent(in) :: fileid + integer, intent(out) :: value + integer, intent(in) :: default + integer j,stat,ilen + ! + value = default + ! + rewind(fileid) + ! + do while(.true.) + ! + read(fileid,'(a)',iostat = stat)line + ! + if (stat==-1) exit + ! + call read_line(line, keystr, valstr) + ! + if (trim(keystr)==trim(keyword)) then + ! + read(valstr,*)value + ! + exit + ! + endif + ! + enddo + ! + end subroutine + + + subroutine read_char_input(fileid,keyword,value,default) + ! + character(*), intent(in) :: keyword + character(len=256) :: keystr0 + character(len=256) :: keystr + character(len=256) :: valstr + character(len=256) :: line + integer, intent(in) :: fileid + character(*), intent(in) :: default + character(*), intent(out) :: value + integer j,stat,ilen,jn + ! + value = default + ! + rewind(fileid) + ! + do while(.true.) + ! + read(fileid,'(a)',iostat = stat)line + ! + if (stat==-1) exit + ! + call read_line(line, keystr, valstr) + ! + if (trim(keystr)==trim(keyword)) then + ! + value = valstr + ! + exit + ! + endif + ! + enddo + ! + end subroutine + + + subroutine read_logical_input(fileid,keyword,value,default) + ! + character(*), intent(in) :: keyword + character(len=256) :: keystr0 + character(len=256) :: keystr + character(len=256) :: valstr + character(len=256) :: line + integer, intent(in) :: fileid + logical, intent(in) :: default + logical, intent(out) :: value + integer j,stat,ilen + ! + value = default + ! + rewind(fileid) + ! + do while(.true.) + ! + read(fileid,'(a)',iostat = stat)line + ! + if (stat==-1) exit + ! + call read_line(line, keystr, valstr) + ! + if (trim(keystr)==trim(keyword)) then + ! + if (valstr(1:1) == '1' .or. valstr(1:1) == 'y' .or. valstr(1:1) == 'Y' .or. valstr(1:1) == 't' .or. valstr(1:1) == 'T') then + value = .true. + else + value = .false. + endif + ! + exit + ! + endif + ! + enddo + ! + end subroutine + + subroutine read_line(line0, keystr, valstr) + ! + ! Reads line from input file, returns keyword and value strings + ! + character(*), intent(in) :: line0 + character(len=256) :: line + character(*), intent(out) :: keystr + character(*), intent(out) :: valstr + integer j, ilen, jn + ! + keystr = '' + valstr = '' + ! + ! Change tabs into spaces. + ! + call notabs(line0, line, ilen) + ! + ! Look for line ending character. Remove it if it exists. + ! + jn = index(line, '\r') + ! + if (jn > 0) then + ! + ! New line character detected (probably sfincs.inp with windows line endings, running in linux) + ! + line = line(1 : jn - 1) + ! + endif + ! + ! Remove leading and trailing spaces. + ! + line = trim(line) + ! + if (line(1:1) == '#' .or. line(1:1) == '!' .or. line(1:1) == '@') return + ! + ! Find "=" + ! + j = index(line, '=') + ! + if (j == 0) return + ! + keystr = trim(line(1:j-1)) + ! + valstr = trim(line(j+1:)) + ! + ! Remove comments + ! + jn = index(valstr, '#') + ! + if (jn > 0) then + ! + valstr = trim(valstr(1 : jn - 1)) + ! + endif + ! + valstr = adjustl(trim(valstr)) + ! + end subroutine + + + subroutine notabs(INSTR,OUTSTR,ILEN) + ! @(#) convert tabs in input to spaces in output while maintaining columns, assuming a tab is set every 8 characters + ! + ! USES: + ! It is often useful to expand tabs in input files to simplify further processing such as tokenizing an input line. + ! Some FORTRAN compilers hate tabs in input files; some printers; some editors will have problems with tabs + ! AUTHOR: + ! John S. Urban + ! + ! SEE ALSO: + ! GNU/Unix commands expand(1) and unexpand(1) + ! + use ISO_FORTRAN_ENV, only : ERROR_UNIT ! get unit for standard error. if not supported yet, define ERROR_UNIT for your system (typically 0) + character(len=*),intent(in) :: INSTR ! input line to scan for tab characters + character(len=*),intent(out) :: OUTSTR ! tab-expanded version of INSTR produced + integer,intent(out) :: ILEN ! column position of last character put into output string + + integer,parameter :: TABSIZE=8 ! assume a tab stop is set every 8th column + character(len=1) :: c ! character read from stdin + integer :: ipos ! position in OUTSTR to put next character of INSTR + integer :: lenin ! length of input string trimmed of trailing spaces + integer :: lenout ! number of characters output string can hold + integer :: i10 ! counter that advances thru input string INSTR one character at a time + ! + IPOS=1 ! where to put next character in output string OUTSTR + lenin=len(INSTR) ! length of character variable INSTR + lenin=len_trim(INSTR(1:lenin)) ! length of INSTR trimmed of trailing spaces + lenout=len(OUTSTR) ! number of characters output string OUTSTR can hold + OUTSTR=" " ! this SHOULD blank-fill string, a buggy machine required a loop to set all characters + ! + do i10=1,lenin ! look through input string one character at a time + c=INSTR(i10:i10) + if(ichar(c) == 9)then ! test if character is a tab (ADE (ASCII Decimal Equivalent) of tab character is 9) + IPOS = IPOS + (TABSIZE - (mod(IPOS-1,TABSIZE))) + else ! c is anything else other than a tab insert it in output string + if(IPOS > lenout)then + write(ERROR_UNIT,*)"*notabs* output string overflow" + exit + else + OUTSTR(IPOS:IPOS)=c + IPOS=IPOS+1 + endif + endif + enddo + ! + ILEN=len_trim(OUTSTR(:IPOS)) ! trim trailing spaces + return + ! + end subroutine notabs + + +end module diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index b7eab1708..3c94a7bd0 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -587,6 +587,7 @@ subroutine read_snapwave_input() ! Reads snapwave data from sfincs.inp ! use snapwave_data + use sfincs_read ! implicit none ! @@ -701,303 +702,7 @@ subroutine read_snapwave_input() restart = .true. coupled_to_sfincs = .true. ! - end subroutine + end subroutine read_snapwave_input - subroutine read_real_input(fileid,keyword,value,default) - ! - character(*), intent(in) :: keyword - character(len=256) :: keystr - character(len=256) :: valstr - character(len=256) :: line - integer, intent(in) :: fileid - real*4, intent(out) :: value - real*4, intent(in) :: default - integer j,stat,ilen - ! - value = default - ! - rewind(fileid) - ! - do while(.true.) - ! - read(fileid,'(a)',iostat = stat)line - ! - if (stat==-1) exit - ! - call read_line(line, keystr, valstr) - ! - if (trim(keystr)==trim(keyword)) then - ! - read(valstr,*)value - ! - exit - ! - endif - ! - enddo - ! - end subroutine - - subroutine read_real_array_input(fileid,keyword,value,default,nr) - ! - character(*), intent(in) :: keyword - character(len=256) :: keystr - character(len=256) :: valstr - character(len=256) :: line - integer, intent(in) :: fileid - integer, intent(in) :: nr - real*4, dimension(:), intent(out), allocatable :: value - real*4, intent(in) :: default - integer j,stat, m,ilen - ! - allocate(value(nr)) - ! - value = default - ! - rewind(fileid) - ! - do while(.true.) - ! - read(fileid,'(a)',iostat = stat)line - ! - if (stat==-1) exit - ! - call read_line(line, keystr, valstr) - ! - if (trim(keystr)==trim(keyword)) then - ! - read(valstr,*)(value(m), m = 1, nr) - ! - exit - ! - endif - ! - enddo - ! - end subroutine - - - subroutine read_int_input(fileid,keyword,value,default) - ! - character(*), intent(in) :: keyword - character(len=256) :: keystr - character(len=256) :: valstr - character(len=256) :: line - integer, intent(in) :: fileid - integer, intent(out) :: value - integer, intent(in) :: default - integer j,stat,ilen - ! - value = default - ! - rewind(fileid) - ! - do while(.true.) - ! - read(fileid,'(a)',iostat = stat)line - ! - if (stat==-1) exit - ! - call read_line(line, keystr, valstr) - ! - if (trim(keystr)==trim(keyword)) then - ! - read(valstr,*)value - ! - exit - ! - endif - ! - enddo - ! - end subroutine - - - subroutine read_char_input(fileid,keyword,value,default) - ! - character(*), intent(in) :: keyword - character(len=256) :: keystr0 - character(len=256) :: keystr - character(len=256) :: valstr - character(len=256) :: line - integer, intent(in) :: fileid - character(*), intent(in) :: default - character(*), intent(out) :: value - integer j,stat,ilen,jn - ! - value = default - ! - rewind(fileid) - ! - do while(.true.) - ! - read(fileid,'(a)',iostat = stat)line - ! - if (stat==-1) exit - ! - call read_line(line, keystr, valstr) - ! - if (trim(keystr)==trim(keyword)) then - ! - value = valstr - ! - exit - ! - endif - ! - enddo - ! - end subroutine - - subroutine read_logical_input(fileid,keyword,value,default) - ! - character(*), intent(in) :: keyword - character(len=256) :: keystr0 - character(len=256) :: keystr - character(len=256) :: valstr - character(len=256) :: line - integer, intent(in) :: fileid - logical, intent(in) :: default - logical, intent(out) :: value - integer j,stat,ilen - ! - value = default - ! - rewind(fileid) - ! - do while(.true.) - ! - read(fileid,'(a)',iostat = stat)line - ! - if (stat==-1) exit - ! - call read_line(line, keystr, valstr) - ! - if (trim(keystr)==trim(keyword)) then - ! - if (valstr(1:1) == '1' .or. valstr(1:1) == 'y' .or. valstr(1:1) == 'Y' .or. valstr(1:1) == 't' .or. valstr(1:1) == 'T') then - value = .true. - else - value = .false. - endif - ! - exit - ! - endif - ! - enddo - ! - end subroutine - - subroutine read_line(line0, keystr, valstr) - ! - ! Reads line from input file, returns keyword and value strings - ! - character(*), intent(in) :: line0 - character(len=256) :: line - character(*), intent(out) :: keystr - character(*), intent(out) :: valstr - integer j, ilen, jn - ! - keystr = '' - valstr = '' - ! - ! Change tabs into spaces. - ! - call notabs(line0, line, ilen) - ! - ! Look for line ending character. Remove it if it exists. - ! - jn = index(line, '\r') - ! - if (jn > 0) then - ! - ! New line character detected (probably sfincs.inp with windows line endings, running in linux) - ! - line = line(1 : jn - 1) - ! - endif - ! - ! Remove leading and trailing spaces. - ! - line = trim(line) - ! - if (line(1:1) == '#' .or. line(1:1) == '!' .or. line(1:1) == '@') return - ! - ! Find "=" - ! - j = index(line, '=') - ! - if (j == 0) return - ! - keystr = trim(line(1:j-1)) - ! - valstr = trim(line(j+1:)) - ! - ! Remove comments - ! - jn = index(valstr, '#') - ! - if (jn > 0) then - ! - valstr = trim(valstr(1 : jn - 1)) - ! - endif - ! - valstr = adjustl(trim(valstr)) - ! - end subroutine - - - subroutine notabs(INSTR,OUTSTR,ILEN) - ! @(#) convert tabs in input to spaces in output while maintaining columns, assuming a tab is set every 8 characters - ! - ! USES: - ! It is often useful to expand tabs in input files to simplify further processing such as tokenizing an input line. - ! Some FORTRAN compilers hate tabs in input files; some printers; some editors will have problems with tabs - ! AUTHOR: - ! John S. Urban - ! - ! SEE ALSO: - ! GNU/Unix commands expand(1) and unexpand(1) - ! - use ISO_FORTRAN_ENV, only : ERROR_UNIT ! get unit for standard error. if not supported yet, define ERROR_UNIT for your system (typically 0) - character(len=*),intent(in) :: INSTR ! input line to scan for tab characters - character(len=*),intent(out) :: OUTSTR ! tab-expanded version of INSTR produced - integer,intent(out) :: ILEN ! column position of last character put into output string - - integer,parameter :: TABSIZE=8 ! assume a tab stop is set every 8th column - character(len=1) :: c ! character read from stdin - integer :: ipos ! position in OUTSTR to put next character of INSTR - integer :: lenin ! length of input string trimmed of trailing spaces - integer :: lenout ! number of characters output string can hold - integer :: i10 ! counter that advances thru input string INSTR one character at a time - ! - IPOS=1 ! where to put next character in output string OUTSTR - lenin=len(INSTR) ! length of character variable INSTR - lenin=len_trim(INSTR(1:lenin)) ! length of INSTR trimmed of trailing spaces - lenout=len(OUTSTR) ! number of characters output string OUTSTR can hold - OUTSTR=" " ! this SHOULD blank-fill string, a buggy machine required a loop to set all characters - ! - do i10=1,lenin ! look through input string one character at a time - c=INSTR(i10:i10) - if(ichar(c) == 9)then ! test if character is a tab (ADE (ASCII Decimal Equivalent) of tab character is 9) - IPOS = IPOS + (TABSIZE - (mod(IPOS-1,TABSIZE))) - else ! c is anything else other than a tab insert it in output string - if(IPOS > lenout)then - write(ERROR_UNIT,*)"*notabs* output string overflow" - exit - else - OUTSTR(IPOS:IPOS)=c - IPOS=IPOS+1 - endif - endif - enddo - ! - ILEN=len_trim(OUTSTR(:IPOS)) ! trim trailing spaces - return - ! - end subroutine notabs - end module From 2227188c2435a6c51029279af4a733ba276e5717 Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 25 Mar 2026 10:20:00 +0100 Subject: [PATCH 046/118] - Also in sfincs_spiderweb.f90 replace local read_real_input and read_int_input by use sfincs_read --- source/src/sfincs_spiderweb.f90 | 56 +-------------------------------- 1 file changed, 1 insertion(+), 55 deletions(-) diff --git a/source/src/sfincs_spiderweb.f90 b/source/src/sfincs_spiderweb.f90 index 2c0abb618..7e9e6818b 100644 --- a/source/src/sfincs_spiderweb.f90 +++ b/source/src/sfincs_spiderweb.f90 @@ -1,6 +1,7 @@ module sfincs_spiderweb use sfincs_log + use sfincs_read contains @@ -404,61 +405,6 @@ subroutine read_amuv_dimensions(filename,nt,nrows,ncols,x_llcorner,y_llcorner,dx ! end subroutine - - subroutine read_real_input(fileid,keyword,value,default) - ! - character(*), intent(in) :: keyword - character(len=256) :: keystr - character(len=256) :: valstr - character(len=256) :: line - integer, intent(in) :: fileid - real*4, intent(out) :: value - real*4, intent(in) :: default - integer j,stat - ! - value = default - rewind(fileid) - do while(.true.) - read(fileid,'(a)',iostat = stat)line - if (stat<0) exit - j=index(line,'=') - keystr = trim(line(1:j-1)) - if (trim(keystr)==trim(keyword)) then - valstr = trim(line(j+1:256)) - read(valstr,*)value - exit - endif - enddo - ! - end subroutine - - - subroutine read_int_input(fileid,keyword,value,default) - ! - character(*), intent(in) :: keyword - character(len=256) :: keystr - character(len=256) :: valstr - character(len=256) :: line - integer, intent(in) :: fileid - integer, intent(out) :: value - integer, intent(in) :: default - integer j,stat - ! - value = default - rewind(fileid) - do while(.true.) - read(fileid,'(a)',iostat = stat)line - if (stat<0) exit - j=index(line,'=') - keystr = trim(line(1:j-1)) - if (trim(keystr)==trim(keyword)) then - valstr = trim(line(j+1:256)) - read(valstr,*)value - exit - endif - enddo - ! - end subroutine subroutine compute_time_in_seconds(line,trefstr,dtsec) From 6b006a3383da25b85518c512de84355acf09af30 Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 25 Mar 2026 10:58:49 +0100 Subject: [PATCH 047/118] - add posibility to inspect snapwave grid as in PR jre/snapwave_sfincs --- source/sfincs_lib/sfincs_lib.vfproj | 5 +- source/src/Makefile.am | 3 +- source/src/sfincs_snapwave.f90 | 1 + source/src/snapwave/snapwave_data.f90 | 1 + source/src/snapwave/snapwave_domain.f90 | 11 ++ source/src/snapwave/snapwave_ncoutput.F90 | 140 ++++++++++++++++++++++ 6 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 source/src/snapwave/snapwave_ncoutput.F90 diff --git a/source/sfincs_lib/sfincs_lib.vfproj b/source/sfincs_lib/sfincs_lib.vfproj index 57d511c7d..f02568835 100644 --- a/source/sfincs_lib/sfincs_lib.vfproj +++ b/source/sfincs_lib/sfincs_lib.vfproj @@ -35,7 +35,8 @@ - + + @@ -45,6 +46,8 @@ + + diff --git a/source/src/Makefile.am b/source/src/Makefile.am index 58a18d6d0..fd89f2055 100644 --- a/source/src/Makefile.am +++ b/source/src/Makefile.am @@ -26,7 +26,8 @@ libsfincs_la_SOURCES = \ sfincs_quadtree.f90 \ snapwave/interp.F90 \ snapwave/snapwave_data.f90 \ - snapwave/snapwave_ncinput.F90 \ + snapwave/snapwave_ncinput.F90 \ + snapwave/snapwave_ncoutput.F90 \ snapwave/snapwave_infragravity.f90 \ snapwave/snapwave_boundaries.f90 \ snapwave/snapwave_date.f90 \ diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index 3c94a7bd0..2ea60004b 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -659,6 +659,7 @@ subroutine read_snapwave_input() call read_char_input(500,'snapwave_depfile',depfile,'none') call read_char_input(500,'snapwave_ncfile', gridfile,'snapwave_net.nc') call read_char_input(500,'netsnapwavefile',netsnapwavefile,'') + call read_logical_input(500,'storesnapwavegrid',storesnapwavegrid,.false.) call read_char_input(500,'tref',trefstr,'20000101 000000') ! Read again > needed in sfincs_ncinput.F90 ! close(500) diff --git a/source/src/snapwave/snapwave_data.f90 b/source/src/snapwave/snapwave_data.f90 index 7f6c8230f..5a35cd0fe 100644 --- a/source/src/snapwave/snapwave_data.f90 +++ b/source/src/snapwave/snapwave_data.f90 @@ -281,6 +281,7 @@ module snapwave_data ! logical :: restart logical :: coupled_to_sfincs + logical :: storesnapwavegrid ! integer :: nr_quadtree_points ! diff --git a/source/src/snapwave/snapwave_domain.f90 b/source/src/snapwave/snapwave_domain.f90 index 9a04534f7..5b186aa4d 100644 --- a/source/src/snapwave/snapwave_domain.f90 +++ b/source/src/snapwave/snapwave_domain.f90 @@ -8,6 +8,7 @@ subroutine initialize_snapwave_domain() ! use snapwave_data use snapwave_boundaries + use snapwave_ncoutput use interp use sfincs_error ! @@ -21,6 +22,7 @@ subroutine initialize_snapwave_domain() integer*4 :: idummy character*2 :: ext logical :: generate_upw, exists + character(len=256) :: snapwave_ncfname ! real*8 :: xmn, ymn ! ! First set some constants @@ -83,6 +85,15 @@ subroutine initialize_snapwave_domain() if (face_nodes(4,k)==0) face_nodes(4,k) = -999 enddo ! + ! write mesh to file + if (storesnapwavegrid) then + ! + snapwave_ncfname = 'snapwavegrid.nc' + ! + call write_snapwave_mesh(snapwave_ncfname, sferic == 1) + ! + endif + ! ! Done with the mesh ! ! keep on also if ja_vegetation==0, so array Dveg is initialized with zeroes diff --git a/source/src/snapwave/snapwave_ncoutput.F90 b/source/src/snapwave/snapwave_ncoutput.F90 new file mode 100644 index 000000000..bd2710fb0 --- /dev/null +++ b/source/src/snapwave/snapwave_ncoutput.F90 @@ -0,0 +1,140 @@ +#define NF90(nf90call) call handle_err(nf90call,__FILE__,__LINE__) +module snapwave_ncoutput + ! + use sfincs_log + use netcdf + ! + implicit none + ! + contains + ! + subroutine write_snapwave_mesh(fname, crsgeo) + ! + use snapwave_data + ! + implicit none + ! + character(len=256), intent(in) :: fname + logical, intent(in) :: crsgeo + ! + integer :: ncid + integer :: nmesh2d_node_dimid, nmesh2d_face_dimid, max_nmesh2d_face_nodes_dimid + integer :: mesh2d_varid + integer :: mesh2d_node_x_varid, mesh2d_node_y_varid, crs_varid + integer :: mesh2d_face_nodes_varid + integer :: zb_varid + ! + integer, parameter :: nc_deflate_level = 2 + real*4, parameter :: FILL_VALUE = -99999.0 + ! + ! dimensions + NF90(nf90_create(trim(fname), ior(NF90_CLOBBER, NF90_NETCDF4), ncid)) + NF90(nf90_def_dim(ncid, 'nmesh2d_node', no_nodes, nmesh2d_node_dimid)) + NF90(nf90_def_dim(ncid, 'nmesh2d_face', no_faces, nmesh2d_face_dimid)) + NF90(nf90_def_dim(ncid, 'max_nmesh2d_face_nodes', 4, max_nmesh2d_face_nodes_dimid)) + ! + ! global attributes + NF90(nf90_put_att(ncid,nf90_global, "Conventions", "Conventions = 'CF-1.8 UGRID-1.0 Deltares-0.10'")) + NF90(nf90_put_att(ncid,nf90_global, "Build-Revision-Date-Netcdf-library", trim(nf90_inq_libvers()))) + NF90(nf90_put_att(ncid,nf90_global, "Producer", "SFINCS model: Super-Fast INundation of CoastS")) + NF90(nf90_put_att(ncid,nf90_global, "Build-Revision", trim(build_revision))) + NF90(nf90_put_att(ncid,nf90_global, "Build-Date", trim(build_date))) + NF90(nf90_put_att(ncid,nf90_global, "title", "Snapwave grid")) + ! + ! mesh topology + NF90(nf90_def_var(ncid, 'mesh2d', NF90_INT, mesh2d_varid)) + NF90(nf90_put_att(ncid, mesh2d_varid, 'cf_role', 'mesh_topology')) + NF90(nf90_put_att(ncid, mesh2d_varid, 'long_name', 'Topology data of 2D network')) + NF90(nf90_put_att(ncid, mesh2d_varid, 'topology_dimension', 2)) + NF90(nf90_put_att(ncid, mesh2d_varid, 'node_coordinates', 'mesh2d_node_x mesh2d_node_y')) + NF90(nf90_put_att(ncid, mesh2d_varid, 'node_dimension', 'nmesh2d_node')) + NF90(nf90_put_att(ncid, mesh2d_varid, 'max_face_nodes_dimension', 'max_nmesh2d_face_nodes')) + NF90(nf90_put_att(ncid, mesh2d_varid, 'face_node_connectivity', 'mesh2d_face_nodes')) + NF90(nf90_put_att(ncid, mesh2d_varid, 'face_dimension', 'nmesh2d_face')) + ! + if (crsgeo) then + ! + NF90(nf90_def_var(ncid, 'mesh2d_node_x', NF90_FLOAT, (/nmesh2d_node_dimid/), mesh2d_node_x_varid)) ! location of zb, zs etc. in cell centre + NF90(nf90_def_var_deflate(ncid, mesh2d_node_x_varid, 1, 1, nc_deflate_level)) + NF90(nf90_put_att(ncid, mesh2d_node_x_varid, 'units', 'degrees')) + NF90(nf90_put_att(ncid, mesh2d_node_x_varid, 'standard_name', 'longitude')) + NF90(nf90_put_att(ncid, mesh2d_node_x_varid, 'long_name', 'longitude')) + NF90(nf90_put_att(ncid, mesh2d_node_x_varid, 'mesh', 'mesh2d')) + NF90(nf90_put_att(ncid, mesh2d_node_x_varid, 'location', 'node')) + ! + NF90(nf90_def_var(ncid, 'mesh2d_node_y', NF90_FLOAT, (/nmesh2d_node_dimid/), mesh2d_node_y_varid)) ! location of zb, zs etc. in cell centre + NF90(nf90_def_var_deflate(ncid, mesh2d_node_y_varid, 1, 1, nc_deflate_level)) + NF90(nf90_put_att(ncid, mesh2d_node_y_varid, 'units', 'degrees')) + NF90(nf90_put_att(ncid, mesh2d_node_y_varid, 'standard_name', 'latitude')) + NF90(nf90_put_att(ncid, mesh2d_node_y_varid, 'long_name', 'latitude')) + NF90(nf90_put_att(ncid, mesh2d_node_y_varid, 'mesh', 'mesh2d')) + NF90(nf90_put_att(ncid, mesh2d_node_y_varid, 'location', 'node')) + ! + else + ! + NF90(nf90_def_var(ncid, 'mesh2d_node_x', NF90_DOUBLE, (/nmesh2d_node_dimid/), mesh2d_node_x_varid)) ! location of zb, zs etc. in cell centre + NF90(nf90_def_var_deflate(ncid, mesh2d_node_x_varid, 1, 1, nc_deflate_level)) + NF90(nf90_put_att(ncid, mesh2d_node_x_varid, 'units', 'm')) + NF90(nf90_put_att(ncid, mesh2d_node_x_varid, 'standard_name', 'projection_x_coordinate')) + NF90(nf90_put_att(ncid, mesh2d_node_x_varid, 'long_name', 'x-coordinate of mesh nodes')) + NF90(nf90_put_att(ncid, mesh2d_node_x_varid, 'mesh', 'mesh2d')) + NF90(nf90_put_att(ncid, mesh2d_node_x_varid, 'location', 'node')) + ! + NF90(nf90_def_var(ncid, 'mesh2d_node_y', NF90_DOUBLE, (/nmesh2d_node_dimid/), mesh2d_node_y_varid)) ! location of zb, zs etc. in cell centre + NF90(nf90_def_var_deflate(ncid, mesh2d_node_y_varid, 1, 1, nc_deflate_level)) + NF90(nf90_put_att(ncid, mesh2d_node_y_varid, 'units', 'm')) + NF90(nf90_put_att(ncid, mesh2d_node_y_varid, 'standard_name', 'projection_y_coordinate')) + NF90(nf90_put_att(ncid, mesh2d_node_y_varid, 'long_name', 'y-coordinate of mesh nodes')) + NF90(nf90_put_att(ncid, mesh2d_node_y_varid, 'mesh', 'mesh2d')) + NF90(nf90_put_att(ncid, mesh2d_node_y_varid, 'location', 'node')) + ! + endif + ! + NF90(nf90_def_var(ncid, 'mesh2d_face_nodes', NF90_INT, (/max_nmesh2d_face_nodes_dimid, nmesh2d_face_dimid/), mesh2d_face_nodes_varid)) ! location of zb, zs etc. in cell centre + NF90(nf90_def_var_deflate(ncid, mesh2d_face_nodes_varid, 1, 1, nc_deflate_level)) + NF90(nf90_put_att(ncid, mesh2d_face_nodes_varid, 'cf_role', 'face_node_connectivity')) + NF90(nf90_put_att(ncid, mesh2d_face_nodes_varid, 'mesh', 'mesh2d')) + NF90(nf90_put_att(ncid, mesh2d_face_nodes_varid, 'location', 'face')) + NF90(nf90_put_att(ncid, mesh2d_face_nodes_varid, 'long_name', 'Mapping from every face to its corner nodes (counterclockwise)')) + NF90(nf90_put_att(ncid, mesh2d_face_nodes_varid, 'start_index', 1)) + NF90(nf90_put_att(ncid, mesh2d_face_nodes_varid, '_FillValue', -999)) + ! + NF90(nf90_def_var(ncid, 'crs', NF90_INT, crs_varid)) ! For EPSG code + NF90(nf90_put_att(ncid, crs_varid, 'EPSG', '-')) + ! + NF90(nf90_def_var(ncid, 'mesh2d_node_z', NF90_FLOAT, (/nmesh2d_node_dimid/), zb_varid)) ! bed level in cell centre + NF90(nf90_def_var_deflate(ncid, zb_varid, 1, 1, nc_deflate_level)) + NF90(nf90_put_att(ncid, zb_varid, '_FillValue', FILL_VALUE)) + NF90(nf90_put_att(ncid, zb_varid, 'units', 'm')) + NF90(nf90_put_att(ncid, zb_varid, 'standard_name', 'altitude')) + NF90(nf90_put_att(ncid, zb_varid, 'long_name', 'bed_level_above_reference_level')) + ! + NF90(nf90_enddef(ncid)) + ! + ! put variables + NF90(nf90_put_var(ncid, mesh2d_node_x_varid, x)) ! write node x + NF90(nf90_put_var(ncid, mesh2d_node_y_varid, y)) ! write node y + NF90(nf90_put_var(ncid, mesh2d_face_nodes_varid, face_nodes)) + NF90(nf90_put_var(ncid, zb_varid, zb)) + + ! close file + NF90(nf90_close(ncid)) + + end subroutine write_snapwave_mesh + + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + subroutine handle_err(status,file,line) + ! + integer, intent ( in) :: status + character(*), intent(in) :: file + integer, intent ( in) :: line + integer :: status2 + + if(status /= nf90_noerr) then + ! !UNIT=6 for stdout and UNIT=0 for stderr. + write(0,'("NETCDF ERROR: ",a,i6,":",a)') file,line,trim(nf90_strerror(status)) + end if + end subroutine handle_err + ! + end module \ No newline at end of file From 50b75da4a3a30bc79facf43723a6b334f9a7e605 Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 25 Mar 2026 11:00:26 +0100 Subject: [PATCH 048/118] - restart already fixed to true in sfincs_snapwave --- source/src/snapwave/snapwave_solver.f90 | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 2d492003f..2aee8e205 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -41,8 +41,6 @@ subroutine compute_wave_field() ! ee_ig = waveps ! - restart = 1 !TODO TL: CHECK > we need this turned on right now for IG... - ! endif ! ! Initialize wave period From fe0f275bfa31b0e8c4e7279db4d15c628efd88fa Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 25 Mar 2026 11:12:56 +0100 Subject: [PATCH 049/118] - Remove unused subroutine 'neuboundaries' that is replaced by neuboundaries_light --- source/src/snapwave/snapwave_domain.f90 | 54 ------------------------- 1 file changed, 54 deletions(-) diff --git a/source/src/snapwave/snapwave_domain.f90 b/source/src/snapwave/snapwave_domain.f90 index 5b186aa4d..b710f3864 100644 --- a/source/src/snapwave/snapwave_domain.f90 +++ b/source/src/snapwave/snapwave_domain.f90 @@ -850,60 +850,6 @@ subroutine neuboundaries_light(x, y, msk, no_nodes, neumannconnected) end subroutine neuboundaries_light - subroutine neuboundaries(x,y,no_nodes,xneu,yneu,n_neu,tol,neumannconnected) - ! - ! MvO: can this be removed ? - ! - implicit none - ! - integer, intent(in) :: no_nodes - integer, intent(in) :: n_neu - real*8, dimension(no_nodes), intent(in) :: x,y - real*8, dimension(n_neu), intent(in) :: xneu,yneu - real*4, intent(in) :: tol - integer, dimension(no_nodes), intent(out) :: neumannconnected - ! - integer :: ib,k,kmin, k2 - real*8 :: alpha, cosa,sina, distmin, x1,y1,x2,y2, xend - ! - neumannconnected=0 - do ib=1,n_neu-1 - if (xneu(ib).ne.-999.and.xneu(ib+1).ne.-999) then - alpha=atan2(yneu(ib+1)-yneu(ib),xneu(ib+1)-xneu(ib)) - cosa=cos(alpha) - sina=sin(alpha) - xend=(xneu(ib+1)-xneu(ib))*cosa+(yneu(ib+1)-yneu(ib))*sina - do k=1,no_nodes - x1= (x(k)-xneu(ib))*cosa+(y(k)-yneu(ib))*sina - y1=-(x(k)-xneu(ib))*sina+(y(k)-yneu(ib))*cosa - if (x1>=0.d0 .and. x1<=xend) then - if (abs(y1)0) then - neumannconnected(kmin)=k - write(logstr,*)kmin,k - call write_log(logstr, 0) - endif - endif - endif - enddo - endif - enddo - ! -end subroutine neuboundaries - subroutine read_snapwave_sfincs_mesh() ! From 79804e0b57f8b594e35924f9d49fb0df02867f38 Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 25 Mar 2026 11:28:27 +0100 Subject: [PATCH 050/118] - Add back some description --- source/src/snapwave/snapwave_solver.f90 | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 2aee8e205..3f87afd70 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -551,6 +551,8 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! if (sweep == 1 .or. iterative_srcig) then ! + ! Determining of IG source term as defined in Leijnse et al. 2024 + ! call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, cg_ig, nwav, depth, zb, H, & ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, & alphaig_local, beta_local, srcig_local) @@ -616,8 +618,6 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! enddo ! - ! Fill DoverE - ! ! Bottom friction ! uorbi = 0.5 * sig(k) * Hk / sinhkh(k) @@ -1094,6 +1094,13 @@ end subroutine baldock subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) + ! + ! Determining of IG source term as defined in Leijnse et al. 2024 + ! + ! inout: alphaig_local, srcig_local, eeprev, eeprev_ig, cgprev, beta_local + ! in: the rest + ! + ! NOTE - This is based on the energy in the precious SnapWave timestep 'ee' and 'ee_ig', and waveheight 'H', which should therefore be made available. ! implicit none ! From cab2d6ef1969299a2352aba550b46a2ba320694c Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 25 Mar 2026 11:30:16 +0100 Subject: [PATCH 051/118] - Bugfix, actually update Hk so it is used in IG bottom friction determination --- source/src/snapwave/snapwave_solver.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 3f87afd70..a34ba7eaa 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -770,7 +770,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Update Hk (because used in bottom friction) ! - H(k) = sqrt(8 * sum(ee(:, k)) * dtheta / rho / g) + Hk = sqrt(8 * sum(ee(:, k)) * dtheta / rho / g) ! ! Bottom friction Henderson and Bowen (2002) - D = 0.015*rhow*(9.81/depth(k))**1.5*(Hk/sqrt(8.0))*Hk_ig**2/8 ! From fe4d7603a602caa439a3a71806662e6e6ce32c91 Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 25 Mar 2026 13:15:37 +0100 Subject: [PATCH 052/118] - Preprocess snapwave_ncoutput --- source/sfincs_lib/sfincs_lib.vfproj | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/source/sfincs_lib/sfincs_lib.vfproj b/source/sfincs_lib/sfincs_lib.vfproj index f02568835..1c7d2040d 100644 --- a/source/sfincs_lib/sfincs_lib.vfproj +++ b/source/sfincs_lib/sfincs_lib.vfproj @@ -32,12 +32,14 @@ - + + - + + @@ -47,10 +49,17 @@ + + + + + + - + + @@ -70,7 +79,8 @@ - + + @@ -93,7 +103,8 @@ - + + From 3811c9008189c1908ae662d514fa7f23abfc81ca Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 25 Mar 2026 13:38:14 +0100 Subject: [PATCH 053/118] - Comment --- source/src/sfincs_snapwave.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index 2ea60004b..62b041c6f 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -596,7 +596,7 @@ subroutine read_snapwave_input() ! Input section ! call read_real_input(500,'snapwave_gamma',gamma,0.7) - call read_real_input(500,'snapwave_gammax',gammax,2.0) + call read_real_input(500,'snapwave_gammax',gammax,2.0) ! MvO - Changed default gammax from 0.6 to 2.0 call read_real_input(500,'snapwave_alpha',alpha,1.0) call read_real_input(500,'snapwave_hmin',hmin,0.1) call read_real_input(500,'snapwave_fw',fw0,0.01) @@ -604,7 +604,7 @@ subroutine read_snapwave_input() call read_real_input(500,'snapwave_dt',dt,36000.0) call read_real_input(500,'snapwave_tol',tol,1000.0) call read_real_input(500,'snapwave_dtheta',dtheta,10.0) - call read_real_input(500,'snapwave_crit',crit,0.00001) !TL: Old default was 0.01 + call read_real_input(500,'snapwave_crit',crit,0.00001) !TL: Old default was 0.01 > main is 0.001 call read_int_input(500,'snapwave_nrsweeps',nr_sweeps,4) call read_int_input(500,'snapwave_niter',niter, 10) !TL: Old default was 40 !call read_int_input(500,'snapwave_baldock_opt',baldock_opt,1) @@ -647,7 +647,7 @@ subroutine read_snapwave_input() call read_int_input(500, 'vegetation', vegetation_opt, 0) ! ! Input files - call read_char_input(500,'snapwave_jonswapfile',snapwave_jonswapfile,'') + call read_char_input(500,'snapwave_jonswapfile',snapwave_jonswapfile,'noe') call read_char_input(500,'snapwave_bndfile',snapwave_bndfile,'') call read_char_input(500,'snapwave_encfile',snapwave_encfile,'') call read_char_input(500,'snapwave_bhsfile',snapwave_bhsfile,'') From d2a20c3a952ec4c90efa5665801be205bdda42ae Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 25 Mar 2026 13:40:42 +0100 Subject: [PATCH 054/118] - Keep snapwave_crit= 0.001 as default as in main --- source/src/sfincs_snapwave.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index 4f6b19ebf..78ca6da35 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -621,7 +621,7 @@ subroutine read_snapwave_input() call read_real_input(500,'snapwave_dt',dt,36000.0) call read_real_input(500,'snapwave_tol',tol,1000.0) call read_real_input(500,'snapwave_dtheta',dtheta,10.0) - call read_real_input(500,'snapwave_crit',crit,0.00001) !TL: Old default was 0.01 > main is 0.001 + call read_real_input(500,'snapwave_crit',crit,0.001) call read_int_input(500,'snapwave_nrsweeps',nr_sweeps,4) call read_int_input(500,'snapwave_niter',niter, 10) !TL: Old default was 40 !call read_int_input(500,'snapwave_baldock_opt',baldock_opt,1) From b89c80291c52c03fcde00e5c94626a750017afcf Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 25 Mar 2026 17:37:18 +0100 Subject: [PATCH 055/118] - make (:,k) to (:, k) consistently, everywhere I hope --- source/src/snapwave/snapwave_solver.f90 | 39 +++++++++++++------------ 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index f495191f0..be0770020 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -518,9 +518,9 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! sig(k) = sig(kn) Tp(k) = 2 * pi / sig(kn) - WsorE(:,k) = WsorE(:,kn) - WsorA(:,k) = WsorA(:,kn) - aa(:,k) = aa(:,kn) + WsorE(:, k) = WsorE(:, kn) + WsorA(:, k) = WsorA(:, kn) + aa(:, k) = aa(:, kn) ! endif ! @@ -645,7 +645,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! if (vegetation) then ! - call vegatt(sig(k), no_nodes, kwav(k), no_secveg, veg_ah(k,:), veg_bstems(k,:), veg_Nstems(k,:), veg_Cd(k,:), depth(k), rho, g, Hk, Dvegk) + call vegatt(sig(k), no_nodes, kwav(k), no_secveg, veg_ah(k, :), veg_bstems(k, :), veg_Nstems(k, :), veg_Cd(k, :), depth(k), rho, g, Hk, Dvegk) ! else ! @@ -691,10 +691,11 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! MvO: in compute_celerities, Hmx is computed again. Why? ! - call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) + call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:, k)) ! - call windinput(u10(k), rho, g, depth(k), ntheta, windspreadfac(:,k), Ek, Ak, cg(k), ee(:,k), aa(:,k), ds(:,k), WsorE(:,k), WsorA(:,k), jadcgdx) + call windinput(u10(k), rho, g, depth(k), ntheta, windspreadfac(:, k), Ek, Ak, cg(k), ee(:, k), aa(:, k), ds(:, k), WsorE(:, k), WsorA(:, k), jadcgdx) ! + ! initial conditions are not equal to bc conditions DwT = - c_dispT / (1.0 - ndissip) * (2 * pi) / sig(k)**2 * cg(k) * kwav(k) * DoverE(k) DwAk = 1.0 / 2.0 / pi * (E(k) * DwT + 2.0 * pi * Ak * DoverE(k) ) ! @@ -739,15 +740,15 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! endif ! - R(:) = R(:) + WsorE(:,k) - R_aa(:) = R_aa(:) + WsorA(:,k) + R(:) = R(:) + WsorE(:, k) + R_aa(:) = R_aa(:) + WsorA(:, k) ! - call solve_tridiag(A, B, C, R, ee(:,k), ntheta) - call solve_tridiag(A, B_aa, C, R_aa, aa(:,k), ntheta) + call solve_tridiag(A, B, C, R, ee(:, k), ntheta) + call solve_tridiag(A, B_aa, C, R_aa, aa(:, k), ntheta) ! ee(:, k) = max(ee(:, k), waveps) - aa(:,k) = max(aa(:,k), waveps / sigmax) - aa(:,k) = max(aa(:,k), waveps / sig(k)) + aa(:, k) = max(aa(:, k), waveps / sigmax) + aa(:, k) = max(aa(:, k), waveps / sig(k)) ! else ! @@ -762,7 +763,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! Limit incident energy with gammax ! depthlimfac = max(1.0, (sqrt(sum(ee(:, k)) * dtheta / rhog8) / (gammax * depth(k)) )**2.0) - ee(:,k) = ee(:,k) / depthlimfac + ee(:, k) = ee(:, k) / depthlimfac ! ! IG ! @@ -845,7 +846,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Solve tridiagonal system per point ! - call solve_tridiag(A_ig, B_ig, C_ig, R_ig, ee_ig(:,k), ntheta) + call solve_tridiag(A_ig, B_ig, C_ig, R_ig, ee_ig(:, k), ntheta) ee_ig(:, k) = max(ee_ig(:, k), 0.0) ! else @@ -857,7 +858,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! Limit IG energy with gammax ! depthlimfac = max(1.0, (sqrt(sum(ee_ig(:, k)) * dtheta / rhog8) / (gammax * depth(k)) )**2.0) - ee_ig(:, k) = ee_ig(:,k) / depthlimfac + ee_ig(:, k) = ee_ig(:, k) / depthlimfac ! endif ! @@ -866,7 +867,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ee(:, k) = 0.0 ! if (wind) then - aa(:,k) = 0.0 + aa(:, k) = 0.0 endif ! ee_ig(:, k) = 0.0 @@ -943,11 +944,11 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! average beta, alphaig, srcig over directions ! - betamean(k) = sum(beta_local(:,k)) / ntheta ! real mean + betamean(k) = sum(beta_local(:, k)) / ntheta ! real mean ! - alphaig(k) = sum(alphaig_local(:,k)) / ntheta ! real mean + alphaig(k) = sum(alphaig_local(:, k)) / ntheta ! real mean ! - srcig(k) = sum(srcig_local(:,k)) / ntheta ! real mean + srcig(k) = sum(srcig_local(:, k)) / ntheta ! real mean ! endif ! From 2c3a75f49eddf860973cb03642c8d748e64892fc Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 25 Mar 2026 18:02:44 +0100 Subject: [PATCH 056/118] - Try adding back missing stuff --- source/src/snapwave/snapwave_solver.f90 | 37 ++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index be0770020..480375a5c 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -688,12 +688,29 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! Solve tridiagonal system per point ! if (wind) then + ! + ! + Ak = sum(aaprev)*dtheta + ! + Ak = Ak/depthlimfac + ee(:,k) = ee(:,k) / depthlimfac + aa(:,k) = aa(:,k) / depthlimfac + sig(k) = Ek/Ak + sig(k) = max(sig(k),sigmin) + sig(k) = min(sig(k),sigmax) + Ak = Ek/sig(k) ! to avoid small T in windinput + aaprev=min(aaprev,eeprev/sigmin) + aaprev=max(aaprev,eeprev/sigmax) ! ! MvO: in compute_celerities, Hmx is computed again. Why? ! call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:, k)) ! - call windinput(u10(k), rho, g, depth(k), ntheta, windspreadfac(:, k), Ek, Ak, cg(k), ee(:, k), aa(:, k), ds(:, k), WsorE(:, k), WsorA(:, k), jadcgdx) + if (iter==1) then + call windinput(u10(k), rho, g, depth(k), ntheta, windspreadfac(:,k), Ek, Ak, cg(k), eeprev, aaprev, ds(:,k), WsorE(:,k), WsorA(:,k), jadcgdx) + else + call windinput(u10(k), rho, g, depth(k), ntheta, windspreadfac(:,k), Ek, Ak, cg(k), ee(:,k), aa(:,k), ds(:,k), WsorE(:,k), WsorA(:,k), jadcgdx) + endif ! ! initial conditions are not equal to bc conditions DwT = - c_dispT / (1.0 - ndissip) * (2 * pi) / sig(k)**2 * cg(k) * kwav(k) * DoverE(k) @@ -750,6 +767,24 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & aa(:, k) = max(aa(:, k), waveps / sigmax) aa(:, k) = max(aa(:, k), waveps / sig(k)) ! + Ek = sum(ee(:, k))*dtheta + Ak = sum(aa(:,k))*dtheta + ! + depthlimfac = max(1.0, (sqrt(Ek/rhog8)/(gammax*depth(k)))**2.0) + Hk = sqrt(Ek/rhog8/depthlimfac) + Ek = Ek/depthlimfac + Ak = Ak/depthlimfac + ee(:,k) = ee(:,k)/depthlimfac + aa(:,k) = aa(:,k)/depthlimfac + ! + sig(k) = Ek/Ak + sig(k) = max(sig(k),sigmin) + sig(k) = min(sig(k),sigmax) + call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) + if (sig(k)<0.1) then + a=1 + endif + ! else ! ! Solve tridiagonal system per point From b6f533837496a1bd2a3680c760c610b87c99c17f Mon Sep 17 00:00:00 2001 From: Maarten van Ormondt Date: Fri, 27 Mar 2026 00:45:27 +0100 Subject: [PATCH 057/118] tmp --- source/src/snapwave/snapwave_solver.f90 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 480375a5c..d769692a8 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -699,6 +699,8 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & sig(k) = max(sig(k),sigmin) sig(k) = min(sig(k),sigmax) Ak = Ek/sig(k) ! to avoid small T in windinput + if (k==6) write(*,'(3i8,20f10.3)')k,k1,k2,sig(k),Ek,Ak + aaprev=min(aaprev,eeprev/sigmin) aaprev=max(aaprev,eeprev/sigmax) ! @@ -780,6 +782,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & sig(k) = Ek/Ak sig(k) = max(sig(k),sigmin) sig(k) = min(sig(k),sigmax) + if (k==6) write(*,'(3i8,20f10.3)')k,k1,k2,sig(k),Ek,Ak call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) if (sig(k)<0.1) then a=1 From 1782de6c1c953507c4ad81232fdf769e18772b52 Mon Sep 17 00:00:00 2001 From: Maarten van Ormondt Date: Fri, 27 Mar 2026 00:53:27 +0100 Subject: [PATCH 058/118] tmp --- source/src/snapwave/snapwave_solver.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index d769692a8..92ae3e157 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -699,7 +699,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & sig(k) = max(sig(k),sigmin) sig(k) = min(sig(k),sigmax) Ak = Ek/sig(k) ! to avoid small T in windinput - if (k==6) write(*,'(3i8,20f10.3)')k,k1,k2,sig(k),Ek,Ak + if (k==6) write(*,'(3i8,20f10.3)')k,k1,k2,sig(k),Ek,Ak,Hk aaprev=min(aaprev,eeprev/sigmin) aaprev=max(aaprev,eeprev/sigmax) @@ -782,7 +782,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & sig(k) = Ek/Ak sig(k) = max(sig(k),sigmin) sig(k) = min(sig(k),sigmax) - if (k==6) write(*,'(3i8,20f10.3)')k,k1,k2,sig(k),Ek,Ak + if (k==6) write(*,'(3i8,20f10.3)')k,k1,k2,sig(k),Ek,Ak,Hk call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) if (sig(k)<0.1) then a=1 From 40e4a34c4b8f6c14827063c6be5f83707176eeba Mon Sep 17 00:00:00 2001 From: Maarten van Ormondt Date: Fri, 27 Mar 2026 14:09:34 +0100 Subject: [PATCH 059/118] making it work for wind --- source/src/snapwave/snapwave_solver.f90 | 660 +++++++++++------------- 1 file changed, 309 insertions(+), 351 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 92ae3e157..7691862e9 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -395,9 +395,13 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & if (dtheta < 0.0) dtheta = dtheta + 2*pi ! if (wind) then - sig = 2 * pi / Tpini + ! + sig = 2 * pi / Tpini + ! else - sig = 2 * pi / Tp + ! + sig = 2 * pi / Tp + ! endif ! oneoverdt = 1.0 / dt @@ -419,6 +423,20 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & WsorE = 0.0 WsorA = 0.0 Ak = waveps / sigmax + Tp = Tpini + ! + do k = 1, no_nodes + ! + sig(k) = 2 * pi / Tp(k) + sig(k) = min(max(sig(k), sigmin), sigmax) + ! + if (.not. inner(k)) then + aa(:, k) = max(ee(:, k), waveps) / sig(k) + endif + ! + call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) + ! + enddo ! endif ! @@ -461,8 +479,6 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! Start iteration ! do iter = 1, niter * 4 - ! - ! write(*,*)'iter=',iter ! sweep = mod(iter, 4) !TODO - TL: problem that we don't have option for sweep = 1 anymore? ! @@ -478,9 +494,9 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! if (ok(k) == 1) cycle ! - ee(:, k) = max(ee(:, k), waveps) + ee(:, k) = max(ee(:, k), waveps) ! - E(k) = sum(ee(:, k)) * dtheta + E(k) = sum(ee(:, k)) * dtheta H(k) = sqrt(8 * E(k) / rho / g) ! if (igwaves) then @@ -490,14 +506,6 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! endif ! - if (wind) then - ! - sig(k) = 2 * pi / Tp(k) - sig(k) = min(max(sig(k), sigmin), sigmax) - aa(:, k) = max(ee(:, k), waveps) / sig(k) - ! - endif - ! ! Set Neumann boundaries ! if (neumannconnected(k) /= 0) then @@ -524,8 +532,8 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! endif ! - Df(kn) = Df(kn) - Dw(kn) = Dw(kn) + Df(k) = Df(kn) + Dw(k) = Dw(kn) ! endif ! @@ -567,350 +575,300 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! k = indx(count, sweep) ! - if (inner(k)) then ! Regular point + ! Skip non-inner (boundary) nodes + ! + if (.not. inner(k)) cycle + ! + ! For nodes below minimum depth: zero out energy and skip + ! + if (depth(k) <= hmin) then ! - ! Set Ek, Hk, Ek_ig, Hk_ig and Ak + ee(:, k) = 0.0 + if (wind) aa(:, k) = 0.0 + ee_ig(:, k) = 0.0 + cycle ! - Ek = E(k) - Hk = H(k) + endif + ! + ! Skip nodes that have already converged + ! + if (ok(k) == 1) cycle + ! + ! Retrieve integrated quantities computed in the start-of-sweep pre-loop + ! + Ek = E(k) + Hk = H(k) + ! + if (igwaves) then + ! + Ek_ig = E_ig(k) + Hk_ig = H_ig(k) + ! + endif + ! + ! --- Step 1: Upwind energy, group velocity (and action for wind) ------------ + ! + do itheta = 1, ntheta + ! + k1 = prev(1, itheta, k) + k2 = prev(2, itheta, k) + ! + eeprev(itheta) = w(1, itheta, k) * ee(itheta, k1) + w(2, itheta, k) * ee(itheta, k2) + cgprev(itheta) = w(1, itheta, k) * cg(k1) + w(2, itheta, k) * cg(k2) ! if (igwaves) then - ! - Ek_ig = E_ig(k) - Hk_ig = H_ig(k) - ! - endif + eeprev_ig(itheta) = w(1, itheta, k) * ee_ig(itheta, k1) + w(2, itheta, k) * ee_ig(itheta, k2) + cgprev_ig(itheta) = w(1, itheta, k) * cg_ig(k1) + w(2, itheta, k) * cg_ig(k2) + endif ! if (wind) then - ! - Ak = Ek / sig(k) - ! + aaprev(itheta) = w(1, itheta, k) * aa(itheta, k1) + w(2, itheta, k) * aa(itheta, k2) + aaprev(itheta) = min(aaprev(itheta), eeprev(itheta) / sigmin) + aaprev(itheta) = max(aaprev(itheta), eeprev(itheta) / sigmax) endif ! - if (depth(k) > hmin) then - ! - if (ok(k) == 0) then ! Only perform computations on wet inner points that are not yet converged (ok=1) - ! - ! Get upwind data - ! - do itheta = 1, ntheta - ! - k1 = prev(1, itheta, k) - k2 = prev(2, itheta, k) - ! - eeprev(itheta) = w(1, itheta, k) * ee(itheta, k1) + w(2, itheta, k) * ee(itheta, k2) - cgprev(itheta) = w(1, itheta, k) * cg(k1) + w(2, itheta, k) * cg(k2) - ! - if (igwaves) then - ! - eeprev_ig(itheta) = w(1, itheta, k) * ee_ig(itheta, k1) + w(2, itheta, k) * ee_ig(itheta, k2) - cgprev_ig(itheta) = w(1, itheta, k) * cg_ig(k1) + w(2, itheta, k) * cg_ig(k2) - ! - endif - ! - if (wind) then - ! - aaprev(itheta) = w(1, itheta, k) * aa(itheta, k1) + w(2, itheta, k) * aa(itheta, k2) - aaprev(itheta) = min(aaprev(itheta), eeprev(itheta) / sigmin) - aaprev(itheta) = max(aaprev(itheta), eeprev(itheta) / sigmax) - ! - endif - ! - enddo - ! - ! Bottom friction - ! - uorbi = 0.5 * sig(k) * Hk / sinhkh(k) - Dfk = 0.28 * rho * fw(k) * uorbi**3 - ! - ! Wave breaking - ! - ! First check if wave breaking could occur based on Baldock criterion (Hk > baldock_ratio * Hmx(k)) - ! - if (Hk > baldock_ratio * Hmx(k)) then - ! - ! Baldock - ! - call baldock(rho, g, alfa, gamma, depth(k), Hk, 2 * pi / sig(k) , baldock_exponent, Dwk, Hmx(k)) - ! - else - ! - ! No breaking - ! - Dwk = 0.0 - ! - endif - ! - ! Vegetation - ! - if (vegetation) then - ! - call vegatt(sig(k), no_nodes, kwav(k), no_secveg, veg_ah(k, :), veg_bstems(k, :), veg_Nstems(k, :), veg_Cd(k, :), depth(k), rho, g, Hk, Dvegk) - ! - else - ! - Dvegk = 0.0 - ! - endif - ! - ! Use some under relaxation (unless relax_factor_DoverE is set to 1.0) - ! - DoverE(k) = (1.0 - relax_factor_DoverE) * DoverE(k) + relax_factor_DoverE * (Dwk + Dfk + Dvegk) / max(Ek, 1.0e-6) - ! - ! Store dissipation terms for output - ! - Df(k) = Dfk - Dw(k) = Dwk - Dveg(k) = Dvegk - ! - do itheta = 1, ntheta - ! - R(itheta) = oneoverdt*ee(itheta, k) + cgprev(itheta) * eeprev(itheta) / ds(itheta, k) - srcig_local(itheta, k) * shinc2ig * fdrspr - ! - enddo - ! - do itheta = 2, ntheta - 1 - ! - A(itheta) = -ctheta(itheta - 1, k) * oneover2dtheta - B(itheta) = oneoverdt + cg(k) / ds(itheta,k) + DoverE(k) - C(itheta) = ctheta(itheta + 1, k) * oneover2dtheta - ! - enddo - ! - A(1) = -ctheta(ntheta, k) * oneover2dtheta - B(1) = oneoverdt + cg(k) / ds(1,k) + DoverE(k) - C(1) = ctheta(2, k) * oneover2dtheta - ! - A(ntheta) = -ctheta(ntheta - 1, k) * oneover2dtheta - B(ntheta) = oneoverdt + cg(k) / ds(ntheta,k) + DoverE(k) - C(ntheta) = ctheta(1, k) * oneover2dtheta - ! - ! Solve tridiagonal system per point - ! - if (wind) then - ! - ! - Ak = sum(aaprev)*dtheta - ! - Ak = Ak/depthlimfac - ee(:,k) = ee(:,k) / depthlimfac - aa(:,k) = aa(:,k) / depthlimfac - sig(k) = Ek/Ak - sig(k) = max(sig(k),sigmin) - sig(k) = min(sig(k),sigmax) - Ak = Ek/sig(k) ! to avoid small T in windinput - if (k==6) write(*,'(3i8,20f10.3)')k,k1,k2,sig(k),Ek,Ak,Hk - - aaprev=min(aaprev,eeprev/sigmin) - aaprev=max(aaprev,eeprev/sigmax) - ! - ! MvO: in compute_celerities, Hmx is computed again. Why? - ! - call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:, k)) - ! - if (iter==1) then - call windinput(u10(k), rho, g, depth(k), ntheta, windspreadfac(:,k), Ek, Ak, cg(k), eeprev, aaprev, ds(:,k), WsorE(:,k), WsorA(:,k), jadcgdx) - else - call windinput(u10(k), rho, g, depth(k), ntheta, windspreadfac(:,k), Ek, Ak, cg(k), ee(:,k), aa(:,k), ds(:,k), WsorE(:,k), WsorA(:,k), jadcgdx) - endif - ! - ! initial conditions are not equal to bc conditions - DwT = - c_dispT / (1.0 - ndissip) * (2 * pi) / sig(k)**2 * cg(k) * kwav(k) * DoverE(k) - DwAk = 1.0 / 2.0 / pi * (E(k) * DwT + 2.0 * pi * Ak * DoverE(k) ) - ! - if (iter == 1) then - ! - DoverA(k) = DwAk / max(Ak, 1e-6) - ! - else - ! - DoverA(k) = (1.0 - relax_factor_DoverA) * DoverA(k) + relax_factor_DoverA * DwAk / max(Ak, 1.0e-6) - ! - endif - ! - do itheta = 2, ntheta - 1 - ! - B_aa(itheta) = oneoverdt + cg(k) / ds(itheta,k) + DoverA(k) - R_aa(itheta) = (oneoverdt) * aa(itheta, k) + cgprev(itheta) * aaprev(itheta) / ds(itheta, k) - ! - enddo - ! - if (ctheta(1, k) < 0) then - ! - B_aa(1) = oneoverdt - ctheta(1, k) / dtheta + cg(k) / ds(1, k) + DoverA(k) - R_aa(1) = (oneoverdt) * aa(1, k) + cgprev(1) * aaprev(1) / ds(1, k) - ! - else - ! - B_aa(1) = oneoverdt + cg(k) / ds(1, k) + DoverA(k) - R_aa(1) = (oneoverdt) * aa(1, k) + cgprev(1) * aaprev(1) / ds(1, k) - ! - endif - ! - if (ctheta(ntheta, k) > 0) then - ! - B_aa(ntheta) = oneoverdt + ctheta(ntheta, k) / dtheta + cg(k) / ds(ntheta, k) + DoverA(k) - R_aa(ntheta) = oneoverdt * aa(ntheta,k) + cgprev(ntheta) * aaprev(ntheta) / ds(ntheta, k) - ! - else - ! - B_aa(ntheta) = oneoverdt + cg(k) / ds(ntheta, k) + DoverA(k) - R_aa(ntheta) = (oneoverdt) * aa(ntheta,k) + cgprev(ntheta) * aaprev(ntheta) / ds(ntheta, k) - ! - endif - ! - R(:) = R(:) + WsorE(:, k) - R_aa(:) = R_aa(:) + WsorA(:, k) - ! - call solve_tridiag(A, B, C, R, ee(:, k), ntheta) - call solve_tridiag(A, B_aa, C, R_aa, aa(:, k), ntheta) - ! - ee(:, k) = max(ee(:, k), waveps) - aa(:, k) = max(aa(:, k), waveps / sigmax) - aa(:, k) = max(aa(:, k), waveps / sig(k)) - ! - Ek = sum(ee(:, k))*dtheta - Ak = sum(aa(:,k))*dtheta - ! - depthlimfac = max(1.0, (sqrt(Ek/rhog8)/(gammax*depth(k)))**2.0) - Hk = sqrt(Ek/rhog8/depthlimfac) - Ek = Ek/depthlimfac - Ak = Ak/depthlimfac - ee(:,k) = ee(:,k)/depthlimfac - aa(:,k) = aa(:,k)/depthlimfac - ! - sig(k) = Ek/Ak - sig(k) = max(sig(k),sigmin) - sig(k) = min(sig(k),sigmax) - if (k==6) write(*,'(3i8,20f10.3)')k,k1,k2,sig(k),Ek,Ak,Hk - call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) - if (sig(k)<0.1) then - a=1 - endif - ! - else - ! - ! Solve tridiagonal system per point - ! - call solve_tridiag(A, B, C, R, ee(:, k), ntheta) - ! - ee(:, k) = max(ee(:, k), waveps) - ! - endif ! wind - ! - ! Limit incident energy with gammax - ! - depthlimfac = max(1.0, (sqrt(sum(ee(:, k)) * dtheta / rhog8) / (gammax * depth(k)) )**2.0) - ee(:, k) = ee(:, k) / depthlimfac - ! - ! IG - ! - if (igwaves) then - ! - ! Update Hk (because used in bottom friction) - ! - Hk = sqrt(8 * sum(ee(:, k)) * dtheta / rho / g) - ! - ! Bottom friction Henderson and Bowen (2002) - D = 0.015*rhow*(9.81/depth(k))**1.5*(Hk/sqrt(8.0))*Hk_ig**2/8 - ! - Dfk_ig = fw_ig(k) * 0.0361 * (9.81 / depth(k))**1.5 * Hk * Ek_ig - ! - ! Dissipation of infragravity waves - ! - if (Hk_ig > baldock_ratio_ig * Hmx_ig(k)) then - ! - ! MvO: gamma_ig is not used in Baldock, on Hmx_ig ! - ! - call baldock(rho, g, alfa_ig, gamma_ig, depth(k), Hk_ig, T_ig(k), baldock_exponent, Dwk_ig, Hmx_ig(k)) - ! - else - ! - ! No wave breaking - ! - Dwk_ig = 0.0 - ! - endif - ! - ! Store dissipation terms for output - ! - Df_ig(k) = Dfk_ig - Dw_ig(k) = Dwk_ig - ! - ! Not using underrelaxation for IG dissipation for now, but we could add this if needed (relax_factor_DoverE_ig) - ! - DoverE_ig(k) = (Dwk_ig + Dfk_ig) / max(Ek_ig, 1.0e-6) - ! - do itheta = 1, ntheta - ! - R_ig(itheta) = oneoverdt*ee_ig(itheta, k) + cgprev_ig(itheta) * eeprev_ig(itheta) / ds(itheta, k) + srcig_local(itheta, k) * fdrspr - ! - enddo - ! - do itheta = 2, ntheta - 1 - ! - A_ig(itheta) = - ctheta_ig(itheta - 1, k) * oneover2dtheta - B_ig(itheta) = oneoverdt + cg_ig(k) / ds(itheta,k) + DoverE_ig(k) - C_ig(itheta) = ctheta_ig(itheta + 1, k) * oneover2dtheta - ! - enddo - ! - if (ctheta_ig(1,k) < 0) then - ! - A_ig(1) = 0.0 - B_ig(1) = oneoverdt - ctheta_ig(1, k) / dtheta + cg_ig(k) / ds(1, k) + DoverE_ig(k) - C_ig(1) = ctheta_ig(2, k) / dtheta - ! - else - ! - A_ig(1) = 0.0 - B_ig(1) = 1.0 / dt + cg_ig(k) / ds(1, k) + DoverE_ig(k) - C_ig(1) = 0.0 - ! - endif - ! - if (ctheta_ig(ntheta, k) > 0) then - ! - A_ig(ntheta) = -ctheta_ig(ntheta - 1, k) / dtheta - B_ig(ntheta) = oneoverdt + ctheta_ig(ntheta, k) / dtheta + cg_ig(k) / ds(ntheta, k) + DoverE_ig(k) - C_ig(ntheta) = 0.0 - ! - else - ! - A_ig(ntheta) = 0.0 - B_ig(ntheta) = oneoverdt + cg_ig(k) / ds(ntheta, k) + DoverE_ig(k) - C_ig(ntheta) = 0.0 - ! - endif - ! - ! Solve tridiagonal system per point - ! - call solve_tridiag(A_ig, B_ig, C_ig, R_ig, ee_ig(:, k), ntheta) - ee_ig(:, k) = max(ee_ig(:, k), 0.0) - ! - else - ! - ee_ig(:, k) = 0.0 - ! - endif - ! - ! Limit IG energy with gammax - ! - depthlimfac = max(1.0, (sqrt(sum(ee_ig(:, k)) * dtheta / rhog8) / (gammax * depth(k)) )**2.0) - ee_ig(:, k) = ee_ig(:, k) / depthlimfac - ! - endif - ! + enddo + ! + ! --- Step 2: Pre-solve sig and celerities from upwind Ek/Ak (wind only) ---- + ! + ! The upwind Ek/Ak provides the best pre-solve estimate of local sig, so that + ! both the ee and aa matrices are assembled with a consistent cg(k). + ! Post-solve, sig is updated from the solved Ek/Ak in Step 6. + ! + if (wind) then + ! + Ek = sum(eeprev) * dtheta + Ak = sum(aaprev) * dtheta + sig(k) = max(min(Ek / Ak, sigmax), sigmin) + Ak = Ek / sig(k) + aaprev = min(aaprev, eeprev / sigmin) + aaprev = max(aaprev, eeprev / sigmax) + call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, & + dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:, k)) + ! + endif + ! + ! --- Step 3: Source and sink terms ------------------------------------------ + ! + ! Bottom friction + ! + uorbi = 0.5 * sig(k) * Hk / sinhkh(k) + Dfk = 0.28 * rho * fw(k) * uorbi**3 + ! + ! Wave breaking (Baldock) + ! First check if wave breaking could occur based on Baldock criterion (Hk > baldock_ratio * Hmx(k)) + ! + if (Hk > baldock_ratio * Hmx(k)) then + ! + call baldock(rho, g, alfa, gamma, depth(k), Hk, 2 * pi / sig(k), baldock_exponent, Dwk, Hmx(k)) + ! + else + ! + ! No wave breaking according to Baldock criterion + ! + Dwk = 0.0 + ! + endif + ! + ! Vegetation + ! + if (vegetation) then + ! + call vegatt(sig(k), no_nodes, kwav(k), no_secveg, veg_ah(k, :), veg_bstems(k, :), & + veg_Nstems(k, :), veg_Cd(k, :), depth(k), rho, g, Hk, Dvegk) + ! + else + ! + Dvegk = 0.0 + ! + endif + ! + ! Energy dissipation ratio (with under-relaxation) + ! + DoverE(k) = (1.0 - relax_factor_DoverE) * DoverE(k) & + + relax_factor_DoverE * (Dwk + Dfk + Dvegk) / max(Ek, 1.0e-6) + ! + Df(k) = Dfk + Dw(k) = Dwk + Dveg(k) = Dvegk + ! + ! Wind source terms and action dissipation ratio DoverA (wind only) + ! + if (wind) then + ! + if (iter == 1) then + call windinput(u10(k), rho, g, depth(k), ntheta, windspreadfac(:, k), Ek, Ak, cg(k), & + eeprev, aaprev, ds(:, k), WsorE(:, k), WsorA(:, k), jadcgdx) else - ! - ee(:, k) = 0.0 - ! - if (wind) then - aa(:, k) = 0.0 - endif - ! - ee_ig(:, k) = 0.0 - ! - endif + call windinput(u10(k), rho, g, depth(k), ntheta, windspreadfac(:, k), Ek, Ak, cg(k), & + ee(:, k), aa(:, k), ds(:, k), WsorE(:, k), WsorA(:, k), jadcgdx) + endif + ! + DwT = -c_dispT / (1.0 - ndissip) * (2.0 * pi) / sig(k)**2 * cg(k) * kwav(k) * DoverE(k) + DwAk = 1.0 / (2.0 * pi) * (E(k) * DwT + 2.0 * pi * Ak * DoverE(k)) + ! + if (iter == 1) then + DoverA(k) = DwAk / max(Ak, 1.0e-6) + else + DoverA(k) = (1.0 - relax_factor_DoverA) * DoverA(k) & + + relax_factor_DoverA * DwAk / max(Ak, 1.0e-6) + endif + ! + endif + ! + ! --- Step 4: Assemble and solve energy balance (ee) ------------------------- + ! + do itheta = 1, ntheta + ! + R(itheta) = oneoverdt * ee(itheta, k) + cgprev(itheta) * eeprev(itheta) / ds(itheta, k) & + - srcig_local(itheta, k) * shinc2ig * fdrspr + ! + enddo + ! + do itheta = 2, ntheta - 1 + ! + A(itheta) = -ctheta(itheta - 1, k) * oneover2dtheta + B(itheta) = oneoverdt + cg(k) / ds(itheta, k) + DoverE(k) + C(itheta) = ctheta(itheta + 1, k) * oneover2dtheta + ! + enddo + ! + A(1) = - ctheta(ntheta, k) * oneover2dtheta + B(1) = oneoverdt + cg(k) / ds(1, k) + DoverE(k) + C(1) = ctheta(2, k) * oneover2dtheta + ! + A(ntheta) = -ctheta(ntheta - 1, k) * oneover2dtheta + B(ntheta) = oneoverdt + cg(k) / ds(ntheta, k) + DoverE(k) + C(ntheta) = ctheta(1, k) * oneover2dtheta + ! + if (wind) R(:) = R(:) + WsorE(:, k) + ! + call solve_tridiag(A, B, C, R, ee(:, k), ntheta) + ee(:, k) = max(ee(:, k), waveps) + ! + ! --- Step 5: Assemble and solve action balance (aa, wind only) --------------- + ! + ! A and C are the same as for ee (refraction terms don't change). + ! Only B_aa differs: DoverA instead of DoverE, plus upwind BC for ctheta endpoints. + ! + if (wind) then + ! + do itheta = 2, ntheta - 1 + B_aa(itheta) = oneoverdt + cg(k) / ds(itheta, k) + DoverA(k) + R_aa(itheta) = oneoverdt * aa(itheta, k) + cgprev(itheta) * aaprev(itheta) / ds(itheta, k) + enddo + ! + if (ctheta(1, k) < 0.0) then + B_aa(1) = oneoverdt - ctheta(1, k) / dtheta + cg(k) / ds(1, k) + DoverA(k) + else + B_aa(1) = oneoverdt + cg(k) / ds(1, k) + DoverA(k) + endif + ! + R_aa(1) = oneoverdt * aa(1, k) + cgprev(1) * aaprev(1) / ds(1, k) + ! + if (ctheta(ntheta, k) > 0.0) then + B_aa(ntheta) = oneoverdt + ctheta(ntheta, k) / dtheta + cg(k) / ds(ntheta, k) + DoverA(k) + else + B_aa(ntheta) = oneoverdt + cg(k) / ds(ntheta, k) + DoverA(k) + endif + ! + R_aa(ntheta) = oneoverdt * aa(ntheta, k) + cgprev(ntheta) * aaprev(ntheta) / ds(ntheta, k) + R_aa(:) = R_aa(:) + WsorA(:, k) + ! + call solve_tridiag(A, B_aa, C, R_aa, aa(:, k), ntheta) + ! + aa(:, k) = max(aa(:, k), waveps / sigmax) + aa(:, k) = max(aa(:, k), waveps / sig(k)) + ! + endif + ! + ! --- Step 6: Depth-limit energy (and action), update sig and celerities ----- + ! + Ek = sum(ee(:, k)) * dtheta + depthlimfac = max(1.0, (sqrt(Ek / rhog8) / (gammax * depth(k)))**2) + ee(:, k) = ee(:, k) / depthlimfac + ! + if (wind) then + ! + Ek = Ek / depthlimfac + Ak = sum(aa(:, k)) * dtheta + Ak = Ak / depthlimfac + aa(:, k) = aa(:, k) / depthlimfac + sig(k) = max(min(Ek / Ak, sigmax), sigmin) + ! + call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, & + dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:, k)) + ! + endif + ! + ! --- Step 7: IG wave balance (optional) ------------------------------------- + ! + if (igwaves) then + ! + ! Update incident Hk from post-solve ee (needed for IG bottom friction) + ! + Hk = sqrt(8.0 * sum(ee(:, k)) * dtheta / rho / g) + Dfk_ig = fw_ig(k) * 0.0361 * (9.81 / depth(k))**1.5 * Hk * Ek_ig + ! + ! IG wave breaking (Baldock) + ! + if (Hk_ig > baldock_ratio_ig * Hmx_ig(k)) then + call baldock(rho, g, alfa_ig, gamma_ig, depth(k), Hk_ig, T_ig(k), baldock_exponent, Dwk_ig, Hmx_ig(k)) + else + Dwk_ig = 0.0 + endif + ! + Df_ig(k) = Dfk_ig + Dw_ig(k) = Dwk_ig + DoverE_ig(k) = (Dwk_ig + Dfk_ig) / max(Ek_ig, 1.0e-6) + ! + ! IG RHS + ! + do itheta = 1, ntheta + R_ig(itheta) = oneoverdt * ee_ig(itheta, k) & + + cgprev_ig(itheta) * eeprev_ig(itheta) / ds(itheta, k) & + + srcig_local(itheta, k) * fdrspr + enddo + ! + ! IG matrix with directional boundary conditions + ! + do itheta = 2, ntheta - 1 + A_ig(itheta) = -ctheta_ig(itheta - 1, k) * oneover2dtheta + B_ig(itheta) = oneoverdt + cg_ig(k) / ds(itheta, k) + DoverE_ig(k) + C_ig(itheta) = ctheta_ig(itheta + 1, k) * oneover2dtheta + enddo + ! + if (ctheta_ig(1, k) < 0.0) then + A_ig(1) = 0.0 + B_ig(1) = oneoverdt - ctheta_ig(1, k) / dtheta + cg_ig(k) / ds(1, k) + DoverE_ig(k) + C_ig(1) = ctheta_ig(2, k) / dtheta + else + A_ig(1) = 0.0 + B_ig(1) = oneoverdt + cg_ig(k) / ds(1, k) + DoverE_ig(k) + C_ig(1) = 0.0 + endif + ! + if (ctheta_ig(ntheta, k) > 0.0) then + A_ig(ntheta) = -ctheta_ig(ntheta - 1, k) / dtheta + B_ig(ntheta) = oneoverdt + ctheta_ig(ntheta, k) / dtheta + cg_ig(k) / ds(ntheta, k) + DoverE_ig(k) + C_ig(ntheta) = 0.0 + else + A_ig(ntheta) = 0.0 + B_ig(ntheta) = oneoverdt + cg_ig(k) / ds(ntheta, k) + DoverE_ig(k) + C_ig(ntheta) = 0.0 + endif + ! + call solve_tridiag(A_ig, B_ig, C_ig, R_ig, ee_ig(:, k), ntheta) + ee_ig(:, k) = max(ee_ig(:, k), 0.0) + ! + ! Depth-limit IG energy + ! + depthlimfac = max(1.0, (sqrt(sum(ee_ig(:, k)) * dtheta / rhog8) / (gammax * depth(k)))**2) + ee_ig(:, k) = ee_ig(:, k) / depthlimfac + ! + else + ! + ee_ig(:, k) = 0.0 ! endif ! From ef31070c20f93395284a1467c28c78c5b2c87620 Mon Sep 17 00:00:00 2001 From: Maarten van Ormondt Date: Tue, 31 Mar 2026 11:31:36 +0200 Subject: [PATCH 060/118] removed second call to celerities --- source/src/snapwave/snapwave_solver.f90 | 26 +++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 7691862e9..62d4551d4 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -486,6 +486,8 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & sweep = 4 endif ! + !write(*,*)'iter:', iter, 'sweep:', sweep + ! ! At start of each sweep, compute E, H, E_ig and H_ig, and aa ! ! This loop can be parallelized ! @@ -788,18 +790,18 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & depthlimfac = max(1.0, (sqrt(Ek / rhog8) / (gammax * depth(k)))**2) ee(:, k) = ee(:, k) / depthlimfac ! - if (wind) then - ! - Ek = Ek / depthlimfac - Ak = sum(aa(:, k)) * dtheta - Ak = Ak / depthlimfac - aa(:, k) = aa(:, k) / depthlimfac - sig(k) = max(min(Ek / Ak, sigmax), sigmin) - ! - call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, & - dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:, k)) - ! - endif +! if (wind) then +! ! +! Ek = Ek / depthlimfac +! Ak = sum(aa(:, k)) * dtheta +! Ak = Ak / depthlimfac +! aa(:, k) = aa(:, k) / depthlimfac +! sig(k) = max(min(Ek / Ak, sigmax), sigmin) +! ! +! call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, & +! dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:, k)) +! ! +! endif ! ! --- Step 7: IG wave balance (optional) ------------------------------------- ! From 2934b8ed5443844d330464c81bc3f722601d8b9c Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 31 Mar 2026 13:49:58 +0200 Subject: [PATCH 061/118] - Bump version for clarity when testing --- source/src/sfincs_lib.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/src/sfincs_lib.f90 b/source/src/sfincs_lib.f90 index e9d528c4d..8a5f7aca7 100644 --- a/source/src/sfincs_lib.f90 +++ b/source/src/sfincs_lib.f90 @@ -94,8 +94,8 @@ function sfincs_initialize() result(ierr) ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! - build_revision = "$Rev: v2.3.2 mt. Faber+" - build_date = "$Date: 2026-03-25" + build_revision = "$Rev: v2.3.2 mt. Faber+branch:snapwave_domain_update" + build_date = "$Date: 2026-03-31" ! call write_log('', 1) call write_log('------------ Welcome to SFINCS ------------', 1) From fdd1ad7befe3733dcb5ef1b2800a840ae88312ba Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 1 Apr 2026 09:19:13 +0200 Subject: [PATCH 062/118] - Remove references to ig_opt 20+ in main solver --- source/src/snapwave/snapwave_solver.f90 | 57 +++++-------------------- 1 file changed, 10 insertions(+), 47 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 56ea24bb2..673f31234 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -670,11 +670,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! do itheta = 1, ntheta ! - if (ig_opt > 0 .and. ig_opt < 20) then - R(itheta) = oneoverdt*ee(itheta, k) + cgprev(itheta)*eeprev(itheta)/ds(itheta, k) - srcig_local(itheta, k) * shinc2ig - else - R(itheta) = oneoverdt*ee(itheta, k) + cgprev(itheta)*eeprev(itheta)/ds(itheta, k) - endif + R(itheta) = oneoverdt*ee(itheta, k) + cgprev(itheta)*eeprev(itheta)/ds(itheta, k) - srcig_local(itheta, k) * shinc2ig ! enddo ! @@ -682,11 +678,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! A(itheta) = -ctheta(itheta - 1, k)*oneover2dtheta ! - if (ig_opt > 0 .and. ig_opt < 20) then - B(itheta) = oneoverdt + cg(k)/ds(itheta,k) + DoverE(k) - else - B(itheta) = oneoverdt + cg(k)/ds(itheta,k) + DoverE(k) + srcig_local(itheta, k) * shinc2ig - endif + B(itheta) = oneoverdt + cg(k)/ds(itheta,k) + DoverE(k) ! C(itheta) = ctheta(itheta + 1, k)*oneover2dtheta ! @@ -698,13 +690,8 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & A(ntheta) = -ctheta(ntheta - 1, k)*oneover2dtheta C(ntheta) = ctheta(1, k)*oneover2dtheta ! - if (ig_opt > 0 .and. ig_opt < 20) then - B(1) = oneoverdt + cg(k)/ds(1,k) + DoverE(k) - B(ntheta) = oneoverdt + cg(k)/ds(ntheta,k) + DoverE(k) - else - B(1) = oneoverdt + cg(k)/ds(1,k) + DoverE(k) + srcig_local(1, k) * shinc2ig - B(ntheta) = oneoverdt + cg(k)/ds(ntheta,k) + DoverE(k) + srcig_local(ntheta, k) * shinc2ig - endif + B(1) = oneoverdt + cg(k)/ds(1,k) + DoverE(k) + B(ntheta) = oneoverdt + cg(k)/ds(ntheta,k) + DoverE(k) ! ! Solve tridiagonal system per point ! @@ -789,11 +776,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! do itheta = 1, ntheta ! - if (ig_opt > 0 .and. ig_opt < 20) then - R_ig(itheta) = oneoverdt*ee_ig(itheta, k) + cgprev_ig(itheta)*eeprev_ig(itheta)/ds(itheta, k) + srcig_local(itheta, k) - else - R_ig(itheta) = oneoverdt*ee_ig(itheta, k) + cgprev_ig(itheta)*eeprev_ig(itheta)/ds(itheta, k) - endif + R_ig(itheta) = oneoverdt*ee_ig(itheta, k) + cgprev_ig(itheta)*eeprev_ig(itheta)/ds(itheta, k) + srcig_local(itheta, k) ! enddo ! @@ -801,11 +784,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! A_ig(itheta) = -ctheta_ig(itheta - 1, k)*oneover2dtheta ! - if (ig_opt > 0 .and. ig_opt < 20) then - B_ig(itheta) = oneoverdt + cg_ig(k)/ds(itheta,k) + DoverE_ig(k) - else - B_ig(itheta) = oneoverdt + cg_ig(k)/ds(itheta,k) + DoverE_ig(k) - srcig_local(itheta, k) - endif + B_ig(itheta) = oneoverdt + cg_ig(k)/ds(itheta,k) + DoverE_ig(k) ! C_ig(itheta) = ctheta_ig(itheta + 1, k)*oneover2dtheta ! @@ -813,21 +792,13 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! if (ctheta_ig(1,k)<0) then A_ig(1) = 0.0 - if (ig_opt > 0 .and. ig_opt < 20) then - B_ig(1) = oneoverdt - ctheta_ig(1, k)/dtheta + cg_ig(k)/ds(1, k) + DoverE_ig(k) - else - B_ig(1) = oneoverdt - ctheta_ig(1, k)/dtheta + cg_ig(k)/ds(1, k) + DoverE_ig(k) - srcig_local(itheta, k) - endif + B_ig(1) = oneoverdt - ctheta_ig(1, k)/dtheta + cg_ig(k)/ds(1, k) + DoverE_ig(k) ! C_ig(1) = ctheta_ig(2, k)/dtheta else A_ig(1)=0.0 ! - if (ig_opt > 0 .and. ig_opt < 20) then - B_ig(1)=1.0/dt + cg_ig(k)/ds(1, k) + DoverE_ig(k) - else - B_ig(1)=1.0/dt + cg_ig(k)/ds(1, k) + DoverE_ig(k) - srcig_local(itheta, k) - endif + B_ig(1)=1.0/dt + cg_ig(k)/ds(1, k) + DoverE_ig(k) ! C_ig(1)=0.0 endif @@ -835,21 +806,13 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & if (ctheta_ig(ntheta, k)>0) then A_ig(ntheta) = -ctheta_ig(ntheta - 1, k)/dtheta ! - if (ig_opt > 0 .and. ig_opt < 20) then - B_ig(ntheta) = oneoverdt + ctheta_ig(ntheta, k)/dtheta + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) - else - B_ig(ntheta) = oneoverdt + ctheta_ig(ntheta, k)/dtheta + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) - srcig_local(itheta, k) - endif + B_ig(ntheta) = oneoverdt + ctheta_ig(ntheta, k)/dtheta + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) ! C_ig(ntheta) = 0.0 else A_ig(ntheta) = 0.0 ! - if (ig_opt > 0 .and. ig_opt < 20) then - B_ig(ntheta) = oneoverdt + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) - else - B_ig(ntheta) = oneoverdt + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) - srcig_local(itheta, k) - endif + B_ig(ntheta) = oneoverdt + cg_ig(k)/ds(ntheta, k) + DoverE_ig(k) ! C_ig(ntheta) = 0.0 endif From 596e42d64be7ec928efeed00fefe7a6288582118 Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 1 Apr 2026 09:39:29 +0200 Subject: [PATCH 063/118] - Remove cg_ig adjustment option - Remove some of the options - let ig_opt =1 &2 be the simple one without smooth srcig to 0 functions --- source/src/snapwave/snapwave_solver.f90 | 59 +++++++++++-------------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 673f31234..e0d5142d9 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1205,27 +1205,26 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! Adjust cg_ig for free infragravity waves release in surfzone ! TL - Note: cg_ig = cg - if (ig_opt == 3) then - ! - if (gam > (gamma_fac_br * gamma)) then - ! - cg_ig(k) = sqrt(9.81 * depth(k)) - ! - endif - ! - endif + !if (ig_opt == X) then + ! ! + ! if (gam > (gamma_fac_br * gamma)) then + ! ! + ! cg_ig(k) = sqrt(9.81 * depth(k)) + ! ! + ! endif + ! ! + !endif ! ! Determine dSxx and IG source/sink term 'srcig' ! - if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 11 .or. ig_opt == 12 .or. ig_opt == 13) then + if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 12 .or. ig_opt == 13) then ! ! Calculate shoaling parameter alpha_ig following Leijnse et al. (2024) ! if (ig_opt == 12 .or. ig_opt == 13) then ! - ! Limit beta to max 0.1 before going into alphaig parametrisation + ! Limit beta to max 0.07 (=beta_limit_1) before going into alphaig parametrisation ! - !beta_local(itheta,k) = min(beta_local(itheta,k), 0.07) beta_local(itheta,k) = min(beta_local(itheta,k), beta_limit_1) ! endif @@ -1241,7 +1240,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! else ! - if (ig_opt == 1 .or. ig_opt == 3 .or. ig_opt == 11 .or. ig_opt == 12 .or. ig_opt == 13) then ! Option using conservative shoaling for dSxx/dx + if (ig_opt == 1 .or. ig_opt == 12 .or. ig_opt == 13) then ! Option using conservative shoaling for dSxx/dx ! ! Calculate Sxx based on conservative shoaling of upwind point's energy: ! Sxx_cons = E(i-1) * Cg(i-1) / Cg * (2 * n(i) - 0.5) @@ -1257,37 +1256,33 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! dSxx = max(dSxx, 0.0) ! - if (ig_opt == 1 .or. ig_opt == 11 .or. ig_opt == 2 .or. ig_opt == 3 .or. ig_opt == 12 .or. ig_opt == 13) then - ! - ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy - ! NOTE - already here multiplied with ee(itheta,k), for direct inclusion in 'R'-term - srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) /max(E_local(k), 1.0e-6) * ee(itheta,k) - ! + !if (ig_opt == 1 .or. ig_opt == 2.or. ig_opt == 12 .or. ig_opt == 13) then + ! + ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy + ! NOTE - already here multiplied with ee(itheta,k), for direct inclusion in 'R'-term + srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) /max(E_local(k), 1.0e-6) * ee(itheta,k) + ! !elseif (ig_opt == 20) then ! ! NOTE - in main script this is multiplied with ee(itheta,k) to get directional energy, for direct inclusion in 'B'-term ! !srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) /max(E_local(k), 1.0e-6) !* ee(itheta,k) - endif + !endif ! ! Limit srcig to 0 after waves start (significantly) breaking, as defined here as gam=Hrms,inc / h > (gamma_fac_br * gamma) ! ! Ergo, it is assumed that after this point IG waves are free, and no bound wave forcing is happening anymore, so srcig should be 0 from here on ! - if (ig_opt == 11 .or. ig_opt == 2 .or. ig_opt == 3) then - ! - ! Free waves and no IG source/sink term if incident waves start breaking - ! - ! Note - gam is in Hrms - if (gam > (gamma_fac_br * gamma)) then - ! - srcig_local(itheta, k) = 0.0 - ! - endif - ! - elseif (ig_opt == 1 .or. ig_opt == 12) then + if (ig_opt == 12) then ! ! Let srcig transition to 0 more smoothly using fac_transition that reduced from 1 to 0 around gamma_fac_br * snapwave_gamma + ! Similar as before, but then smooth: + ! ! Note - gam is in Hrms + ! if (gam > (gamma_fac_br * gamma)) then + ! ! + ! srcig_local(itheta, k) = 0.0 + ! ! + ! endif ! transition_factor = 1.0 - (1.0 / (1.0 + exp(- (gam - (gamma_fac_br * gamma)) / transition_factor_width_1))) ! From 3f83248a79592cd0fb6c1690ac21806fde89e5be Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 1 Apr 2026 10:57:13 +0200 Subject: [PATCH 064/118] - Added subroutine 'estimate_shoaling_parameter_alphaig_steep_slopes' for addition to alphaig - Values set to initial estimate by Yasmine - Tested to work for 1:3 test - Todo: make factors user definable --- source/src/sfincs_lib.f90 | 2 +- source/src/snapwave/snapwave_solver.f90 | 79 ++++++++++++++++++++++++- 2 files changed, 77 insertions(+), 4 deletions(-) diff --git a/source/src/sfincs_lib.f90 b/source/src/sfincs_lib.f90 index 36628b1c7..8f3ffd4bf 100644 --- a/source/src/sfincs_lib.f90 +++ b/source/src/sfincs_lib.f90 @@ -93,7 +93,7 @@ function sfincs_initialize() result(ierr) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! build_revision = "$Rev: v2.3.0+ mt. Faber:branch-281" - build_date = "$Date: 2026-03-16" + build_date = "$Date: 2026-04-01" ! call write_log('', 1) call write_log('------------ Welcome to SFINCS ------------', 1) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index e0d5142d9..08fb93d6b 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1217,7 +1217,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! Determine dSxx and IG source/sink term 'srcig' ! - if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 12 .or. ig_opt == 13) then + if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 12 .or. ig_opt == 13 .or. ig_opt == 14 .or. ig_opt == 15) then ! ! Calculate shoaling parameter alpha_ig following Leijnse et al. (2024) ! @@ -1230,6 +1230,14 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d endif ! call estimate_shoaling_parameter_alphaig(beta_local(itheta,k), gam, alphaig_local(itheta,k)) ! [input, input, output] + ! + ! Steep slope addition + ! + if (ig_opt == 14 .or. ig_opt == 15) then + ! + call estimate_shoaling_parameter_alphaig_steep_slopes(beta_local(itheta,k), gam, alphaig_local(itheta,k)) ! [input, input, inout] + ! + endif ! ! Now calculate source term component ! @@ -1240,7 +1248,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! else ! - if (ig_opt == 1 .or. ig_opt == 12 .or. ig_opt == 13) then ! Option using conservative shoaling for dSxx/dx + if (ig_opt == 1 .or. ig_opt == 12 .or. ig_opt == 13 .or. ig_opt == 14 .or. ig_opt == 15) then ! Option using conservative shoaling for dSxx/dx ! ! Calculate Sxx based on conservative shoaling of upwind point's energy: ! Sxx_cons = E(i-1) * Cg(i-1) / Cg * (2 * n(i) - 0.5) @@ -1288,7 +1296,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! srcig_local(itheta, k) = transition_factor * srcig_local(itheta, k) ! - elseif (ig_opt == 13) then + elseif (ig_opt == 13 .or. ig_opt == 15) then ! ! Let srcig transition to 0 more smoothly using fac_transition that reduced from 1 to 0 around gamma_fac_br * snapwave_gamma ! @@ -1372,6 +1380,71 @@ subroutine estimate_shoaling_parameter_alphaig(beta, gam, alphaig) ! end subroutine estimate_shoaling_parameter_alphaig + + subroutine estimate_shoaling_parameter_alphaig_steep_slopes(beta, gam, alphaig) ! [input, input, inout] + real*4, intent(in) :: beta + real*4, intent(in) :: gam + real*4, intent(inout) :: alphaig + ! + real*4 :: fac1, fac2, fac3, fac4, fac5 + real*4 :: alphaig_steep + ! + ! Estimate shoaling parameter alphaig - for steep slopes with beta > 0.07 + ! These were not covered in training dataset of Leijnse et al. 2024 + ! + !alphaig_total = alphaig Eq11 + alphaig_steep + !alphaig_steep = 0.1 * max(beta-0.07, 0)^0.6 * max(1.0-gamma, 0) + !alphaig_steep = fac2 * max(beta-fac3, 0)**fac4 * max(fac5-gam, 0) + ! + ! Determine constants + ! + !fac1 = 0.3 !Cut-off gamma, below this alphaig_steep = 0 + fac1 = 0.0 !Cut-off gamma, below this alphaig_steep = 0 + fac2 = 0.1 ! Multiplication factor + fac3 = 0.07 ! Cut-off beta, below this alphaig_steep = 0, and above this it increases with beta + fac4 = 0.6 ! Exponent + fac5 = 1.0 ! Cut-off gamma, above this alphaig_steep = 0 + ! + ! For deep water or negative slope, alphaig_steep = 0 + ! + alphaig_steep = 0.0 + ! + !if (beta > 0.0) then + ! write(*,*)'Starting alphaig steep slope addition, beta, gam, alphaig before', beta, gam, alphaig + !endif + ! + ! If positively increasing local bed slope beta + ! + if (beta > 0.0) then + ! + if (gam >= fac1) then ! shallow(er) water - for gam>1.0 (=fac5) the fit automatically goes to 0 + ! + alphaig_steep = fac2 * (max(beta - fac3, 0.0) ** fac4) * (max(fac5 - gam, 0.0)) + ! + else ! for gam < fac1 + ! + alphaig_steep = 0.0 + ! + endif + ! + endif + ! + !if (beta > 0.0) then + ! write(*,*)'Calculated alphaig_steep addition', alphaig_steep + !endif + ! + ! Combine + ! + alphaig = alphaig + alphaig_steep + ! + ! Limit total alphaig between [0, 1] to prevent large overshoots in case of low gamma and very small beta + ! + alphaig = max(alphaig, 0.0) + alphaig = min(alphaig, 1.0) + ! + end subroutine estimate_shoaling_parameter_alphaig_steep_slopes + + subroutine hpsort_eps_epw (n, ra, ind, eps) !--------------------------------------------------------------------- ! sort an array ra(1:n) into ascending order using heapsort algorithm, From 61c890cfef44c0b02fc9d322203c4b63c08e9b92 Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 1 Apr 2026 11:04:09 +0200 Subject: [PATCH 065/118] - Add back an option 11 that does have the beta lim, but no srcig to 0 correction --- source/src/snapwave/snapwave_solver.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 08fb93d6b..e3d8d30c1 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1217,11 +1217,11 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! Determine dSxx and IG source/sink term 'srcig' ! - if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 12 .or. ig_opt == 13 .or. ig_opt == 14 .or. ig_opt == 15) then + if (ig_opt == 1 .or. ig_opt == 2 .or. ig_opt == 11 .or. ig_opt == 12 .or. ig_opt == 13 .or. ig_opt == 14 .or. ig_opt == 15) then ! ! Calculate shoaling parameter alpha_ig following Leijnse et al. (2024) ! - if (ig_opt == 12 .or. ig_opt == 13) then + if (ig_opt == 11 .or. ig_opt == 12 .or. ig_opt == 13) then ! ! Limit beta to max 0.07 (=beta_limit_1) before going into alphaig parametrisation ! @@ -1248,7 +1248,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! else ! - if (ig_opt == 1 .or. ig_opt == 12 .or. ig_opt == 13 .or. ig_opt == 14 .or. ig_opt == 15) then ! Option using conservative shoaling for dSxx/dx + if (ig_opt == 1 .or. ig_opt == 11 .or. ig_opt == 12 .or. ig_opt == 13 .or. ig_opt == 14 .or. ig_opt == 15) then ! Option using conservative shoaling for dSxx/dx ! ! Calculate Sxx based on conservative shoaling of upwind point's energy: ! Sxx_cons = E(i-1) * Cg(i-1) / Cg * (2 * n(i) - 0.5) From deb83be6993b4a8f3d8e67eb6c46216232d6d3d3 Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 1 Apr 2026 11:28:40 +0200 Subject: [PATCH 066/118] - Make the 5 steep_fac options user defineable, with defaults as hardcoded values of before. Result is therefore the same --- source/src/sfincs_snapwave.f90 | 7 ++++++ source/src/snapwave/snapwave_data.f90 | 1 + source/src/snapwave/snapwave_solver.f90 | 32 +++++++++++++++---------- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index 75673dec4..2a9a3edae 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -658,6 +658,13 @@ subroutine read_snapwave_input() call read_int_input(500,'snapwave_ig_opt',ig_opt,1) call read_int_input(500,'snapwave_iterative_srcig',iterative_srcig_opt,0) ! Option whether to calculate IG source/sink term in iterative lower (better, but potentially slower, 1=default), or effectively based on previous timestep (faster, potential mismatch, =0) ! + ! IG steep slope related: + call read_real_input(500,'snapwave_steep_fac1',steep_fac1,0.0) ! Cut-off gamma, below this alphaig_steep = 0 + call read_real_input(500,'snapwave_steep_fac2',steep_fac2,0.1) ! Multiplication factor + call read_real_input(500,'snapwave_steep_fac3',steep_fac3,0.07) ! Cut-off beta, below this alphaig_steep = 0, and above this it increases with beta + call read_real_input(500,'snapwave_steep_fac4',steep_fac4,0.6) ! Exponent + call read_real_input(500,'snapwave_steep_fac5',steep_fac5,1.0) ! Cut-off gamma, above this alphaig_steep = 0 + ! ! IG boundary conditions options: call read_int_input(500,'snapwave_use_herbers',herbers_opt,1) ! Choice whether you want IG Hm0&Tp be calculated by herbers (=1, default), or want to specify user defined values (0> then snapwave_eeinc2ig & snapwave_Tinc2ig are used) call read_int_input(500,'snapwave_tpig_opt',tpig_opt,1) ! IG wave period option based on Herbers calculated spectrum, only used if snapwave_use_herbers = 1. Options are: 1=Tm01 (default), 2=Tpsmooth, 3=Tp, 4=Tm-1,0 diff --git a/source/src/snapwave/snapwave_data.f90 b/source/src/snapwave/snapwave_data.f90 index 94496482a..7f5d267c5 100644 --- a/source/src/snapwave/snapwave_data.f90 +++ b/source/src/snapwave/snapwave_data.f90 @@ -272,6 +272,7 @@ module snapwave_data ! ... or just a priori based on effectively incident wave energy from previous timestep only integer :: herbers_opt ! Choice whether you want IG Hm0&Tp be calculated by herbers (=1, default), or want to specify user defined values (0> then snapwave_eeinc2ig & snapwave_Tinc2ig are used) integer :: tpig_opt ! IG wave period option based on Herbers calculated spectrum, only used if herbers_opt = 1. Options are: 1=Tm01 (default), 2=Tpsmooth, 3=Tp, 4=Tm-1,0 + real*4 :: steep_fac1, steep_fac2, steep_fac3, steep_fac4, steep_fac5 ! ! Switches logical :: igwaves ! switch whether include IG or not diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index e3d8d30c1..234604403 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -135,6 +135,7 @@ subroutine compute_wave_field() c_dispT, WsorE, WsorA, SwE, SwA, Tpini, & igwaves,kwav_ig, cg_ig,H_ig,ctheta_ig,Hmx_ig, ee_ig,fw_ig, & beta, srcig, alphaig, Dw_ig, Df_ig, qb, gam, & + steep_fac1, steep_fac2, steep_fac3, steep_fac4, steep_fac5, & vegetation, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, Dveg, & zb, nwav, ig_opt, alpha_ig, gamma_ig, gamma_fac_br, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) ! @@ -160,6 +161,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & c_dispT, WsorE, WsorA, SwE, SwA, Tpini, & igwaves,kwav_ig, cg_ig,H_ig,ctheta_ig,Hmx_ig, ee_ig,fw_ig, & betamean, srcig, alphaig, Dw_ig, Df_ig, qb, gam, & + steep_fac1, steep_fac2, steep_fac3, steep_fac4, steep_fac5, & vegetation, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, Dveg, & zb, nwav, ig_opt, alfa_ig, gamma_ig, gamma_fac_br, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) ! @@ -222,7 +224,8 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & real*4, dimension(no_nodes), intent(in) :: u10 ! wind speed and direction integer, intent(in) :: niter ! max number of iterations real*4, intent(in) :: crit ! relative accuracy for stopping criterion - integer :: ig_opt ! option of IG wave settings (1 = default = conservative shoaling based dSxx and Baldock breaking) + integer, intent(in) :: ig_opt ! option of IG wave settings (1 = default = conservative shoaling based dSxx and Baldock breaking) + real*4, intent(in) :: steep_fac1, steep_fac2, steep_fac3, steep_fac4, steep_fac5 ! ! wind source vars ! @@ -481,7 +484,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term: ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br) + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br, steep_fac1, steep_fac2, steep_fac3, steep_fac4, steep_fac5) ! ! inout: alphaig_local, srcig_local, cgprev, beta_local, qb_local, gam_local ! in: the rest @@ -564,7 +567,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Actual determining of source term - every first sweep of iteration ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br) + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br, steep_fac1, steep_fac2, steep_fac3, steep_fac4, steep_fac5) ! endif ! @@ -1049,7 +1052,7 @@ subroutine baldock (rho,g,alfa,gamma,depth,H,T,opt,Dw,Hmax) ! end subroutine baldock - subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br) + subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, Dw, Hmx, qb_local, gam_local, gamma, gamma_fac_br, steep_fac1, steep_fac2, steep_fac3, steep_fac4, steep_fac5) ! implicit none ! @@ -1072,7 +1075,8 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d real*4, intent(in) :: gamma ! coefficients in Baldock wave breaking dissipation real*4, intent(in) :: gamma_fac_br ! factor times gamma that is used to determine the maximum incident wave breaking point in the surf zone using local incident wave height over water depth ratio, among others used to set the IG source term to 0 shallower than this point real*4, dimension(no_nodes), intent(in) :: Dw ! wave breaking dissipation - real*4, dimension(no_nodes), intent(in) :: Hmx ! Hmax + real*4, dimension(no_nodes), intent(in) :: Hmx ! Hmax + real*4, intent(in) :: steep_fac1, steep_fac2, steep_fac3, steep_fac4, steep_fac5 ! ! Inout variables real*4, dimension(:,:), intent(inout) :: alphaig_local ! Local infragravity wave shoaling parameter alpha @@ -1235,7 +1239,8 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! if (ig_opt == 14 .or. ig_opt == 15) then ! - call estimate_shoaling_parameter_alphaig_steep_slopes(beta_local(itheta,k), gam, alphaig_local(itheta,k)) ! [input, input, inout] + call estimate_shoaling_parameter_alphaig_steep_slopes(beta_local(itheta,k), gam, alphaig_local(itheta,k), steep_fac1, steep_fac2, steep_fac3, steep_fac4, steep_fac5) + ! [input, input, inout, input, input, input, input, input] ! endif ! @@ -1381,12 +1386,13 @@ subroutine estimate_shoaling_parameter_alphaig(beta, gam, alphaig) end subroutine estimate_shoaling_parameter_alphaig - subroutine estimate_shoaling_parameter_alphaig_steep_slopes(beta, gam, alphaig) ! [input, input, inout] + subroutine estimate_shoaling_parameter_alphaig_steep_slopes(beta, gam, alphaig, fac1, fac2, fac3, fac4, fac5) + ! [input, input, inout, input, input, input, input, input] real*4, intent(in) :: beta real*4, intent(in) :: gam real*4, intent(inout) :: alphaig ! - real*4 :: fac1, fac2, fac3, fac4, fac5 + real*4, intent(in) :: fac1, fac2, fac3, fac4, fac5 real*4 :: alphaig_steep ! ! Estimate shoaling parameter alphaig - for steep slopes with beta > 0.07 @@ -1399,11 +1405,11 @@ subroutine estimate_shoaling_parameter_alphaig_steep_slopes(beta, gam, alphaig) ! Determine constants ! !fac1 = 0.3 !Cut-off gamma, below this alphaig_steep = 0 - fac1 = 0.0 !Cut-off gamma, below this alphaig_steep = 0 - fac2 = 0.1 ! Multiplication factor - fac3 = 0.07 ! Cut-off beta, below this alphaig_steep = 0, and above this it increases with beta - fac4 = 0.6 ! Exponent - fac5 = 1.0 ! Cut-off gamma, above this alphaig_steep = 0 + !fac1 = 0.0 !Cut-off gamma, below this alphaig_steep = 0 + !fac2 = 0.1 ! Multiplication factor + !fac3 = 0.07 ! Cut-off beta, below this alphaig_steep = 0, and above this it increases with beta + !fac4 = 0.6 ! Exponent + !fac5 = 1.0 ! Cut-off gamma, above this alphaig_steep = 0 ! ! For deep water or negative slope, alphaig_steep = 0 ! From 80365f008422568d8147189280f6922ae1b8a90c Mon Sep 17 00:00:00 2001 From: Leynse Date: Thu, 2 Apr 2026 13:09:49 +0200 Subject: [PATCH 067/118] - Fix --- source/src/snapwave/snapwave_solver.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 1cfc2bff1..8ed6dbec0 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1253,7 +1253,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! cgprev(itheta) = w(1, itheta, k)*cg_ig(k1) + w(2, itheta, k)*cg_ig(k2) ! - Sxxprev(itheta) = w(1, itheta, k) * Sxx(itheta,k1) + w(2, itheta, k) * Sxx(itheta,k2) + Sxxprev(itheta) = w(1, itheta, k) * Sxx(k1) + w(2, itheta, k) * Sxx(k2) ! Eprev(itheta) = w(1, itheta, k) * E_local(k1) + w(2, itheta, k) * E_local(k2) Eprev_ig(itheta) = w(1, itheta, k) * E_ig_local(k1) + w(2, itheta, k) * E_ig_local(k2) From 9d1ad92b5a5a31c964c8aabf3e16fb234afa94b4 Mon Sep 17 00:00:00 2001 From: Leynse Date: Thu, 2 Apr 2026 14:02:37 +0200 Subject: [PATCH 068/118] - Make Herbers IG boundary warning dimensionless, using hsinc / depth - Check further for best ratio later, start at 0.5 --- source/src/snapwave/snapwave_infragravity.f90 | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/source/src/snapwave/snapwave_infragravity.f90 b/source/src/snapwave/snapwave_infragravity.f90 index 592f653f0..741ce4515 100644 --- a/source/src/snapwave/snapwave_infragravity.f90 +++ b/source/src/snapwave/snapwave_infragravity.f90 @@ -43,20 +43,18 @@ subroutine determine_ig_bc(x_bwv, y_bwv, hsinc, tpinc, ds, jonswapgam, depth, Ti scoeff = (2/ds**2) - 1 ! ! Call function that calculates Hig0 following Herbers, as also implemented in XBeach and secordspec2 in Matlab - ! Loosely based on 3 step calculation in waveparams.F90 of XBeach (build_jonswap, build_etdir, build_boundw), here all in 1 subroutine calculate_herbers + ! Loosely based on 3 step calculation in waveparams.F90 of XBeach (build_jonswap, build_etdir, build_boundw), here all in 1 subroutine compute_herbers ! - if (depth < 5.0) then + if (hsinc / depth > 0.5) then ! - ! MvO - Is this really the best check? Does not seem very non-dimensional. Maybe something like hsig / depth > 0.5 ? - ! - write(logstr, *)'ERROR SnapWave - depth at boundary input point ', x_bwv, ',', y_bwv,' below 5 m: ', depth + write(logstr, *)'ERROR SnapWave - Hs over depth at boundary input point ', x_bwv, ',', y_bwv,' is larger then 0.5: ', hsinc / depth call write_log(logstr, 0) - write(logstr, *)'This may lead to large values of Hm0ig as bc, especially when directional spreading is low! Please specify input in deeper water.' + write(logstr, *)'This may lead to large values of Hm0ig as bc, especially when directional spreading is low! Please specify input in deeper water.' call write_log(logstr, 0) - write(logstr,*)'Depth set back to 5 meters for stability, simulation will continue.' + write(logstr,*)'Depth set back to 2.0 * hsinc meters for stability, simulation will continue.' call write_log(logstr, 0) ! - depth = 5.0 + depth = 2.0 * hsinc ! elseif (depth > 200.0) then ! @@ -75,9 +73,7 @@ subroutine determine_ig_bc(x_bwv, y_bwv, hsinc, tpinc, ds, jonswapgam, depth, Ti call write_log(logstr, 1) hsig = max(hsig, 0.0) ! - endif - ! - if (hsig > 3.0) then + elseif (hsig > 3.0) then ! write(logstr,*)'DEBUG SnapWave - computed hm0ig at boundary exceeds 3 meter: ',hsig, ' - please check whether this might be realistic!' call write_log(logstr, 1) From d13e33bd13ac8e2182bac967a0a9563c2e6f8385 Mon Sep 17 00:00:00 2001 From: Leynse Date: Thu, 2 Apr 2026 14:11:47 +0200 Subject: [PATCH 069/118] - Add user definable snapwave_relax_factor_DoverE and snapwave_relax_factor_DoverA keywords to sfincs_snapwave - By default set to 0.25 for both for now --- source/src/sfincs_snapwave.f90 | 2 ++ source/src/snapwave/snapwave_data.f90 | 2 ++ source/src/snapwave/snapwave_solver.f90 | 36 +++++++++++++------------ 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index 78ca6da35..01d10dc74 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -637,6 +637,8 @@ subroutine read_snapwave_input() call read_int_input (500,'snapwave_jadcgdx',jadcgdx,1) call read_real_input(500,'snapwave_c_dispT',c_dispT,1.0) call read_real_input(500,'snapwave_sector',sector,180.0) + call read_real_input(500,'snapwave_relax_factor_DoverA',relax_factor_DoverA,0.25) ! underrelaxation factor for DoverA (set to 1.0 to disable) + call read_real_input(500,'snapwave_relax_factor_DoverE',relax_factor_DoverE,0.25) ! underrelaxation factor for DoverE (set to 1.0 to disable) ! ! Settings related to IG waves: call read_int_input(500,'snapwave_igwaves',igwaves_opt,1) diff --git a/source/src/snapwave/snapwave_data.f90 b/source/src/snapwave/snapwave_data.f90 index e65b3af6f..a5d2f173e 100644 --- a/source/src/snapwave/snapwave_data.f90 +++ b/source/src/snapwave/snapwave_data.f90 @@ -216,6 +216,8 @@ module snapwave_data real*4 :: rghlevland ! Elevation separation as in SFINCS for simple elevation varying roughness real*4 :: fwratio ! Above 'rghlevland' elevation of zb, the friction for incident waves is multiplied with value 'fwratio' real*4 :: fwigratio ! Above 'rghlevland' elevation of zb, the friction for IG waves is multiplied with value 'fwratio' + real*4 :: relax_factor_DoverA ! underrelaxation factor for DoverA (set to 1.0 to disable) + real*4 :: relax_factor_DoverE ! underrelaxation factor for DoverE (set to 1.0 to disable) ! character*3 :: outputformat integer :: ja_save_each_iter ! logical to save output after each iteration or not diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 62d4551d4..01d69e362 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -139,17 +139,18 @@ subroutine compute_wave_field() call timer(t2) ! call solve_energy_balance2Dstat (x,y,dhdx, dhdy, no_nodes,inner, & - w, ds, prev, & - neumannconnected, & + w, ds, prev, & + neumannconnected, & theta,ntheta,thetamean, & - depth,kwav,cg,ctheta,fw, & + depth,kwav,cg,ctheta,fw, & Tp,Tp_ig,dt,rho,alpha,gamma, gammax, & - wind, & - H,Dw,F,Df,thetam,sinhkh,& + wind, & + H,Dw,F,Df,thetam,sinhkh, & Hmx, ee, windspreadfac, u10, niter, crit, & hmin, baldock_ratio, baldock_ratio_ig, baldock_exponent, & - aa, sig, jadcgdx, sigmin, sigmax,& - c_dispT, DoverE, WsorE, WsorA, SwE, SwA, Tpini, & + aa, sig, jadcgdx, sigmin, sigmax, & + DoverE, relax_factor_DoverE, relax_factor_DoverA, & + c_dispT, WsorE, WsorA, SwE, SwA, Tpini, & igwaves, kwav_ig, cg_ig,H_ig,ctheta_ig,Hmx_ig, ee_ig,fw_ig, & beta, srcig, alphaig, Dw_ig, Df_ig, & vegetation, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, Dveg, & @@ -165,17 +166,18 @@ subroutine compute_wave_field() subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & - w, ds, prev, & - neumannconnected, & + w, ds, prev, & + neumannconnected, & theta,ntheta,thetamean, & - depth,kwav,cg,ctheta,fw, & + depth,kwav,cg,ctheta,fw, & Tp,T_ig,dt,rho,alfa,gamma, gammax, & - wind, & - H,Dw,F,Df,thetam,sinhkh,& + wind, & + H,Dw,F,Df,thetam,sinhkh, & Hmx, ee, windspreadfac, u10, niter, crit, & hmin, baldock_ratio, baldock_ratio_ig, baldock_exponent, & - aa, sig, jadcgdx, sigmin, sigmax,& - c_dispT, DoverE, WsorE, WsorA, SwE, SwA, Tpini, & + aa, sig, jadcgdx, sigmin, sigmax, & + DoverE, relax_factor_DoverE, relax_factor_DoverA, & + c_dispT, WsorE, WsorA, SwE, SwA, Tpini, & igwaves,kwav_ig, cg_ig,H_ig,ctheta_ig,Hmx_ig, ee_ig,fw_ig, & betamean, srcig, alphaig, Dw_ig, Df_ig, & vegetation, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, Dveg, & @@ -237,7 +239,9 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & real*4, dimension(no_nodes), intent(in) :: u10 ! wind speed and direction integer, intent(in) :: niter ! max number of iterations real*4, intent(in) :: crit ! relative accuracy for stopping criterion - integer :: ig_opt ! option of IG wave settings (1 = default = conservative shoaling based dSxx as in Leijnse et al. 2024) + integer, intent(in) :: ig_opt ! option of IG wave settings (1 = default = conservative shoaling based dSxx as in Leijnse et al. 2024) + real*4, intent(in) :: relax_factor_DoverA ! underrelaxation factor for DoverA (set to 1.0 to disable) + real*4, intent(in) :: relax_factor_DoverE ! underrelaxation factor for DoverE (set to 1.0 to disable) ! ! wind source vars ! @@ -294,8 +298,6 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & real*4 :: pi = 4.0 * atan(1.0) real*4 :: g = 9.81 real*4 :: hmin ! minimum water depth! TL: make user changeable also here according to 'snapwave_hmin' in sfincs.inp - real*4 :: relax_factor_DoverA = 0.25 ! underrelaxation factor for DoverA (set to 1.0 to disable) - real*4 :: relax_factor_DoverE = 0.25 ! underrelaxation factor for DoverE (set to 1.0 to disable) real*4 :: oneoverdt real*4 :: oneover2dtheta real*4 :: rhog8 From 12bce8f394f2626b3c6d9b935cf94975d12c7d2e Mon Sep 17 00:00:00 2001 From: Leynse Date: Thu, 2 Apr 2026 14:16:02 +0200 Subject: [PATCH 070/118] - For now do simple Hmx(k) = gamma * depth(k) and IG as in trunk, TBD --- source/src/snapwave/snapwave_solver.f90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 01d69e362..52958379d 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -91,14 +91,15 @@ subroutine compute_wave_field() do k = 1, no_nodes ! sinhkh(k) = sinh(min(kwav(k) * depth(k), 50.0)) - Hmx(k) = 0.88 / kwav(k) * tanh(gamma * kwav(k) * depth(k) / 0.88) + !Hmx(k) = 0.88 / kwav(k) * tanh(gamma * kwav(k) * depth(k) / 0.88) Hmx(k) = gamma * depth(k) ! if (igwaves) then ! ! Why is this different from Hmx for regular waves where we use gamma * h? ! - Hmx_ig(k) = 0.88 / kwav_ig(k) * tanh(gamma_ig * kwav_ig(k) * depth(k) / 0.88) ! Note - uses gamma_ig + !Hmx_ig(k) = 0.88 / kwav_ig(k) * tanh(gamma_ig * kwav_ig(k) * depth(k) / 0.88) ! Note - uses gamma_ig + Hmx_ig(k) = gamma_ig * depth(k) ! endif ! From 2b9c7e2d7384826e5131a799e95d9955e5295cd0 Mon Sep 17 00:00:00 2001 From: Leynse Date: Thu, 2 Apr 2026 14:17:14 +0200 Subject: [PATCH 071/118] - As discussed, remove fdrspr for now. Could be added back later on (with actual working function) --- source/src/snapwave/snapwave_solver.f90 | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 52958379d..0ad4bcdb1 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -317,7 +317,6 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & real*4 :: Tinc2ig ! ratio compared to period Tinc to estimate Tig real*4 :: alphaigfac ! Multiplication factor for IG shoaling source/sink term, default = 1.0 real*4 :: shinc2ig ! Ratio of how much of the calculated IG wave source term, is subtracted from the incident wave energy (0-1, 0=default) - real*4 :: fdrspr ! Inc-IG reduction factor to account for directional spreading integer, save :: callno=1 integer, intent(in) :: baldock_exponent ! Exponent for multiplying the Baldock dissipation with a factor 'f = (Hloc / Hmax)**iexp' to enhance breaking when H > Hmax, with iexp = 0 (default, means unused), 1 or 2 ! @@ -336,11 +335,6 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! waveps = 0.0001 ! - fdrspr = 1.0 ! This is a factor on the IG source term to account for directional spreading - ! of the incident wave energy, which reduces the IG wave energy generated. - ! Default is 1.0, but can be reduced to e.g. 0.65. A reduction leads to lowering - ! of the IG energy. - ! allocate(ok(no_nodes)); ok=0 allocate(indx(no_nodes,4)); indx=0 allocate(eeold(ntheta,no_nodes)); eeold=0.0 @@ -726,7 +720,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & do itheta = 1, ntheta ! R(itheta) = oneoverdt * ee(itheta, k) + cgprev(itheta) * eeprev(itheta) / ds(itheta, k) & - - srcig_local(itheta, k) * shinc2ig * fdrspr + - srcig_local(itheta, k) * shinc2ig ! enddo ! @@ -832,7 +826,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & do itheta = 1, ntheta R_ig(itheta) = oneoverdt * ee_ig(itheta, k) & + cgprev_ig(itheta) * eeprev_ig(itheta) / ds(itheta, k) & - + srcig_local(itheta, k) * fdrspr + + srcig_local(itheta, k) enddo ! ! IG matrix with directional boundary conditions From 6f4128514b39258b5ddec331ca0b6d9516e1fbc5 Mon Sep 17 00:00:00 2001 From: Leynse Date: Thu, 2 Apr 2026 14:20:34 +0200 Subject: [PATCH 072/118] - Add back comment --- source/src/snapwave/snapwave_solver.f90 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 0ad4bcdb1..5d7a3a62e 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -819,7 +819,10 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! Df_ig(k) = Dfk_ig Dw_ig(k) = Dwk_ig + ! + ! Not using underrelaxation for IG dissipation for now, but we could add this if needed (relax_factor_DoverE_ig) DoverE_ig(k) = (Dwk_ig + Dfk_ig) / max(Ek_ig, 1.0e-6) + ! ! ! IG RHS ! From 0815e57fd61236a5e33832b8696c8086c21bd8e0 Mon Sep 17 00:00:00 2001 From: Leynse Date: Thu, 2 Apr 2026 14:21:58 +0200 Subject: [PATCH 073/118] - Remove subroutine bj78 --- source/src/snapwave/snapwave_solver.f90 | 40 ------------------------- 1 file changed, 40 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 5d7a3a62e..51034e456 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1051,46 +1051,6 @@ subroutine baldock (rho, g, alfa, gamma, depth, H, T, iexp, Dw, Hmax) ! end subroutine baldock - -! subroutine bj78(rho, g, alfa, gamma, depth, H, T, iexp, Dw, Hmax) -! ! -! real*4, intent(in) :: rho -! real*4, intent(in) :: g -! real*4, intent(in) :: alfa -! real*4, intent(in) :: gamma -! real*4, intent(in) :: depth -! real*4, intent(in) :: H -! real*4, intent(in) :: T -! integer, intent(in) :: iexp -! real*4, intent(out) :: Dw -! real*4, intent(in) :: Hmax -! real*4 :: Hloc -! real*4 :: f -! ! -! ! Compute dissipation according to Battjes and Janssen (1978) -! ! -! Hloc = max(H, 1.e-6) -! ! -! if (iexp > 0 .and. Hloc > Hmax) then -! ! -! ! Add extra dissipation when Hloc exceeds Hmax. -! ! This is needed at very steep coast lines, where BJ78 dissipation cannot always keep up with -! ! the wave height increase due to shoaling. The extra dissipation is added by multiplying -! ! the BJ78 dissipation with a factor f, which is larger than 1 when Hloc > Hmax. -! ! -! f = (Hloc / Hmax)**iexp -! ! -! else -! ! -! f = 1.0 -! ! -! endif -! ! -! Dw = 0.25 * rho * g / T * exp( - (Hmax / Hloc)**2) * (Hloc**3 / depth) * f -! ! -! end subroutine bj78 - - subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, cg_ig, nwav, depth, zb, H, ee, ee_ig, eeprev, eeprev_ig, cgprev, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) ! From ea6bcf5e472def383a66fe41d6aa261bf09a165f Mon Sep 17 00:00:00 2001 From: Leynse Date: Thu, 2 Apr 2026 15:12:11 +0200 Subject: [PATCH 074/118] - Added calculation and write_log message of error_ig and %ok_ig with thanks to Mr Claude - For now criterion 'ok' of incident waves for determining iteration ended is unaltered --- source/src/snapwave/snapwave_solver.f90 | 88 +++++++++++++++++++++---- 1 file changed, 75 insertions(+), 13 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 51034e456..efad0aba6 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -271,12 +271,16 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! Local variables and arrays ! integer, dimension(:), allocatable :: ok ! mask for fully iterated points - real*4 :: eemax,dtheta ! maximum wave energy density, directional resolution + integer, dimension(:), allocatable :: ok_ig ! mask for fully iterated IG points + real*4 :: dtheta ! directional resolution + real*4 :: eemax ! maximum wave energy density + real*4 :: eemax_ig ! maximum IG wave energy density real*4 :: uorbi integer :: sweep,iter ! sweep number, number of iterations integer :: k,k1,k2,count,kn,itheta ! counters (k is grid index) integer, dimension(:,:), allocatable :: indx ! index for grid sorted per sweep direction real*4, dimension(:,:), allocatable :: eeold ! wave energy density, energy density previous iteration + real*4, dimension(:,:), allocatable :: eeold_ig ! IG wave energy density, energy density previous iteration real*4, dimension(:), allocatable :: Eold ! mean wave energy, previous iteration real*4, dimension(:,:), allocatable :: srcig_local ! Energy source/sink term because of IG wave energy transfer from incident waves real*4, dimension(:,:), allocatable :: beta_local ! Local bed slope based on bed level per direction @@ -293,6 +297,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & real*4, dimension(:), allocatable :: E ! mean wave energy real*4, dimension(:), allocatable :: E_ig ! mean wave energy real*4, dimension(:), allocatable :: diff ! maximum difference of wave energy relative to previous iteration + real*4, dimension(:), allocatable :: diff_ig ! maximum difference of IG wave energy relative to previous iteration real*4, dimension(:), allocatable :: ra ! coordinate in sweep direction real*4, dimension(:), allocatable :: sigm_ig integer, dimension(4) :: shift @@ -307,7 +312,9 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & real*4 :: Ek real*4 :: Hk real*4 :: percok + real*4 :: percok_ig ! percentage of converged IG points real*4 :: error + real*4 :: error_ig ! relative maximum IG wave error real*4 :: Dfk_ig real*4 :: Dwk_ig real*4 :: Ek_ig @@ -358,9 +365,12 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & allocate(DoverE_ig(no_nodes)); DoverE_ig=0.0 allocate(E_ig(no_nodes)); E_ig=waveps allocate(sigm_ig(no_nodes)); sigm_ig=0.0 - allocate(depthprev(ntheta,no_nodes)); depthprev=0.0 - allocate(beta_local(ntheta,no_nodes)); beta_local=0.0 + allocate(depthprev(ntheta,no_nodes)); depthprev=0.0 + allocate(beta_local(ntheta,no_nodes)); beta_local=0.0 allocate(alphaig_local(ntheta,no_nodes)); alphaig_local=0.0 + allocate(eeold_ig(ntheta,no_nodes)); eeold_ig=0.0 + allocate(diff_ig(no_nodes)); diff_ig=0.0 + allocate(ok_ig(no_nodes)); ok_ig=0 endif ! if (wind) then @@ -387,6 +397,10 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ok = 0 indx = 0 eemax = maxval(ee) + if (igwaves) then + ok_ig = 0 + eemax_ig = maxval(ee_ig) + endif dtheta = theta(2) - theta(1) ! if (dtheta < 0.0) dtheta = dtheta + 2*pi @@ -542,6 +556,12 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! eeold = ee ! + if (igwaves) then + ! + eeold_ig = ee_ig + ! + endif + ! do k = 1, no_nodes ! Eold(k) = sum(eeold(:, k)) @@ -887,7 +907,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! if (diff(k) / eemax < crit) then ok(k) = 1 - endif + endif ! enddo ! @@ -900,19 +920,61 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! error = maxval(diff) / eemax ! - write(logstr,'(a,i6,a,f10.5,a,f7.2)')' iteration ', iter / 4 ,' error = ', error,' %ok = ', percok - call write_log(logstr, 0) + ! Check convergence of IG waves ! - if (error < crit .or. percok > 99.0) then + if (igwaves) then ! - write(logstr,'(a,i6,a,f10.5,a,f7.2)')' converged at iteration ', iter / 4 ,' error = ',error,' %ok = ', percok - call write_log(logstr, 0) - exit + do k = 1, no_nodes + ! + dee = ee_ig(:, k) - eeold_ig(:, k) + diff_ig(k) = maxval(abs(dee)) + ! + if (diff_ig(k) / eemax_ig < crit) then + ok_ig(k) = 1 + endif + ! + enddo ! - elseif (iter == niter * 4) then ! Made it to the end without reaching 'error 0 .and. k2 > 0) then ! IMPORTANT - for some reason (k1*k2)>0 is not reliable always, resulting in directions being uncorrectly skipped!!! + if (k1 > 0 .and. k2 > 0) then ! IMPORTANT - for some reason (k1*k2)>0 is not reliable always, resulting in directions being uncorrectly skipped!!! ! ! First calculate upwind direction dependent variables ! - depthprev(itheta,k) = w(1, itheta, k) * depth(k1) + w(2, itheta, k) * depth(k2) - ! + depthprev(itheta,k) = w(1, itheta, k) * depth(k1) + w(2, itheta, k) * depth(k2) + ! beta_local(itheta,k) = max((w(1, itheta, k) * (zb(k) - zb(k1)) + w(2, itheta, k) * (zb(k) - zb(k2))) / ds(itheta, k), 0.0) ! ! Notes: @@ -1196,20 +1229,19 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! - in zb, depth is negative > therefore zb(k) minus zb(k1) ! - beta=0 means a horizontal or decreasing slope > need alphaig=0 then in IG src/sink term ! - !betan_local(itheta,k) = (beta/sigm_ig)*sqrt(9.81/max(depth(k), hmin)) ! TL: in case in the future we would need the normalised bed slope again + !betan_local(itheta,k) = (beta/sigm_ig)*sqrt(9.81/max(depth(k), hmin)) ! TL: in case in the future we would need the normalised bed slope again + ! + cgprev(itheta) = w(1, itheta, k) * cg_ig(k1) + w(2, itheta, k) * cg_ig(k2) + ! + ! Sxx is pre-computed for all nodes before this parallel loop ! - cgprev(itheta) = w(1, itheta, k) * cg_ig(k1) + w(2, itheta, k) * cg_ig(k2) - ! - Sxx(itheta,k1) = ((2.0 * max(0.0, min(1.0, nwav(k1)))) - 0.5) * ee(itheta, k1) ! limit so value of nwav is between 0 and 1 - Sxx(itheta,k2) = ((2.0 * max(0.0, min(1.0, nwav(k2)))) - 0.5) * ee(itheta, k2) ! limit so value of nwav is between 0 and 1 + Sxxprev(itheta) = w(1, itheta, k) * Sxx(itheta,k1) + w(2, itheta, k) * Sxx(itheta,k2) ! - Sxxprev(itheta) = w(1, itheta, k) * Sxx(itheta,k1) + w(2, itheta, k) * Sxx(itheta,k2) + eeprev(itheta) = w(1, itheta, k) * ee(itheta, k1) + w(2, itheta, k) * ee(itheta, k2) + eeprev_ig(itheta) = w(1, itheta, k) * ee_ig(itheta, k1) + w(2, itheta, k) * ee_ig(itheta, k2) ! - eeprev(itheta) = w(1, itheta, k) * ee(itheta, k1) + w(2, itheta, k) * ee(itheta, k2) - eeprev_ig(itheta) = w(1, itheta, k) * ee_ig(itheta, k1) + w(2, itheta, k) * ee_ig(itheta, k2) + Hprev(itheta) = w(1, itheta, k) * H(k1) + w(2, itheta, k) * H(k2) ! - Hprev(itheta) = w(1, itheta, k) * H(k1) + w(2, itheta, k) * H(k2) - ! ! Determine relative waterdepth 'gam' ! gam = max(0.5 * (Hprev(itheta) / depthprev(itheta,k) + H(k) / depth(k)), 0.0) ! mean gamma over current and upwind point @@ -1237,13 +1269,13 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! Calculate Sxx based on conservative shoaling of upwind point's energy: ! Sxx_cons = E(i-1) * Cg(i-1) / Cg * (2 * n(i) - 0.5) Sxx_cons = eeprev(itheta) * cgprev(itheta) / cg_ig(k) * ((2.0 * max(0.0,min(1.0, nwav(k)))) - 0.5) - ! Note - limit so value of nwav is between 0 and 1, and Sxx therefore doesn't become NaN for nwav=Infinite + ! Note - limit so value of nwav is between 0 and 1, and Sxx therefore doesn't become NaN for nwav=Infinite ! dSxx = Sxx_cons - Sxxprev(itheta) - ! + ! elseif (ig_opt == 2) then ! Option taking actual difference for dSxx/dx ! - dSxx = Sxx(itheta,k) - Sxxprev(itheta) + dSxx = Sxx(itheta,k) - Sxxprev(itheta) ! endif ! @@ -1263,12 +1295,13 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! endif ! - enddo + enddo ! endif ! - enddo - ! + enddo + !$omp end parallel do + ! end subroutine determine_infragravity_source_sink_term subroutine estimate_shoaling_parameter_alphaig(beta, gam, alphaig) From 7e50bdfbb63d131c6e9f1b81dc15c83e31c82438 Mon Sep 17 00:00:00 2001 From: Leynse Date: Thu, 2 Apr 2026 16:35:25 +0200 Subject: [PATCH 076/118] - Already do the bugfix of PR #283 by switching to srcig based on E and redistribute by /E * ee --- source/src/sfincs_lib.f90 | 2 +- source/src/snapwave/snapwave_solver.f90 | 63 ++++++++++++++++++------- 2 files changed, 47 insertions(+), 18 deletions(-) diff --git a/source/src/sfincs_lib.f90 b/source/src/sfincs_lib.f90 index 8a5f7aca7..f9a6e7e34 100644 --- a/source/src/sfincs_lib.f90 +++ b/source/src/sfincs_lib.f90 @@ -95,7 +95,7 @@ function sfincs_initialize() result(ierr) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! build_revision = "$Rev: v2.3.2 mt. Faber+branch:snapwave_domain_update" - build_date = "$Date: 2026-03-31" + build_date = "$Date: 2026-04-02" ! call write_log('', 1) call write_log('------------ Welcome to SFINCS ------------', 1) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index f3cbad92f..3c8063b4a 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -596,7 +596,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! ! Determining of IG source term as defined in Leijnse et al. 2024 ! - call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, cg_ig, nwav, depth, zb, H, & + call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, & ee, ee_ig, ig_opt, alphaigfac, & alphaig_local, beta_local, srcig_local) ! @@ -1136,7 +1136,7 @@ subroutine baldock (rho, g, alfa, gamma, depth, H, T, iexp, Dw, Hmax) end subroutine baldock - subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, cg_ig, nwav, depth, zb, H, ee, ee_ig, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) + subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) ! ! Determining of IG source term as defined in Leijnse et al. 2024 ! @@ -1163,6 +1163,7 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d real*4, dimension(ntheta,no_nodes), intent(in) :: ee_ig ! energy density infragravity waves integer, intent(in) :: ig_opt ! option of IG wave settings (1 = default = conservative shoaling based dSxx and Baldock breaking) real*4, intent(in) :: alphaigfac ! Multiplication factor for IG shoaling source/sink term, default = 1.0 + real*4, intent(in) :: dtheta ! directional resolution ! ! Inout variables ! @@ -1177,33 +1178,57 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d integer :: k1,k2 ! upwind counters (k is grid index) real*4 :: gam ! local gamma (Hinc / depth ratio) real*4, dimension(ntheta,no_nodes) :: depthprev ! water depth at upwind intersection point - real*4, dimension(ntheta,no_nodes) :: Sxx ! Radiation Stress + real*4, dimension(no_nodes) :: Sxx ! radiation Stress real*4, dimension(ntheta) :: Sxxprev ! radiation stress at upwind point real*4, dimension(ntheta) :: Hprev ! wave height at upwind point real*4, dimension(ntheta) :: cgprev ! group velocity at upwind point - real*4, dimension(ntheta) :: eeprev ! energy density at upwind point - real*4, dimension(ntheta) :: eeprev_ig ! IG energy density at upwind point + real*4, dimension(ntheta) :: Eprev ! Mean incident wave energy at upwind intersection point + real*4, dimension(ntheta) :: Eprev_ig ! Mean infragravity wave energy at upwind intersection point + real*4, dimension(no_nodes) :: E_local ! mean wave energy waves - just local + real*4, dimension(no_nodes) :: E_ig_local ! mean wave energy infragravity waves - just local real*4 :: dSxx ! difference in Radiation stress real*4 :: Sxx_cons ! conservative estimate of radiation stress using conservative shoaling ! + ! Set internal variables + ! + Sxx = 0.0 + Hprev = 0.0 + Eprev = 0.0 + Eprev_ig = 0.0 + ! + E_local = 0.0 + E_ig_local = 0.0 + Sxx = 0.0 ! Pre-compute Sxx for all nodes ! - !$omp parallel do private(itheta) schedule(static) + !$omp parallel do schedule(static) do k = 1, no_nodes - do itheta = 1, ntheta - Sxx(itheta, k) = ((2.0 * max(0.0, min(1.0, nwav(k)))) - 0.5) * ee(itheta, k) - enddo + ! + if (inner(k)) then !TODO: check whether should be on only 'inner' or not + ! + ! Update E (not saved from previous timestep) + ! + E_local(k) = sum(ee(:,k)) * dtheta + ! + ! Update E_ig (not saved from previous timestep) + ! + E_ig_local(k) = sum(ee_ig(:, k)) * dtheta + ! + endif + ! + Sxx(k) = ((2.0 * max(0.0, min(1.0, nwav(k)))) - 0.5) * E_local(k) + ! enddo !$omp end parallel do ! ! Main loop: compute IG source/sink term per node. ! All writes target the column (itheta, k), so the loop is data-independent across k. - ! Per-k scratch arrays (cgprev, eeprev, eeprev_ig, Sxxprev, Hprev) are + ! Per-k scratch arrays (cgprev, Eprev, Eprev_ig, Sxxprev, Hprev) are ! listed as private so each thread gets its own copy on the stack. ! !$omp parallel do & !$omp& private(itheta, k1, k2, gam, dSxx, Sxx_cons, & - !$omp& cgprev, eeprev, eeprev_ig, Sxxprev, Hprev) & + !$omp& cgprev, Eprev, Eprev_ig, Sxxprev, Hprev) & !$omp& schedule(static) do k = 1, no_nodes ! @@ -1235,10 +1260,10 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! Sxx is pre-computed for all nodes before this parallel loop ! - Sxxprev(itheta) = w(1, itheta, k) * Sxx(itheta,k1) + w(2, itheta, k) * Sxx(itheta,k2) + Sxxprev(itheta) = w(1, itheta, k) * Sxx(k1) + w(2, itheta, k) * Sxx(k2) ! - eeprev(itheta) = w(1, itheta, k) * ee(itheta, k1) + w(2, itheta, k) * ee(itheta, k2) - eeprev_ig(itheta) = w(1, itheta, k) * ee_ig(itheta, k1) + w(2, itheta, k) * ee_ig(itheta, k2) + Eprev(itheta) = w(1, itheta, k) * E_local(k1) + w(2, itheta, k) * E_local(k2) + Eprev_ig(itheta) = w(1, itheta, k) * E_ig_local(k1) + w(2, itheta, k) * E_ig_local(k2) ! Hprev(itheta) = w(1, itheta, k) * H(k1) + w(2, itheta, k) * H(k2) ! @@ -1268,20 +1293,24 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! ! Calculate Sxx based on conservative shoaling of upwind point's energy: ! Sxx_cons = E(i-1) * Cg(i-1) / Cg * (2 * n(i) - 0.5) - Sxx_cons = eeprev(itheta) * cgprev(itheta) / cg_ig(k) * ((2.0 * max(0.0,min(1.0, nwav(k)))) - 0.5) + ! + Sxx_cons = Eprev(itheta) * cgprev(itheta) / cg_ig(k) * ((2.0 * max(0.0, min(1.0, nwav(k)))) - 0.5) + ! ! Note - limit so value of nwav is between 0 and 1, and Sxx therefore doesn't become NaN for nwav=Infinite ! dSxx = Sxx_cons - Sxxprev(itheta) ! elseif (ig_opt == 2) then ! Option taking actual difference for dSxx/dx ! - dSxx = Sxx(itheta,k) - Sxxprev(itheta) + dSxx = Sxx(k) - Sxxprev(itheta) ! endif ! dSxx = max(dSxx, 0.0) ! - srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta, k) * sqrt(eeprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta, k) * dSxx / ds(itheta, k) + ! Base on E_prev_ig instead of eeprev_ig(itheta) > no bins but total energy + ! NOTE - already here multiplied with ee(itheta,k), for direct inclusion in 'R'-term + srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) /max(E_local(k), 1.0e-6) * ee(itheta,k) ! endif ! From d3bebd5ea94d5c0abbe5dc3aa51548d5513fffeb Mon Sep 17 00:00:00 2001 From: Leynse Date: Thu, 2 Apr 2026 17:03:58 +0200 Subject: [PATCH 077/118] - Remove double cgprev --- source/src/snapwave/snapwave_solver.f90 | 1 - 1 file changed, 1 deletion(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 04e629ab1..2a7a588f7 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1227,7 +1227,6 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! real*4, dimension(:,:), intent(inout) :: alphaig_local ! Local infragravity wave shoaling parameter alpha real*4, dimension(:,:), intent(inout) :: srcig_local ! Energy source/sink term because of IG wave shoaling - real*4, dimension(:), intent(inout) :: cgprev ! group velocity at upwind intersection point real*4, dimension(ntheta,no_nodes), intent(inout):: beta_local ! Local bed slope based on bed level per direction real*4, dimension(ntheta,no_nodes), intent(inout):: qb_local ! local percentage of breaking waves Qb real*4, dimension(ntheta,no_nodes), intent(inout):: gam_local ! local incident wave height over water depth ratio From 9d1b5b8c7bcd96b2ac45b8e1cac75199a2d4b39a Mon Sep 17 00:00:00 2001 From: Leynse Date: Thu, 2 Apr 2026 18:05:17 +0200 Subject: [PATCH 078/118] - Add back Neumann message --- source/src/snapwave/snapwave_domain.f90 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/src/snapwave/snapwave_domain.f90 b/source/src/snapwave/snapwave_domain.f90 index f6bd5f65c..b46016406 100644 --- a/source/src/snapwave/snapwave_domain.f90 +++ b/source/src/snapwave/snapwave_domain.f90 @@ -320,6 +320,9 @@ subroutine initialize_snapwave_domain() ! call neuboundaries_light(x, y, msk, no_nodes, neumannconnected) ! + write(logstr,*)'SnapWave: Neumann connected boundaries found ...' + call write_log(logstr, 0) + ! else ! neumannconnected = 0 From d9989bac2a42e098a0592be26dd28ab3f8172802 Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 3 Apr 2026 12:22:18 +0200 Subject: [PATCH 079/118] - Bump version for clarity --- source/src/sfincs_lib.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/src/sfincs_lib.f90 b/source/src/sfincs_lib.f90 index 556f5cf30..dcd1b1708 100644 --- a/source/src/sfincs_lib.f90 +++ b/source/src/sfincs_lib.f90 @@ -95,7 +95,7 @@ function sfincs_initialize() result(ierr) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! build_revision = "$Rev: v2.3.2 mt. Faber+branch:281+292+snapwave_domain_updates" - build_date = "$Date: 2026-04-02" + build_date = "$Date: 2026-04-03" ! call write_log('', 1) call write_log('------------ Welcome to SFINCS ------------', 1) From e2103c250f9a44fc0c6561246cd87bee3b11455a Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 10 Apr 2026 10:56:25 +0200 Subject: [PATCH 080/118] - Clean up this PR, so that only the pure snapwave veggie changes remain, the mean flow effect is still kept in copy of this branch: 315-veggie-effect-on-mean-flow --- source/src/sfincs_momentum.f90 | 94 +--------------------------------- source/src/sfincs_quadtree.F90 | 31 ++--------- 2 files changed, 5 insertions(+), 120 deletions(-) diff --git a/source/src/sfincs_momentum.f90 b/source/src/sfincs_momentum.f90 index 9ff78125b..9f177c07e 100644 --- a/source/src/sfincs_momentum.f90 +++ b/source/src/sfincs_momentum.f90 @@ -7,8 +7,6 @@ module sfincs_momentum contains ! subroutine compute_fluxes(dt, tloop) - ! - use quadtree ! TEMP - to get the veggie variables, not the final solution, should go through sfincs_domain.f90 ! ! Computes fluxes over subgrid u and v points ! @@ -25,8 +23,7 @@ subroutine compute_fluxes(dt, tloop) integer :: nmu integer :: n integer :: m - integer :: iveg - + ! integer :: idir integer :: iref integer :: itype @@ -118,54 +115,6 @@ subroutine compute_fluxes(dt, tloop) !$omp end do !$omp end parallel ! - !Precalculate veggie terms: - ! - if (vegetation) then - ! New : vegetation drag due to mean flow - ! - if (quadtree_no_secveg > 0) then - ! only in case vegetation is present - ! - !$omp parallel & - !$omp private ( ip, nm, iveg ) - !$omp do - !$acc loop independent, gang, vector - ! - do ip = 1, npuv - ! - !if (kcuv(ip)==1) then - ! - ! Regular UV point - ! - ! Indices of surrounding water level points - ! - nm = uv_index_z_nm(ip) - nmu = uv_index_z_nmu(ip) - ! - veg_CdBNstems = 0.5*(veg_CdBNstems(nm,iveg)+veg_CdBNstems(nmu,iveg)) - ! - !do iveg=1,quadtree_no_secveg ! for each vertical vegetation section - ! - iveg = 1 - ! - !veg_fvm(nm, iveg) = 0.5 * veg_CdBNstems(nm, iveg) * uv0(ip) * abs(uv0(ip)) / rhow - veg_fvm(ip, iveg) = 0.5 * veg_CdBNstems * uv0(ip) * abs(uv0(ip)) / rhow - - ! in flux loop only still needs to be multiplied with 'hvegeff', which can still change - ! - ! NOTE: veg_CdBNstems = quadtree_snapwave_veg_Cd(nm, iveg) * quadtree_snapwave_veg_bstems(nm, iveg) * quadtree_snapwave_veg_Nstems(nm, iveg) - ! - !endif - enddo - !$omp end do - !$omp end parallel - else - ! - vegetation = .false. - ! - endif - endif - ! ! Copy flux and velocity from previous time step ! !$acc parallel, present( kcuv, kfuv, zs, q, q0, uv, uv0, zsderv, & @@ -632,47 +581,6 @@ subroutine compute_fluxes(dt, tloop) ! endif ! - if (vegetation) then - ! New : vegetation drag due to mean flow - - ! - - ! - !fvm = 0.0 - ! - !do iveg=1,quadtree_no_secveg ! for each vertical vegetation section - ! fvm = fvm + veg_fvm(nm,iveg) * min(quadtree_snapwave_veg_ah(ip,iveg), hu) - !enddo - ! - ! With all pre-calculateable terms already pre-determined for Fvm, beside effective depth: - iveg=1 !for testing keep at 1 - - - - - - - - - - - nm = uv_index_z_nm(ip) - nmu = uv_index_z_nmu(ip) - ! - veg_ah = 0.5*(quadtree_snapwave_veg_ah(nm,iveg)+quadtree_snapwave_veg_ah(nmu,iveg)) - - fvm = veg_fvm(ip,iveg) * min(veg_ah, hu) - - - ! - !fvm = veg_fvm(nm,iveg) * min(quadtree_snapwave_veg_ah(ip,iveg), hu) - ! FIXME Question TL: water depth per layer, or always compared to lower bed level, or? - ! - frc = frc - fvm ! FIXME - minus OR plus? - !frc = frc + fvm ! FIXME - minus OR plus? - ! - endif - ! ! Compute flux qfr used for friction term ! if (kfuv(ip) == 0) then diff --git a/source/src/sfincs_quadtree.F90 b/source/src/sfincs_quadtree.F90 index f8c6a6cb5..00f5eb2bb 100644 --- a/source/src/sfincs_quadtree.F90 +++ b/source/src/sfincs_quadtree.F90 @@ -51,8 +51,6 @@ module quadtree real*4, dimension(:,:), allocatable :: quadtree_snapwave_veg_ah real*4, dimension(:,:), allocatable :: quadtree_snapwave_veg_bstems real*4, dimension(:,:), allocatable :: quadtree_snapwave_veg_Nstems - real*4, dimension(:,:), allocatable :: veg_CdBNstems, veg_fvm - real*4 :: fvm ! integer :: quadtree_no_secveg ! nr of vegetation sections in vertical ! @@ -373,15 +371,6 @@ subroutine quadtree_read_file_netcdf(qtrfile, snapwave, nonhydrostatic, store_ve allocate(quadtree_snapwave_veg_bstems(np, quadtree_no_secveg)) allocate(quadtree_snapwave_veg_Nstems(np, quadtree_no_secveg)) ! - allocate(veg_CdBNstems(np, quadtree_no_secveg)) - !allocate(veg_fvm(np, quadtree_no_secveg)) - allocate(veg_fvm(npuv, quadtree_no_secveg)) !TODO - CHeck npuv - - ! - veg_CdBNstems = 0.0 - veg_fvm = 0.0 - fvm = 0.0 - ! endif endif ! @@ -430,30 +419,18 @@ subroutine quadtree_read_file_netcdf(qtrfile, snapwave, nonhydrostatic, store_ve NF90(nf90_get_var(net_file_qtr%ncid, net_file_qtr%mask_varid, quadtree_mask(:))) ! if (snapwave) then -! + ! if (store_vegetation) then - - - - - ! NF90(nf90_get_var(net_file_qtr%ncid, net_file_qtr%snapwave_veg_Cd_varid, quadtree_snapwave_veg_Cd(:,:))) NF90(nf90_get_var(net_file_qtr%ncid, net_file_qtr%snapwave_veg_ah_varid, quadtree_snapwave_veg_ah(:,:))) NF90(nf90_get_var(net_file_qtr%ncid, net_file_qtr%snapwave_veg_bstems_varid, quadtree_snapwave_veg_bstems(:,:))) - NF90(nf90_get_var(net_file_qtr%ncid, net_file_qtr%snapwave_veg_Nstems_varid, quadtree_snapwave_veg_Nstems(:,:))) - ! - ! Directly determine the multiplication of Cd*bstems*nstems: + NF90(nf90_get_var(net_file_qtr%ncid, net_file_qtr%snapwave_veg_Nstems_varid, quadtree_snapwave_veg_Nstems(:,:))) ! - do nm = 1, np - ! - do iveg = 1, quadtree_no_secveg - veg_CdBNstems(nm,iveg) = quadtree_snapwave_veg_Cd(nm,iveg) * quadtree_snapwave_veg_bstems(nm,iveg) * quadtree_snapwave_veg_Nstems(nm,iveg) - enddo - ! - enddo endif + ! NF90(nf90_get_var(net_file_qtr%ncid, net_file_qtr%snapwave_mask_varid, quadtree_snapwave_mask(:))) + ! endif ! ! Nonhydrostatic mask From 7a93b8c1ee16d669674ceb04f0f8432634b62b7d Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 10 Apr 2026 11:17:07 +0200 Subject: [PATCH 081/118] - Cleanup and switch to logicals --- source/src/sfincs_data.f90 | 3 ++- source/src/sfincs_input.f90 | 15 ++++----------- source/src/snapwave/snapwave_domain.f90 | 7 ------- 3 files changed, 6 insertions(+), 19 deletions(-) diff --git a/source/src/sfincs_data.f90 b/source/src/sfincs_data.f90 index 852bf3d9d..195ef4e3c 100644 --- a/source/src/sfincs_data.f90 +++ b/source/src/sfincs_data.f90 @@ -202,7 +202,8 @@ module sfincs_data logical :: subgrid logical :: manning2d ! spatially-varying roughness logical :: coriolis - logical :: vegetation + logical :: vegetation + logical :: snapwave_vegetation logical :: store_cumulative_precipitation logical :: store_maximum_waterlevel logical :: store_maximum_waterdepth diff --git a/source/src/sfincs_input.f90 b/source/src/sfincs_input.f90 index edc4abbc6..67995fa4b 100644 --- a/source/src/sfincs_input.f90 +++ b/source/src/sfincs_input.f90 @@ -25,8 +25,6 @@ subroutine read_sfincs_input() integer itsunamitime integer ispinupmeteo integer isnapwave - integer ivegetationsnapwave - integer ivegetationsfincs integer iwindmax integer iwind integer ioutfixed @@ -146,6 +144,7 @@ subroutine read_sfincs_input() call read_real_input(500, 'factor_pres', factor_pres, 1.0) call read_real_input(500, 'factor_prcp', factor_prcp, 1.0) call read_real_input(500, 'factor_spw_size', factor_spw_size, 1.0) + call read_logical_input(500,'vegetation',vegetation,.false.) ! ! Domain ! @@ -243,11 +242,9 @@ subroutine read_sfincs_input() ! Limit to range (0,100) percdoneval = max(min(percdoneval,100), 0) ! - call read_int_input(500,'vegetation',ivegetationsfincs,0) - ! ! Coupled SnapWave solver related call read_int_input(500,'snapwave_wind',iwind,0) - call read_int_input(500,'snapwave_vegetation',ivegetationsnapwave,0) + call read_logical_input(500,'snapwave_vegetation',snapwave_vegetation,.false.) ! ! Wind drag ! @@ -433,10 +430,11 @@ subroutine read_sfincs_input() endif ! store_vegetation = .false. - if (ivegetationsnapwave==1 .or. ivegetationsfincs==1) then + if (vegetation==.true. .or. snapwave_vegetation==.true.) then ! store_vegetation = .true. ! vegetation can be used in SnapWave and/or SFINCS calculations + ! endif ! store_twet = .false. @@ -535,11 +533,6 @@ subroutine read_sfincs_input() call write_log('Info : turning on process: Viscosity', 0) endif ! - vegetation = .false. - if (ivegetationsfincs>0) then - vegetation = .true. - endif - ! spinup_meteo = .true. if (ispinupmeteo==0) then spinup_meteo = .false. diff --git a/source/src/snapwave/snapwave_domain.f90 b/source/src/snapwave/snapwave_domain.f90 index 3100297ae..a1bfebd5a 100644 --- a/source/src/snapwave/snapwave_domain.f90 +++ b/source/src/snapwave/snapwave_domain.f90 @@ -86,13 +86,6 @@ subroutine initialize_snapwave_domain() ! ! Done with the mesh ! - ! keep on also if ja_vegetation==0, so array Dveg is initialized with zeroes - !if (ja_vegetation==1) then - ! call veggie_init() - !else - - !endif - ! ntheta360 = nint(360./dtheta) ntheta = nint(sector/dtheta) ! From be6f771ef948bb2b57350dec674c49f0deb7cfbc Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 10 Apr 2026 11:40:13 +0200 Subject: [PATCH 082/118] - Start of sfincs_vegetation --- source/sfincs_lib/sfincs_lib.vfproj | 41 +++++++++++----- source/src/Makefile.am | 1 + source/src/sfincs_data.f90 | 1 + source/src/sfincs_domain.f90 | 2 + source/src/sfincs_input.f90 | 1 + source/src/sfincs_vegetation.f90 | 76 +++++++++++++++++++++++++++++ 6 files changed, 109 insertions(+), 13 deletions(-) create mode 100644 source/src/sfincs_vegetation.f90 diff --git a/source/sfincs_lib/sfincs_lib.vfproj b/source/sfincs_lib/sfincs_lib.vfproj index 34b9b0f84..9275b4af9 100644 --- a/source/sfincs_lib/sfincs_lib.vfproj +++ b/source/sfincs_lib/sfincs_lib.vfproj @@ -32,10 +32,14 @@ - - - - + + + + + + + + @@ -46,7 +50,8 @@ - + + @@ -55,19 +60,26 @@ - - + + + + - + + - + + - - + + + + - + + @@ -97,7 +109,8 @@ - + + @@ -108,6 +121,8 @@ + + diff --git a/source/src/Makefile.am b/source/src/Makefile.am index bc8a2b9f9..8a215d0ce 100644 --- a/source/src/Makefile.am +++ b/source/src/Makefile.am @@ -23,6 +23,7 @@ libsfincs_la_SOURCES = \ ../third_party_open/utils/geometry.f90 \ sfincs_error.f90 \ sfincs_quadtree.f90 \ + sfincs_vegetation.f90 \ snapwave/interp.F90 \ snapwave/snapwave_data.f90 \ snapwave/snapwave_ncinput.F90 \ diff --git a/source/src/sfincs_data.f90 b/source/src/sfincs_data.f90 index 195ef4e3c..9b7b77265 100644 --- a/source/src/sfincs_data.f90 +++ b/source/src/sfincs_data.f90 @@ -174,6 +174,7 @@ module sfincs_data character*256 :: wvmfile character*256 :: qtrfile character*256 :: volfile + character*256 :: veggiefile ! character*256 :: trefstr_iso8601 character*41 :: treftimefews diff --git a/source/src/sfincs_domain.f90 b/source/src/sfincs_domain.f90 index c07b455d5..334969ed7 100644 --- a/source/src/sfincs_domain.f90 +++ b/source/src/sfincs_domain.f90 @@ -26,6 +26,8 @@ subroutine initialize_domain() ! call initialize_storage_volume() ! + call initialize_vegetation() + ! call initialize_hydro() ! if (quadtree_nr_levels == 1 .and. .not. use_quadtree_output) then diff --git a/source/src/sfincs_input.f90 b/source/src/sfincs_input.f90 index 67995fa4b..6763bce1b 100644 --- a/source/src/sfincs_input.f90 +++ b/source/src/sfincs_input.f90 @@ -162,6 +162,7 @@ subroutine read_sfincs_input() call read_char_input(500,'manningfile',manningfile,'none') call read_char_input(500,'drnfile',drnfile,'none') call read_char_input(500,'volfile',volfile,'none') + call read_char_input(500,'vegetationfile',veggiefile,'none') ! ! Forcing ! diff --git a/source/src/sfincs_vegetation.f90 b/source/src/sfincs_vegetation.f90 new file mode 100644 index 000000000..096bbc6cc --- /dev/null +++ b/source/src/sfincs_vegetation.f90 @@ -0,0 +1,76 @@ +module sfincs_vegetation + + use sfincs_log + use sfincs_error + +contains + + subroutine initialize_vegetation() + ! + use sfincs_data + use sfincs_ncinput + ! + implicit none + ! + integer :: nm + ! + logical :: ok + ! + character*256 :: varname + ! + if (store_vegetation) then !either SFINCS and/or SnapWave needs veggie input + ! + write(logstr,'(a,a)')'Info : reading vegetation file ',trim(veggiefile) + call write_log(logstr, 0) + ! + ok = check_file_exists(veggiefile, 'Vegetation file', .true.) + ! + ! Get dimension of vertical sections + NF90(nf90_inq_dimid(net_file_qtr%ncid, "nsec", net_file_qtr%nsec_dimid)) + ! + NF90(nf90_inquire_dimension(net_file_qtr%ncid, net_file_qtr%nsec_dimid, len = quadtree_no_secveg)) + ! + ! get ids of variables + NF90(nf90_inq_varid(net_file_qtr%ncid, 'snapwave_veg_Cd', net_file_qtr%snapwave_veg_Cd_varid)) + NF90(nf90_inq_varid(net_file_qtr%ncid, 'snapwave_veg_ah', net_file_qtr%snapwave_veg_ah_varid)) + NF90(nf90_inq_varid(net_file_qtr%ncid, 'snapwave_veg_bstems', net_file_qtr%snapwave_veg_bstems_varid)) + NF90(nf90_inq_varid(net_file_qtr%ncid, 'snapwave_veg_Nstems', net_file_qtr%snapwave_veg_Nstems_varid)) + ! + ! allocate variables + allocate(vegetation_cd(np, vegetation_vertical_segments)) + allocate(vegetation_stems_height(np, vegetation_vertical_segments)) !=vegetation_ah + allocate(vegetation_stems_width(np, vegetation_vertical_segments)) !=vegetation_bstems + allocate(vegetation_stems_density(np, vegetation_vertical_segments)) !=vegetation_Nstems + ! + vegetation_cd = 0.0 + vegetation_stems_height = 0.0 + vegetation_stems_width = 0.0 + vegetation_stems_density = 0.0 + ! + ! Call the generic quadtree nc file reader function + varname = 'snapwave_veg_Cd' + !varname = 'vegegation_cd' ! TODO: change input into this + call read_netcdf_quadtree_to_sfincs(veggiefile, varname, vegetation_cd) !ncfile, varname, varout) + ! + ! Call the generic quadtree nc file reader function + varname = 'snapwave_veg_ah' + !varname = 'vegetation_stems_height' ! TODO: change input into this + call read_netcdf_quadtree_to_sfincs(veggiefile, varname, vegetation_stems_height) !ncfile, varname, varout) + ! + ! Call the generic quadtree nc file reader function + varname = 'snapwave_veg_bstems' + !varname = 'vegetation_stems_width' ! TODO: change input into this + call read_netcdf_quadtree_to_sfincs(veggiefile, varname, vegetation_stems_width) !ncfile, varname, varout) + ! + ! Call the generic quadtree nc file reader function + varname = 'snapwave_veg_Nstems' + !varname = 'vegetation_stems_density' ! TODO: change input into this + call read_netcdf_quadtree_to_sfincs(veggiefile, varname, vegetation_stems_density) !ncfile, varname, varout) + + endif + + + ! + end subroutine + +end module \ No newline at end of file From bf1ff20d43a29ef3448917728fffbf058273a639 Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 10 Apr 2026 11:41:26 +0200 Subject: [PATCH 083/118] - Only for quadtree --- source/src/sfincs_vegetation.f90 | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/source/src/sfincs_vegetation.f90 b/source/src/sfincs_vegetation.f90 index 096bbc6cc..ce4bd0753 100644 --- a/source/src/sfincs_vegetation.f90 +++ b/source/src/sfincs_vegetation.f90 @@ -18,6 +18,12 @@ subroutine initialize_vegetation() ! character*256 :: varname ! + if (use_quadtree .eqv. .false.) then + ! + call stop_sfincs('Error ! Netcdf vegetation input format can only be specified for quadtree mesh model !', 1) + ! + endif + ! if (store_vegetation) then !either SFINCS and/or SnapWave needs veggie input ! write(logstr,'(a,a)')'Info : reading vegetation file ',trim(veggiefile) @@ -68,8 +74,6 @@ subroutine initialize_vegetation() call read_netcdf_quadtree_to_sfincs(veggiefile, varname, vegetation_stems_density) !ncfile, varname, varout) endif - - ! end subroutine From 9820d7b92a1d8806b453336bbeb9240b5a6a1c06 Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 10 Apr 2026 11:49:43 +0200 Subject: [PATCH 084/118] - Move veggie reference out of sfincs_quadtree --- source/src/sfincs_data.f90 | 8 +++++ source/src/sfincs_quadtree.F90 | 50 +++++--------------------------- source/src/sfincs_vegetation.f90 | 2 +- 3 files changed, 16 insertions(+), 44 deletions(-) diff --git a/source/src/sfincs_data.f90 b/source/src/sfincs_data.f90 index 07cd07e8b..e2fcd505d 100644 --- a/source/src/sfincs_data.f90 +++ b/source/src/sfincs_data.f90 @@ -423,6 +423,14 @@ module sfincs_data ! real*4, dimension(:), allocatable :: uvmean ! + ! Vegetation + ! + integer :: vegetation_vertical_segments ! nr of vegetation sections in vertical + real*4, dimension(:,:), allocatable :: vegetation_cd + real*4, dimension(:,:), allocatable :: vegetation_stems_height + real*4, dimension(:,:), allocatable :: vegetation_stems_width + real*4, dimension(:,:), allocatable :: vegetation_stems_density + ! !!! Wave makers ! character*256 :: wavemaker_wvmfile ! polylines diff --git a/source/src/sfincs_quadtree.F90 b/source/src/sfincs_quadtree.F90 index 00f5eb2bb..28e197a8d 100644 --- a/source/src/sfincs_quadtree.F90 +++ b/source/src/sfincs_quadtree.F90 @@ -47,12 +47,6 @@ module quadtree integer*1, dimension(:), allocatable :: quadtree_snapwave_mask integer*1, dimension(:), allocatable :: quadtree_nonh_mask ! - real*4, dimension(:,:), allocatable :: quadtree_snapwave_veg_Cd - real*4, dimension(:,:), allocatable :: quadtree_snapwave_veg_ah - real*4, dimension(:,:), allocatable :: quadtree_snapwave_veg_bstems - real*4, dimension(:,:), allocatable :: quadtree_snapwave_veg_Nstems - ! - integer :: quadtree_no_secveg ! nr of vegetation sections in vertical ! type net_type_qtr integer :: ncid @@ -62,20 +56,19 @@ module quadtree integer :: nu_varid, mu_varid, nd_varid, md_varid integer :: nu1_varid, mu1_varid, nd1_varid, md1_varid, nu2_varid, mu2_varid, nd2_varid, md2_varid integer :: z_varid, mask_varid, snapwave_mask_varid, nonh_mask_varid - integer :: snapwave_veg_Cd_varid, snapwave_veg_ah_varid, snapwave_veg_bstems_varid, snapwave_veg_Nstems_varid end type type(net_type_qtr) :: net_file_qtr ! contains ! - subroutine quadtree_read_file(qtrfile, snapwave, nonhydrostatic, store_vegetation) + subroutine quadtree_read_file(qtrfile, snapwave, nonhydrostatic) ! ! Reads quadtree file ! implicit none ! character*256, intent(in) :: qtrfile - logical, intent(in) :: snapwave, nonhydrostatic, store_vegetation + logical, intent(in) :: snapwave, nonhydrostatic ! real*4, dimension(:), allocatable :: dxr real*4, dimension(:), allocatable :: dyr @@ -98,7 +91,7 @@ subroutine quadtree_read_file(qtrfile, snapwave, nonhydrostatic, store_vegetatio ok = check_file_exists(qtrfile, 'Quadtree qtr file', .true.) ! if (quadtree_netcdf) then - call quadtree_read_file_netcdf(qtrfile, snapwave, nonhydrostatic, store_vegetation) + call quadtree_read_file_netcdf(qtrfile, snapwave, nonhydrostatic) else call quadtree_read_file_binary(qtrfile) endif @@ -299,17 +292,17 @@ subroutine quadtree_read_file_binary(qtrfile) end subroutine - subroutine quadtree_read_file_netcdf(qtrfile, snapwave, nonhydrostatic, store_vegetation) + subroutine quadtree_read_file_netcdf(qtrfile, snapwave, nonhydrostatic) ! ! Reads quadtree file from netcdf file ! implicit none ! character*256, intent(in) :: qtrfile - logical, intent(in) :: snapwave, nonhydrostatic, store_vegetation + logical, intent(in) :: snapwave, nonhydrostatic ! integer*1 :: iversion - integer :: np, nm, ip, iveg, iepsg, status + integer :: np, nm, ip, iepsg, status ! write(logstr,'(a,a)')'Info : reading QuadTree netCDF file ', trim(qtrfile) call write_log(logstr, 0) @@ -351,27 +344,7 @@ subroutine quadtree_read_file_netcdf(qtrfile, snapwave, nonhydrostatic, store_ve NF90(nf90_inq_varid(net_file_qtr%ncid, 'snapwave_mask', net_file_qtr%snapwave_mask_varid)) ! allocate(quadtree_snapwave_mask(np)) - - if (store_vegetation) then ! only read snapwave_veg_Cd, _ah, _bstems, _Nstems if snapwave_vegetation turned on - ! - ! Get dimension of vertical sections - NF90(nf90_inq_dimid(net_file_qtr%ncid, "nsec", net_file_qtr%nsec_dimid)) - ! - NF90(nf90_inquire_dimension(net_file_qtr%ncid, net_file_qtr%nsec_dimid, len = quadtree_no_secveg)) - ! - ! get ids of variables - NF90(nf90_inq_varid(net_file_qtr%ncid, 'snapwave_veg_Cd', net_file_qtr%snapwave_veg_Cd_varid)) - NF90(nf90_inq_varid(net_file_qtr%ncid, 'snapwave_veg_ah', net_file_qtr%snapwave_veg_ah_varid)) - NF90(nf90_inq_varid(net_file_qtr%ncid, 'snapwave_veg_bstems', net_file_qtr%snapwave_veg_bstems_varid)) - NF90(nf90_inq_varid(net_file_qtr%ncid, 'snapwave_veg_Nstems', net_file_qtr%snapwave_veg_Nstems_varid)) - ! - ! allocate variables - allocate(quadtree_snapwave_veg_Cd(np, quadtree_no_secveg)) - allocate(quadtree_snapwave_veg_ah(np, quadtree_no_secveg)) - allocate(quadtree_snapwave_veg_bstems(np, quadtree_no_secveg)) - allocate(quadtree_snapwave_veg_Nstems(np, quadtree_no_secveg)) - ! - endif + ! endif ! ! Allocate variables @@ -419,15 +392,6 @@ subroutine quadtree_read_file_netcdf(qtrfile, snapwave, nonhydrostatic, store_ve NF90(nf90_get_var(net_file_qtr%ncid, net_file_qtr%mask_varid, quadtree_mask(:))) ! if (snapwave) then - ! - if (store_vegetation) then - ! - NF90(nf90_get_var(net_file_qtr%ncid, net_file_qtr%snapwave_veg_Cd_varid, quadtree_snapwave_veg_Cd(:,:))) - NF90(nf90_get_var(net_file_qtr%ncid, net_file_qtr%snapwave_veg_ah_varid, quadtree_snapwave_veg_ah(:,:))) - NF90(nf90_get_var(net_file_qtr%ncid, net_file_qtr%snapwave_veg_bstems_varid, quadtree_snapwave_veg_bstems(:,:))) - NF90(nf90_get_var(net_file_qtr%ncid, net_file_qtr%snapwave_veg_Nstems_varid, quadtree_snapwave_veg_Nstems(:,:))) - ! - endif ! NF90(nf90_get_var(net_file_qtr%ncid, net_file_qtr%snapwave_mask_varid, quadtree_snapwave_mask(:))) ! diff --git a/source/src/sfincs_vegetation.f90 b/source/src/sfincs_vegetation.f90 index ce4bd0753..59657d1b0 100644 --- a/source/src/sfincs_vegetation.f90 +++ b/source/src/sfincs_vegetation.f90 @@ -34,7 +34,7 @@ subroutine initialize_vegetation() ! Get dimension of vertical sections NF90(nf90_inq_dimid(net_file_qtr%ncid, "nsec", net_file_qtr%nsec_dimid)) ! - NF90(nf90_inquire_dimension(net_file_qtr%ncid, net_file_qtr%nsec_dimid, len = quadtree_no_secveg)) + NF90(nf90_inquire_dimension(net_file_qtr%ncid, net_file_qtr%nsec_dimid, len = vegetation_vertical_segments)) ! ! get ids of variables NF90(nf90_inq_varid(net_file_qtr%ncid, 'snapwave_veg_Cd', net_file_qtr%snapwave_veg_Cd_varid)) From 0e68552e15954955284a84c00c11a4e15e6581fe Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 10 Apr 2026 12:06:41 +0200 Subject: [PATCH 085/118] - Add new generic subroutine 'read_netcdf_quadtree_get_dimension' - cleanup --- source/src/sfincs_domain.f90 | 2 +- source/src/sfincs_ncinput.F90 | 40 +++++++++++++++++++++++++ source/src/sfincs_vegetation.f90 | 24 +++++++-------- source/src/snapwave/snapwave_domain.f90 | 14 ++++----- 4 files changed, 58 insertions(+), 22 deletions(-) diff --git a/source/src/sfincs_domain.f90 b/source/src/sfincs_domain.f90 index 832b57152..010133d32 100644 --- a/source/src/sfincs_domain.f90 +++ b/source/src/sfincs_domain.f90 @@ -193,7 +193,7 @@ subroutine initialize_mesh() ! ! Read quadtree file ! - call quadtree_read_file(qtrfile, snapwave, nonhydrostatic, store_vegetation) + call quadtree_read_file(qtrfile, snapwave, nonhydrostatic) ! else ! diff --git a/source/src/sfincs_ncinput.F90 b/source/src/sfincs_ncinput.F90 index 40238e1b6..eadecddd9 100644 --- a/source/src/sfincs_ncinput.F90 +++ b/source/src/sfincs_ncinput.F90 @@ -244,6 +244,46 @@ subroutine read_netcdf_storage_volume() ! end subroutine + subroutine read_netcdf_quadtree_get_dimension(ncfile, varname, var) + ! For instance: vegetationfile, nsec, vegetation_vertical_segments + ! + use netcdf + use sfincs_data + use quadtree + ! + implicit none + ! + integer :: nm, ip, nrcells, status + ! + character*256 :: ncfile + character*256 :: varname + ! + integer, intent(inout) :: var ! variable that we are mapping to + ! + real*4, dimension(:), allocatable :: vartmp + ! + ! Open netcdf file + ! + NF90(nf90_open(trim(ncfile), NF90_CLOBBER, net_file_generic%ncid)) + ! + ! Get dimensions id's: nr points + ! + NF90(nf90_inq_dimid(net_file_generic%ncid, varname, net_file_generic%np_dimid)) + ! + ! Get dimensions sizes + ! + status = nf90_inquire_dimension(net_file_generic%ncid, net_file_generic%np_dimid, len = var) + ! + ! Stop SFINCS if wanted variable was not found + if (status /= nf90_noerr) then + write(logstr,'(a,a,a,a,a)')'Error : netcdf input file ',trim(ncfile),' does not contain needed variable: ',trim(varname),' !' + call stop_sfincs(trim(logstr), 1) + endif + ! + NF90(nf90_close(net_file_generic%ncid)) + ! + end subroutine + subroutine read_netcdf_quadtree_to_sfincs(ncfile, varname, var) ! For instance: storage_volume.nc, vol, storage_volume ! diff --git a/source/src/sfincs_vegetation.f90 b/source/src/sfincs_vegetation.f90 index 59657d1b0..7460398c1 100644 --- a/source/src/sfincs_vegetation.f90 +++ b/source/src/sfincs_vegetation.f90 @@ -30,18 +30,14 @@ subroutine initialize_vegetation() call write_log(logstr, 0) ! ok = check_file_exists(veggiefile, 'Vegetation file', .true.) - ! + ! ! Get dimension of vertical sections - NF90(nf90_inq_dimid(net_file_qtr%ncid, "nsec", net_file_qtr%nsec_dimid)) ! - NF90(nf90_inquire_dimension(net_file_qtr%ncid, net_file_qtr%nsec_dimid, len = vegetation_vertical_segments)) - ! - ! get ids of variables - NF90(nf90_inq_varid(net_file_qtr%ncid, 'snapwave_veg_Cd', net_file_qtr%snapwave_veg_Cd_varid)) - NF90(nf90_inq_varid(net_file_qtr%ncid, 'snapwave_veg_ah', net_file_qtr%snapwave_veg_ah_varid)) - NF90(nf90_inq_varid(net_file_qtr%ncid, 'snapwave_veg_bstems', net_file_qtr%snapwave_veg_bstems_varid)) - NF90(nf90_inq_varid(net_file_qtr%ncid, 'snapwave_veg_Nstems', net_file_qtr%snapwave_veg_Nstems_varid)) - ! + ! Call the generic quadtree nc file reader function + varname = 'nsec' + !varname = 'vegetation_vertical_segments' ! TODO: change input into this + call read_netcdf_quadtree_get_dimension(veggiefile, varname, vegetation_vertical_segments) !ncfile, varname, varout) + ! ! allocate variables allocate(vegetation_cd(np, vegetation_vertical_segments)) allocate(vegetation_stems_height(np, vegetation_vertical_segments)) !=vegetation_ah @@ -55,22 +51,22 @@ subroutine initialize_vegetation() ! ! Call the generic quadtree nc file reader function varname = 'snapwave_veg_Cd' - !varname = 'vegegation_cd' ! TODO: change input into this + !varname = 'vegegation_cd' ! TODO: change naming netcdf file into this call read_netcdf_quadtree_to_sfincs(veggiefile, varname, vegetation_cd) !ncfile, varname, varout) ! ! Call the generic quadtree nc file reader function varname = 'snapwave_veg_ah' - !varname = 'vegetation_stems_height' ! TODO: change input into this + !varname = 'vegetation_stems_height' ! TODO: change naming netcdf file into this call read_netcdf_quadtree_to_sfincs(veggiefile, varname, vegetation_stems_height) !ncfile, varname, varout) ! ! Call the generic quadtree nc file reader function varname = 'snapwave_veg_bstems' - !varname = 'vegetation_stems_width' ! TODO: change input into this + !varname = 'vegetation_stems_width' ! TODO: change naming netcdf file into this call read_netcdf_quadtree_to_sfincs(veggiefile, varname, vegetation_stems_width) !ncfile, varname, varout) ! ! Call the generic quadtree nc file reader function varname = 'snapwave_veg_Nstems' - !varname = 'vegetation_stems_density' ! TODO: change input into this + !varname = 'vegetation_stems_density' ! TODO: change naming netcdf file into this call read_netcdf_quadtree_to_sfincs(veggiefile, varname, vegetation_stems_density) !ncfile, varname, varout) endif diff --git a/source/src/snapwave/snapwave_domain.f90 b/source/src/snapwave/snapwave_domain.f90 index d7f9428f4..8290a3bb1 100644 --- a/source/src/snapwave/snapwave_domain.f90 +++ b/source/src/snapwave/snapwave_domain.f90 @@ -2113,9 +2113,9 @@ subroutine read_snapwave_quadtree_mesh(load_quadtree) enddo enddo ! - ! STEP 9 - if vegetation, re-map veggie input from quadtree netcdf file - ! Set 'no_secveg' from quadtree.F90 for use in snapwave_data - no_secveg = quadtree_no_secveg + ! STEP 9 - if vegetation, re-map veggie input from quadtree netcdf vegetationfile + ! Set 'no_secveg' from sfincs_vegetation.f90 for use in snapwave_data + no_secveg = vegetation_vertical_segments allocate(veg_Cd(no_nodes, no_secveg)) allocate(veg_ah(no_nodes, no_secveg)) allocate(veg_bstems(no_nodes, no_secveg)) @@ -2137,10 +2137,10 @@ subroutine read_snapwave_quadtree_mesh(load_quadtree) ! ! Set node values for all points in the vertical do iq = 1, no_secveg - veg_Cd(nac,iq) = quadtree_snapwave_veg_Cd(ip,iq) - veg_ah(nac,iq) = quadtree_snapwave_veg_ah(ip,iq) - veg_bstems(nac,iq) = quadtree_snapwave_veg_bstems(ip,iq) - veg_Nstems(nac,iq) = quadtree_snapwave_veg_Nstems(ip,iq) + veg_Cd(nac,iq) = vegetation_cd(ip,iq) + veg_ah(nac,iq) = vegetation_stems_height(ip,iq) + veg_bstems(nac,iq) = vegetation_stems_width(ip,iq) + veg_Nstems(nac,iq) = vegetation_stems_density(ip,iq) enddo ! endif From 6ffdb26cb0c2cab32ae8e82c226f76ad2dd03cc7 Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 10 Apr 2026 12:16:31 +0200 Subject: [PATCH 086/118] - Neat way to import only needed veggie variables from sfincs_data into snapwave_domain --- source/src/sfincs_domain.f90 | 1 + source/src/snapwave/snapwave_domain.f90 | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/source/src/sfincs_domain.f90 b/source/src/sfincs_domain.f90 index 010133d32..d754dee73 100644 --- a/source/src/sfincs_domain.f90 +++ b/source/src/sfincs_domain.f90 @@ -10,6 +10,7 @@ subroutine initialize_domain() use sfincs_data use quadtree use sfincs_infiltration + use sfincs_vegetation use sfincs_timestep_analysis ! implicit none diff --git a/source/src/snapwave/snapwave_domain.f90 b/source/src/snapwave/snapwave_domain.f90 index 8290a3bb1..61c2c2250 100644 --- a/source/src/snapwave/snapwave_domain.f90 +++ b/source/src/snapwave/snapwave_domain.f90 @@ -1116,6 +1116,9 @@ subroutine read_snapwave_quadtree_mesh(load_quadtree) ! use snapwave_data use quadtree + use sfincs_data, only: vegetation_cd, vegetation_stems_height, & + vegetation_stems_width, vegetation_stems_density, & + vegetation_vertical_segments ! ! Local input variables ! @@ -2113,13 +2116,16 @@ subroutine read_snapwave_quadtree_mesh(load_quadtree) enddo enddo ! - ! STEP 9 - if vegetation, re-map veggie input from quadtree netcdf vegetationfile + ! STEP 9 - if vegetation, re-map veggie input from quadtree netcdf vegetationfile ! Set 'no_secveg' from sfincs_vegetation.f90 for use in snapwave_data + ! no_secveg = vegetation_vertical_segments + ! allocate(veg_Cd(no_nodes, no_secveg)) allocate(veg_ah(no_nodes, no_secveg)) allocate(veg_bstems(no_nodes, no_secveg)) allocate(veg_Nstems(no_nodes, no_secveg)) + ! veg_Cd = 0.0 veg_ah = 0.0 veg_bstems = 0.0 From 6064edbc476d8da77b54f78e5c65b4b678e5f076 Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 10 Apr 2026 12:28:37 +0200 Subject: [PATCH 087/118] - Cleanup code --- source/src/snapwave/snapwave_solver.f90 | 34 +++---------------------- 1 file changed, 3 insertions(+), 31 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 3ab03bd9f..742876fdf 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -643,10 +643,6 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & endif ! DoverE(k) = (Dwk + Dfk + Dvegk)/max(Ek, 1.0e-6) - !if (Dvegk > 0.0) then - ! write(logstr,*)'k ',k,'depth(k)',depth(k),'Hk ',Hk,'Ek ',Ek,'Dwk ', Dwk,'Dfk ', Dfk,'Dvegk ', Dvegk,'DoverE veggie ', DoverE(k),'DoverE org ', (Dwk + Dfk)/max(Ek, 1.0e-6) - ! call write_log(logstr, 0) - !endif ! if (wind) then ! @@ -900,10 +896,8 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & if (vegetation) then ! ! Compute the non-linear wave velocity time series (unl) using a wave shape model > only needs to be called once per calling SnapWave - !write(*,*)'Call swvegnonlin' ! call swvegnonlin(no_nodes, kwav, depth, H, g, Tp, unl, etaw0) - !write(*,*)'Finished swvegnonlin' ! endif ! @@ -929,18 +923,14 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & else call baldock(rho, g, alfa, gamma, depth(k), H(k), Tp(k), 1, Dw(k), Hmx(k)) F(k) = Dw(k)*kwav(k)/sig(k)/rho/depth(k) - !F(k) = (Dw(k) + Df(k))*kwav(k)/sig(k)/rho/depth(k) - !F(k) = (Dw(k) + Df(k))*kwav(k)/sigm ! TODO TL: before was this, now multiplied with rho*depth(k) in sfincs_snapwave.f90 endif ! if (vegetation) then ! ! Compute wave dissipation due to vegetation - !write(*,*)'Call vegatt' call vegatt(sig(k), no_nodes, kwav(k), no_secveg, veg_ah(k,:), veg_bstems(k,:), veg_Nstems(k,:), veg_Cd(k,:), depth(k), rho, g, H(k), Dveg(k)) ! ! Now also call 'momeqveg' to compute wave drag force due to vegetation - !write(*,*)'Call momeqveg' call momeqveg(no_nodes, no_secveg, veg_ah(k,:), veg_bstems(k,:), veg_Nstems(k,:), veg_Cd(k,:), depth(k), rho, H(k), Tp(k), unl(k,:), Fvw(k)) ! NOTE - TL: for now replaced 'Trep' by 'Tp(k)' ! @@ -949,24 +939,9 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & Fvw(k) = 0. endif ! - !F(k) = Dw(k)*kwav(k)/sig(k)/rho/depth(k) - !F(k) = (Dw(k) + Df(k))*kwav(k)/sig(k)/rho/depth(k) F(k) = (Dw(k) + Dveg(k))*kwav(k)/sig(k)/rho/depth(k) - F(k) = F(k) + Fvw(k) ! FIXME - still *kwav(k)/sig(k) ??? - - !F(k) = (Dw(k) + Df(k))*kwav(k)/sigm ! TODO TL: before was this, now multiplied with rho*depth(k) in sfincs_snapwave.f90 ! - !if (vegetation) then - ! if (Dveg(k) > 0.0) then - ! write(logstr,*)'k ',k,'depth(k)',depth(k),'H(k) ',H(k),'Dw(k) ', Dw(k),'Dveg(k) ', Dveg(k),'Hmx(k) ', Hmx(k),'kwav(k) ', kwav(k),'sig(k) ', sig(k), 'thetam(k)',thetam(k),'F(k) ',F(k) - ! call write_log(logstr, 0) - ! endif - !else - ! if (H(k) > 0.0) then - ! write(logstr,*)'k ',k,'depth(k)',depth(k),'H(k) ',H(k),'Dw(k) ', Dw(k),'Hmx(k) ', Hmx(k),'kwav(k) ', kwav(k),'sig(k) ', sig(k), 'thetam(k)',thetam(k),'F(k) ',F(k) - ! call write_log(logstr, 0) - ! endif - !endif + F(k) = F(k) + Fvw(k) ! FIXME - still *kwav(k)/sig(k) ??? ! if (igwaves) then ! @@ -1615,9 +1590,7 @@ subroutine momeqveg(no_nodes, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, integer :: m, t real*4 :: dt, hvegeff, Fvgnlt, integral real*4 :: Cd, b, N - ! - !write(*,*)'Started momeqveg' - + ! ! Initialize output force ! Fvw = 0.0 @@ -1644,8 +1617,7 @@ subroutine momeqveg(no_nodes, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, Fvw = Fvw + Fvgnlt enddo - !write(*,*)'Ended momeqveg' - + ! end subroutine momeqveg subroutine swvegnonlin(no_nodes, kwav, depth, H, g, Trep, unl, etaw0) From 2ef01e5a6f0219e25e57b12a3f8304e1eaa3ca18 Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 10 Apr 2026 12:54:19 +0200 Subject: [PATCH 088/118] - Manual merge back swvegnonlin, momeqveg, update F(k) --- source/src/snapwave/snapwave_solver.f90 | 54 ++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 4d1c406ca..4c6d901ef 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1022,8 +1022,6 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! thetam(k) = atan2(sum(ee(:, k) * sin(theta)), sum(ee(:, k) * cos(theta))) ! - F(k) = Dw(k) * kwav(k) / sig(k) / rho / depth(k) - ! if (igwaves) then ! ! IG wave height @@ -1053,6 +1051,58 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & enddo !$omp end parallel do ! + ! For vegetation, need to compute unl using updated H(k) + ! + if (vegetation) then + ! + ! Compute the non-linear wave velocity time series (unl) using a wave shape model > only needs to be called once per calling SnapWave + ! + call swvegnonlin(no_nodes, kwav, depth, H, g, Tp, unl, etaw0) + ! + endif + ! + ! Update wave forces - depends on vegetation + !$omp parallel do schedule(static) + do k = 1, no_nodes + ! + ! Compute some directionally integrated parameters for output + ! + if (depth(k) > hmin) then + ! + ! Update wave breaking dissipation > FIXME - should be called again using updated H(k) or not? + !if (wind) then + ! call baldock(rho, g, alfa, gamma, depth(k), H(k), 2.0*pi/sig(k), 1, Dw(k), Hmx(k)) + !else + ! call baldock(rho, g, alfa, gamma, depth(k), H(k), Tp(k), 1, Dw(k), Hmx(k)) + !endif + ! + ! Update wave forces + F(k) = Dw(k) * kwav(k) / sig(k) / rho / depth(k) + ! + ! In case of vegetation, we also need to update the vegetation dissipation and compute wave drag force due to vegetation + ! + if (vegetation) then + ! + ! Compute wave dissipation due to vegetation > FIXME - correct that it should be called again to update Dveg based on updated H(k)? + ! + call vegatt(sig(k), no_nodes, kwav(k), no_secveg, veg_ah(k,:), veg_bstems(k,:), veg_Nstems(k,:), veg_Cd(k,:), depth(k), rho, g, H(k), Dveg(k)) + ! + F(k) = F(k) + ( Dveg(k) * kwav(k) / sig(k) / rho / depth(k) ) + ! + ! Now also call 'momeqveg' to compute wave drag force due to vegetation Fvw + ! + call momeqveg(no_nodes, no_secveg, veg_ah(k,:), veg_bstems(k,:), veg_Nstems(k,:), veg_Cd(k,:), depth(k), rho, H(k), Tp(k), unl(k,:), Fvw(k)) + ! NOTE - TL: for now replaced 'Trep' by 'Tp(k)' + ! + F(k) = F(k) + Fvw(k) ! FIXME - still *kwav(k)/sig(k) ??? + ! + endif + ! + endif + ! + enddo + !$omp end parallel do + ! callno = callno + 1 ! end subroutine solve_energy_balance2Dstat From 40deeae869279622b8d17e6e14f43baa3eeda962 Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 10 Apr 2026 14:15:38 +0200 Subject: [PATCH 089/118] - For now limit vegetation_vertical_segments to max 4 --- source/src/sfincs_vegetation.f90 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/src/sfincs_vegetation.f90 b/source/src/sfincs_vegetation.f90 index 7460398c1..bdc8e4c52 100644 --- a/source/src/sfincs_vegetation.f90 +++ b/source/src/sfincs_vegetation.f90 @@ -38,6 +38,12 @@ subroutine initialize_vegetation() !varname = 'vegetation_vertical_segments' ! TODO: change input into this call read_netcdf_quadtree_get_dimension(veggiefile, varname, vegetation_vertical_segments) !ncfile, varname, varout) ! + if (vegetation_vertical_segments > 4) then + ! + call stop_sfincs('Error ! Maximum allowed vertical sections for vegetation specified in vegetationfile is 4 !', 1) + ! + endif + ! ! allocate variables allocate(vegetation_cd(np, vegetation_vertical_segments)) allocate(vegetation_stems_height(np, vegetation_vertical_segments)) !=vegetation_ah From 942d71d7dbaee0ec1790e1e7effa8d48b98b9125 Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 10 Apr 2026 14:48:10 +0200 Subject: [PATCH 090/118] - move check from sfincs_snapwave to wavemaker (not veggie related), if snapwave yes but wavemaker no, the message before still appeared --- source/src/sfincs_snapwave.f90 | 11 +---------- source/src/sfincs_wavemaker.f90 | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index afe35a583..52263b00a 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -583,17 +583,8 @@ subroutine compute_snapwave(t) if (igwaves) then ! snapwave_tpigmean = tpmean_bwv_ig - ! - if (snapwave_tpigmean < 10.0) then - ! These warnings should not occur here - write(logstr,*)'DEBUG SFINCS_SnapWave - incoming tp for IG wave at wavemaker might be unrealistically small! value: ',snapwave_tpigmean - call write_log(logstr, 0) - elseif (snapwave_tpigmean > 250.0) then - write(logstr,*)'DEBUG SFINCS_SnapWave - incoming tp for IG wave at wavemaker might be unrealistically large! value: ',snapwave_tpigmean - call write_log(logstr, 0) - endif + ! endif - ! TL: NOTE - in first timestep run of SnapWave tp = 0, therefore excluded that case from the check ! end subroutine diff --git a/source/src/sfincs_wavemaker.f90 b/source/src/sfincs_wavemaker.f90 index 1bf5a6e04..8d81b8891 100644 --- a/source/src/sfincs_wavemaker.f90 +++ b/source/src/sfincs_wavemaker.f90 @@ -1437,10 +1437,6 @@ subroutine update_wavemaker_fluxes(t, dt, tloop) tp_inc = 10.0 ! Later make it possible to also specify Tp_inc in time series forcing, but for now just add a fixed value (that is not used) ! else - ! - ! Use mean peak period from SnapWave boundary conditions - ! - tp_ig = snapwave_tpigmean ! TL: Now calculated in SnapWave, different options for using a period based on Herbers spectrum (snapwave_tpig_opt, if snapwave_use_herbers=1, or user defined snapwave_Tinc2ig ratio (if snapwave_use_herbers = 0) ! ! We may want to use Herbers for computation of IG waves in SnapWave, but we want to have control over peak IG period at wave makers. ! @@ -1465,6 +1461,21 @@ subroutine update_wavemaker_fluxes(t, dt, tloop) ! ! ! tp_ig = snapwave_tpmean * max(1.86 * betas**-0.43 * wave_steepness**0.07, 5.0) ! ! + else + ! + ! Use mean peak period from SnapWave boundary conditions + ! + tp_ig = snapwave_tpigmean ! TL: Now calculated in SnapWave, different options for using a period based on Herbers spectrum (snapwave_tpig_opt, if snapwave_use_herbers=1, or user defined snapwave_Tinc2ig ratio (if snapwave_use_herbers = 0) + ! + if (tp_ig < 10.0) then + ! These warnings should not occur here + write(logstr,*)'DEBUG SFINCS_SnapWave - incoming tp for IG wave at wavemaker might be unrealistically small! value: ',tp_ig + call write_log(logstr, 0) + elseif (tp_ig > 250.0) then + write(logstr,*)'DEBUG SFINCS_SnapWave - incoming tp for IG wave at wavemaker might be unrealistically large! value: ',tp_ig + call write_log(logstr, 0) + endif + ! endif ! tp_inc = max(snapwave_tpmean, wavemaker_tpmin) From ee097c92301e8a5ae63119ef49ad4bf4755dbf18 Mon Sep 17 00:00:00 2001 From: Tim Leijnse Date: Fri, 10 Apr 2026 14:58:40 +0200 Subject: [PATCH 091/118] Delete source/src/snapwave/RFveg.inc --- source/src/snapwave/RFveg.inc | 3970 --------------------------------- 1 file changed, 3970 deletions(-) delete mode 100644 source/src/snapwave/RFveg.inc diff --git a/source/src/snapwave/RFveg.inc b/source/src/snapwave/RFveg.inc deleted file mode 100644 index c231ba55d..000000000 --- a/source/src/snapwave/RFveg.inc +++ /dev/null @@ -1,3970 +0,0 @@ -! This file is generated by 'scripts/generate.py' using -! /src/xbeachlibrary/variables.def -! /src/xbeachlibrary/params.def -! src/xbeachlibray/templates/RFveg.mako -! Advice: do not edit this file, but above mentioned files. - -real*8 , dimension(11,18,20),parameter :: RFveg=reshape((/ & -22.47180000000000 , & -0.22370000000000 , & --0.00050000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -6.26960000000000 , & -0.40090000000000 , & --0.00030000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -6.13660000000000 , & -0.40960000000000 , & --0.00110000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -5.93530000000000 , & -0.42340000000000 , & --0.00240000000000 , & -0.00060000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -5.67800000000000 , & -0.44260000000000 , & --0.00420000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -2.82390000000000 , & -0.59330000000000 , & --0.00020000000000 , & -0.00300000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -2.81430000000000 , & -0.59540000000000 , & --0.00080000000000 , & -0.00600000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -2.79860000000000 , & -0.59870000000000 , & --0.00170000000000 , & -0.00910000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -2.77700000000000 , & -0.60340000000000 , & --0.00300000000000 , & -0.01230000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -2.74970000000000 , & -0.60930000000000 , & --0.00460000000000 , & -0.01560000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -2.71710000000000 , & -0.61660000000000 , & --0.00660000000000 , & -0.01910000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -2.67920000000000 , & -0.62540000000000 , & --0.00890000000000 , & -0.02270000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -2.63520000000000 , & -0.63580000000000 , & --0.01150000000000 , & -0.02650000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -2.58340000000000 , & -0.64860000000000 , & --0.01440000000000 , & -0.03050000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.03050000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.03050000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.03050000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.03050000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.03050000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.03050000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.03050000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.03050000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.03050000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.68990000000000 , & -0.74360000000000 , & --0.00020000000000 , & -0.00720000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.68850000000000 , & -0.74420000000000 , & --0.00060000000000 , & -0.01440000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.68610000000000 , & -0.74530000000000 , & --0.00140000000000 , & -0.02160000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.68270000000000 , & -0.74680000000000 , & --0.00240000000000 , & -0.02880000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.67830000000000 , & -0.74870000000000 , & --0.00380000000000 , & -0.03600000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.67290000000000 , & -0.75120000000000 , & --0.00540000000000 , & -0.04320000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.66640000000000 , & -0.75410000000000 , & --0.00730000000000 , & -0.05030000000000 , & -0.00050000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.65870000000000 , & -0.75760000000000 , & --0.00960000000000 , & -0.05740000000000 , & -0.00070000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.64960000000000 , & -0.76180000000000 , & --0.01210000000000 , & -0.06450000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.63910000000000 , & -0.76660000000000 , & --0.01480000000000 , & -0.07160000000000 , & -0.00120000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.62690000000000 , & -0.77240000000000 , & --0.01790000000000 , & -0.07850000000000 , & -0.00160000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.61250000000000 , & -0.77930000000000 , & --0.02110000000000 , & -0.08530000000000 , & -0.00210000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.59500000000000 , & -0.78780000000000 , & --0.02460000000000 , & -0.09180000000000 , & -0.00270000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.09180000000000 , & -0.00270000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.09180000000000 , & -0.00270000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.09180000000000 , & -0.00270000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.09180000000000 , & -0.00270000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.09180000000000 , & -0.00270000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.20840000000000 , & -0.83200000000000 , & --0.00010000000000 , & -0.00990000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.20780000000000 , & -0.83230000000000 , & --0.00050000000000 , & -0.01980000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.20690000000000 , & -0.83300000000000 , & --0.00120000000000 , & -0.02960000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.20560000000000 , & -0.83380000000000 , & --0.00220000000000 , & -0.03940000000000 , & -0.00060000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.20390000000000 , & -0.83500000000000 , & --0.00340000000000 , & -0.04910000000000 , & -0.00100000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.20180000000000 , & -0.83650000000000 , & --0.00490000000000 , & -0.05880000000000 , & -0.00140000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.19930000000000 , & -0.83830000000000 , & --0.00660000000000 , & -0.06830000000000 , & -0.00200000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.19620000000000 , & -0.84040000000000 , & --0.00860000000000 , & -0.07780000000000 , & -0.00260000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.19260000000000 , & -0.84290000000000 , & --0.01090000000000 , & -0.08700000000000 , & -0.00330000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.18840000000000 , & -0.84590000000000 , & --0.01340000000000 , & -0.09620000000000 , & -0.00420000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.18360000000000 , & -0.84940000000000 , & --0.01620000000000 , & -0.10510000000000 , & -0.00520000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.17790000000000 , & -0.85350000000000 , & --0.01920000000000 , & -0.11370000000000 , & -0.00640000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.17120000000000 , & -0.85840000000000 , & --0.02240000000000 , & -0.12210000000000 , & -0.00770000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.16330000000000 , & -0.86420000000000 , & --0.02590000000000 , & -0.13000000000000 , & -0.00920000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.15370000000000 , & -0.87140000000000 , & --0.02960000000000 , & -0.13740000000000 , & -0.01100000000000 , & -0.00040000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -1.14090000000000 , & -0.88110000000000 , & --0.03350000000000 , & -0.14380000000000 , & -0.01320000000000 , & -0.00070000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.14380000000000 , & -0.01320000000000 , & -0.00070000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.14380000000000 , & -0.01320000000000 , & -0.00070000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.94900000000000 , & -0.88270000000000 , & --0.00010000000000 , & -0.01140000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.94860000000000 , & -0.88310000000000 , & --0.00050000000000 , & -0.02280000000000 , & -0.00040000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.94790000000000 , & -0.88380000000000 , & --0.00110000000000 , & -0.03420000000000 , & -0.00080000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.94690000000000 , & -0.88480000000000 , & --0.00200000000000 , & -0.04550000000000 , & -0.00150000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.94550000000000 , & -0.88600000000000 , & --0.00320000000000 , & -0.05670000000000 , & -0.00230000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.94390000000000 , & -0.88750000000000 , & --0.00460000000000 , & -0.06770000000000 , & -0.00330000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.94190000000000 , & -0.88940000000000 , & --0.00620000000000 , & -0.07860000000000 , & -0.00450000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.93960000000000 , & -0.89160000000000 , & --0.00810000000000 , & -0.08920000000000 , & -0.00590000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.93690000000000 , & -0.89410000000000 , & --0.01020000000000 , & -0.09970000000000 , & -0.00750000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.93380000000000 , & -0.89710000000000 , & --0.01260000000000 , & -0.10990000000000 , & -0.00930000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.93030000000000 , & -0.90050000000000 , & --0.01520000000000 , & -0.11980000000000 , & -0.01130000000000 , & -0.00050000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.92630000000000 , & -0.90450000000000 , & --0.01810000000000 , & -0.12930000000000 , & -0.01350000000000 , & -0.00070000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.92160000000000 , & -0.90900000000000 , & --0.02120000000000 , & -0.13850000000000 , & -0.01590000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.91630000000000 , & -0.91430000000000 , & --0.02450000000000 , & -0.14710000000000 , & -0.01850000000000 , & -0.00120000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.91010000000000 , & -0.92050000000000 , & --0.02800000000000 , & -0.15520000000000 , & -0.02140000000000 , & -0.00160000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.90260000000000 , & -0.92810000000000 , & --0.03170000000000 , & -0.16240000000000 , & -0.02470000000000 , & -0.00210000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.16240000000000 , & -0.02470000000000 , & -0.00210000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.16240000000000 , & -0.02470000000000 , & -0.00210000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.78580000000000 , & -0.91390000000000 , & --0.00010000000000 , & -0.01240000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.78530000000000 , & -0.91440000000000 , & --0.00050000000000 , & -0.02470000000000 , & -0.00070000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.78450000000000 , & -0.91530000000000 , & --0.00110000000000 , & -0.03700000000000 , & -0.00150000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.78350000000000 , & -0.91650000000000 , & --0.00200000000000 , & -0.04910000000000 , & -0.00260000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.78210000000000 , & -0.91810000000000 , & --0.00310000000000 , & -0.06110000000000 , & -0.00410000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.78040000000000 , & -0.92010000000000 , & --0.00440000000000 , & -0.07290000000000 , & -0.00590000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.77840000000000 , & -0.92250000000000 , & --0.00600000000000 , & -0.08440000000000 , & -0.00790000000000 , & -0.00040000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.77610000000000 , & -0.92520000000000 , & --0.00780000000000 , & -0.09570000000000 , & -0.01030000000000 , & -0.00060000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.77350000000000 , & -0.92840000000000 , & --0.00990000000000 , & -0.10660000000000 , & -0.01290000000000 , & -0.00080000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.77050000000000 , & -0.93190000000000 , & --0.01220000000000 , & -0.11720000000000 , & -0.01580000000000 , & -0.00120000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.76720000000000 , & -0.93600000000000 , & --0.01470000000000 , & -0.12740000000000 , & -0.01900000000000 , & -0.00160000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.76350000000000 , & -0.94060000000000 , & --0.01740000000000 , & -0.13720000000000 , & -0.02230000000000 , & -0.00200000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.75930000000000 , & -0.94570000000000 , & --0.02040000000000 , & -0.14640000000000 , & -0.02600000000000 , & -0.00260000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.75460000000000 , & -0.95160000000000 , & --0.02360000000000 , & -0.15510000000000 , & -0.02980000000000 , & -0.00340000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.74930000000000 , & -0.95830000000000 , & --0.02700000000000 , & -0.16310000000000 , & -0.03390000000000 , & -0.00430000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.74320000000000 , & -0.96620000000000 , & --0.03050000000000 , & -0.17020000000000 , & -0.03820000000000 , & -0.00540000000000 , & -0.00050000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.73570000000000 , & -0.97600000000000 , & --0.03430000000000 , & -0.17600000000000 , & -0.04280000000000 , & -0.00680000000000 , & -0.00080000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.17600000000000 , & -0.04280000000000 , & -0.00680000000000 , & -0.00080000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.67260000000000 , & -0.93420000000000 , & --0.00010000000000 , & -0.01300000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.67210000000000 , & -0.93490000000000 , & --0.00050000000000 , & -0.02590000000000 , & -0.00100000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.67120000000000 , & -0.93610000000000 , & --0.00110000000000 , & -0.03870000000000 , & -0.00230000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.67000000000000 , & -0.93780000000000 , & --0.00190000000000 , & -0.05140000000000 , & -0.00410000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.66850000000000 , & -0.93990000000000 , & --0.00300000000000 , & -0.06380000000000 , & -0.00630000000000 , & -0.00040000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.66660000000000 , & -0.94250000000000 , & --0.00430000000000 , & -0.07590000000000 , & -0.00890000000000 , & -0.00060000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.66450000000000 , & -0.94560000000000 , & --0.00590000000000 , & -0.08770000000000 , & -0.01190000000000 , & -0.00100000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.66200000000000 , & -0.94910000000000 , & --0.00760000000000 , & -0.09910000000000 , & -0.01530000000000 , & -0.00140000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.65930000000000 , & -0.95310000000000 , & --0.00960000000000 , & -0.11010000000000 , & -0.01910000000000 , & -0.00200000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.65620000000000 , & -0.95750000000000 , & --0.01190000000000 , & -0.12070000000000 , & -0.02310000000000 , & -0.00270000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.65280000000000 , & -0.96250000000000 , & --0.01430000000000 , & -0.13080000000000 , & -0.02740000000000 , & -0.00350000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.64910000000000 , & -0.96800000000000 , & --0.01700000000000 , & -0.14030000000000 , & -0.03190000000000 , & -0.00450000000000 , & -0.00040000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.64510000000000 , & -0.97410000000000 , & --0.01990000000000 , & -0.14930000000000 , & -0.03660000000000 , & -0.00570000000000 , & -0.00060000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.64060000000000 , & -0.98090000000000 , & --0.02300000000000 , & -0.15760000000000 , & -0.04150000000000 , & -0.00700000000000 , & -0.00080000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.63560000000000 , & -0.98850000000000 , & --0.02620000000000 , & -0.16510000000000 , & -0.04660000000000 , & -0.00860000000000 , & -0.00110000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.63000000000000 , & -0.99740000000000 , & --0.02970000000000 , & -0.17160000000000 , & -0.05180000000000 , & -0.01050000000000 , & -0.00160000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.62330000000000 , & -1.00810000000000 , & --0.03340000000000 , & -0.17670000000000 , & -0.05710000000000 , & -0.01270000000000 , & -0.00220000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.17670000000000 , & -0.05710000000000 , & -0.01270000000000 , & -0.00220000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.58910000000000 , & -0.94810000000000 , & --0.00010000000000 , & -0.01340000000000 , & -0.00040000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.58850000000000 , & -0.94910000000000 , & --0.00050000000000 , & -0.02670000000000 , & -0.00150000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.58750000000000 , & -0.95070000000000 , & --0.00110000000000 , & -0.03990000000000 , & -0.00320000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.58610000000000 , & -0.95290000000000 , & --0.00190000000000 , & -0.05280000000000 , & -0.00570000000000 , & -0.00040000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.58440000000000 , & -0.95560000000000 , & --0.00300000000000 , & -0.06540000000000 , & -0.00870000000000 , & -0.00070000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.58240000000000 , & -0.95900000000000 , & --0.00420000000000 , & -0.07760000000000 , & -0.01230000000000 , & -0.00120000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.58010000000000 , & -0.96280000000000 , & --0.00580000000000 , & -0.08940000000000 , & -0.01630000000000 , & -0.00190000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.57740000000000 , & -0.96720000000000 , & --0.00750000000000 , & -0.10070000000000 , & -0.02070000000000 , & -0.00270000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.57450000000000 , & -0.97210000000000 , & --0.00950000000000 , & -0.11150000000000 , & -0.02550000000000 , & -0.00380000000000 , & -0.00040000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.57130000000000 , & -0.97760000000000 , & --0.01170000000000 , & -0.12180000000000 , & -0.03060000000000 , & -0.00500000000000 , & -0.00060000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.56790000000000 , & -0.98350000000000 , & --0.01410000000000 , & -0.13150000000000 , & -0.03580000000000 , & -0.00640000000000 , & -0.00080000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.56410000000000 , & -0.99010000000000 , & --0.01670000000000 , & -0.14050000000000 , & -0.04130000000000 , & -0.00810000000000 , & -0.00110000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.56010000000000 , & -0.99720000000000 , & --0.01950000000000 , & -0.14900000000000 , & -0.04690000000000 , & -0.01000000000000 , & -0.00160000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.55570000000000 , & -1.00510000000000 , & --0.02250000000000 , & -0.15660000000000 , & -0.05260000000000 , & -0.01210000000000 , & -0.00210000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.55090000000000 , & -1.01390000000000 , & --0.02570000000000 , & -0.16350000000000 , & -0.05830000000000 , & -0.01440000000000 , & -0.00270000000000 , & -0.00040000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.54550000000000 , & -1.02390000000000 , & --0.02910000000000 , & -0.16920000000000 , & -0.06400000000000 , & -0.01710000000000 , & -0.00360000000000 , & -0.00060000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.16920000000000 , & -0.06400000000000 , & -0.01710000000000 , & -0.00360000000000 , & -0.00060000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.16920000000000 , & -0.06400000000000 , & -0.01710000000000 , & -0.00360000000000 , & -0.00060000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.52460000000000 , & -0.95820000000000 , & --0.00010000000000 , & -0.01370000000000 , & -0.00050000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.52390000000000 , & -0.95940000000000 , & --0.00050000000000 , & -0.02730000000000 , & -0.00190000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.52280000000000 , & -0.96140000000000 , & --0.00110000000000 , & -0.04060000000000 , & -0.00430000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.52130000000000 , & -0.96410000000000 , & --0.00190000000000 , & -0.05360000000000 , & -0.00740000000000 , & -0.00070000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.51950000000000 , & -0.96760000000000 , & --0.00290000000000 , & -0.06620000000000 , & -0.01130000000000 , & -0.00130000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.51730000000000 , & -0.97170000000000 , & --0.00420000000000 , & -0.07830000000000 , & -0.01580000000000 , & -0.00210000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.51480000000000 , & -0.97650000000000 , & --0.00570000000000 , & -0.08990000000000 , & -0.02080000000000 , & -0.00320000000000 , & -0.00040000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.51200000000000 , & -0.98180000000000 , & --0.00740000000000 , & -0.10090000000000 , & -0.02620000000000 , & -0.00460000000000 , & -0.00060000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.50890000000000 , & -0.98770000000000 , & --0.00940000000000 , & -0.11130000000000 , & -0.03180000000000 , & -0.00620000000000 , & -0.00090000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.50560000000000 , & -0.99410000000000 , & --0.01150000000000 , & -0.12120000000000 , & -0.03770000000000 , & -0.00810000000000 , & -0.00130000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.50210000000000 , & -1.00110000000000 , & --0.01390000000000 , & -0.13030000000000 , & -0.04380000000000 , & -0.01020000000000 , & -0.00180000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.49830000000000 , & -1.00870000000000 , & --0.01640000000000 , & -0.13880000000000 , & -0.04990000000000 , & -0.01260000000000 , & -0.00240000000000 , & -0.00040000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.49430000000000 , & -1.01690000000000 , & --0.01920000000000 , & -0.14660000000000 , & -0.05610000000000 , & -0.01520000000000 , & -0.00320000000000 , & -0.00050000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.49000000000000 , & -1.02590000000000 , & --0.02210000000000 , & -0.15360000000000 , & -0.06230000000000 , & -0.01810000000000 , & -0.00410000000000 , & -0.00070000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.48530000000000 , & -1.03590000000000 , & --0.02530000000000 , & -0.15970000000000 , & -0.06830000000000 , & -0.02120000000000 , & -0.00520000000000 , & -0.00110000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.48000000000000 , & -1.04720000000000 , & --0.02860000000000 , & -0.16460000000000 , & -0.07420000000000 , & -0.02460000000000 , & -0.00660000000000 , & -0.00150000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.16460000000000 , & -0.07420000000000 , & -0.02460000000000 , & -0.00660000000000 , & -0.00150000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.16460000000000 , & -0.07420000000000 , & -0.02460000000000 , & -0.00660000000000 , & -0.00150000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.47320000000000 , & -0.96560000000000 , & --0.00010000000000 , & -0.01390000000000 , & -0.00060000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.47250000000000 , & -0.96710000000000 , & --0.00050000000000 , & -0.02770000000000 , & -0.00250000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.47130000000000 , & -0.96960000000000 , & --0.00100000000000 , & -0.04110000000000 , & -0.00540000000000 , & -0.00050000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.46960000000000 , & -0.97300000000000 , & --0.00190000000000 , & -0.05410000000000 , & -0.00930000000000 , & -0.00110000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.46760000000000 , & -0.97720000000000 , & --0.00290000000000 , & -0.06650000000000 , & -0.01400000000000 , & -0.00200000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.46530000000000 , & -0.98210000000000 , & --0.00420000000000 , & -0.07840000000000 , & -0.01940000000000 , & -0.00330000000000 , & -0.00040000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.46260000000000 , & -0.98770000000000 , & --0.00560000000000 , & -0.08960000000000 , & -0.02520000000000 , & -0.00490000000000 , & -0.00070000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.45970000000000 , & -0.99400000000000 , & --0.00730000000000 , & -0.10020000000000 , & -0.03140000000000 , & -0.00690000000000 , & -0.00120000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.45660000000000 , & -1.00080000000000 , & --0.00930000000000 , & -0.11020000000000 , & -0.03780000000000 , & -0.00910000000000 , & -0.00170000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.45320000000000 , & -1.00830000000000 , & --0.01140000000000 , & -0.11940000000000 , & -0.04430000000000 , & -0.01170000000000 , & -0.00240000000000 , & -0.00040000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.44960000000000 , & -1.01630000000000 , & --0.01370000000000 , & -0.12800000000000 , & -0.05090000000000 , & -0.01450000000000 , & -0.00330000000000 , & -0.00060000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.44590000000000 , & -1.02490000000000 , & --0.01620000000000 , & -0.13590000000000 , & -0.05750000000000 , & -0.01760000000000 , & -0.00430000000000 , & -0.00090000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.44190000000000 , & -1.03420000000000 , & --0.01890000000000 , & -0.14300000000000 , & -0.06390000000000 , & -0.02100000000000 , & -0.00560000000000 , & -0.00120000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.43760000000000 , & -1.04430000000000 , & --0.02180000000000 , & -0.14930000000000 , & -0.07020000000000 , & -0.02460000000000 , & -0.00700000000000 , & -0.00170000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.43300000000000 , & -1.05540000000000 , & --0.02490000000000 , & -0.15460000000000 , & -0.07630000000000 , & -0.02830000000000 , & -0.00870000000000 , & -0.00220000000000 , & -0.00050000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.42780000000000 , & -1.06820000000000 , & --0.02820000000000 , & -0.15860000000000 , & -0.08200000000000 , & -0.03240000000000 , & -0.01070000000000 , & -0.00300000000000 , & -0.00070000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.15860000000000 , & -0.08200000000000 , & -0.03240000000000 , & -0.01070000000000 , & -0.00300000000000 , & -0.00070000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.15860000000000 , & -0.08200000000000 , & -0.03240000000000 , & -0.01070000000000 , & -0.00300000000000 , & -0.00070000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.43130000000000 , & -0.97130000000000 , & --0.00010000000000 , & -0.01410000000000 , & -0.00080000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.43040000000000 , & -0.97320000000000 , & --0.00050000000000 , & -0.02790000000000 , & -0.00300000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.42910000000000 , & -0.97610000000000 , & --0.00100000000000 , & -0.04140000000000 , & -0.00660000000000 , & -0.00070000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.42740000000000 , & -0.98020000000000 , & --0.00180000000000 , & -0.05420000000000 , & -0.01130000000000 , & -0.00160000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.42520000000000 , & -0.98510000000000 , & --0.00290000000000 , & -0.06650000000000 , & -0.01680000000000 , & -0.00300000000000 , & -0.00040000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.42270000000000 , & -0.99090000000000 , & --0.00410000000000 , & -0.07800000000000 , & -0.02290000000000 , & -0.00470000000000 , & -0.00080000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.42000000000000 , & -0.99740000000000 , & --0.00560000000000 , & -0.08880000000000 , & -0.02940000000000 , & -0.00700000000000 , & -0.00130000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.41700000000000 , & -1.00450000000000 , & --0.00730000000000 , & -0.09890000000000 , & -0.03620000000000 , & -0.00950000000000 , & -0.00200000000000 , & -0.00040000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.41380000000000 , & -1.01230000000000 , & --0.00920000000000 , & -0.10830000000000 , & -0.04310000000000 , & -0.01250000000000 , & -0.00290000000000 , & -0.00060000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.41040000000000 , & -1.02070000000000 , & --0.01130000000000 , & -0.11700000000000 , & -0.05010000000000 , & -0.01570000000000 , & -0.00400000000000 , & -0.00090000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.40680000000000 , & -1.02970000000000 , & --0.01360000000000 , & -0.12500000000000 , & -0.05700000000000 , & -0.01930000000000 , & -0.00530000000000 , & -0.00120000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.40300000000000 , & -1.03930000000000 , & --0.01600000000000 , & -0.13230000000000 , & -0.06370000000000 , & -0.02300000000000 , & -0.00680000000000 , & -0.00170000000000 , & -0.00040000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.39910000000000 , & -1.04970000000000 , & --0.01870000000000 , & -0.13880000000000 , & -0.07020000000000 , & -0.02700000000000 , & -0.00860000000000 , & -0.00230000000000 , & -0.00050000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.39480000000000 , & -1.06090000000000 , & --0.02160000000000 , & -0.14440000000000 , & -0.07650000000000 , & -0.03110000000000 , & -0.01050000000000 , & -0.00310000000000 , & -0.00080000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.39030000000000 , & -1.07320000000000 , & --0.02460000000000 , & -0.14890000000000 , & -0.08240000000000 , & -0.03540000000000 , & -0.01280000000000 , & -0.00400000000000 , & -0.00110000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.14890000000000 , & -0.08240000000000 , & -0.03540000000000 , & -0.01280000000000 , & -0.00400000000000 , & -0.00110000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.14890000000000 , & -0.08240000000000 , & -0.03540000000000 , & -0.01280000000000 , & -0.00400000000000 , & -0.00110000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.14890000000000 , & -0.08240000000000 , & -0.03540000000000 , & -0.01280000000000 , & -0.00400000000000 , & -0.00110000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.39630000000000 , & -0.97580000000000 , & --0.00010000000000 , & -0.01420000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.39540000000000 , & -0.97800000000000 , & --0.00050000000000 , & -0.02810000000000 , & -0.00360000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.39400000000000 , & -0.98150000000000 , & --0.00100000000000 , & -0.04150000000000 , & -0.00780000000000 , & -0.00100000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.39210000000000 , & -0.98620000000000 , & --0.00180000000000 , & -0.05410000000000 , & -0.01320000000000 , & -0.00230000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.38980000000000 , & -0.99190000000000 , & --0.00290000000000 , & -0.06600000000000 , & -0.01950000000000 , & -0.00410000000000 , & -0.00070000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.38720000000000 , & -0.99850000000000 , & --0.00410000000000 , & -0.07720000000000 , & -0.02620000000000 , & -0.00640000000000 , & -0.00130000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.38440000000000 , & -1.00580000000000 , & --0.00560000000000 , & -0.08750000000000 , & -0.03330000000000 , & -0.00930000000000 , & -0.00210000000000 , & -0.00040000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.38140000000000 , & -1.01390000000000 , & --0.00720000000000 , & -0.09710000000000 , & -0.04050000000000 , & -0.01250000000000 , & -0.00320000000000 , & -0.00070000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.37810000000000 , & -1.02260000000000 , & --0.00910000000000 , & -0.10600000000000 , & -0.04780000000000 , & -0.01610000000000 , & -0.00450000000000 , & -0.00110000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.37470000000000 , & -1.03190000000000 , & --0.01120000000000 , & -0.11410000000000 , & -0.05490000000000 , & -0.02000000000000 , & -0.00600000000000 , & -0.00150000000000 , & -0.00030000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.37110000000000 , & -1.04180000000000 , & --0.01340000000000 , & -0.12160000000000 , & -0.06190000000000 , & -0.02410000000000 , & -0.00780000000000 , & -0.00220000000000 , & -0.00050000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.36740000000000 , & -1.05240000000000 , & --0.01590000000000 , & -0.12820000000000 , & -0.06870000000000 , & -0.02840000000000 , & -0.00980000000000 , & -0.00290000000000 , & -0.00080000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.36350000000000 , & -1.06380000000000 , & --0.01850000000000 , & -0.13410000000000 , & -0.07510000000000 , & -0.03280000000000 , & -0.01210000000000 , & -0.00390000000000 , & -0.00110000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.35930000000000 , & -1.07610000000000 , & --0.02130000000000 , & -0.13910000000000 , & -0.08110000000000 , & -0.03730000000000 , & -0.01460000000000 , & -0.00500000000000 , & -0.00150000000000 , & -0.00040000000000 , & -0.00010000000000 , & -0.35480000000000 , & -1.08970000000000 , & --0.02430000000000 , & -0.14290000000000 , & -0.08660000000000 , & -0.04190000000000 , & -0.01740000000000 , & -0.00640000000000 , & -0.00210000000000 , & -0.00060000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.14290000000000 , & -0.08660000000000 , & -0.04190000000000 , & -0.01740000000000 , & -0.00640000000000 , & -0.00210000000000 , & -0.00060000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.14290000000000 , & -0.08660000000000 , & -0.04190000000000 , & -0.01740000000000 , & -0.00640000000000 , & -0.00210000000000 , & -0.00060000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.14290000000000 , & -0.08660000000000 , & -0.04190000000000 , & -0.01740000000000 , & -0.00640000000000 , & -0.00210000000000 , & -0.00060000000000 , & -0.00020000000000 , & -0.36660000000000 , & -0.97940000000000 , & --0.00010000000000 , & -0.01430000000000 , & -0.00110000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.36570000000000 , & -0.98190000000000 , & --0.00050000000000 , & -0.02820000000000 , & -0.00430000000000 , & -0.00050000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.36410000000000 , & -0.98600000000000 , & --0.00100000000000 , & -0.04140000000000 , & -0.00910000000000 , & -0.00140000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.36220000000000 , & -0.99140000000000 , & --0.00180000000000 , & -0.05380000000000 , & -0.01520000000000 , & -0.00310000000000 , & -0.00050000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.35980000000000 , & -0.99780000000000 , & --0.00280000000000 , & -0.06540000000000 , & -0.02200000000000 , & -0.00540000000000 , & -0.00110000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.35720000000000 , & -1.00520000000000 , & --0.00410000000000 , & -0.07610000000000 , & -0.02930000000000 , & -0.00830000000000 , & -0.00200000000000 , & -0.00040000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.35430000000000 , & -1.01340000000000 , & --0.00550000000000 , & -0.08600000000000 , & -0.03680000000000 , & -0.01180000000000 , & -0.00310000000000 , & -0.00070000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.35120000000000 , & -1.02230000000000 , & --0.00720000000000 , & -0.09510000000000 , & -0.04430000000000 , & -0.01560000000000 , & -0.00460000000000 , & -0.00120000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.34790000000000 , & -1.03190000000000 , & --0.00900000000000 , & -0.10340000000000 , & -0.05170000000000 , & -0.01980000000000 , & -0.00630000000000 , & -0.00180000000000 , & -0.00040000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.34450000000000 , & -1.04210000000000 , & --0.01110000000000 , & -0.11100000000000 , & -0.05890000000000 , & -0.02420000000000 , & -0.00840000000000 , & -0.00250000000000 , & -0.00070000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.34100000000000 , & -1.05290000000000 , & --0.01330000000000 , & -0.11790000000000 , & -0.06580000000000 , & -0.02880000000000 , & -0.01060000000000 , & -0.00340000000000 , & -0.00100000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.33730000000000 , & -1.06440000000000 , & --0.01580000000000 , & -0.12400000000000 , & -0.07240000000000 , & -0.03350000000000 , & -0.01310000000000 , & -0.00450000000000 , & -0.00140000000000 , & -0.00040000000000 , & -0.00010000000000 , & -0.33340000000000 , & -1.07680000000000 , & --0.01840000000000 , & -0.12930000000000 , & -0.07860000000000 , & -0.03820000000000 , & -0.01590000000000 , & -0.00590000000000 , & -0.00190000000000 , & -0.00060000000000 , & -0.00010000000000 , & -0.32930000000000 , & -1.09020000000000 , & --0.02110000000000 , & -0.13370000000000 , & -0.08430000000000 , & -0.04300000000000 , & -0.01890000000000 , & -0.00740000000000 , & -0.00260000000000 , & -0.00080000000000 , & -0.00020000000000 , & -0.32490000000000 , & -1.10510000000000 , & --0.02410000000000 , & -0.13680000000000 , & -0.08930000000000 , & -0.04770000000000 , & -0.02220000000000 , & -0.00920000000000 , & -0.00350000000000 , & -0.00120000000000 , & -0.00040000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.13680000000000 , & -0.08930000000000 , & -0.04770000000000 , & -0.02220000000000 , & -0.00920000000000 , & -0.00350000000000 , & -0.00120000000000 , & -0.00040000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.13680000000000 , & -0.08930000000000 , & -0.04770000000000 , & -0.02220000000000 , & -0.00920000000000 , & -0.00350000000000 , & -0.00120000000000 , & -0.00040000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.13680000000000 , & -0.08930000000000 , & -0.04770000000000 , & -0.02220000000000 , & -0.00920000000000 , & -0.00350000000000 , & -0.00120000000000 , & -0.00040000000000 , & -0.34120000000000 , & -0.98230000000000 , & --0.00010000000000 , & -0.01430000000000 , & -0.00130000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.34010000000000 , & -0.98520000000000 , & --0.00050000000000 , & -0.02820000000000 , & -0.00490000000000 , & -0.00060000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.33850000000000 , & -0.98990000000000 , & --0.00100000000000 , & -0.04130000000000 , & -0.01040000000000 , & -0.00190000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.33650000000000 , & -0.99590000000000 , & --0.00180000000000 , & -0.05340000000000 , & -0.01710000000000 , & -0.00400000000000 , & -0.00080000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.33410000000000 , & -1.00310000000000 , & --0.00280000000000 , & -0.06460000000000 , & -0.02440000000000 , & -0.00680000000000 , & -0.00160000000000 , & -0.00030000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.33140000000000 , & -1.01130000000000 , & --0.00410000000000 , & -0.07480000000000 , & -0.03210000000000 , & -0.01030000000000 , & -0.00280000000000 , & -0.00070000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.32840000000000 , & -1.02030000000000 , & --0.00550000000000 , & -0.08420000000000 , & -0.03980000000000 , & -0.01430000000000 , & -0.00440000000000 , & -0.00120000000000 , & -0.00030000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.32530000000000 , & -1.03000000000000 , & --0.00710000000000 , & -0.09280000000000 , & -0.04750000000000 , & -0.01870000000000 , & -0.00630000000000 , & -0.00180000000000 , & -0.00050000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.32210000000000 , & -1.04040000000000 , & --0.00900000000000 , & -0.10060000000000 , & -0.05490000000000 , & -0.02340000000000 , & -0.00850000000000 , & -0.00270000000000 , & -0.00080000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.31870000000000 , & -1.05150000000000 , & --0.01100000000000 , & -0.10780000000000 , & -0.06200000000000 , & -0.02820000000000 , & -0.01100000000000 , & -0.00380000000000 , & -0.00120000000000 , & -0.00030000000000 , & -0.00010000000000 , & -0.31520000000000 , & -1.06320000000000 , & --0.01320000000000 , & -0.11410000000000 , & -0.06880000000000 , & -0.03320000000000 , & -0.01370000000000 , & -0.00500000000000 , & -0.00170000000000 , & -0.00050000000000 , & -0.00010000000000 , & -0.31150000000000 , & -1.07560000000000 , & --0.01560000000000 , & -0.11980000000000 , & -0.07520000000000 , & -0.03810000000000 , & -0.01670000000000 , & -0.00650000000000 , & -0.00230000000000 , & -0.00070000000000 , & -0.00020000000000 , & -0.30770000000000 , & -1.08890000000000 , & --0.01820000000000 , & -0.12460000000000 , & -0.08110000000000 , & -0.04310000000000 , & -0.01990000000000 , & -0.00820000000000 , & -0.00310000000000 , & -0.00100000000000 , & -0.00030000000000 , & -0.30370000000000 , & -1.10340000000000 , & --0.02100000000000 , & -0.12840000000000 , & -0.08630000000000 , & -0.04800000000000 , & -0.02330000000000 , & -0.01020000000000 , & -0.00410000000000 , & -0.00150000000000 , & -0.00050000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.12840000000000 , & -0.08630000000000 , & -0.04800000000000 , & -0.02330000000000 , & -0.01020000000000 , & -0.00410000000000 , & -0.00150000000000 , & -0.00050000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.12840000000000 , & -0.08630000000000 , & -0.04800000000000 , & -0.02330000000000 , & -0.01020000000000 , & -0.00410000000000 , & -0.00150000000000 , & -0.00050000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.12840000000000 , & -0.08630000000000 , & -0.04800000000000 , & -0.02330000000000 , & -0.01020000000000 , & -0.00410000000000 , & -0.00150000000000 , & -0.00050000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.12840000000000 , & -0.08630000000000 , & -0.04800000000000 , & -0.02330000000000 , & -0.01020000000000 , & -0.00410000000000 , & -0.00150000000000 , & -0.00050000000000 , & -0.31900000000000 , & -0.98470000000000 , & --0.00010000000000 , & -0.01440000000000 , & -0.00150000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.31800000000000 , & -0.98810000000000 , & --0.00050000000000 , & -0.02820000000000 , & -0.00560000000000 , & -0.00080000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.31630000000000 , & -0.99330000000000 , & --0.00100000000000 , & -0.04100000000000 , & -0.01170000000000 , & -0.00240000000000 , & -0.00040000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.31420000000000 , & -1.00000000000000 , & --0.00180000000000 , & -0.05280000000000 , & -0.01890000000000 , & -0.00500000000000 , & -0.00110000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.31170000000000 , & -1.00790000000000 , & --0.00280000000000 , & -0.06360000000000 , & -0.02660000000000 , & -0.00840000000000 , & -0.00220000000000 , & -0.00050000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.30890000000000 , & -1.01690000000000 , & --0.00400000000000 , & -0.07340000000000 , & -0.03450000000000 , & -0.01240000000000 , & -0.00380000000000 , & -0.00100000000000 , & -0.00020000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.30600000000000 , & -1.02660000000000 , & --0.00550000000000 , & -0.08230000000000 , & -0.04240000000000 , & -0.01690000000000 , & -0.00580000000000 , & -0.00170000000000 , & -0.00050000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.30290000000000 , & -1.03720000000000 , & --0.00710000000000 , & -0.09040000000000 , & -0.05010000000000 , & -0.02180000000000 , & -0.00810000000000 , & -0.00270000000000 , & -0.00080000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.29970000000000 , & -1.04830000000000 , & --0.00890000000000 , & -0.09780000000000 , & -0.05740000000000 , & -0.02680000000000 , & -0.01080000000000 , & -0.00390000000000 , & -0.00120000000000 , & -0.00040000000000 , & -0.00010000000000 , & -0.29630000000000 , & -1.06020000000000 , & --0.01090000000000 , & -0.10450000000000 , & -0.06440000000000 , & -0.03200000000000 , & -0.01370000000000 , & -0.00530000000000 , & -0.00180000000000 , & -0.00060000000000 , & -0.00020000000000 , & -0.29280000000000 , & -1.07280000000000 , & --0.01320000000000 , & -0.11040000000000 , & -0.07100000000000 , & -0.03720000000000 , & -0.01690000000000 , & -0.00690000000000 , & -0.00250000000000 , & -0.00090000000000 , & -0.00030000000000 , & -0.28930000000000 , & -1.08610000000000 , & --0.01550000000000 , & -0.11560000000000 , & -0.07700000000000 , & -0.04230000000000 , & -0.02030000000000 , & -0.00870000000000 , & -0.00340000000000 , & -0.00120000000000 , & -0.00040000000000 , & -0.28550000000000 , & -1.10040000000000 , & --0.01810000000000 , & -0.11990000000000 , & -0.08250000000000 , & -0.04740000000000 , & -0.02380000000000 , & -0.01080000000000 , & -0.00450000000000 , & -0.00170000000000 , & -0.00060000000000 , & -0.28150000000000 , & -1.11590000000000 , & --0.02080000000000 , & -0.12320000000000 , & -0.08730000000000 , & -0.05220000000000 , & -0.02750000000000 , & -0.01320000000000 , & -0.00590000000000 , & -0.00240000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.12320000000000 , & -0.08730000000000 , & -0.05220000000000 , & -0.02750000000000 , & -0.01320000000000 , & -0.00590000000000 , & -0.00240000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.12320000000000 , & -0.08730000000000 , & -0.05220000000000 , & -0.02750000000000 , & -0.01320000000000 , & -0.00590000000000 , & -0.00240000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.12320000000000 , & -0.08730000000000 , & -0.05220000000000 , & -0.02750000000000 , & -0.01320000000000 , & -0.00590000000000 , & -0.00240000000000 , & -0.00090000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.12320000000000 , & -0.08730000000000 , & -0.05220000000000 , & -0.02750000000000 , & -0.01320000000000 , & -0.00590000000000 , & -0.00240000000000 , & -0.00090000000000 , & -0.29970000000000 , & -0.98670000000000 , & --0.00010000000000 , & -0.01440000000000 , & -0.00170000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.29850000000000 , & -0.99050000000000 , & --0.00050000000000 , & -0.02810000000000 , & -0.00630000000000 , & -0.00100000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.29680000000000 , & -0.99630000000000 , & --0.00100000000000 , & -0.04070000000000 , & -0.01290000000000 , & -0.00300000000000 , & -0.00060000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.29460000000000 , & -1.00370000000000 , & --0.00180000000000 , & -0.05220000000000 , & -0.02050000000000 , & -0.00610000000000 , & -0.00150000000000 , & -0.00030000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.29210000000000 , & -1.01240000000000 , & --0.00280000000000 , & -0.06250000000000 , & -0.02860000000000 , & -0.01000000000000 , & -0.00300000000000 , & -0.00080000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.28930000000000 , & -1.02200000000000 , & --0.00400000000000 , & -0.07190000000000 , & -0.03670000000000 , & -0.01450000000000 , & -0.00490000000000 , & -0.00150000000000 , & -0.00040000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.28640000000000 , & -1.03250000000000 , & --0.00540000000000 , & -0.08040000000000 , & -0.04460000000000 , & -0.01950000000000 , & -0.00730000000000 , & -0.00250000000000 , & -0.00080000000000 , & -0.00020000000000 , & -0.00010000000000 , & -0.28330000000000 , & -1.04380000000000 , & --0.00710000000000 , & -0.08810000000000 , & -0.05210000000000 , & -0.02470000000000 , & -0.01010000000000 , & -0.00370000000000 , & -0.00120000000000 , & -0.00040000000000 , & -0.00010000000000 , & -0.28010000000000 , & -1.05580000000000 , & --0.00890000000000 , & -0.09500000000000 , & -0.05930000000000 , & -0.03010000000000 , & -0.01320000000000 , & -0.00520000000000 , & -0.00190000000000 , & -0.00060000000000 , & -0.00020000000000 , & -0.27670000000000 , & -1.06840000000000 , & --0.01090000000000 , & -0.10130000000000 , & -0.06610000000000 , & -0.03540000000000 , & -0.01660000000000 , & -0.00700000000000 , & -0.00270000000000 , & -0.00090000000000 , & -0.00030000000000 , & -0.27330000000000 , & -1.08180000000000 , & --0.01310000000000 , & -0.10680000000000 , & -0.07240000000000 , & -0.04080000000000 , & -0.02010000000000 , & -0.00900000000000 , & -0.00370000000000 , & -0.00140000000000 , & -0.00050000000000 , & -0.26980000000000 , & -1.09600000000000 , & --0.01540000000000 , & -0.11150000000000 , & -0.07810000000000 , & -0.04600000000000 , & -0.02380000000000 , & -0.01120000000000 , & -0.00490000000000 , & -0.00190000000000 , & -0.00070000000000 , & -0.26610000000000 , & -1.11120000000000 , & --0.01800000000000 , & -0.11540000000000 , & -0.08330000000000 , & -0.05100000000000 , & -0.02760000000000 , & -0.01370000000000 , & -0.00630000000000 , & -0.00270000000000 , & -0.00110000000000 , & -0.26220000000000 , & -1.12780000000000 , & --0.02060000000000 , & -0.11810000000000 , & -0.08750000000000 , & -0.05560000000000 , & -0.03150000000000 , & -0.01640000000000 , & -0.00790000000000 , & -0.00360000000000 , & -0.00150000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.11810000000000 , & -0.08750000000000 , & -0.05560000000000 , & -0.03150000000000 , & -0.01640000000000 , & -0.00790000000000 , & -0.00360000000000 , & -0.00150000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.11810000000000 , & -0.08750000000000 , & -0.05560000000000 , & -0.03150000000000 , & -0.01640000000000 , & -0.00790000000000 , & -0.00360000000000 , & -0.00150000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.11810000000000 , & -0.08750000000000 , & -0.05560000000000 , & -0.03150000000000 , & -0.01640000000000 , & -0.00790000000000 , & -0.00360000000000 , & -0.00150000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.11810000000000 , & -0.08750000000000 , & -0.05560000000000 , & -0.03150000000000 , & -0.01640000000000 , & -0.00790000000000 , & -0.00360000000000 , & -0.00150000000000 , & -0.28250000000000 , & -0.98850000000000 , & --0.00010000000000 , & -0.01440000000000 , & -0.00190000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.28130000000000 , & -0.99270000000000 , & --0.00050000000000 , & -0.02800000000000 , & -0.00700000000000 , & -0.00130000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.27950000000000 , & -0.99910000000000 , & --0.00100000000000 , & -0.04030000000000 , & -0.01410000000000 , & -0.00370000000000 , & -0.00080000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.27730000000000 , & -1.00710000000000 , & --0.00180000000000 , & -0.05140000000000 , & -0.02210000000000 , & -0.00720000000000 , & -0.00200000000000 , & -0.00050000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.27470000000000 , & -1.01650000000000 , & --0.00280000000000 , & -0.06130000000000 , & -0.03030000000000 , & -0.01160000000000 , & -0.00380000000000 , & -0.00110000000000 , & -0.00030000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.27200000000000 , & -1.02680000000000 , & --0.00400000000000 , & -0.07030000000000 , & -0.03840000000000 , & -0.01660000000000 , & -0.00620000000000 , & -0.00210000000000 , & -0.00060000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.26900000000000 , & -1.03800000000000 , & --0.00540000000000 , & -0.07840000000000 , & -0.04630000000000 , & -0.02190000000000 , & -0.00900000000000 , & -0.00330000000000 , & -0.00110000000000 , & -0.00040000000000 , & -0.00010000000000 , & -0.26590000000000 , & -1.05000000000000 , & --0.00700000000000 , & -0.08570000000000 , & -0.05380000000000 , & -0.02740000000000 , & -0.01220000000000 , & -0.00490000000000 , & -0.00180000000000 , & -0.00060000000000 , & -0.00020000000000 , & -0.26280000000000 , & -1.06270000000000 , & --0.00880000000000 , & -0.09220000000000 , & -0.06080000000000 , & -0.03300000000000 , & -0.01570000000000 , & -0.00670000000000 , & -0.00270000000000 , & -0.00100000000000 , & -0.00030000000000 , & -0.25950000000000 , & -1.07620000000000 , & --0.01080000000000 , & -0.09810000000000 , & -0.06730000000000 , & -0.03850000000000 , & -0.01940000000000 , & -0.00880000000000 , & -0.00370000000000 , & -0.00150000000000 , & -0.00050000000000 , & -0.25610000000000 , & -1.09040000000000 , & --0.01300000000000 , & -0.10320000000000 , & -0.07330000000000 , & -0.04390000000000 , & -0.02320000000000 , & -0.01120000000000 , & -0.00500000000000 , & -0.00210000000000 , & -0.00080000000000 , & -0.25260000000000 , & -1.10540000000000 , & --0.01530000000000 , & -0.10760000000000 , & -0.07870000000000 , & -0.04910000000000 , & -0.02720000000000 , & -0.01380000000000 , & -0.00650000000000 , & -0.00280000000000 , & -0.00120000000000 , & -0.24900000000000 , & -1.12150000000000 , & --0.01780000000000 , & -0.11100000000000 , & -0.08340000000000 , & -0.05390000000000 , & -0.03120000000000 , & -0.01660000000000 , & -0.00820000000000 , & -0.00380000000000 , & -0.00170000000000 , & -0.24520000000000 , & -1.13910000000000 , & --0.02050000000000 , & -0.11320000000000 , & -0.08710000000000 , & -0.05830000000000 , & -0.03520000000000 , & -0.01960000000000 , & -0.01020000000000 , & -0.00500000000000 , & -0.00230000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.11320000000000 , & -0.08710000000000 , & -0.05830000000000 , & -0.03520000000000 , & -0.01960000000000 , & -0.01020000000000 , & -0.00500000000000 , & -0.00230000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.11320000000000 , & -0.08710000000000 , & -0.05830000000000 , & -0.03520000000000 , & -0.01960000000000 , & -0.01020000000000 , & -0.00500000000000 , & -0.00230000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.11320000000000 , & -0.08710000000000 , & -0.05830000000000 , & -0.03520000000000 , & -0.01960000000000 , & -0.01020000000000 , & -0.00500000000000 , & -0.00230000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.11320000000000 , & -0.08710000000000 , & -0.05830000000000 , & -0.03520000000000 , & -0.01960000000000 , & -0.01020000000000 , & -0.00500000000000 , & -0.00230000000000 , & -0.26720000000000 , & -0.99000000000000 , & --0.00010000000000 , & -0.01440000000000 , & -0.00210000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.26600000000000 , & -0.99470000000000 , & --0.00050000000000 , & -0.02790000000000 , & -0.00770000000000 , & -0.00160000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.26410000000000 , & -1.00160000000000 , & --0.00100000000000 , & -0.03990000000000 , & -0.01520000000000 , & -0.00440000000000 , & -0.00110000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.26190000000000 , & -1.01030000000000 , & --0.00180000000000 , & -0.05060000000000 , & -0.02350000000000 , & -0.00840000000000 , & -0.00260000000000 , & -0.00070000000000 , & -0.00020000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.25930000000000 , & -1.02030000000000 , & --0.00280000000000 , & -0.06010000000000 , & -0.03180000000000 , & -0.01320000000000 , & -0.00480000000000 , & -0.00160000000000 , & -0.00050000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.25650000000000 , & -1.03130000000000 , & --0.00400000000000 , & -0.06870000000000 , & -0.03990000000000 , & -0.01860000000000 , & -0.00750000000000 , & -0.00280000000000 , & -0.00090000000000 , & -0.00030000000000 , & -0.00010000000000 , & -0.25360000000000 , & -1.04320000000000 , & --0.00540000000000 , & -0.07640000000000 , & -0.04770000000000 , & -0.02420000000000 , & -0.01070000000000 , & -0.00430000000000 , & -0.00160000000000 , & -0.00050000000000 , & -0.00020000000000 , & -0.25050000000000 , & -1.05590000000000 , & --0.00700000000000 , & -0.08330000000000 , & -0.05500000000000 , & -0.02990000000000 , & -0.01430000000000 , & -0.00620000000000 , & -0.00250000000000 , & -0.00090000000000 , & -0.00030000000000 , & -0.24740000000000 , & -1.06940000000000 , & --0.00880000000000 , & -0.08950000000000 , & -0.06170000000000 , & -0.03560000000000 , & -0.01810000000000 , & -0.00840000000000 , & -0.00360000000000 , & -0.00140000000000 , & -0.00050000000000 , & -0.24420000000000 , & -1.08350000000000 , & --0.01080000000000 , & -0.09500000000000 , & -0.06800000000000 , & -0.04120000000000 , & -0.02210000000000 , & -0.01080000000000 , & -0.00490000000000 , & -0.00210000000000 , & -0.00080000000000 , & -0.24080000000000 , & -1.09850000000000 , & --0.01290000000000 , & -0.09980000000000 , & -0.07360000000000 , & -0.04650000000000 , & -0.02620000000000 , & -0.01350000000000 , & -0.00650000000000 , & -0.00290000000000 , & -0.00120000000000 , & -0.23740000000000 , & -1.11430000000000 , & --0.01520000000000 , & -0.10380000000000 , & -0.07870000000000 , & -0.05160000000000 , & -0.03030000000000 , & -0.01640000000000 , & -0.00830000000000 , & -0.00390000000000 , & -0.00180000000000 , & -0.23390000000000 , & -1.13130000000000 , & --0.01770000000000 , & -0.10690000000000 , & -0.08300000000000 , & -0.05630000000000 , & -0.03440000000000 , & -0.01940000000000 , & -0.01030000000000 , & -0.00510000000000 , & -0.00240000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.10690000000000 , & -0.08300000000000 , & -0.05630000000000 , & -0.03440000000000 , & -0.01940000000000 , & -0.01030000000000 , & -0.00510000000000 , & -0.00240000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.10690000000000 , & -0.08300000000000 , & -0.05630000000000 , & -0.03440000000000 , & -0.01940000000000 , & -0.01030000000000 , & -0.00510000000000 , & -0.00240000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.10690000000000 , & -0.08300000000000 , & -0.05630000000000 , & -0.03440000000000 , & -0.01940000000000 , & -0.01030000000000 , & -0.00510000000000 , & -0.00240000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.10690000000000 , & -0.08300000000000 , & -0.05630000000000 , & -0.03440000000000 , & -0.01940000000000 , & -0.01030000000000 , & -0.00510000000000 , & -0.00240000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.10690000000000 , & -0.08300000000000 , & -0.05630000000000 , & -0.03440000000000 , & -0.01940000000000 , & -0.01030000000000 , & -0.00510000000000 , & -0.00240000000000 , & -0.25350000000000 , & -0.99130000000000 , & --0.00010000000000 , & -0.01440000000000 , & -0.00240000000000 , & -0.00030000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.25220000000000 , & -0.99640000000000 , & --0.00050000000000 , & -0.02770000000000 , & -0.00840000000000 , & -0.00190000000000 , & -0.00040000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.25030000000000 , & -1.00400000000000 , & --0.00100000000000 , & -0.03940000000000 , & -0.01630000000000 , & -0.00510000000000 , & -0.00140000000000 , & -0.00030000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.24800000000000 , & -1.01320000000000 , & --0.00180000000000 , & -0.04980000000000 , & -0.02470000000000 , & -0.00960000000000 , & -0.00320000000000 , & -0.00100000000000 , & -0.00030000000000 , & -0.00010000000000 , & -0.00000000000000 , & -0.24550000000000 , & -1.02390000000000 , & --0.00280000000000 , & -0.05890000000000 , & -0.03310000000000 , & -0.01480000000000 , & -0.00580000000000 , & -0.00200000000000 , & -0.00070000000000 , & -0.00020000000000 , & -0.00010000000000 , & -0.24270000000000 , & -1.03560000000000 , & --0.00400000000000 , & -0.06710000000000 , & -0.04110000000000 , & -0.02050000000000 , & -0.00890000000000 , & -0.00350000000000 , & -0.00130000000000 , & -0.00040000000000 , & -0.00010000000000 , & -0.23980000000000 , & -1.04810000000000 , & --0.00540000000000 , & -0.07450000000000 , & -0.04870000000000 , & -0.02630000000000 , & -0.01250000000000 , & -0.00540000000000 , & -0.00220000000000 , & -0.00080000000000 , & -0.00030000000000 , & -0.23680000000000 , & -1.06150000000000 , & --0.00700000000000 , & -0.08110000000000 , & -0.05580000000000 , & -0.03220000000000 , & -0.01640000000000 , & -0.00760000000000 , & -0.00330000000000 , & -0.00130000000000 , & -0.00050000000000 , & -0.23360000000000 , & -1.07570000000000 , & --0.00880000000000 , & -0.08690000000000 , & -0.06230000000000 , & -0.03790000000000 , & -0.02050000000000 , & -0.01010000000000 , & -0.00470000000000 , & -0.00200000000000 , & -0.00080000000000 , & -0.23050000000000 , & -1.09060000000000 , & --0.01070000000000 , & -0.09210000000000 , & -0.06830000000000 , & -0.04350000000000 , & -0.02470000000000 , & -0.01290000000000 , & -0.00630000000000 , & -0.00290000000000 , & -0.00120000000000 , & -0.22720000000000 , & -1.10630000000000 , & --0.01290000000000 , & -0.09660000000000 , & -0.07360000000000 , & -0.04870000000000 , & -0.02900000000000 , & -0.01590000000000 , & -0.00810000000000 , & -0.00390000000000 , & -0.00180000000000 , & -0.22380000000000 , & -1.12290000000000 , & --0.01520000000000 , & -0.10020000000000 , & -0.07830000000000 , & -0.05370000000000 , & -0.03320000000000 , & -0.01900000000000 , & -0.01020000000000 , & -0.00520000000000 , & -0.00250000000000 , & -0.22030000000000 , & -1.14060000000000 , & --0.01760000000000 , & -0.10290000000000 , & -0.08220000000000 , & -0.05810000000000 , & -0.03730000000000 , & -0.02220000000000 , & -0.01250000000000 , & -0.00660000000000 , & -0.00340000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.10290000000000 , & -0.08220000000000 , & -0.05810000000000 , & -0.03730000000000 , & -0.02220000000000 , & -0.01250000000000 , & -0.00660000000000 , & -0.00340000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.10290000000000 , & -0.08220000000000 , & -0.05810000000000 , & -0.03730000000000 , & -0.02220000000000 , & -0.01250000000000 , & -0.00660000000000 , & -0.00340000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.10290000000000 , & -0.08220000000000 , & -0.05810000000000 , & -0.03730000000000 , & -0.02220000000000 , & -0.01250000000000 , & -0.00660000000000 , & -0.00340000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.10290000000000 , & -0.08220000000000 , & -0.05810000000000 , & -0.03730000000000 , & -0.02220000000000 , & -0.01250000000000 , & -0.00660000000000 , & -0.00340000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.00000000000000 , & -0.10290000000000 , & -0.08220000000000 , & -0.05810000000000 , & -0.03730000000000 , & -0.02220000000000 , & -0.01250000000000 , & -0.00660000000000 , & -0.00340000000000 & -/),(/11,18,20/)) - -! vim: filetype=fortran From 96b42712aac528b443f62c2b45856bb4cc11f6d3 Mon Sep 17 00:00:00 2001 From: Tim Leijnse Date: Fri, 10 Apr 2026 14:59:04 +0200 Subject: [PATCH 092/118] Delete source/src/snapwave/snapwave_RFtable.f90 --- source/src/snapwave/snapwave_RFtable.f90 | 3990 ---------------------- 1 file changed, 3990 deletions(-) delete mode 100644 source/src/snapwave/snapwave_RFtable.f90 diff --git a/source/src/snapwave/snapwave_RFtable.f90 b/source/src/snapwave/snapwave_RFtable.f90 deleted file mode 100644 index 7ae97eea4..000000000 --- a/source/src/snapwave/snapwave_RFtable.f90 +++ /dev/null @@ -1,3990 +0,0 @@ -module snapwave_RFtable - - implicit none - - contains - - subroutine load_RFtable(RFveg) - - implicit none - ! - real*4, dimension(:,:,:), allocatable, intent(out) :: RFveg - real*8, dimension(:), allocatable :: RFvegtmp - ! - allocate(RFveg(11,18,20)) - ! - ! load Ad's RF-table (update for depth averaged velocities?) - XBeach: - !include 'RFveg.inc' - ! - ! Instead, include as hardcoded table that does not need to be compiled anymore: - RFvegtmp = (/ & - 22.47180000000000 , & - 0.22370000000000 , & - -0.00050000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 6.26960000000000 , & - 0.40090000000000 , & - -0.00030000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 6.13660000000000 , & - 0.40960000000000 , & - -0.00110000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 5.93530000000000 , & - 0.42340000000000 , & - -0.00240000000000 , & - 0.00060000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 5.67800000000000 , & - 0.44260000000000 , & - -0.00420000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 2.82390000000000 , & - 0.59330000000000 , & - -0.00020000000000 , & - 0.00300000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 2.81430000000000 , & - 0.59540000000000 , & - -0.00080000000000 , & - 0.00600000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 2.79860000000000 , & - 0.59870000000000 , & - -0.00170000000000 , & - 0.00910000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 2.77700000000000 , & - 0.60340000000000 , & - -0.00300000000000 , & - 0.01230000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 2.74970000000000 , & - 0.60930000000000 , & - -0.00460000000000 , & - 0.01560000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 2.71710000000000 , & - 0.61660000000000 , & - -0.00660000000000 , & - 0.01910000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 2.67920000000000 , & - 0.62540000000000 , & - -0.00890000000000 , & - 0.02270000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 2.63520000000000 , & - 0.63580000000000 , & - -0.01150000000000 , & - 0.02650000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 2.58340000000000 , & - 0.64860000000000 , & - -0.01440000000000 , & - 0.03050000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.03050000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.03050000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.03050000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.03050000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.03050000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.03050000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.03050000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.03050000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.03050000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.68990000000000 , & - 0.74360000000000 , & - -0.00020000000000 , & - 0.00720000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.68850000000000 , & - 0.74420000000000 , & - -0.00060000000000 , & - 0.01440000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.68610000000000 , & - 0.74530000000000 , & - -0.00140000000000 , & - 0.02160000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.68270000000000 , & - 0.74680000000000 , & - -0.00240000000000 , & - 0.02880000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.67830000000000 , & - 0.74870000000000 , & - -0.00380000000000 , & - 0.03600000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.67290000000000 , & - 0.75120000000000 , & - -0.00540000000000 , & - 0.04320000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.66640000000000 , & - 0.75410000000000 , & - -0.00730000000000 , & - 0.05030000000000 , & - 0.00050000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.65870000000000 , & - 0.75760000000000 , & - -0.00960000000000 , & - 0.05740000000000 , & - 0.00070000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.64960000000000 , & - 0.76180000000000 , & - -0.01210000000000 , & - 0.06450000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.63910000000000 , & - 0.76660000000000 , & - -0.01480000000000 , & - 0.07160000000000 , & - 0.00120000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.62690000000000 , & - 0.77240000000000 , & - -0.01790000000000 , & - 0.07850000000000 , & - 0.00160000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.61250000000000 , & - 0.77930000000000 , & - -0.02110000000000 , & - 0.08530000000000 , & - 0.00210000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.59500000000000 , & - 0.78780000000000 , & - -0.02460000000000 , & - 0.09180000000000 , & - 0.00270000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.09180000000000 , & - 0.00270000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.09180000000000 , & - 0.00270000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.09180000000000 , & - 0.00270000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.09180000000000 , & - 0.00270000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.09180000000000 , & - 0.00270000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.20840000000000 , & - 0.83200000000000 , & - -0.00010000000000 , & - 0.00990000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.20780000000000 , & - 0.83230000000000 , & - -0.00050000000000 , & - 0.01980000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.20690000000000 , & - 0.83300000000000 , & - -0.00120000000000 , & - 0.02960000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.20560000000000 , & - 0.83380000000000 , & - -0.00220000000000 , & - 0.03940000000000 , & - 0.00060000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.20390000000000 , & - 0.83500000000000 , & - -0.00340000000000 , & - 0.04910000000000 , & - 0.00100000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.20180000000000 , & - 0.83650000000000 , & - -0.00490000000000 , & - 0.05880000000000 , & - 0.00140000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.19930000000000 , & - 0.83830000000000 , & - -0.00660000000000 , & - 0.06830000000000 , & - 0.00200000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.19620000000000 , & - 0.84040000000000 , & - -0.00860000000000 , & - 0.07780000000000 , & - 0.00260000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.19260000000000 , & - 0.84290000000000 , & - -0.01090000000000 , & - 0.08700000000000 , & - 0.00330000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.18840000000000 , & - 0.84590000000000 , & - -0.01340000000000 , & - 0.09620000000000 , & - 0.00420000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.18360000000000 , & - 0.84940000000000 , & - -0.01620000000000 , & - 0.10510000000000 , & - 0.00520000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.17790000000000 , & - 0.85350000000000 , & - -0.01920000000000 , & - 0.11370000000000 , & - 0.00640000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.17120000000000 , & - 0.85840000000000 , & - -0.02240000000000 , & - 0.12210000000000 , & - 0.00770000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.16330000000000 , & - 0.86420000000000 , & - -0.02590000000000 , & - 0.13000000000000 , & - 0.00920000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.15370000000000 , & - 0.87140000000000 , & - -0.02960000000000 , & - 0.13740000000000 , & - 0.01100000000000 , & - 0.00040000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 1.14090000000000 , & - 0.88110000000000 , & - -0.03350000000000 , & - 0.14380000000000 , & - 0.01320000000000 , & - 0.00070000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.14380000000000 , & - 0.01320000000000 , & - 0.00070000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.14380000000000 , & - 0.01320000000000 , & - 0.00070000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.94900000000000 , & - 0.88270000000000 , & - -0.00010000000000 , & - 0.01140000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.94860000000000 , & - 0.88310000000000 , & - -0.00050000000000 , & - 0.02280000000000 , & - 0.00040000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.94790000000000 , & - 0.88380000000000 , & - -0.00110000000000 , & - 0.03420000000000 , & - 0.00080000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.94690000000000 , & - 0.88480000000000 , & - -0.00200000000000 , & - 0.04550000000000 , & - 0.00150000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.94550000000000 , & - 0.88600000000000 , & - -0.00320000000000 , & - 0.05670000000000 , & - 0.00230000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.94390000000000 , & - 0.88750000000000 , & - -0.00460000000000 , & - 0.06770000000000 , & - 0.00330000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.94190000000000 , & - 0.88940000000000 , & - -0.00620000000000 , & - 0.07860000000000 , & - 0.00450000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.93960000000000 , & - 0.89160000000000 , & - -0.00810000000000 , & - 0.08920000000000 , & - 0.00590000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.93690000000000 , & - 0.89410000000000 , & - -0.01020000000000 , & - 0.09970000000000 , & - 0.00750000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.93380000000000 , & - 0.89710000000000 , & - -0.01260000000000 , & - 0.10990000000000 , & - 0.00930000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.93030000000000 , & - 0.90050000000000 , & - -0.01520000000000 , & - 0.11980000000000 , & - 0.01130000000000 , & - 0.00050000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.92630000000000 , & - 0.90450000000000 , & - -0.01810000000000 , & - 0.12930000000000 , & - 0.01350000000000 , & - 0.00070000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.92160000000000 , & - 0.90900000000000 , & - -0.02120000000000 , & - 0.13850000000000 , & - 0.01590000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.91630000000000 , & - 0.91430000000000 , & - -0.02450000000000 , & - 0.14710000000000 , & - 0.01850000000000 , & - 0.00120000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.91010000000000 , & - 0.92050000000000 , & - -0.02800000000000 , & - 0.15520000000000 , & - 0.02140000000000 , & - 0.00160000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.90260000000000 , & - 0.92810000000000 , & - -0.03170000000000 , & - 0.16240000000000 , & - 0.02470000000000 , & - 0.00210000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.16240000000000 , & - 0.02470000000000 , & - 0.00210000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.16240000000000 , & - 0.02470000000000 , & - 0.00210000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.78580000000000 , & - 0.91390000000000 , & - -0.00010000000000 , & - 0.01240000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.78530000000000 , & - 0.91440000000000 , & - -0.00050000000000 , & - 0.02470000000000 , & - 0.00070000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.78450000000000 , & - 0.91530000000000 , & - -0.00110000000000 , & - 0.03700000000000 , & - 0.00150000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.78350000000000 , & - 0.91650000000000 , & - -0.00200000000000 , & - 0.04910000000000 , & - 0.00260000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.78210000000000 , & - 0.91810000000000 , & - -0.00310000000000 , & - 0.06110000000000 , & - 0.00410000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.78040000000000 , & - 0.92010000000000 , & - -0.00440000000000 , & - 0.07290000000000 , & - 0.00590000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.77840000000000 , & - 0.92250000000000 , & - -0.00600000000000 , & - 0.08440000000000 , & - 0.00790000000000 , & - 0.00040000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.77610000000000 , & - 0.92520000000000 , & - -0.00780000000000 , & - 0.09570000000000 , & - 0.01030000000000 , & - 0.00060000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.77350000000000 , & - 0.92840000000000 , & - -0.00990000000000 , & - 0.10660000000000 , & - 0.01290000000000 , & - 0.00080000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.77050000000000 , & - 0.93190000000000 , & - -0.01220000000000 , & - 0.11720000000000 , & - 0.01580000000000 , & - 0.00120000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.76720000000000 , & - 0.93600000000000 , & - -0.01470000000000 , & - 0.12740000000000 , & - 0.01900000000000 , & - 0.00160000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.76350000000000 , & - 0.94060000000000 , & - -0.01740000000000 , & - 0.13720000000000 , & - 0.02230000000000 , & - 0.00200000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.75930000000000 , & - 0.94570000000000 , & - -0.02040000000000 , & - 0.14640000000000 , & - 0.02600000000000 , & - 0.00260000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.75460000000000 , & - 0.95160000000000 , & - -0.02360000000000 , & - 0.15510000000000 , & - 0.02980000000000 , & - 0.00340000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.74930000000000 , & - 0.95830000000000 , & - -0.02700000000000 , & - 0.16310000000000 , & - 0.03390000000000 , & - 0.00430000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.74320000000000 , & - 0.96620000000000 , & - -0.03050000000000 , & - 0.17020000000000 , & - 0.03820000000000 , & - 0.00540000000000 , & - 0.00050000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.73570000000000 , & - 0.97600000000000 , & - -0.03430000000000 , & - 0.17600000000000 , & - 0.04280000000000 , & - 0.00680000000000 , & - 0.00080000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.17600000000000 , & - 0.04280000000000 , & - 0.00680000000000 , & - 0.00080000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.67260000000000 , & - 0.93420000000000 , & - -0.00010000000000 , & - 0.01300000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.67210000000000 , & - 0.93490000000000 , & - -0.00050000000000 , & - 0.02590000000000 , & - 0.00100000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.67120000000000 , & - 0.93610000000000 , & - -0.00110000000000 , & - 0.03870000000000 , & - 0.00230000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.67000000000000 , & - 0.93780000000000 , & - -0.00190000000000 , & - 0.05140000000000 , & - 0.00410000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.66850000000000 , & - 0.93990000000000 , & - -0.00300000000000 , & - 0.06380000000000 , & - 0.00630000000000 , & - 0.00040000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.66660000000000 , & - 0.94250000000000 , & - -0.00430000000000 , & - 0.07590000000000 , & - 0.00890000000000 , & - 0.00060000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.66450000000000 , & - 0.94560000000000 , & - -0.00590000000000 , & - 0.08770000000000 , & - 0.01190000000000 , & - 0.00100000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.66200000000000 , & - 0.94910000000000 , & - -0.00760000000000 , & - 0.09910000000000 , & - 0.01530000000000 , & - 0.00140000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.65930000000000 , & - 0.95310000000000 , & - -0.00960000000000 , & - 0.11010000000000 , & - 0.01910000000000 , & - 0.00200000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.65620000000000 , & - 0.95750000000000 , & - -0.01190000000000 , & - 0.12070000000000 , & - 0.02310000000000 , & - 0.00270000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.65280000000000 , & - 0.96250000000000 , & - -0.01430000000000 , & - 0.13080000000000 , & - 0.02740000000000 , & - 0.00350000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.64910000000000 , & - 0.96800000000000 , & - -0.01700000000000 , & - 0.14030000000000 , & - 0.03190000000000 , & - 0.00450000000000 , & - 0.00040000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.64510000000000 , & - 0.97410000000000 , & - -0.01990000000000 , & - 0.14930000000000 , & - 0.03660000000000 , & - 0.00570000000000 , & - 0.00060000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.64060000000000 , & - 0.98090000000000 , & - -0.02300000000000 , & - 0.15760000000000 , & - 0.04150000000000 , & - 0.00700000000000 , & - 0.00080000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.63560000000000 , & - 0.98850000000000 , & - -0.02620000000000 , & - 0.16510000000000 , & - 0.04660000000000 , & - 0.00860000000000 , & - 0.00110000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.63000000000000 , & - 0.99740000000000 , & - -0.02970000000000 , & - 0.17160000000000 , & - 0.05180000000000 , & - 0.01050000000000 , & - 0.00160000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.62330000000000 , & - 1.00810000000000 , & - -0.03340000000000 , & - 0.17670000000000 , & - 0.05710000000000 , & - 0.01270000000000 , & - 0.00220000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.17670000000000 , & - 0.05710000000000 , & - 0.01270000000000 , & - 0.00220000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.58910000000000 , & - 0.94810000000000 , & - -0.00010000000000 , & - 0.01340000000000 , & - 0.00040000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.58850000000000 , & - 0.94910000000000 , & - -0.00050000000000 , & - 0.02670000000000 , & - 0.00150000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.58750000000000 , & - 0.95070000000000 , & - -0.00110000000000 , & - 0.03990000000000 , & - 0.00320000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.58610000000000 , & - 0.95290000000000 , & - -0.00190000000000 , & - 0.05280000000000 , & - 0.00570000000000 , & - 0.00040000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.58440000000000 , & - 0.95560000000000 , & - -0.00300000000000 , & - 0.06540000000000 , & - 0.00870000000000 , & - 0.00070000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.58240000000000 , & - 0.95900000000000 , & - -0.00420000000000 , & - 0.07760000000000 , & - 0.01230000000000 , & - 0.00120000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.58010000000000 , & - 0.96280000000000 , & - -0.00580000000000 , & - 0.08940000000000 , & - 0.01630000000000 , & - 0.00190000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.57740000000000 , & - 0.96720000000000 , & - -0.00750000000000 , & - 0.10070000000000 , & - 0.02070000000000 , & - 0.00270000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.57450000000000 , & - 0.97210000000000 , & - -0.00950000000000 , & - 0.11150000000000 , & - 0.02550000000000 , & - 0.00380000000000 , & - 0.00040000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.57130000000000 , & - 0.97760000000000 , & - -0.01170000000000 , & - 0.12180000000000 , & - 0.03060000000000 , & - 0.00500000000000 , & - 0.00060000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.56790000000000 , & - 0.98350000000000 , & - -0.01410000000000 , & - 0.13150000000000 , & - 0.03580000000000 , & - 0.00640000000000 , & - 0.00080000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.56410000000000 , & - 0.99010000000000 , & - -0.01670000000000 , & - 0.14050000000000 , & - 0.04130000000000 , & - 0.00810000000000 , & - 0.00110000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.56010000000000 , & - 0.99720000000000 , & - -0.01950000000000 , & - 0.14900000000000 , & - 0.04690000000000 , & - 0.01000000000000 , & - 0.00160000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.55570000000000 , & - 1.00510000000000 , & - -0.02250000000000 , & - 0.15660000000000 , & - 0.05260000000000 , & - 0.01210000000000 , & - 0.00210000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.55090000000000 , & - 1.01390000000000 , & - -0.02570000000000 , & - 0.16350000000000 , & - 0.05830000000000 , & - 0.01440000000000 , & - 0.00270000000000 , & - 0.00040000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.54550000000000 , & - 1.02390000000000 , & - -0.02910000000000 , & - 0.16920000000000 , & - 0.06400000000000 , & - 0.01710000000000 , & - 0.00360000000000 , & - 0.00060000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.16920000000000 , & - 0.06400000000000 , & - 0.01710000000000 , & - 0.00360000000000 , & - 0.00060000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.16920000000000 , & - 0.06400000000000 , & - 0.01710000000000 , & - 0.00360000000000 , & - 0.00060000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.52460000000000 , & - 0.95820000000000 , & - -0.00010000000000 , & - 0.01370000000000 , & - 0.00050000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.52390000000000 , & - 0.95940000000000 , & - -0.00050000000000 , & - 0.02730000000000 , & - 0.00190000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.52280000000000 , & - 0.96140000000000 , & - -0.00110000000000 , & - 0.04060000000000 , & - 0.00430000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.52130000000000 , & - 0.96410000000000 , & - -0.00190000000000 , & - 0.05360000000000 , & - 0.00740000000000 , & - 0.00070000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.51950000000000 , & - 0.96760000000000 , & - -0.00290000000000 , & - 0.06620000000000 , & - 0.01130000000000 , & - 0.00130000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.51730000000000 , & - 0.97170000000000 , & - -0.00420000000000 , & - 0.07830000000000 , & - 0.01580000000000 , & - 0.00210000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.51480000000000 , & - 0.97650000000000 , & - -0.00570000000000 , & - 0.08990000000000 , & - 0.02080000000000 , & - 0.00320000000000 , & - 0.00040000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.51200000000000 , & - 0.98180000000000 , & - -0.00740000000000 , & - 0.10090000000000 , & - 0.02620000000000 , & - 0.00460000000000 , & - 0.00060000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.50890000000000 , & - 0.98770000000000 , & - -0.00940000000000 , & - 0.11130000000000 , & - 0.03180000000000 , & - 0.00620000000000 , & - 0.00090000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.50560000000000 , & - 0.99410000000000 , & - -0.01150000000000 , & - 0.12120000000000 , & - 0.03770000000000 , & - 0.00810000000000 , & - 0.00130000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.50210000000000 , & - 1.00110000000000 , & - -0.01390000000000 , & - 0.13030000000000 , & - 0.04380000000000 , & - 0.01020000000000 , & - 0.00180000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.49830000000000 , & - 1.00870000000000 , & - -0.01640000000000 , & - 0.13880000000000 , & - 0.04990000000000 , & - 0.01260000000000 , & - 0.00240000000000 , & - 0.00040000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.49430000000000 , & - 1.01690000000000 , & - -0.01920000000000 , & - 0.14660000000000 , & - 0.05610000000000 , & - 0.01520000000000 , & - 0.00320000000000 , & - 0.00050000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.49000000000000 , & - 1.02590000000000 , & - -0.02210000000000 , & - 0.15360000000000 , & - 0.06230000000000 , & - 0.01810000000000 , & - 0.00410000000000 , & - 0.00070000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.48530000000000 , & - 1.03590000000000 , & - -0.02530000000000 , & - 0.15970000000000 , & - 0.06830000000000 , & - 0.02120000000000 , & - 0.00520000000000 , & - 0.00110000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.48000000000000 , & - 1.04720000000000 , & - -0.02860000000000 , & - 0.16460000000000 , & - 0.07420000000000 , & - 0.02460000000000 , & - 0.00660000000000 , & - 0.00150000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.16460000000000 , & - 0.07420000000000 , & - 0.02460000000000 , & - 0.00660000000000 , & - 0.00150000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.16460000000000 , & - 0.07420000000000 , & - 0.02460000000000 , & - 0.00660000000000 , & - 0.00150000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.47320000000000 , & - 0.96560000000000 , & - -0.00010000000000 , & - 0.01390000000000 , & - 0.00060000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.47250000000000 , & - 0.96710000000000 , & - -0.00050000000000 , & - 0.02770000000000 , & - 0.00250000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.47130000000000 , & - 0.96960000000000 , & - -0.00100000000000 , & - 0.04110000000000 , & - 0.00540000000000 , & - 0.00050000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.46960000000000 , & - 0.97300000000000 , & - -0.00190000000000 , & - 0.05410000000000 , & - 0.00930000000000 , & - 0.00110000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.46760000000000 , & - 0.97720000000000 , & - -0.00290000000000 , & - 0.06650000000000 , & - 0.01400000000000 , & - 0.00200000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.46530000000000 , & - 0.98210000000000 , & - -0.00420000000000 , & - 0.07840000000000 , & - 0.01940000000000 , & - 0.00330000000000 , & - 0.00040000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.46260000000000 , & - 0.98770000000000 , & - -0.00560000000000 , & - 0.08960000000000 , & - 0.02520000000000 , & - 0.00490000000000 , & - 0.00070000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.45970000000000 , & - 0.99400000000000 , & - -0.00730000000000 , & - 0.10020000000000 , & - 0.03140000000000 , & - 0.00690000000000 , & - 0.00120000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.45660000000000 , & - 1.00080000000000 , & - -0.00930000000000 , & - 0.11020000000000 , & - 0.03780000000000 , & - 0.00910000000000 , & - 0.00170000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.45320000000000 , & - 1.00830000000000 , & - -0.01140000000000 , & - 0.11940000000000 , & - 0.04430000000000 , & - 0.01170000000000 , & - 0.00240000000000 , & - 0.00040000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.44960000000000 , & - 1.01630000000000 , & - -0.01370000000000 , & - 0.12800000000000 , & - 0.05090000000000 , & - 0.01450000000000 , & - 0.00330000000000 , & - 0.00060000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.44590000000000 , & - 1.02490000000000 , & - -0.01620000000000 , & - 0.13590000000000 , & - 0.05750000000000 , & - 0.01760000000000 , & - 0.00430000000000 , & - 0.00090000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.44190000000000 , & - 1.03420000000000 , & - -0.01890000000000 , & - 0.14300000000000 , & - 0.06390000000000 , & - 0.02100000000000 , & - 0.00560000000000 , & - 0.00120000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.43760000000000 , & - 1.04430000000000 , & - -0.02180000000000 , & - 0.14930000000000 , & - 0.07020000000000 , & - 0.02460000000000 , & - 0.00700000000000 , & - 0.00170000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.43300000000000 , & - 1.05540000000000 , & - -0.02490000000000 , & - 0.15460000000000 , & - 0.07630000000000 , & - 0.02830000000000 , & - 0.00870000000000 , & - 0.00220000000000 , & - 0.00050000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.42780000000000 , & - 1.06820000000000 , & - -0.02820000000000 , & - 0.15860000000000 , & - 0.08200000000000 , & - 0.03240000000000 , & - 0.01070000000000 , & - 0.00300000000000 , & - 0.00070000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.15860000000000 , & - 0.08200000000000 , & - 0.03240000000000 , & - 0.01070000000000 , & - 0.00300000000000 , & - 0.00070000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.15860000000000 , & - 0.08200000000000 , & - 0.03240000000000 , & - 0.01070000000000 , & - 0.00300000000000 , & - 0.00070000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.43130000000000 , & - 0.97130000000000 , & - -0.00010000000000 , & - 0.01410000000000 , & - 0.00080000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.43040000000000 , & - 0.97320000000000 , & - -0.00050000000000 , & - 0.02790000000000 , & - 0.00300000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.42910000000000 , & - 0.97610000000000 , & - -0.00100000000000 , & - 0.04140000000000 , & - 0.00660000000000 , & - 0.00070000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.42740000000000 , & - 0.98020000000000 , & - -0.00180000000000 , & - 0.05420000000000 , & - 0.01130000000000 , & - 0.00160000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.42520000000000 , & - 0.98510000000000 , & - -0.00290000000000 , & - 0.06650000000000 , & - 0.01680000000000 , & - 0.00300000000000 , & - 0.00040000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.42270000000000 , & - 0.99090000000000 , & - -0.00410000000000 , & - 0.07800000000000 , & - 0.02290000000000 , & - 0.00470000000000 , & - 0.00080000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.42000000000000 , & - 0.99740000000000 , & - -0.00560000000000 , & - 0.08880000000000 , & - 0.02940000000000 , & - 0.00700000000000 , & - 0.00130000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.41700000000000 , & - 1.00450000000000 , & - -0.00730000000000 , & - 0.09890000000000 , & - 0.03620000000000 , & - 0.00950000000000 , & - 0.00200000000000 , & - 0.00040000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.41380000000000 , & - 1.01230000000000 , & - -0.00920000000000 , & - 0.10830000000000 , & - 0.04310000000000 , & - 0.01250000000000 , & - 0.00290000000000 , & - 0.00060000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.41040000000000 , & - 1.02070000000000 , & - -0.01130000000000 , & - 0.11700000000000 , & - 0.05010000000000 , & - 0.01570000000000 , & - 0.00400000000000 , & - 0.00090000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.40680000000000 , & - 1.02970000000000 , & - -0.01360000000000 , & - 0.12500000000000 , & - 0.05700000000000 , & - 0.01930000000000 , & - 0.00530000000000 , & - 0.00120000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.40300000000000 , & - 1.03930000000000 , & - -0.01600000000000 , & - 0.13230000000000 , & - 0.06370000000000 , & - 0.02300000000000 , & - 0.00680000000000 , & - 0.00170000000000 , & - 0.00040000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.39910000000000 , & - 1.04970000000000 , & - -0.01870000000000 , & - 0.13880000000000 , & - 0.07020000000000 , & - 0.02700000000000 , & - 0.00860000000000 , & - 0.00230000000000 , & - 0.00050000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.39480000000000 , & - 1.06090000000000 , & - -0.02160000000000 , & - 0.14440000000000 , & - 0.07650000000000 , & - 0.03110000000000 , & - 0.01050000000000 , & - 0.00310000000000 , & - 0.00080000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.39030000000000 , & - 1.07320000000000 , & - -0.02460000000000 , & - 0.14890000000000 , & - 0.08240000000000 , & - 0.03540000000000 , & - 0.01280000000000 , & - 0.00400000000000 , & - 0.00110000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.14890000000000 , & - 0.08240000000000 , & - 0.03540000000000 , & - 0.01280000000000 , & - 0.00400000000000 , & - 0.00110000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.14890000000000 , & - 0.08240000000000 , & - 0.03540000000000 , & - 0.01280000000000 , & - 0.00400000000000 , & - 0.00110000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.14890000000000 , & - 0.08240000000000 , & - 0.03540000000000 , & - 0.01280000000000 , & - 0.00400000000000 , & - 0.00110000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.39630000000000 , & - 0.97580000000000 , & - -0.00010000000000 , & - 0.01420000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.39540000000000 , & - 0.97800000000000 , & - -0.00050000000000 , & - 0.02810000000000 , & - 0.00360000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.39400000000000 , & - 0.98150000000000 , & - -0.00100000000000 , & - 0.04150000000000 , & - 0.00780000000000 , & - 0.00100000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.39210000000000 , & - 0.98620000000000 , & - -0.00180000000000 , & - 0.05410000000000 , & - 0.01320000000000 , & - 0.00230000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.38980000000000 , & - 0.99190000000000 , & - -0.00290000000000 , & - 0.06600000000000 , & - 0.01950000000000 , & - 0.00410000000000 , & - 0.00070000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.38720000000000 , & - 0.99850000000000 , & - -0.00410000000000 , & - 0.07720000000000 , & - 0.02620000000000 , & - 0.00640000000000 , & - 0.00130000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.38440000000000 , & - 1.00580000000000 , & - -0.00560000000000 , & - 0.08750000000000 , & - 0.03330000000000 , & - 0.00930000000000 , & - 0.00210000000000 , & - 0.00040000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.38140000000000 , & - 1.01390000000000 , & - -0.00720000000000 , & - 0.09710000000000 , & - 0.04050000000000 , & - 0.01250000000000 , & - 0.00320000000000 , & - 0.00070000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.37810000000000 , & - 1.02260000000000 , & - -0.00910000000000 , & - 0.10600000000000 , & - 0.04780000000000 , & - 0.01610000000000 , & - 0.00450000000000 , & - 0.00110000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.37470000000000 , & - 1.03190000000000 , & - -0.01120000000000 , & - 0.11410000000000 , & - 0.05490000000000 , & - 0.02000000000000 , & - 0.00600000000000 , & - 0.00150000000000 , & - 0.00030000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.37110000000000 , & - 1.04180000000000 , & - -0.01340000000000 , & - 0.12160000000000 , & - 0.06190000000000 , & - 0.02410000000000 , & - 0.00780000000000 , & - 0.00220000000000 , & - 0.00050000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.36740000000000 , & - 1.05240000000000 , & - -0.01590000000000 , & - 0.12820000000000 , & - 0.06870000000000 , & - 0.02840000000000 , & - 0.00980000000000 , & - 0.00290000000000 , & - 0.00080000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.36350000000000 , & - 1.06380000000000 , & - -0.01850000000000 , & - 0.13410000000000 , & - 0.07510000000000 , & - 0.03280000000000 , & - 0.01210000000000 , & - 0.00390000000000 , & - 0.00110000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.35930000000000 , & - 1.07610000000000 , & - -0.02130000000000 , & - 0.13910000000000 , & - 0.08110000000000 , & - 0.03730000000000 , & - 0.01460000000000 , & - 0.00500000000000 , & - 0.00150000000000 , & - 0.00040000000000 , & - 0.00010000000000 , & - 0.35480000000000 , & - 1.08970000000000 , & - -0.02430000000000 , & - 0.14290000000000 , & - 0.08660000000000 , & - 0.04190000000000 , & - 0.01740000000000 , & - 0.00640000000000 , & - 0.00210000000000 , & - 0.00060000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.14290000000000 , & - 0.08660000000000 , & - 0.04190000000000 , & - 0.01740000000000 , & - 0.00640000000000 , & - 0.00210000000000 , & - 0.00060000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.14290000000000 , & - 0.08660000000000 , & - 0.04190000000000 , & - 0.01740000000000 , & - 0.00640000000000 , & - 0.00210000000000 , & - 0.00060000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.14290000000000 , & - 0.08660000000000 , & - 0.04190000000000 , & - 0.01740000000000 , & - 0.00640000000000 , & - 0.00210000000000 , & - 0.00060000000000 , & - 0.00020000000000 , & - 0.36660000000000 , & - 0.97940000000000 , & - -0.00010000000000 , & - 0.01430000000000 , & - 0.00110000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.36570000000000 , & - 0.98190000000000 , & - -0.00050000000000 , & - 0.02820000000000 , & - 0.00430000000000 , & - 0.00050000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.36410000000000 , & - 0.98600000000000 , & - -0.00100000000000 , & - 0.04140000000000 , & - 0.00910000000000 , & - 0.00140000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.36220000000000 , & - 0.99140000000000 , & - -0.00180000000000 , & - 0.05380000000000 , & - 0.01520000000000 , & - 0.00310000000000 , & - 0.00050000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.35980000000000 , & - 0.99780000000000 , & - -0.00280000000000 , & - 0.06540000000000 , & - 0.02200000000000 , & - 0.00540000000000 , & - 0.00110000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.35720000000000 , & - 1.00520000000000 , & - -0.00410000000000 , & - 0.07610000000000 , & - 0.02930000000000 , & - 0.00830000000000 , & - 0.00200000000000 , & - 0.00040000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.35430000000000 , & - 1.01340000000000 , & - -0.00550000000000 , & - 0.08600000000000 , & - 0.03680000000000 , & - 0.01180000000000 , & - 0.00310000000000 , & - 0.00070000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.35120000000000 , & - 1.02230000000000 , & - -0.00720000000000 , & - 0.09510000000000 , & - 0.04430000000000 , & - 0.01560000000000 , & - 0.00460000000000 , & - 0.00120000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.34790000000000 , & - 1.03190000000000 , & - -0.00900000000000 , & - 0.10340000000000 , & - 0.05170000000000 , & - 0.01980000000000 , & - 0.00630000000000 , & - 0.00180000000000 , & - 0.00040000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.34450000000000 , & - 1.04210000000000 , & - -0.01110000000000 , & - 0.11100000000000 , & - 0.05890000000000 , & - 0.02420000000000 , & - 0.00840000000000 , & - 0.00250000000000 , & - 0.00070000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.34100000000000 , & - 1.05290000000000 , & - -0.01330000000000 , & - 0.11790000000000 , & - 0.06580000000000 , & - 0.02880000000000 , & - 0.01060000000000 , & - 0.00340000000000 , & - 0.00100000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.33730000000000 , & - 1.06440000000000 , & - -0.01580000000000 , & - 0.12400000000000 , & - 0.07240000000000 , & - 0.03350000000000 , & - 0.01310000000000 , & - 0.00450000000000 , & - 0.00140000000000 , & - 0.00040000000000 , & - 0.00010000000000 , & - 0.33340000000000 , & - 1.07680000000000 , & - -0.01840000000000 , & - 0.12930000000000 , & - 0.07860000000000 , & - 0.03820000000000 , & - 0.01590000000000 , & - 0.00590000000000 , & - 0.00190000000000 , & - 0.00060000000000 , & - 0.00010000000000 , & - 0.32930000000000 , & - 1.09020000000000 , & - -0.02110000000000 , & - 0.13370000000000 , & - 0.08430000000000 , & - 0.04300000000000 , & - 0.01890000000000 , & - 0.00740000000000 , & - 0.00260000000000 , & - 0.00080000000000 , & - 0.00020000000000 , & - 0.32490000000000 , & - 1.10510000000000 , & - -0.02410000000000 , & - 0.13680000000000 , & - 0.08930000000000 , & - 0.04770000000000 , & - 0.02220000000000 , & - 0.00920000000000 , & - 0.00350000000000 , & - 0.00120000000000 , & - 0.00040000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.13680000000000 , & - 0.08930000000000 , & - 0.04770000000000 , & - 0.02220000000000 , & - 0.00920000000000 , & - 0.00350000000000 , & - 0.00120000000000 , & - 0.00040000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.13680000000000 , & - 0.08930000000000 , & - 0.04770000000000 , & - 0.02220000000000 , & - 0.00920000000000 , & - 0.00350000000000 , & - 0.00120000000000 , & - 0.00040000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.13680000000000 , & - 0.08930000000000 , & - 0.04770000000000 , & - 0.02220000000000 , & - 0.00920000000000 , & - 0.00350000000000 , & - 0.00120000000000 , & - 0.00040000000000 , & - 0.34120000000000 , & - 0.98230000000000 , & - -0.00010000000000 , & - 0.01430000000000 , & - 0.00130000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.34010000000000 , & - 0.98520000000000 , & - -0.00050000000000 , & - 0.02820000000000 , & - 0.00490000000000 , & - 0.00060000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.33850000000000 , & - 0.98990000000000 , & - -0.00100000000000 , & - 0.04130000000000 , & - 0.01040000000000 , & - 0.00190000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.33650000000000 , & - 0.99590000000000 , & - -0.00180000000000 , & - 0.05340000000000 , & - 0.01710000000000 , & - 0.00400000000000 , & - 0.00080000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.33410000000000 , & - 1.00310000000000 , & - -0.00280000000000 , & - 0.06460000000000 , & - 0.02440000000000 , & - 0.00680000000000 , & - 0.00160000000000 , & - 0.00030000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.33140000000000 , & - 1.01130000000000 , & - -0.00410000000000 , & - 0.07480000000000 , & - 0.03210000000000 , & - 0.01030000000000 , & - 0.00280000000000 , & - 0.00070000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.32840000000000 , & - 1.02030000000000 , & - -0.00550000000000 , & - 0.08420000000000 , & - 0.03980000000000 , & - 0.01430000000000 , & - 0.00440000000000 , & - 0.00120000000000 , & - 0.00030000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.32530000000000 , & - 1.03000000000000 , & - -0.00710000000000 , & - 0.09280000000000 , & - 0.04750000000000 , & - 0.01870000000000 , & - 0.00630000000000 , & - 0.00180000000000 , & - 0.00050000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.32210000000000 , & - 1.04040000000000 , & - -0.00900000000000 , & - 0.10060000000000 , & - 0.05490000000000 , & - 0.02340000000000 , & - 0.00850000000000 , & - 0.00270000000000 , & - 0.00080000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.31870000000000 , & - 1.05150000000000 , & - -0.01100000000000 , & - 0.10780000000000 , & - 0.06200000000000 , & - 0.02820000000000 , & - 0.01100000000000 , & - 0.00380000000000 , & - 0.00120000000000 , & - 0.00030000000000 , & - 0.00010000000000 , & - 0.31520000000000 , & - 1.06320000000000 , & - -0.01320000000000 , & - 0.11410000000000 , & - 0.06880000000000 , & - 0.03320000000000 , & - 0.01370000000000 , & - 0.00500000000000 , & - 0.00170000000000 , & - 0.00050000000000 , & - 0.00010000000000 , & - 0.31150000000000 , & - 1.07560000000000 , & - -0.01560000000000 , & - 0.11980000000000 , & - 0.07520000000000 , & - 0.03810000000000 , & - 0.01670000000000 , & - 0.00650000000000 , & - 0.00230000000000 , & - 0.00070000000000 , & - 0.00020000000000 , & - 0.30770000000000 , & - 1.08890000000000 , & - -0.01820000000000 , & - 0.12460000000000 , & - 0.08110000000000 , & - 0.04310000000000 , & - 0.01990000000000 , & - 0.00820000000000 , & - 0.00310000000000 , & - 0.00100000000000 , & - 0.00030000000000 , & - 0.30370000000000 , & - 1.10340000000000 , & - -0.02100000000000 , & - 0.12840000000000 , & - 0.08630000000000 , & - 0.04800000000000 , & - 0.02330000000000 , & - 0.01020000000000 , & - 0.00410000000000 , & - 0.00150000000000 , & - 0.00050000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.12840000000000 , & - 0.08630000000000 , & - 0.04800000000000 , & - 0.02330000000000 , & - 0.01020000000000 , & - 0.00410000000000 , & - 0.00150000000000 , & - 0.00050000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.12840000000000 , & - 0.08630000000000 , & - 0.04800000000000 , & - 0.02330000000000 , & - 0.01020000000000 , & - 0.00410000000000 , & - 0.00150000000000 , & - 0.00050000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.12840000000000 , & - 0.08630000000000 , & - 0.04800000000000 , & - 0.02330000000000 , & - 0.01020000000000 , & - 0.00410000000000 , & - 0.00150000000000 , & - 0.00050000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.12840000000000 , & - 0.08630000000000 , & - 0.04800000000000 , & - 0.02330000000000 , & - 0.01020000000000 , & - 0.00410000000000 , & - 0.00150000000000 , & - 0.00050000000000 , & - 0.31900000000000 , & - 0.98470000000000 , & - -0.00010000000000 , & - 0.01440000000000 , & - 0.00150000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.31800000000000 , & - 0.98810000000000 , & - -0.00050000000000 , & - 0.02820000000000 , & - 0.00560000000000 , & - 0.00080000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.31630000000000 , & - 0.99330000000000 , & - -0.00100000000000 , & - 0.04100000000000 , & - 0.01170000000000 , & - 0.00240000000000 , & - 0.00040000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.31420000000000 , & - 1.00000000000000 , & - -0.00180000000000 , & - 0.05280000000000 , & - 0.01890000000000 , & - 0.00500000000000 , & - 0.00110000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.31170000000000 , & - 1.00790000000000 , & - -0.00280000000000 , & - 0.06360000000000 , & - 0.02660000000000 , & - 0.00840000000000 , & - 0.00220000000000 , & - 0.00050000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.30890000000000 , & - 1.01690000000000 , & - -0.00400000000000 , & - 0.07340000000000 , & - 0.03450000000000 , & - 0.01240000000000 , & - 0.00380000000000 , & - 0.00100000000000 , & - 0.00020000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.30600000000000 , & - 1.02660000000000 , & - -0.00550000000000 , & - 0.08230000000000 , & - 0.04240000000000 , & - 0.01690000000000 , & - 0.00580000000000 , & - 0.00170000000000 , & - 0.00050000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.30290000000000 , & - 1.03720000000000 , & - -0.00710000000000 , & - 0.09040000000000 , & - 0.05010000000000 , & - 0.02180000000000 , & - 0.00810000000000 , & - 0.00270000000000 , & - 0.00080000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.29970000000000 , & - 1.04830000000000 , & - -0.00890000000000 , & - 0.09780000000000 , & - 0.05740000000000 , & - 0.02680000000000 , & - 0.01080000000000 , & - 0.00390000000000 , & - 0.00120000000000 , & - 0.00040000000000 , & - 0.00010000000000 , & - 0.29630000000000 , & - 1.06020000000000 , & - -0.01090000000000 , & - 0.10450000000000 , & - 0.06440000000000 , & - 0.03200000000000 , & - 0.01370000000000 , & - 0.00530000000000 , & - 0.00180000000000 , & - 0.00060000000000 , & - 0.00020000000000 , & - 0.29280000000000 , & - 1.07280000000000 , & - -0.01320000000000 , & - 0.11040000000000 , & - 0.07100000000000 , & - 0.03720000000000 , & - 0.01690000000000 , & - 0.00690000000000 , & - 0.00250000000000 , & - 0.00090000000000 , & - 0.00030000000000 , & - 0.28930000000000 , & - 1.08610000000000 , & - -0.01550000000000 , & - 0.11560000000000 , & - 0.07700000000000 , & - 0.04230000000000 , & - 0.02030000000000 , & - 0.00870000000000 , & - 0.00340000000000 , & - 0.00120000000000 , & - 0.00040000000000 , & - 0.28550000000000 , & - 1.10040000000000 , & - -0.01810000000000 , & - 0.11990000000000 , & - 0.08250000000000 , & - 0.04740000000000 , & - 0.02380000000000 , & - 0.01080000000000 , & - 0.00450000000000 , & - 0.00170000000000 , & - 0.00060000000000 , & - 0.28150000000000 , & - 1.11590000000000 , & - -0.02080000000000 , & - 0.12320000000000 , & - 0.08730000000000 , & - 0.05220000000000 , & - 0.02750000000000 , & - 0.01320000000000 , & - 0.00590000000000 , & - 0.00240000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.12320000000000 , & - 0.08730000000000 , & - 0.05220000000000 , & - 0.02750000000000 , & - 0.01320000000000 , & - 0.00590000000000 , & - 0.00240000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.12320000000000 , & - 0.08730000000000 , & - 0.05220000000000 , & - 0.02750000000000 , & - 0.01320000000000 , & - 0.00590000000000 , & - 0.00240000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.12320000000000 , & - 0.08730000000000 , & - 0.05220000000000 , & - 0.02750000000000 , & - 0.01320000000000 , & - 0.00590000000000 , & - 0.00240000000000 , & - 0.00090000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.12320000000000 , & - 0.08730000000000 , & - 0.05220000000000 , & - 0.02750000000000 , & - 0.01320000000000 , & - 0.00590000000000 , & - 0.00240000000000 , & - 0.00090000000000 , & - 0.29970000000000 , & - 0.98670000000000 , & - -0.00010000000000 , & - 0.01440000000000 , & - 0.00170000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.29850000000000 , & - 0.99050000000000 , & - -0.00050000000000 , & - 0.02810000000000 , & - 0.00630000000000 , & - 0.00100000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.29680000000000 , & - 0.99630000000000 , & - -0.00100000000000 , & - 0.04070000000000 , & - 0.01290000000000 , & - 0.00300000000000 , & - 0.00060000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.29460000000000 , & - 1.00370000000000 , & - -0.00180000000000 , & - 0.05220000000000 , & - 0.02050000000000 , & - 0.00610000000000 , & - 0.00150000000000 , & - 0.00030000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.29210000000000 , & - 1.01240000000000 , & - -0.00280000000000 , & - 0.06250000000000 , & - 0.02860000000000 , & - 0.01000000000000 , & - 0.00300000000000 , & - 0.00080000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.28930000000000 , & - 1.02200000000000 , & - -0.00400000000000 , & - 0.07190000000000 , & - 0.03670000000000 , & - 0.01450000000000 , & - 0.00490000000000 , & - 0.00150000000000 , & - 0.00040000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.28640000000000 , & - 1.03250000000000 , & - -0.00540000000000 , & - 0.08040000000000 , & - 0.04460000000000 , & - 0.01950000000000 , & - 0.00730000000000 , & - 0.00250000000000 , & - 0.00080000000000 , & - 0.00020000000000 , & - 0.00010000000000 , & - 0.28330000000000 , & - 1.04380000000000 , & - -0.00710000000000 , & - 0.08810000000000 , & - 0.05210000000000 , & - 0.02470000000000 , & - 0.01010000000000 , & - 0.00370000000000 , & - 0.00120000000000 , & - 0.00040000000000 , & - 0.00010000000000 , & - 0.28010000000000 , & - 1.05580000000000 , & - -0.00890000000000 , & - 0.09500000000000 , & - 0.05930000000000 , & - 0.03010000000000 , & - 0.01320000000000 , & - 0.00520000000000 , & - 0.00190000000000 , & - 0.00060000000000 , & - 0.00020000000000 , & - 0.27670000000000 , & - 1.06840000000000 , & - -0.01090000000000 , & - 0.10130000000000 , & - 0.06610000000000 , & - 0.03540000000000 , & - 0.01660000000000 , & - 0.00700000000000 , & - 0.00270000000000 , & - 0.00090000000000 , & - 0.00030000000000 , & - 0.27330000000000 , & - 1.08180000000000 , & - -0.01310000000000 , & - 0.10680000000000 , & - 0.07240000000000 , & - 0.04080000000000 , & - 0.02010000000000 , & - 0.00900000000000 , & - 0.00370000000000 , & - 0.00140000000000 , & - 0.00050000000000 , & - 0.26980000000000 , & - 1.09600000000000 , & - -0.01540000000000 , & - 0.11150000000000 , & - 0.07810000000000 , & - 0.04600000000000 , & - 0.02380000000000 , & - 0.01120000000000 , & - 0.00490000000000 , & - 0.00190000000000 , & - 0.00070000000000 , & - 0.26610000000000 , & - 1.11120000000000 , & - -0.01800000000000 , & - 0.11540000000000 , & - 0.08330000000000 , & - 0.05100000000000 , & - 0.02760000000000 , & - 0.01370000000000 , & - 0.00630000000000 , & - 0.00270000000000 , & - 0.00110000000000 , & - 0.26220000000000 , & - 1.12780000000000 , & - -0.02060000000000 , & - 0.11810000000000 , & - 0.08750000000000 , & - 0.05560000000000 , & - 0.03150000000000 , & - 0.01640000000000 , & - 0.00790000000000 , & - 0.00360000000000 , & - 0.00150000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.11810000000000 , & - 0.08750000000000 , & - 0.05560000000000 , & - 0.03150000000000 , & - 0.01640000000000 , & - 0.00790000000000 , & - 0.00360000000000 , & - 0.00150000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.11810000000000 , & - 0.08750000000000 , & - 0.05560000000000 , & - 0.03150000000000 , & - 0.01640000000000 , & - 0.00790000000000 , & - 0.00360000000000 , & - 0.00150000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.11810000000000 , & - 0.08750000000000 , & - 0.05560000000000 , & - 0.03150000000000 , & - 0.01640000000000 , & - 0.00790000000000 , & - 0.00360000000000 , & - 0.00150000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.11810000000000 , & - 0.08750000000000 , & - 0.05560000000000 , & - 0.03150000000000 , & - 0.01640000000000 , & - 0.00790000000000 , & - 0.00360000000000 , & - 0.00150000000000 , & - 0.28250000000000 , & - 0.98850000000000 , & - -0.00010000000000 , & - 0.01440000000000 , & - 0.00190000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.28130000000000 , & - 0.99270000000000 , & - -0.00050000000000 , & - 0.02800000000000 , & - 0.00700000000000 , & - 0.00130000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.27950000000000 , & - 0.99910000000000 , & - -0.00100000000000 , & - 0.04030000000000 , & - 0.01410000000000 , & - 0.00370000000000 , & - 0.00080000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.27730000000000 , & - 1.00710000000000 , & - -0.00180000000000 , & - 0.05140000000000 , & - 0.02210000000000 , & - 0.00720000000000 , & - 0.00200000000000 , & - 0.00050000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.27470000000000 , & - 1.01650000000000 , & - -0.00280000000000 , & - 0.06130000000000 , & - 0.03030000000000 , & - 0.01160000000000 , & - 0.00380000000000 , & - 0.00110000000000 , & - 0.00030000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.27200000000000 , & - 1.02680000000000 , & - -0.00400000000000 , & - 0.07030000000000 , & - 0.03840000000000 , & - 0.01660000000000 , & - 0.00620000000000 , & - 0.00210000000000 , & - 0.00060000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.26900000000000 , & - 1.03800000000000 , & - -0.00540000000000 , & - 0.07840000000000 , & - 0.04630000000000 , & - 0.02190000000000 , & - 0.00900000000000 , & - 0.00330000000000 , & - 0.00110000000000 , & - 0.00040000000000 , & - 0.00010000000000 , & - 0.26590000000000 , & - 1.05000000000000 , & - -0.00700000000000 , & - 0.08570000000000 , & - 0.05380000000000 , & - 0.02740000000000 , & - 0.01220000000000 , & - 0.00490000000000 , & - 0.00180000000000 , & - 0.00060000000000 , & - 0.00020000000000 , & - 0.26280000000000 , & - 1.06270000000000 , & - -0.00880000000000 , & - 0.09220000000000 , & - 0.06080000000000 , & - 0.03300000000000 , & - 0.01570000000000 , & - 0.00670000000000 , & - 0.00270000000000 , & - 0.00100000000000 , & - 0.00030000000000 , & - 0.25950000000000 , & - 1.07620000000000 , & - -0.01080000000000 , & - 0.09810000000000 , & - 0.06730000000000 , & - 0.03850000000000 , & - 0.01940000000000 , & - 0.00880000000000 , & - 0.00370000000000 , & - 0.00150000000000 , & - 0.00050000000000 , & - 0.25610000000000 , & - 1.09040000000000 , & - -0.01300000000000 , & - 0.10320000000000 , & - 0.07330000000000 , & - 0.04390000000000 , & - 0.02320000000000 , & - 0.01120000000000 , & - 0.00500000000000 , & - 0.00210000000000 , & - 0.00080000000000 , & - 0.25260000000000 , & - 1.10540000000000 , & - -0.01530000000000 , & - 0.10760000000000 , & - 0.07870000000000 , & - 0.04910000000000 , & - 0.02720000000000 , & - 0.01380000000000 , & - 0.00650000000000 , & - 0.00280000000000 , & - 0.00120000000000 , & - 0.24900000000000 , & - 1.12150000000000 , & - -0.01780000000000 , & - 0.11100000000000 , & - 0.08340000000000 , & - 0.05390000000000 , & - 0.03120000000000 , & - 0.01660000000000 , & - 0.00820000000000 , & - 0.00380000000000 , & - 0.00170000000000 , & - 0.24520000000000 , & - 1.13910000000000 , & - -0.02050000000000 , & - 0.11320000000000 , & - 0.08710000000000 , & - 0.05830000000000 , & - 0.03520000000000 , & - 0.01960000000000 , & - 0.01020000000000 , & - 0.00500000000000 , & - 0.00230000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.11320000000000 , & - 0.08710000000000 , & - 0.05830000000000 , & - 0.03520000000000 , & - 0.01960000000000 , & - 0.01020000000000 , & - 0.00500000000000 , & - 0.00230000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.11320000000000 , & - 0.08710000000000 , & - 0.05830000000000 , & - 0.03520000000000 , & - 0.01960000000000 , & - 0.01020000000000 , & - 0.00500000000000 , & - 0.00230000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.11320000000000 , & - 0.08710000000000 , & - 0.05830000000000 , & - 0.03520000000000 , & - 0.01960000000000 , & - 0.01020000000000 , & - 0.00500000000000 , & - 0.00230000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.11320000000000 , & - 0.08710000000000 , & - 0.05830000000000 , & - 0.03520000000000 , & - 0.01960000000000 , & - 0.01020000000000 , & - 0.00500000000000 , & - 0.00230000000000 , & - 0.26720000000000 , & - 0.99000000000000 , & - -0.00010000000000 , & - 0.01440000000000 , & - 0.00210000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.26600000000000 , & - 0.99470000000000 , & - -0.00050000000000 , & - 0.02790000000000 , & - 0.00770000000000 , & - 0.00160000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.26410000000000 , & - 1.00160000000000 , & - -0.00100000000000 , & - 0.03990000000000 , & - 0.01520000000000 , & - 0.00440000000000 , & - 0.00110000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.26190000000000 , & - 1.01030000000000 , & - -0.00180000000000 , & - 0.05060000000000 , & - 0.02350000000000 , & - 0.00840000000000 , & - 0.00260000000000 , & - 0.00070000000000 , & - 0.00020000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.25930000000000 , & - 1.02030000000000 , & - -0.00280000000000 , & - 0.06010000000000 , & - 0.03180000000000 , & - 0.01320000000000 , & - 0.00480000000000 , & - 0.00160000000000 , & - 0.00050000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.25650000000000 , & - 1.03130000000000 , & - -0.00400000000000 , & - 0.06870000000000 , & - 0.03990000000000 , & - 0.01860000000000 , & - 0.00750000000000 , & - 0.00280000000000 , & - 0.00090000000000 , & - 0.00030000000000 , & - 0.00010000000000 , & - 0.25360000000000 , & - 1.04320000000000 , & - -0.00540000000000 , & - 0.07640000000000 , & - 0.04770000000000 , & - 0.02420000000000 , & - 0.01070000000000 , & - 0.00430000000000 , & - 0.00160000000000 , & - 0.00050000000000 , & - 0.00020000000000 , & - 0.25050000000000 , & - 1.05590000000000 , & - -0.00700000000000 , & - 0.08330000000000 , & - 0.05500000000000 , & - 0.02990000000000 , & - 0.01430000000000 , & - 0.00620000000000 , & - 0.00250000000000 , & - 0.00090000000000 , & - 0.00030000000000 , & - 0.24740000000000 , & - 1.06940000000000 , & - -0.00880000000000 , & - 0.08950000000000 , & - 0.06170000000000 , & - 0.03560000000000 , & - 0.01810000000000 , & - 0.00840000000000 , & - 0.00360000000000 , & - 0.00140000000000 , & - 0.00050000000000 , & - 0.24420000000000 , & - 1.08350000000000 , & - -0.01080000000000 , & - 0.09500000000000 , & - 0.06800000000000 , & - 0.04120000000000 , & - 0.02210000000000 , & - 0.01080000000000 , & - 0.00490000000000 , & - 0.00210000000000 , & - 0.00080000000000 , & - 0.24080000000000 , & - 1.09850000000000 , & - -0.01290000000000 , & - 0.09980000000000 , & - 0.07360000000000 , & - 0.04650000000000 , & - 0.02620000000000 , & - 0.01350000000000 , & - 0.00650000000000 , & - 0.00290000000000 , & - 0.00120000000000 , & - 0.23740000000000 , & - 1.11430000000000 , & - -0.01520000000000 , & - 0.10380000000000 , & - 0.07870000000000 , & - 0.05160000000000 , & - 0.03030000000000 , & - 0.01640000000000 , & - 0.00830000000000 , & - 0.00390000000000 , & - 0.00180000000000 , & - 0.23390000000000 , & - 1.13130000000000 , & - -0.01770000000000 , & - 0.10690000000000 , & - 0.08300000000000 , & - 0.05630000000000 , & - 0.03440000000000 , & - 0.01940000000000 , & - 0.01030000000000 , & - 0.00510000000000 , & - 0.00240000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.10690000000000 , & - 0.08300000000000 , & - 0.05630000000000 , & - 0.03440000000000 , & - 0.01940000000000 , & - 0.01030000000000 , & - 0.00510000000000 , & - 0.00240000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.10690000000000 , & - 0.08300000000000 , & - 0.05630000000000 , & - 0.03440000000000 , & - 0.01940000000000 , & - 0.01030000000000 , & - 0.00510000000000 , & - 0.00240000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.10690000000000 , & - 0.08300000000000 , & - 0.05630000000000 , & - 0.03440000000000 , & - 0.01940000000000 , & - 0.01030000000000 , & - 0.00510000000000 , & - 0.00240000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.10690000000000 , & - 0.08300000000000 , & - 0.05630000000000 , & - 0.03440000000000 , & - 0.01940000000000 , & - 0.01030000000000 , & - 0.00510000000000 , & - 0.00240000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.10690000000000 , & - 0.08300000000000 , & - 0.05630000000000 , & - 0.03440000000000 , & - 0.01940000000000 , & - 0.01030000000000 , & - 0.00510000000000 , & - 0.00240000000000 , & - 0.25350000000000 , & - 0.99130000000000 , & - -0.00010000000000 , & - 0.01440000000000 , & - 0.00240000000000 , & - 0.00030000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.25220000000000 , & - 0.99640000000000 , & - -0.00050000000000 , & - 0.02770000000000 , & - 0.00840000000000 , & - 0.00190000000000 , & - 0.00040000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.25030000000000 , & - 1.00400000000000 , & - -0.00100000000000 , & - 0.03940000000000 , & - 0.01630000000000 , & - 0.00510000000000 , & - 0.00140000000000 , & - 0.00030000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.24800000000000 , & - 1.01320000000000 , & - -0.00180000000000 , & - 0.04980000000000 , & - 0.02470000000000 , & - 0.00960000000000 , & - 0.00320000000000 , & - 0.00100000000000 , & - 0.00030000000000 , & - 0.00010000000000 , & - 0.00000000000000 , & - 0.24550000000000 , & - 1.02390000000000 , & - -0.00280000000000 , & - 0.05890000000000 , & - 0.03310000000000 , & - 0.01480000000000 , & - 0.00580000000000 , & - 0.00200000000000 , & - 0.00070000000000 , & - 0.00020000000000 , & - 0.00010000000000 , & - 0.24270000000000 , & - 1.03560000000000 , & - -0.00400000000000 , & - 0.06710000000000 , & - 0.04110000000000 , & - 0.02050000000000 , & - 0.00890000000000 , & - 0.00350000000000 , & - 0.00130000000000 , & - 0.00040000000000 , & - 0.00010000000000 , & - 0.23980000000000 , & - 1.04810000000000 , & - -0.00540000000000 , & - 0.07450000000000 , & - 0.04870000000000 , & - 0.02630000000000 , & - 0.01250000000000 , & - 0.00540000000000 , & - 0.00220000000000 , & - 0.00080000000000 , & - 0.00030000000000 , & - 0.23680000000000 , & - 1.06150000000000 , & - -0.00700000000000 , & - 0.08110000000000 , & - 0.05580000000000 , & - 0.03220000000000 , & - 0.01640000000000 , & - 0.00760000000000 , & - 0.00330000000000 , & - 0.00130000000000 , & - 0.00050000000000 , & - 0.23360000000000 , & - 1.07570000000000 , & - -0.00880000000000 , & - 0.08690000000000 , & - 0.06230000000000 , & - 0.03790000000000 , & - 0.02050000000000 , & - 0.01010000000000 , & - 0.00470000000000 , & - 0.00200000000000 , & - 0.00080000000000 , & - 0.23050000000000 , & - 1.09060000000000 , & - -0.01070000000000 , & - 0.09210000000000 , & - 0.06830000000000 , & - 0.04350000000000 , & - 0.02470000000000 , & - 0.01290000000000 , & - 0.00630000000000 , & - 0.00290000000000 , & - 0.00120000000000 , & - 0.22720000000000 , & - 1.10630000000000 , & - -0.01290000000000 , & - 0.09660000000000 , & - 0.07360000000000 , & - 0.04870000000000 , & - 0.02900000000000 , & - 0.01590000000000 , & - 0.00810000000000 , & - 0.00390000000000 , & - 0.00180000000000 , & - 0.22380000000000 , & - 1.12290000000000 , & - -0.01520000000000 , & - 0.10020000000000 , & - 0.07830000000000 , & - 0.05370000000000 , & - 0.03320000000000 , & - 0.01900000000000 , & - 0.01020000000000 , & - 0.00520000000000 , & - 0.00250000000000 , & - 0.22030000000000 , & - 1.14060000000000 , & - -0.01760000000000 , & - 0.10290000000000 , & - 0.08220000000000 , & - 0.05810000000000 , & - 0.03730000000000 , & - 0.02220000000000 , & - 0.01250000000000 , & - 0.00660000000000 , & - 0.00340000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.10290000000000 , & - 0.08220000000000 , & - 0.05810000000000 , & - 0.03730000000000 , & - 0.02220000000000 , & - 0.01250000000000 , & - 0.00660000000000 , & - 0.00340000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.10290000000000 , & - 0.08220000000000 , & - 0.05810000000000 , & - 0.03730000000000 , & - 0.02220000000000 , & - 0.01250000000000 , & - 0.00660000000000 , & - 0.00340000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.10290000000000 , & - 0.08220000000000 , & - 0.05810000000000 , & - 0.03730000000000 , & - 0.02220000000000 , & - 0.01250000000000 , & - 0.00660000000000 , & - 0.00340000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.10290000000000 , & - 0.08220000000000 , & - 0.05810000000000 , & - 0.03730000000000 , & - 0.02220000000000 , & - 0.01250000000000 , & - 0.00660000000000 , & - 0.00340000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.00000000000000 , & - 0.10290000000000 , & - 0.08220000000000 , & - 0.05810000000000 , & - 0.03730000000000 , & - 0.02220000000000 , & - 0.01250000000000 , & - 0.00660000000000 , & - 0.00340000000000 & - /) - ! - RFveg = reshape(RFvegtmp ,(/11,18,20/)) - ! - !write(*,*)'RFveg= ',RFveg - ! - end subroutine load_RFtable - -end module snapwave_RFtable - \ No newline at end of file From c8a4477eed7c2807e3894da6eaefd197c3f9a224 Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 10 Apr 2026 16:35:14 +0200 Subject: [PATCH 093/118] - Add back changes in momentum & data - Fix changed naming - Add back precalculation of cd*b*B - Check that vegetation_vertical_segments is not 0 in initialize already --- source/src/sfincs_data.f90 | 3 ++ source/src/sfincs_momentum.f90 | 72 ++++++++++++++++++++++++++++++++ source/src/sfincs_vegetation.f90 | 36 ++++++++++++++-- 3 files changed, 107 insertions(+), 4 deletions(-) diff --git a/source/src/sfincs_data.f90 b/source/src/sfincs_data.f90 index e2fcd505d..682c89d32 100644 --- a/source/src/sfincs_data.f90 +++ b/source/src/sfincs_data.f90 @@ -430,6 +430,9 @@ module sfincs_data real*4, dimension(:,:), allocatable :: vegetation_stems_height real*4, dimension(:,:), allocatable :: vegetation_stems_width real*4, dimension(:,:), allocatable :: vegetation_stems_density + real*4, dimension(:,:), allocatable :: vegetation_stems_cd_width_density + real*4, dimension(:,:), allocatable :: vegetation_fvm + real*4 :: fvm ! !!! Wave makers ! diff --git a/source/src/sfincs_momentum.f90 b/source/src/sfincs_momentum.f90 index 645fa4f68..b9157c63a 100644 --- a/source/src/sfincs_momentum.f90 +++ b/source/src/sfincs_momentum.f90 @@ -21,6 +21,7 @@ subroutine compute_fluxes(dt, tloop) integer :: ip integer :: nm integer :: nmu + integer :: iveg integer :: n integer :: m ! @@ -137,6 +138,49 @@ subroutine compute_fluxes(dt, tloop) !$omp end do !$omp end parallel ! + !Precalculate veggie terms: + ! + if (vegetation) then + ! New : vegetation drag due to mean flow + ! + ! only in case vegetation is present > already checked in initialize_vegetation + ! + !$omp parallel & + !$omp private ( ip, nm, iveg ) + !$omp do + !$acc loop independent, gang, vector + ! + do ip = 1, npuv + ! + !if (kcuv(ip)==1) then + ! + ! Regular UV point + ! + ! Indices of surrounding water level points + ! + nm = uv_index_z_nm(ip) + nmu = uv_index_z_nmu(ip) + ! + veg_CdBNstems = 0.5 * (vegetation_stems_cd_width_density(nm,iveg) + vegetation_stems_cd_width_density(nmu,iveg)) + ! + !do iveg=1,quadtree_no_secveg ! for each vertical vegetation section + ! + iveg = 1 + ! + !vegetation_fvm(nm, iveg) = 0.5 * veg_CdBNstems(nm, iveg) * uv0(ip) * abs(uv0(ip)) / rhow + vegetation_fvm(ip, iveg) = 0.5 * veg_CdBNstems * uv0(ip) * abs(uv0(ip)) / rhow + ! in flux loop only still needs to be multiplied with 'hvegeff', which can still change + ! + ! NOTE: veg_CdBNstems = quadtree_snapwave_veg_Cd(nm, iveg) * quadtree_snapwave_veg_bstems(nm, iveg) * quadtree_snapwave_veg_Nstems(nm, iveg) + ! + !endif + enddo + !$omp end do + !$omp end parallel + !$acc end parallel + ! + endif + ! ! Copy flux and velocity from previous time step ! !$acc parallel, present( kcuv, kfuv, zs, q, q0, uv, uv0, zsderv, & @@ -603,6 +647,34 @@ subroutine compute_fluxes(dt, tloop) ! endif ! + if (vegetation) then + ! New : vegetation drag due to mean flow + ! + !fvm = 0.0 + ! + !do iveg=1,quadtree_no_secveg ! for each vertical vegetation section + ! fvm = fvm + veg_fvm(nm,iveg) * min(quadtree_snapwave_veg_ah(ip,iveg), hu) + !enddo + ! + ! With all pre-calculateable terms already pre-determined for Fvm, beside effective depth: + iveg=1 !for testing keep at 1 + ! + nm = uv_index_z_nm(ip) + nmu = uv_index_z_nmu(ip) + ! + veg_ah = 0.5*(vegetation_stems_height(nm,iveg)+vegetation_stems_height(nmu,iveg)) ! FIXME - also pre-calculate + ! + fvm = vegetation_fvm(ip,iveg) * min(veg_ah, hu) + ! + ! + !fvm = veg_fvm(nm,iveg) * min(quadtree_snapwave_veg_ah(ip,iveg), hu) + ! FIXME Question TL: water depth per layer, or always compared to lower bed level, or? + ! + frc = frc - fvm ! FIXME - minus OR plus? + !frc = frc + fvm ! FIXME - minus OR plus? + ! + endif + ! ! Compute flux qfr used for friction term ! if (kfuv(ip) == 0) then diff --git a/source/src/sfincs_vegetation.f90 b/source/src/sfincs_vegetation.f90 index bdc8e4c52..a35cafb24 100644 --- a/source/src/sfincs_vegetation.f90 +++ b/source/src/sfincs_vegetation.f90 @@ -12,7 +12,7 @@ subroutine initialize_vegetation() ! implicit none ! - integer :: nm + integer :: nm, iveg ! logical :: ok ! @@ -35,12 +35,15 @@ subroutine initialize_vegetation() ! ! Call the generic quadtree nc file reader function varname = 'nsec' - !varname = 'vegetation_vertical_segments' ! TODO: change input into this + !varname = 'vegetation_vertical_segments' ! TODO: change naming netcdf file into this call read_netcdf_quadtree_get_dimension(veggiefile, varname, vegetation_vertical_segments) !ncfile, varname, varout) ! if (vegetation_vertical_segments > 4) then ! - call stop_sfincs('Error ! Maximum allowed vertical sections for vegetation specified in vegetationfile is 4 !', 1) + call stop_sfincs('Error ! Maximum allowed vertical sections in vegetationfile is 4 !', 1) + elseif(vegetation_vertical_segments == 0) then + ! + call stop_sfincs('Error ! Prescribed vertical sections in vegetationfile is 0 !', 1) ! endif ! @@ -74,9 +77,34 @@ subroutine initialize_vegetation() varname = 'snapwave_veg_Nstems' !varname = 'vegetation_stems_density' ! TODO: change naming netcdf file into this call read_netcdf_quadtree_to_sfincs(veggiefile, varname, vegetation_stems_density) !ncfile, varname, varout) - + ! endif ! + ! For SFINCS precalculate cd * bstems * Nstems for each vertical section - FIXME, already convert from np to uv? + ! + if (vegetation) then + ! + allocate(vegetation_stems_cd_width_density(np, vegetation_vertical_segments)) + ! + !allocate(vegetation_fvm(np, vegetation_vertical_segments)) + allocate(vegetation_fvm(npuv, vegetation_vertical_segments)) + ! + vegetation_stems_cd_width_density = 0.0 + vegetation_fvm = 0.0 + fvm = 0.0 + ! + do nm = 1, np + ! + do iveg = 1, vegetation_vertical_segments + ! + vegetation_stems_cd_width_density(nm,iveg) = vegetation_cd(nm,iveg) * vegetation_stems_width(nm,iveg) * vegetation_stems_density(nm,iveg) + ! + enddo + ! + enddo + ! + endif + ! end subroutine end module \ No newline at end of file From 8916cc786482b61ad5e61c6cb99b88bd92ff87a6 Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 10 Apr 2026 17:08:43 +0200 Subject: [PATCH 094/118] - Pre-calculate vegetation_stems_height already on uv points (only done once) - Pre-calculate cd*width*density already on uv points (only done once), and even already multiply with 0.5 and divide by rhow --- source/src/sfincs_data.f90 | 5 +-- source/src/sfincs_momentum.f90 | 62 ++++++++++++-------------------- source/src/sfincs_vegetation.f90 | 28 ++++++++++----- 3 files changed, 44 insertions(+), 51 deletions(-) diff --git a/source/src/sfincs_data.f90 b/source/src/sfincs_data.f90 index 682c89d32..ac8b3836d 100644 --- a/source/src/sfincs_data.f90 +++ b/source/src/sfincs_data.f90 @@ -428,10 +428,11 @@ module sfincs_data integer :: vegetation_vertical_segments ! nr of vegetation sections in vertical real*4, dimension(:,:), allocatable :: vegetation_cd real*4, dimension(:,:), allocatable :: vegetation_stems_height + real*4, dimension(:,:), allocatable :: vegetation_stems_height_uv real*4, dimension(:,:), allocatable :: vegetation_stems_width real*4, dimension(:,:), allocatable :: vegetation_stems_density - real*4, dimension(:,:), allocatable :: vegetation_stems_cd_width_density - real*4, dimension(:,:), allocatable :: vegetation_fvm + real*4, dimension(:,:), allocatable :: vegetation_stems_cd_width_density_uv + real*4, dimension(:,:), allocatable :: vegetation_fvm_except_height real*4 :: fvm ! !!! Wave makers diff --git a/source/src/sfincs_momentum.f90 b/source/src/sfincs_momentum.f90 index b9157c63a..8ba437e10 100644 --- a/source/src/sfincs_momentum.f90 +++ b/source/src/sfincs_momentum.f90 @@ -138,42 +138,33 @@ subroutine compute_fluxes(dt, tloop) !$omp end do !$omp end parallel ! - !Precalculate veggie terms: - ! if (vegetation) then - ! New : vegetation drag due to mean flow ! - ! only in case vegetation is present > already checked in initialize_vegetation + ! Vegetation drag due to mean flow + ! + ! Pre-determine all that is possible for calculating Fvm ! !$omp parallel & - !$omp private ( ip, nm, iveg ) + !$omp private ( ip, iveg ) !$omp do - !$acc loop independent, gang, vector + !$acc parallel, present( vegetation_fvm_except_height, vegetation_stems_cd_width_density, uv0 ) ! - do ip = 1, npuv + do ip = 1, npuv ! FIXME - does parallelization with openmp/acc work well with loop in loop? ! - !if (kcuv(ip)==1) then + !if (kcuv(ip)==1) then ! FIXME - discuss for what type of points we want to do this ! ! Regular UV point ! - ! Indices of surrounding water level points - ! - nm = uv_index_z_nm(ip) - nmu = uv_index_z_nmu(ip) - ! - veg_CdBNstems = 0.5 * (vegetation_stems_cd_width_density(nm,iveg) + vegetation_stems_cd_width_density(nmu,iveg)) - ! - !do iveg=1,quadtree_no_secveg ! for each vertical vegetation section - ! - iveg = 1 - ! - !vegetation_fvm(nm, iveg) = 0.5 * veg_CdBNstems(nm, iveg) * uv0(ip) * abs(uv0(ip)) / rhow - vegetation_fvm(ip, iveg) = 0.5 * veg_CdBNstems * uv0(ip) * abs(uv0(ip)) / rhow - ! in flux loop only still needs to be multiplied with 'hvegeff', which can still change - ! - ! NOTE: veg_CdBNstems = quadtree_snapwave_veg_Cd(nm, iveg) * quadtree_snapwave_veg_bstems(nm, iveg) * quadtree_snapwave_veg_Nstems(nm, iveg) + do iveg=1,vegetation_vertical_segments ! for each vertical vegetation section + ! + vegetation_fvm_except_height(ip, iveg) = vegetation_stems_cd_width_density_uv(ip,iveg) * uv0(ip) * abs(uv0(ip)) + ! + ! in flux loop only still needs to be multiplied with effective water depth, which can still change below + ! + ! NOTE: vegetation_stems_cd_width_density = 0.5 * vegetation_cd * vegetation_stems_width * vegetation_stems_density / rhow + ! + enddo ! - !endif enddo !$omp end do !$omp end parallel @@ -648,30 +639,21 @@ subroutine compute_fluxes(dt, tloop) endif ! if (vegetation) then - ! New : vegetation drag due to mean flow - ! - !fvm = 0.0 ! - !do iveg=1,quadtree_no_secveg ! for each vertical vegetation section + ! Vegetation drag due to mean flow + ! + !do iveg=1,quadtree_no_secveg ! for each vertical vegetation section ! fvm = fvm + veg_fvm(nm,iveg) * min(quadtree_snapwave_veg_ah(ip,iveg), hu) !enddo ! ! With all pre-calculateable terms already pre-determined for Fvm, beside effective depth: iveg=1 !for testing keep at 1 - ! - nm = uv_index_z_nm(ip) - nmu = uv_index_z_nmu(ip) ! - veg_ah = 0.5*(vegetation_stems_height(nm,iveg)+vegetation_stems_height(nmu,iveg)) ! FIXME - also pre-calculate - ! - fvm = vegetation_fvm(ip,iveg) * min(veg_ah, hu) + fvm = vegetation_fvm_except_height(ip,iveg) * min(vegetation_stems_height_uv(ip,iveg), hu) ! - ! - !fvm = veg_fvm(nm,iveg) * min(quadtree_snapwave_veg_ah(ip,iveg), hu) - ! FIXME Question TL: water depth per layer, or always compared to lower bed level, or? + ! FIXME - water depth per layer, or always compared to lower bed level, or? ! - frc = frc - fvm ! FIXME - minus OR plus? - !frc = frc + fvm ! FIXME - minus OR plus? + frc = frc - fvm ! endif ! diff --git a/source/src/sfincs_vegetation.f90 b/source/src/sfincs_vegetation.f90 index a35cafb24..56062ff2e 100644 --- a/source/src/sfincs_vegetation.f90 +++ b/source/src/sfincs_vegetation.f90 @@ -12,7 +12,7 @@ subroutine initialize_vegetation() ! implicit none ! - integer :: nm, iveg + integer :: nm, nmu, ip, iveg ! logical :: ok ! @@ -80,24 +80,34 @@ subroutine initialize_vegetation() ! endif ! - ! For SFINCS precalculate cd * bstems * Nstems for each vertical section - FIXME, already convert from np to uv? + ! For SFINCS precalculate cd * bstems * Nstems for each vertical section, as well as the vegetation height on uv points ! if (vegetation) then ! - allocate(vegetation_stems_cd_width_density(np, vegetation_vertical_segments)) + allocate(vegetation_stems_cd_width_density_uv(npuv, vegetation_vertical_segments)) ! product of cd, width and density on uv points ! - !allocate(vegetation_fvm(np, vegetation_vertical_segments)) - allocate(vegetation_fvm(npuv, vegetation_vertical_segments)) + allocate(vegetation_stems_height_uv(npuv, vegetation_vertical_segments)) !=vegetation height on uv points + ! + allocate(vegetation_fvm_except_height(npuv, vegetation_vertical_segments)) + ! + vegetation_stems_cd_width_density_uv = 0.0 + vegetation_stems_height_uv = 0.0 + vegetation_fvm_except_height = 0.0 ! - vegetation_stems_cd_width_density = 0.0 - vegetation_fvm = 0.0 fvm = 0.0 ! - do nm = 1, np + do ip = 1, npuv ! + nm = uv_index_z_nm(ip) + nmu = uv_index_z_nmu(ip) + ! do iveg = 1, vegetation_vertical_segments ! - vegetation_stems_cd_width_density(nm,iveg) = vegetation_cd(nm,iveg) * vegetation_stems_width(nm,iveg) * vegetation_stems_density(nm,iveg) + vegetation_stems_height_uv(ip,iveg) = 0.5*(vegetation_stems_height(nm,iveg)+vegetation_stems_height(nmu,iveg)) + ! + vegetation_stems_cd_width_density_uv(ip,iveg) = 0.5 * (0.5 * (vegetation_cd(nm,iveg) + vegetation_cd(nmu,iveg))) * (0.5 * (vegetation_stems_width(nm,iveg) + vegetation_stems_width(nmu,iveg))) * (0.5 * (vegetation_stems_density(nm,iveg) + vegetation_stems_density(nmu,iveg))) / rhow + ! + ! vegetation_stems_cd_width_density = 0.5 * cd * stems_width * stems_density / rhow, so everything that is precalculatable ! enddo ! From 488ada828a17c0a85ecf57ea0cde45d7212cd592 Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 10 Apr 2026 17:13:00 +0200 Subject: [PATCH 095/118] - In theory could work now for multiple layers in the vertical - Though, having the extra do-loop within the main loop probably not wanted for speed - Also definition of effective depth to check! --- source/src/sfincs_momentum.f90 | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/source/src/sfincs_momentum.f90 b/source/src/sfincs_momentum.f90 index 8ba437e10..f331dc658 100644 --- a/source/src/sfincs_momentum.f90 +++ b/source/src/sfincs_momentum.f90 @@ -155,7 +155,7 @@ subroutine compute_fluxes(dt, tloop) ! ! Regular UV point ! - do iveg=1,vegetation_vertical_segments ! for each vertical vegetation section + do iveg=1, vegetation_vertical_segments ! for each vertical vegetation section ! vegetation_fvm_except_height(ip, iveg) = vegetation_stems_cd_width_density_uv(ip,iveg) * uv0(ip) * abs(uv0(ip)) ! @@ -642,11 +642,16 @@ subroutine compute_fluxes(dt, tloop) ! ! Vegetation drag due to mean flow ! - !do iveg=1,quadtree_no_secveg ! for each vertical vegetation section - ! fvm = fvm + veg_fvm(nm,iveg) * min(quadtree_snapwave_veg_ah(ip,iveg), hu) - !enddo + fvm = 0.0 + ! + ! Everything already pre-determined for Fvm, beside effective depth ! - ! With all pre-calculateable terms already pre-determined for Fvm, beside effective depth: + !do iveg=1, vegetation_vertical_segments ! for each vertical vegetation section + ! ! + ! fvm = fvm + vegetation_fvm_except_height(ip,iveg) * min(vegetation_stems_height_uv(ip,iveg), hu) + ! ! + !enddo + ! iveg=1 !for testing keep at 1 ! fvm = vegetation_fvm_except_height(ip,iveg) * min(vegetation_stems_height_uv(ip,iveg), hu) From e26fff57a398db7f667b7b89f29f8fe0ac1cb918 Mon Sep 17 00:00:00 2001 From: Leynse Date: Fri, 10 Apr 2026 17:22:55 +0200 Subject: [PATCH 096/118] - Last changes --- source/src/sfincs_lib.f90 | 7 ++++++- source/src/sfincs_momentum.f90 | 26 +++++++++++++------------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/source/src/sfincs_lib.f90 b/source/src/sfincs_lib.f90 index 9dbd402fa..77801bc26 100644 --- a/source/src/sfincs_lib.f90 +++ b/source/src/sfincs_lib.f90 @@ -94,7 +94,7 @@ function sfincs_initialize() result(ierr) ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! - build_revision = "$Rev: v2.3.2 mt. Faber+branch:292" + build_revision = "$Rev: v2.3.2 mt. Faber+branch:315" build_date = "$Date: 2026-04-10" ! call write_log('', 1) @@ -255,6 +255,11 @@ function sfincs_initialize() result(ierr) else ! call write_log('Non-hydrostatic : no', 1) endif + if (vegetation) then + call write_log('Vegetation : yes', 1) + else + ! call write_log('Vegetation : no', 1) + endif if (bathtub) then call write_log('Bathtub : yes', 1) else diff --git a/source/src/sfincs_momentum.f90 b/source/src/sfincs_momentum.f90 index f331dc658..c88451011 100644 --- a/source/src/sfincs_momentum.f90 +++ b/source/src/sfincs_momentum.f90 @@ -139,17 +139,17 @@ subroutine compute_fluxes(dt, tloop) !$omp end parallel ! if (vegetation) then - ! - ! Vegetation drag due to mean flow - ! - ! Pre-determine all that is possible for calculating Fvm - ! - !$omp parallel & - !$omp private ( ip, iveg ) - !$omp do - !$acc parallel, present( vegetation_fvm_except_height, vegetation_stems_cd_width_density, uv0 ) - ! - do ip = 1, npuv ! FIXME - does parallelization with openmp/acc work well with loop in loop? + ! + ! Vegetation drag due to mean flow + ! + ! Pre-determine all that is possible for calculating Fvm + ! + !$omp parallel & + !$omp private ( ip, iveg ) + !$omp do + !$acc parallel, present( vegetation_fvm_except_height, vegetation_stems_cd_width_density, uv0 ) + ! + do ip = 1, npuv ! FIXME - does parallelization with openmp/acc work well with loop in loop? ! !if (kcuv(ip)==1) then ! FIXME - discuss for what type of points we want to do this ! @@ -181,11 +181,11 @@ subroutine compute_fluxes(dt, tloop) !$acc uv_index_z_nm, uv_index_z_nmu, uv_index_u_nmd, uv_index_u_nmu, uv_index_u_ndm, uv_index_u_num, & !$acc uv_index_v_ndm, uv_index_v_ndmu, uv_index_v_nm, uv_index_v_nmu, cuv_index_uv, cuv_index_uv1, cuv_index_uv2, & !$acc zb, zbuv, zbuvmx, tauwu, tauwv, patm, fwuv, gn2uv, dxminv, dxrinv, dyrinv, dxm2inv, dxr2inv, dyr2inv, & - !$acc dxrinvc, dyrinvc, fcorio2d, nuvisc, z_volume, gnapp2, x73, timestep_analysis_required_timestep ) num_gangs( 1024 ) vector_length( 128 ) + !$acc dxrinvc, dyrinvc, fcorio2d, nuvisc, z_volume, gnapp2, x73, timestep_analysis_required_timestep, vegetation_fvm_except_height, vegetation_stems_height_uv ) num_gangs( 1024 ) vector_length( 128 ) !$omp parallel & !$omp private ( ip,hu,qfr,qsm,qx_nm,nm,nmu,dzdx,frc,idir,itype,iref,dxuvinv,dxuv2inv,dyuvinv,dyuv2inv, & !$omp qx_nmd,qx_nmu,qy_nm,qy_ndm,qy_nmu,qy_ndmu,uu_nm,uu_nmd,uu_nmu,uu_num,uu_ndm,vu, & - !$omp fcoriouv,gnavg2,iok,zsu,dzuv,iuv,facint,fwmax,zmax,zmin,one_minus_facint,dqxudx,dqyudy,uu,ud,qu,qd,qy,hwet,phi,adv,mdrv,hu73,min_dt_ip ) & + !$omp fcoriouv,gnavg2,iok,zsu,dzuv,iuv,facint,fwmax,zmax,zmin,one_minus_facint,dqxudx,dqyudy,uu,ud,qu,qd,qy,hwet,phi,adv,mdrv,hu73,min_dt_ip,iveg ) & !$omp reduction ( min : min_dt ) !$omp do schedule ( dynamic, 256 ) !$acc loop, reduction( min : min_dt ), gang, vector From baad37ac3e21096e15f6d9da4817e73f5a8ed264 Mon Sep 17 00:00:00 2001 From: Leynse Date: Mon, 13 Apr 2026 09:37:29 +0200 Subject: [PATCH 097/118] - Add input variable 'snapwave_waveforces_ratio' which you can set to 0 to turn off wave forces and thus incident wave setup --- source/src/sfincs_data.f90 | 1 + source/src/sfincs_input.f90 | 3 ++- source/src/sfincs_lib.f90 | 4 ++-- source/src/sfincs_ncoutput.F90 | 1 + source/src/sfincs_snapwave.f90 | 6 +++--- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/source/src/sfincs_data.f90 b/source/src/sfincs_data.f90 index 14066306a..f34dab131 100644 --- a/source/src/sfincs_data.f90 +++ b/source/src/sfincs_data.f90 @@ -106,6 +106,7 @@ module sfincs_data real*4 factor_pres real*4 factor_prcp real*4 factor_spw_size + real*4 waveforces_ratio ! integer mmax integer nmax diff --git a/source/src/sfincs_input.f90 b/source/src/sfincs_input.f90 index 5aab1f182..951c6b154 100644 --- a/source/src/sfincs_input.f90 +++ b/source/src/sfincs_input.f90 @@ -299,7 +299,8 @@ subroutine read_sfincs_input() percdoneval = max(min(percdoneval,100), 0) ! ! Coupled SnapWave solver related - call read_int_input(500,'snapwave_wind',iwind,0) + call read_int_input(500,'snapwave_wind',iwind,0) + call read_real_input(500,'snapwave_waveforces_ratio',waveforces_ratio,1.0) ! ! Wind drag ! diff --git a/source/src/sfincs_lib.f90 b/source/src/sfincs_lib.f90 index 8e3707475..ca3441bf4 100644 --- a/source/src/sfincs_lib.f90 +++ b/source/src/sfincs_lib.f90 @@ -94,8 +94,8 @@ function sfincs_initialize() result(ierr) ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! - build_revision = "$Rev: v2.3.2 mt. Faber+" - build_date = "$Date: 2025-04-10" + build_revision = "$Rev: v2.3.2 mt. Faber+branch:318" + build_date = "$Date: 2025-04-13" ! call write_log('', 1) call write_log('------------ Welcome to SFINCS ------------', 1) diff --git a/source/src/sfincs_ncoutput.F90 b/source/src/sfincs_ncoutput.F90 index 33f0ba8e3..23526aa6f 100644 --- a/source/src/sfincs_ncoutput.F90 +++ b/source/src/sfincs_ncoutput.F90 @@ -4117,6 +4117,7 @@ subroutine ncoutput_add_params(ncid, varid) NF90(nf90_put_att(ncid, varid, 'snapwave_nrsweeps',nr_sweeps)) NF90(nf90_put_att(ncid, varid, 'snapwave_baldock_opt',baldock_opt)) NF90(nf90_put_att(ncid, varid, 'snapwave_baldock_ratio',baldock_ratio)) + NF90(nf90_put_att(ncid, varid, 'snapwave_waveforces_ratio',waveforces_ratio)) ! ! SnapWave IG ! diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index 66825a0f5..3f3767cea 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -498,13 +498,13 @@ subroutine update_wave_field(t, tloop) ! ! U point ! - fwuv(ip) = (0.5*(cosrot*fwx0(nm) + sinrot*fwy0(nm)) + 0.5*( cosrot*fwx0(nmu) + sinrot*fwy0(nmu)))/rhow - ! + fwuv(ip) = waveforces_ratio * (0.5 * (cosrot * fwx0(nm) + sinrot * fwy0(nm)) + 0.5 * ( cosrot * fwx0(nmu) + sinrot * fwy0(nmu))) / rhow + ! waveforces_ratio = 1.0 by default, but can be set to 0 to avoid double counting incident setup if wavemaker_hinc true else ! ! V point ! - fwuv(ip) = (0.5*(-sinrot*fwx0(nm) + cosrot*fwy0(nm)) + 0.5*(-sinrot*fwx0(nmu) + cosrot*fwy0(nmu)))/rhow + fwuv(ip) = waveforces_ratio * (0.5 * (-sinrot * fwx0(nm) + cosrot * fwy0(nm)) + 0.5 * (-sinrot * fwx0(nmu) + cosrot * fwy0(nmu))) / rhow ! endif ! From aad2550c13d10eae71fbb739ca0c35195f6e9814 Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 14 Apr 2026 13:24:07 +0200 Subject: [PATCH 098/118] - Calculate per layer now, commit before refactor --- source/src/sfincs_momentum.f90 | 18 +++++++++--------- source/src/sfincs_vegetation.f90 | 4 +++- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/source/src/sfincs_momentum.f90 b/source/src/sfincs_momentum.f90 index c88451011..764ab23da 100644 --- a/source/src/sfincs_momentum.f90 +++ b/source/src/sfincs_momentum.f90 @@ -645,16 +645,16 @@ subroutine compute_fluxes(dt, tloop) fvm = 0.0 ! ! Everything already pre-determined for Fvm, beside effective depth - ! - !do iveg=1, vegetation_vertical_segments ! for each vertical vegetation section - ! ! - ! fvm = fvm + vegetation_fvm_except_height(ip,iveg) * min(vegetation_stems_height_uv(ip,iveg), hu) - ! ! - !enddo + + do iveg=1, vegetation_vertical_segments ! for each vertical vegetation section + ! + fvm = fvm + vegetation_fvm_except_height(ip,iveg) * min(vegetation_stems_height_uv(ip,iveg), hu) + ! + enddo ! - iveg=1 !for testing keep at 1 - ! - fvm = vegetation_fvm_except_height(ip,iveg) * min(vegetation_stems_height_uv(ip,iveg), hu) + !iveg=1 !for testing keep at 1 + ! ! + ! fvm = vegetation_fvm_except_height(ip,iveg) * min(vegetation_stems_height_uv(ip,iveg), hu) ! ! FIXME - water depth per layer, or always compared to lower bed level, or? ! diff --git a/source/src/sfincs_vegetation.f90 b/source/src/sfincs_vegetation.f90 index 56062ff2e..fe0e56cf7 100644 --- a/source/src/sfincs_vegetation.f90 +++ b/source/src/sfincs_vegetation.f90 @@ -82,6 +82,8 @@ subroutine initialize_vegetation() ! ! For SFINCS precalculate cd * bstems * Nstems for each vertical section, as well as the vegetation height on uv points ! + ! TODO - do this now as pre-processing table + ! if (vegetation) then ! allocate(vegetation_stems_cd_width_density_uv(npuv, vegetation_vertical_segments)) ! product of cd, width and density on uv points @@ -113,7 +115,7 @@ subroutine initialize_vegetation() ! enddo ! - endif + endif ! end subroutine From 02f34806ed880b80808d9523ca45312e49fb6338 Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 14 Apr 2026 14:08:48 +0200 Subject: [PATCH 099/118] - Start pre-calculating vegetation effects on streamflow in pre-computed table --- source/src/sfincs_data.f90 | 11 ++-- source/src/sfincs_input.f90 | 3 +- source/src/sfincs_momentum.f90 | 69 +++++-------------------- source/src/sfincs_openacc.f90 | 6 ++- source/src/sfincs_vegetation.f90 | 88 ++++++++++++++++++++++++++------ 5 files changed, 99 insertions(+), 78 deletions(-) diff --git a/source/src/sfincs_data.f90 b/source/src/sfincs_data.f90 index ac8b3836d..b440754fc 100644 --- a/source/src/sfincs_data.f90 +++ b/source/src/sfincs_data.f90 @@ -428,12 +428,17 @@ module sfincs_data integer :: vegetation_vertical_segments ! nr of vegetation sections in vertical real*4, dimension(:,:), allocatable :: vegetation_cd real*4, dimension(:,:), allocatable :: vegetation_stems_height - real*4, dimension(:,:), allocatable :: vegetation_stems_height_uv + real*4, dimension(:,:), allocatable :: vegetation_stems_height_uv real*4, dimension(:,:), allocatable :: vegetation_stems_width real*4, dimension(:,:), allocatable :: vegetation_stems_density real*4, dimension(:,:), allocatable :: vegetation_stems_cd_width_density_uv - real*4, dimension(:,:), allocatable :: vegetation_fvm_except_height - real*4 :: fvm + ! Lookup table arrays (pre-computed in initialize_vegetation, used in compute_fluxes without inner loop) + integer :: vegetation_nlookup ! number of equidistant vertical sections in lookup table (default 20, set via sfincs.inp) + real*4, dimension(:), allocatable :: vegetation_lookup_hmin_uv ! minimum vegetation height on uv points + real*4, dimension(:), allocatable :: vegetation_lookup_hmax_uv ! maximum vegetation height on uv points + real*4, dimension(:), allocatable :: vegetation_lookup_dh_uv ! bin width of lookup table: hmax / vegetation_nlookup, per uv point + real*4, dimension(:,:), allocatable :: vegetation_cd_sum_table ! cumulative sum of cd*width*density at vegetation_nlookup equidistant depth levels, (npuv, 0:vegetation_nlookup) + real*4, dimension(:,:), allocatable :: vegetation_cd_slope_table ! slope between consecutive table entries: table(k+1)-table(k), (npuv, 0:vegetation_nlookup-1) ! !!! Wave makers ! diff --git a/source/src/sfincs_input.f90 b/source/src/sfincs_input.f90 index f9f43b5c9..b0bc8741e 100644 --- a/source/src/sfincs_input.f90 +++ b/source/src/sfincs_input.f90 @@ -221,7 +221,8 @@ subroutine read_sfincs_input() call read_char_input(500,'manningfile',manningfile,'none') call read_char_input(500,'drnfile',drnfile,'none') call read_char_input(500,'volfile',volfile,'none') - call read_char_input(500,'vegetationfile',veggiefile,'none') + call read_char_input(500,'vegetationfile',veggiefile,'none') + call read_int_input(500,'vegetation_nlookup',vegetation_nlookup,20) ! ! Forcing ! diff --git a/source/src/sfincs_momentum.f90 b/source/src/sfincs_momentum.f90 index 764ab23da..a5555e981 100644 --- a/source/src/sfincs_momentum.f90 +++ b/source/src/sfincs_momentum.f90 @@ -21,7 +21,7 @@ subroutine compute_fluxes(dt, tloop) integer :: ip integer :: nm integer :: nmu - integer :: iveg + integer :: ik_veg integer :: n integer :: m ! @@ -90,6 +90,8 @@ subroutine compute_fluxes(dt, tloop) ! real*4 :: min_dt_ip ! + real*4 :: frac_veg + ! real*4, parameter :: expo = 1.0 / 3.0 !integer, parameter :: expo = 1 ! @@ -138,40 +140,7 @@ subroutine compute_fluxes(dt, tloop) !$omp end do !$omp end parallel ! - if (vegetation) then - ! - ! Vegetation drag due to mean flow - ! - ! Pre-determine all that is possible for calculating Fvm - ! - !$omp parallel & - !$omp private ( ip, iveg ) - !$omp do - !$acc parallel, present( vegetation_fvm_except_height, vegetation_stems_cd_width_density, uv0 ) - ! - do ip = 1, npuv ! FIXME - does parallelization with openmp/acc work well with loop in loop? - ! - !if (kcuv(ip)==1) then ! FIXME - discuss for what type of points we want to do this - ! - ! Regular UV point - ! - do iveg=1, vegetation_vertical_segments ! for each vertical vegetation section - ! - vegetation_fvm_except_height(ip, iveg) = vegetation_stems_cd_width_density_uv(ip,iveg) * uv0(ip) * abs(uv0(ip)) - ! - ! in flux loop only still needs to be multiplied with effective water depth, which can still change below - ! - ! NOTE: vegetation_stems_cd_width_density = 0.5 * vegetation_cd * vegetation_stems_width * vegetation_stems_density / rhow - ! - enddo - ! - enddo - !$omp end do - !$omp end parallel - !$acc end parallel - ! - endif - ! + ! ! Copy flux and velocity from previous time step ! !$acc parallel, present( kcuv, kfuv, zs, q, q0, uv, uv0, zsderv, & @@ -181,11 +150,11 @@ subroutine compute_fluxes(dt, tloop) !$acc uv_index_z_nm, uv_index_z_nmu, uv_index_u_nmd, uv_index_u_nmu, uv_index_u_ndm, uv_index_u_num, & !$acc uv_index_v_ndm, uv_index_v_ndmu, uv_index_v_nm, uv_index_v_nmu, cuv_index_uv, cuv_index_uv1, cuv_index_uv2, & !$acc zb, zbuv, zbuvmx, tauwu, tauwv, patm, fwuv, gn2uv, dxminv, dxrinv, dyrinv, dxm2inv, dxr2inv, dyr2inv, & - !$acc dxrinvc, dyrinvc, fcorio2d, nuvisc, z_volume, gnapp2, x73, timestep_analysis_required_timestep, vegetation_fvm_except_height, vegetation_stems_height_uv ) num_gangs( 1024 ) vector_length( 128 ) + !$acc dxrinvc, dyrinvc, fcorio2d, nuvisc, z_volume, gnapp2, x73, timestep_analysis_required_timestep, vegetation_cd_sum_table, vegetation_cd_slope_table, vegetation_lookup_hmax_uv, vegetation_lookup_dh_uv ) num_gangs( 1024 ) vector_length( 128 ) !$omp parallel & !$omp private ( ip,hu,qfr,qsm,qx_nm,nm,nmu,dzdx,frc,idir,itype,iref,dxuvinv,dxuv2inv,dyuvinv,dyuv2inv, & !$omp qx_nmd,qx_nmu,qy_nm,qy_ndm,qy_nmu,qy_ndmu,uu_nm,uu_nmd,uu_nmu,uu_num,uu_ndm,vu, & - !$omp fcoriouv,gnavg2,iok,zsu,dzuv,iuv,facint,fwmax,zmax,zmin,one_minus_facint,dqxudx,dqyudy,uu,ud,qu,qd,qy,hwet,phi,adv,mdrv,hu73,min_dt_ip,iveg ) & + !$omp fcoriouv,gnavg2,iok,zsu,dzuv,iuv,facint,fwmax,zmax,zmin,one_minus_facint,dqxudx,dqyudy,uu,ud,qu,qd,qy,hwet,phi,adv,mdrv,hu73,min_dt_ip,ik_veg,frac_veg ) & !$omp reduction ( min : min_dt ) !$omp do schedule ( dynamic, 256 ) !$acc loop, reduction( min : min_dt ), gang, vector @@ -641,26 +610,16 @@ subroutine compute_fluxes(dt, tloop) if (vegetation) then ! ! Vegetation drag due to mean flow - ! - fvm = 0.0 + ! Direct lookup in pre-computed table - no inner loop over vegetation layers ! - ! Everything already pre-determined for Fvm, beside effective depth - - do iveg=1, vegetation_vertical_segments ! for each vertical vegetation section - ! - fvm = fvm + vegetation_fvm_except_height(ip,iveg) * min(vegetation_stems_height_uv(ip,iveg), hu) - ! - enddo - ! - !iveg=1 !for testing keep at 1 - ! ! - ! fvm = vegetation_fvm_except_height(ip,iveg) * min(vegetation_stems_height_uv(ip,iveg), hu) - ! - ! FIXME - water depth per layer, or always compared to lower bed level, or? - ! - frc = frc - fvm + if (vegetation_lookup_hmax_uv(ip) > 0.0 .and. hu > 0.0) then ! hwet ipv hu, and multiply frc addition with phi * + frac_veg = min(hu, vegetation_lookup_hmax_uv(ip)) / vegetation_lookup_dh_uv(ip) + ik_veg = min(int(frac_veg), vegetation_nlookup - 1) + frac_veg = frac_veg - real(ik_veg) + frc = frc - (vegetation_cd_sum_table(ip, ik_veg) + frac_veg * vegetation_cd_slope_table(ip, ik_veg)) * uv0(ip) * abs(uv0(ip)) + endif ! - endif + endif ! ! Compute flux qfr used for friction term ! diff --git a/source/src/sfincs_openacc.f90 b/source/src/sfincs_openacc.f90 index 857260203..fbd3e3875 100644 --- a/source/src/sfincs_openacc.f90 +++ b/source/src/sfincs_openacc.f90 @@ -36,7 +36,8 @@ subroutine initialize_openacc() !$acc gnapp2, & !$acc timestep_analysis_required_timestep, timestep_analysis_average_required_timestep, timestep_analysis_times_wet, timestep_analysis_times_limiting, & !$acc qinffield, qinfmap, cuminf, scs_rain, scs_Se, scs_P1, scs_F1, scs_S1, rain_T1, & - !$acc ksfield, GA_head, GA_sigma, GA_sigma_max, GA_F, GA_Lu, inf_kr, horton_kd, horton_fc, horton_f0 ) + !$acc ksfield, GA_head, GA_sigma, GA_sigma_max, GA_F, GA_Lu, inf_kr, horton_kd, horton_fc, horton_f0, & + !$acc vegetation_cd_sum_table, vegetation_cd_slope_table, vegetation_lookup_hmin_uv, vegetation_lookup_hmax_uv, vegetation_lookup_dh_uv ) ! end subroutine ! @@ -66,7 +67,8 @@ subroutine finalize_openacc() !$acc gnapp2, & !$acc timestep_analysis_required_timestep, timestep_analysis_average_required_timestep, timestep_analysis_times_wet, timestep_analysis_times_limiting, & !$acc qinffield, qinfmap, cuminf, scs_rain, scs_Se, scs_P1, scs_F1, scs_S1, rain_T1, & - !$acc ksfield, GA_head, GA_sigma, GA_sigma_max, GA_F, GA_Lu, inf_kr, horton_kd, horton_fc, horton_f0 ) + !$acc ksfield, GA_head, GA_sigma, GA_sigma_max, GA_F, GA_Lu, inf_kr, horton_kd, horton_fc, horton_f0, & + !$acc vegetation_cd_sum_table, vegetation_cd_slope_table, vegetation_lookup_hmin_uv, vegetation_lookup_hmax_uv, vegetation_lookup_dh_uv ) ! end subroutine finalize_openacc ! diff --git a/source/src/sfincs_vegetation.f90 b/source/src/sfincs_vegetation.f90 index fe0e56cf7..59696858c 100644 --- a/source/src/sfincs_vegetation.f90 +++ b/source/src/sfincs_vegetation.f90 @@ -12,7 +12,8 @@ subroutine initialize_vegetation() ! implicit none ! - integer :: nm, nmu, ip, iveg + integer :: nm, nmu, ip, iveg, k + real*4 :: dh_veg, h_k, section_bottom, section_top ! logical :: ok ! @@ -88,34 +89,87 @@ subroutine initialize_vegetation() ! allocate(vegetation_stems_cd_width_density_uv(npuv, vegetation_vertical_segments)) ! product of cd, width and density on uv points ! - allocate(vegetation_stems_height_uv(npuv, vegetation_vertical_segments)) !=vegetation height on uv points - ! - allocate(vegetation_fvm_except_height(npuv, vegetation_vertical_segments)) + allocate(vegetation_stems_height_uv(npuv, vegetation_vertical_segments)) ! vegetation height on uv points ! vegetation_stems_cd_width_density_uv = 0.0 - vegetation_stems_height_uv = 0.0 - vegetation_fvm_except_height = 0.0 + vegetation_stems_height_uv = 0.0 ! - fvm = 0.0 + ! Interpolate vegetation properties from z-points to uv-points ! do ip = 1, npuv ! - nm = uv_index_z_nm(ip) - nmu = uv_index_z_nmu(ip) - ! + nm = uv_index_z_nm(ip) + nmu = uv_index_z_nmu(ip) + ! do iveg = 1, vegetation_vertical_segments ! - vegetation_stems_height_uv(ip,iveg) = 0.5*(vegetation_stems_height(nm,iveg)+vegetation_stems_height(nmu,iveg)) - ! + vegetation_stems_height_uv(ip,iveg) = 0.5*(vegetation_stems_height(nm,iveg)+vegetation_stems_height(nmu,iveg)) + ! vegetation_stems_cd_width_density_uv(ip,iveg) = 0.5 * (0.5 * (vegetation_cd(nm,iveg) + vegetation_cd(nmu,iveg))) * (0.5 * (vegetation_stems_width(nm,iveg) + vegetation_stems_width(nmu,iveg))) * (0.5 * (vegetation_stems_density(nm,iveg) + vegetation_stems_density(nmu,iveg))) / rhow ! ! vegetation_stems_cd_width_density = 0.5 * cd * stems_width * stems_density / rhow, so everything that is precalculatable ! - enddo - ! - enddo - ! - endif + enddo + ! + enddo + ! + ! Pre-compute lookup table: cumulative sum of cd*width*density at vegetation_nlookup equidistant depth levels + ! Sections are stacked from the bed (consistent with swvegatt in snapwave_solver.f90): + ! vegetation_cd_sum_table(ip, k) = sum_iveg( cd_wd(ip,iveg) * max(0, min(section_top_iveg, h_k) - section_bottom_iveg) ) + ! In compute_fluxes: fvm = table_lookup(ip, hu) * uv0 * |uv0| (no inner do-loop needed) + ! + allocate(vegetation_lookup_hmin_uv(npuv)) + allocate(vegetation_lookup_hmax_uv(npuv)) + allocate(vegetation_lookup_dh_uv(npuv)) + allocate(vegetation_cd_sum_table(npuv, 0:vegetation_nlookup)) + allocate(vegetation_cd_slope_table(npuv, 0:vegetation_nlookup-1)) + ! + vegetation_lookup_hmin_uv = 0.0 + vegetation_lookup_hmax_uv = 0.0 + vegetation_lookup_dh_uv = 0.0 + vegetation_cd_sum_table = 0.0 + vegetation_cd_slope_table = 0.0 + ! + !$omp parallel do private( ip, k, iveg, dh_veg, h_k, section_bottom, section_top ) schedule( static ) + do ip = 1, npuv + ! + ! Sections are stacked from the bed upward (consistent with swvegatt in snapwave_solver): + ! section_bottom(iveg) = sum of all previous section heights + ! section_top(iveg) = section_bottom + vegetation_stems_height_uv(ip, iveg) + ! hmax = total vegetation height = sum of all section thicknesses + ! hmin = height of the bottom of the lowest section = 0 (all sections start at the bed) + ! + vegetation_lookup_hmin_uv(ip) = 0.0 + vegetation_lookup_hmax_uv(ip) = sum(vegetation_stems_height_uv(ip,:)) + ! + if (vegetation_lookup_hmax_uv(ip) > 0.0) then + dh_veg = vegetation_lookup_hmax_uv(ip) / real(vegetation_nlookup) + vegetation_lookup_dh_uv(ip) = dh_veg + do k = 1, vegetation_nlookup + h_k = k * dh_veg + section_bottom = 0.0 + do iveg = 1, vegetation_vertical_segments + section_top = section_bottom + vegetation_stems_height_uv(ip, iveg) + vegetation_cd_sum_table(ip, k) = vegetation_cd_sum_table(ip, k) + vegetation_stems_cd_width_density_uv(ip, iveg) * max(0.0, min(section_top, h_k) - section_bottom) + section_bottom = section_top + enddo + enddo + endif + ! + enddo + !$omp end parallel do + ! + ! Pre-compute slope between consecutive table entries to avoid the subtraction in compute_fluxes + ! + !$omp parallel do private( ip, k ) schedule( static ) + do ip = 1, npuv + do k = 0, vegetation_nlookup - 1 + vegetation_cd_slope_table(ip, k) = vegetation_cd_sum_table(ip, k+1) - vegetation_cd_sum_table(ip, k) + enddo + enddo + !$omp end parallel do + ! + endif ! end subroutine From 0a765578fc378fa0f5caae44d7cc57b4a09d344b Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 14 Apr 2026 14:09:59 +0200 Subject: [PATCH 100/118] - Double check wet averaged vs grid averaged properties --- source/src/sfincs_momentum.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/src/sfincs_momentum.f90 b/source/src/sfincs_momentum.f90 index a5555e981..0a12fb13c 100644 --- a/source/src/sfincs_momentum.f90 +++ b/source/src/sfincs_momentum.f90 @@ -612,11 +612,11 @@ subroutine compute_fluxes(dt, tloop) ! Vegetation drag due to mean flow ! Direct lookup in pre-computed table - no inner loop over vegetation layers ! - if (vegetation_lookup_hmax_uv(ip) > 0.0 .and. hu > 0.0) then ! hwet ipv hu, and multiply frc addition with phi * + if (vegetation_lookup_hmax_uv(ip) > 0.0 .and. hwet > 0.0) then frac_veg = min(hu, vegetation_lookup_hmax_uv(ip)) / vegetation_lookup_dh_uv(ip) ik_veg = min(int(frac_veg), vegetation_nlookup - 1) frac_veg = frac_veg - real(ik_veg) - frc = frc - (vegetation_cd_sum_table(ip, ik_veg) + frac_veg * vegetation_cd_slope_table(ip, ik_veg)) * uv0(ip) * abs(uv0(ip)) + frc = frc - phi * (vegetation_cd_sum_table(ip, ik_veg) + frac_veg * vegetation_cd_slope_table(ip, ik_veg)) * uv0(ip) * abs(uv0(ip)) ! FIXME - double check wet averaged vs grid averaged properties endif ! endif From f7c0c8443c7488d828e75652a49bce53481a497a Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 14 Apr 2026 15:32:33 +0200 Subject: [PATCH 101/118] - Add netcdf output of the veggie variables (change names later) --- source/src/sfincs_ncoutput.F90 | 110 ++++++++++++++++++++++++++++++--- 1 file changed, 102 insertions(+), 8 deletions(-) diff --git a/source/src/sfincs_ncoutput.F90 b/source/src/sfincs_ncoutput.F90 index 99a2c7585..eca68ca68 100644 --- a/source/src/sfincs_ncoutput.F90 +++ b/source/src/sfincs_ncoutput.F90 @@ -26,6 +26,9 @@ module sfincs_ncoutput integer :: manning_varid integer :: pnonh_varid integer :: subgridslope_varid + ! Vegetation + integer :: nsec_dimid + integer :: veg_cd_varid, veg_ah_varid, veg_bstems_varid, veg_Nstems_varid ! integer :: mesh2d_varid integer :: mesh2d_node_x_varid, mesh2d_node_y_varid @@ -869,7 +872,7 @@ subroutine ncoutput_quadtree_map_init() ! implicit none ! - integer :: nm, nmq, nmu1, num1, n, m, nn, ntmx, n_nodes, n_faces, iref + integer :: nm, nmq, nmu1, num1, n, m, nn, ntmx, n_nodes, n_faces, iref, isec real*4 :: dxx, dyy ! real, dimension(:), allocatable :: nodes_x @@ -877,6 +880,7 @@ subroutine ncoutput_quadtree_map_init() integer*4, dimension(:,:), allocatable :: face_nodes real*4, dimension(:), allocatable :: vtmp integer*4, dimension(:), allocatable :: vtmpi + real*4, dimension(:,:), allocatable :: vtmp2d ! ! Very lazy for now ! @@ -943,11 +947,15 @@ subroutine ncoutput_quadtree_map_init() ! Time ! NF90(nf90_def_dim(map_file%ncid, 'time', NF90_UNLIMITED, map_file%time_dimid)) ! time - ntmx = max(ceiling((t1out - t0out)/dtmaxout), 1) + ntmx = max(ceiling((t1out - t0out)/dtmaxout), 1) NF90(nf90_def_dim(map_file%ncid, 'timemax', ntmx, map_file%timemax_dimid)) ! time - NF90(nf90_def_dim(map_file%ncid, 'runtime', 1, map_file%runtime_dimid)) ! total_runtime, average_dt + NF90(nf90_def_dim(map_file%ncid, 'runtime', 1, map_file%runtime_dimid)) ! total_runtime, average_dt ! - ! Some metadata attributes + if (store_vegetation) then + NF90(nf90_def_dim(map_file%ncid, 'nsec', vegetation_vertical_segments, map_file%nsec_dimid)) ! number of vegetation vertical sections + endif + ! + ! Some metadata attributes ! NF90(nf90_put_att(map_file%ncid,nf90_global, "Conventions", "Conventions = 'CF-1.8 UGRID-1.0 Deltares-0.10'")) NF90(nf90_put_att(map_file%ncid,nf90_global, "Build-Revision-Date-Netcdf-library", trim(nf90_inq_libvers()))) ! version of netcdf library @@ -1064,9 +1072,41 @@ subroutine ncoutput_quadtree_map_init() NF90(nf90_put_att(map_file%ncid, map_file%msk_varid, 'units', '-')) NF90(nf90_put_att(map_file%ncid, map_file%msk_varid, 'standard_name', 'mask')) NF90(nf90_put_att(map_file%ncid, map_file%msk_varid, 'long_name', 'msk_active_cells')) - NF90(nf90_put_att(map_file%ncid, map_file%msk_varid, 'description', 'inactive=0, active=1, normal_boundary=2, outflow_boundary=3, wavemaker=4')) + NF90(nf90_put_att(map_file%ncid, map_file%msk_varid, 'description', 'inactive=0, active=1, normal_boundary=2, outflow_boundary=3, wavemaker=4')) + ! + if (store_vegetation) then + ! + NF90(nf90_def_var(map_file%ncid, 'snapwave_veg_Cd', NF90_FLOAT, (/map_file%nmesh2d_face_dimid, map_file%nsec_dimid/), map_file%veg_cd_varid)) + NF90(nf90_def_var_deflate(map_file%ncid, map_file%veg_cd_varid, 1, 1, nc_deflate_level)) + NF90(nf90_put_att(map_file%ncid, map_file%veg_cd_varid, '_FillValue', FILL_VALUE)) + NF90(nf90_put_att(map_file%ncid, map_file%veg_cd_varid, 'units', '-')) + NF90(nf90_put_att(map_file%ncid, map_file%veg_cd_varid, 'standard_name', 'vegetation_cd')) + NF90(nf90_put_att(map_file%ncid, map_file%veg_cd_varid, 'long_name', 'bulk_drag_coefficient_per_vegetation_section')) + ! + NF90(nf90_def_var(map_file%ncid, 'snapwave_veg_ah', NF90_FLOAT, (/map_file%nmesh2d_face_dimid, map_file%nsec_dimid/), map_file%veg_ah_varid)) + NF90(nf90_def_var_deflate(map_file%ncid, map_file%veg_ah_varid, 1, 1, nc_deflate_level)) + NF90(nf90_put_att(map_file%ncid, map_file%veg_ah_varid, '_FillValue', FILL_VALUE)) + NF90(nf90_put_att(map_file%ncid, map_file%veg_ah_varid, 'units', 'm')) + NF90(nf90_put_att(map_file%ncid, map_file%veg_ah_varid, 'standard_name', 'vegetation_stems_height')) + NF90(nf90_put_att(map_file%ncid, map_file%veg_ah_varid, 'long_name', 'vegetation_section_thickness')) + ! + NF90(nf90_def_var(map_file%ncid, 'snapwave_veg_bstems', NF90_FLOAT, (/map_file%nmesh2d_face_dimid, map_file%nsec_dimid/), map_file%veg_bstems_varid)) + NF90(nf90_def_var_deflate(map_file%ncid, map_file%veg_bstems_varid, 1, 1, nc_deflate_level)) + NF90(nf90_put_att(map_file%ncid, map_file%veg_bstems_varid, '_FillValue', FILL_VALUE)) + NF90(nf90_put_att(map_file%ncid, map_file%veg_bstems_varid, 'units', 'm')) + NF90(nf90_put_att(map_file%ncid, map_file%veg_bstems_varid, 'standard_name', 'vegetation_stems_width')) + NF90(nf90_put_att(map_file%ncid, map_file%veg_bstems_varid, 'long_name', 'width_of_individual_vegetation_stems_per_section')) + ! + NF90(nf90_def_var(map_file%ncid, 'snapwave_veg_Nstems', NF90_FLOAT, (/map_file%nmesh2d_face_dimid, map_file%nsec_dimid/), map_file%veg_Nstems_varid)) + NF90(nf90_def_var_deflate(map_file%ncid, map_file%veg_Nstems_varid, 1, 1, nc_deflate_level)) + NF90(nf90_put_att(map_file%ncid, map_file%veg_Nstems_varid, '_FillValue', FILL_VALUE)) + NF90(nf90_put_att(map_file%ncid, map_file%veg_Nstems_varid, 'units', 'm-2')) + NF90(nf90_put_att(map_file%ncid, map_file%veg_Nstems_varid, 'standard_name', 'vegetation_stems_density')) + NF90(nf90_put_att(map_file%ncid, map_file%veg_Nstems_varid, 'long_name', 'number_of_stems_per_unit_horizontal_area_per_section')) + ! + endif ! - ! Time variables + ! Time variables ! trefstr_iso8601 = date_to_iso8601(trefstr) ! @@ -1599,13 +1639,67 @@ subroutine ncoutput_quadtree_map_init() ! endif ! + ! Write vegetation fields (static, written once at init) + ! + if (store_vegetation) then + ! + allocate(vtmp2d(n_faces, vegetation_vertical_segments)) + ! + vtmp2d = FILL_VALUE + do nmq = 1, quadtree_nr_points + nm = index_sfincs_in_quadtree(nmq) + if (nm > 0) then + do isec = 1, vegetation_vertical_segments + vtmp2d(nmq, isec) = vegetation_cd(nm, isec) + enddo + endif + enddo + NF90(nf90_put_var(map_file%ncid, map_file%veg_cd_varid, vtmp2d)) + ! + vtmp2d = FILL_VALUE + do nmq = 1, quadtree_nr_points + nm = index_sfincs_in_quadtree(nmq) + if (nm > 0) then + do isec = 1, vegetation_vertical_segments + vtmp2d(nmq, isec) = vegetation_stems_height(nm, isec) + enddo + endif + enddo + NF90(nf90_put_var(map_file%ncid, map_file%veg_ah_varid, vtmp2d)) + ! + vtmp2d = FILL_VALUE + do nmq = 1, quadtree_nr_points + nm = index_sfincs_in_quadtree(nmq) + if (nm > 0) then + do isec = 1, vegetation_vertical_segments + vtmp2d(nmq, isec) = vegetation_stems_width(nm, isec) + enddo + endif + enddo + NF90(nf90_put_var(map_file%ncid, map_file%veg_bstems_varid, vtmp2d)) + ! + vtmp2d = FILL_VALUE + do nmq = 1, quadtree_nr_points + nm = index_sfincs_in_quadtree(nmq) + if (nm > 0) then + do isec = 1, vegetation_vertical_segments + vtmp2d(nmq, isec) = vegetation_stems_density(nm, isec) + enddo + endif + enddo + NF90(nf90_put_var(map_file%ncid, map_file%veg_Nstems_varid, vtmp2d)) + ! + deallocate(vtmp2d) + ! + endif + ! ! write away intermediate data ! NF90(nf90_sync(map_file%ncid)) !write away intermediate data ! end subroutine - - + + subroutine ncoutput_his_init() ! ! 1. Initialise dimensions/variables/attributes From 7834847cfe80f5d5cdd5aad01d978fcf25843602 Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 14 Apr 2026 15:36:12 +0200 Subject: [PATCH 102/118] - Update names --- source/src/sfincs_ncoutput.F90 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/src/sfincs_ncoutput.F90 b/source/src/sfincs_ncoutput.F90 index eca68ca68..5d5e1dc51 100644 --- a/source/src/sfincs_ncoutput.F90 +++ b/source/src/sfincs_ncoutput.F90 @@ -1076,28 +1076,28 @@ subroutine ncoutput_quadtree_map_init() ! if (store_vegetation) then ! - NF90(nf90_def_var(map_file%ncid, 'snapwave_veg_Cd', NF90_FLOAT, (/map_file%nmesh2d_face_dimid, map_file%nsec_dimid/), map_file%veg_cd_varid)) + NF90(nf90_def_var(map_file%ncid, 'vegetation_cd', NF90_FLOAT, (/map_file%nmesh2d_face_dimid, map_file%nsec_dimid/), map_file%veg_cd_varid)) NF90(nf90_def_var_deflate(map_file%ncid, map_file%veg_cd_varid, 1, 1, nc_deflate_level)) NF90(nf90_put_att(map_file%ncid, map_file%veg_cd_varid, '_FillValue', FILL_VALUE)) NF90(nf90_put_att(map_file%ncid, map_file%veg_cd_varid, 'units', '-')) NF90(nf90_put_att(map_file%ncid, map_file%veg_cd_varid, 'standard_name', 'vegetation_cd')) NF90(nf90_put_att(map_file%ncid, map_file%veg_cd_varid, 'long_name', 'bulk_drag_coefficient_per_vegetation_section')) ! - NF90(nf90_def_var(map_file%ncid, 'snapwave_veg_ah', NF90_FLOAT, (/map_file%nmesh2d_face_dimid, map_file%nsec_dimid/), map_file%veg_ah_varid)) + NF90(nf90_def_var(map_file%ncid, 'vegetation_stems_height', NF90_FLOAT, (/map_file%nmesh2d_face_dimid, map_file%nsec_dimid/), map_file%veg_ah_varid)) NF90(nf90_def_var_deflate(map_file%ncid, map_file%veg_ah_varid, 1, 1, nc_deflate_level)) NF90(nf90_put_att(map_file%ncid, map_file%veg_ah_varid, '_FillValue', FILL_VALUE)) NF90(nf90_put_att(map_file%ncid, map_file%veg_ah_varid, 'units', 'm')) NF90(nf90_put_att(map_file%ncid, map_file%veg_ah_varid, 'standard_name', 'vegetation_stems_height')) NF90(nf90_put_att(map_file%ncid, map_file%veg_ah_varid, 'long_name', 'vegetation_section_thickness')) ! - NF90(nf90_def_var(map_file%ncid, 'snapwave_veg_bstems', NF90_FLOAT, (/map_file%nmesh2d_face_dimid, map_file%nsec_dimid/), map_file%veg_bstems_varid)) + NF90(nf90_def_var(map_file%ncid, 'vegetation_stems_width', NF90_FLOAT, (/map_file%nmesh2d_face_dimid, map_file%nsec_dimid/), map_file%veg_bstems_varid)) NF90(nf90_def_var_deflate(map_file%ncid, map_file%veg_bstems_varid, 1, 1, nc_deflate_level)) NF90(nf90_put_att(map_file%ncid, map_file%veg_bstems_varid, '_FillValue', FILL_VALUE)) NF90(nf90_put_att(map_file%ncid, map_file%veg_bstems_varid, 'units', 'm')) NF90(nf90_put_att(map_file%ncid, map_file%veg_bstems_varid, 'standard_name', 'vegetation_stems_width')) NF90(nf90_put_att(map_file%ncid, map_file%veg_bstems_varid, 'long_name', 'width_of_individual_vegetation_stems_per_section')) ! - NF90(nf90_def_var(map_file%ncid, 'snapwave_veg_Nstems', NF90_FLOAT, (/map_file%nmesh2d_face_dimid, map_file%nsec_dimid/), map_file%veg_Nstems_varid)) + NF90(nf90_def_var(map_file%ncid, 'vegetation_stems_density', NF90_FLOAT, (/map_file%nmesh2d_face_dimid, map_file%nsec_dimid/), map_file%veg_Nstems_varid)) NF90(nf90_def_var_deflate(map_file%ncid, map_file%veg_Nstems_varid, 1, 1, nc_deflate_level)) NF90(nf90_put_att(map_file%ncid, map_file%veg_Nstems_varid, '_FillValue', FILL_VALUE)) NF90(nf90_put_att(map_file%ncid, map_file%veg_Nstems_varid, 'units', 'm-2')) From ca7446c3587b1ed4cf141562d7ee115444796c11 Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 14 Apr 2026 15:39:11 +0200 Subject: [PATCH 103/118] - Add code documentation --- source/src/sfincs_vegetation.f90 | 45 +++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/source/src/sfincs_vegetation.f90 b/source/src/sfincs_vegetation.f90 index 59696858c..f6d2d8681 100644 --- a/source/src/sfincs_vegetation.f90 +++ b/source/src/sfincs_vegetation.f90 @@ -171,6 +171,45 @@ subroutine initialize_vegetation() ! endif ! - end subroutine - -end module \ No newline at end of file + ! ----------------------------------------------------------------------- + ! Summary: vegetation drag pre-computation + ! ----------------------------------------------------------------------- + ! + ! INPUT (read from vegetation NetCDF file, on z-points): + ! vegetation_cd : bulk drag coefficient [-] (np, nsec) + ! vegetation_stems_height : section thickness, stacked bed upward [m] (np, nsec) + ! vegetation_stems_width : stem diameter [m] (np, nsec) + ! vegetation_stems_density : stem density [m-2] (np, nsec) + ! + ! STEP 1 - interpolate to uv-points and pre-multiply constants: + ! vegetation_stems_height_uv(ip,iveg) = average of nm and nmu cell heights + ! vegetation_stems_cd_width_density_uv(ip,iveg) = 0.5 * cd * b * N / rho_w + ! (factor 0.5 and rho_w division folded in once; never recomputed at runtime) + ! + ! STEP 2 - build lookup table (vegetation_nlookup equidistant depth bins): + ! hmax(ip) = sum of all section heights (total vegetation height) + ! dh(ip) = hmax / vegetation_nlookup (bin width, stored for runtime use) + ! For each bin k (depth level h_k = k * dh): + ! table(ip,k) = sum_iveg [ cd_wd(ip,iveg) * max(0, min(sec_top, h_k) - sec_bot) ] + ! This is the cumulative drag integral up to depth h_k. + ! Sections are stacked from the bed (sec_bot = sum of previous section heights), + ! consistent with the swvegatt convention in snapwave_solver.f90. + ! + ! STEP 3 - pre-compute slope table (avoids subtraction at runtime): + ! slope_table(ip,k) = table(ip,k+1) - table(ip,k) + ! + ! RUNTIME USE (compute_fluxes in sfincs_momentum.f90): + ! Given water depth hu at a uv-point: + ! frac = min(hu, hmax(ip)) / dh(ip) ! fractional bin index + ! ik = floor(frac) ! integer bin + ! frac = frac - ik ! remainder for interpolation + ! cd_eff = table(ip,ik) + frac * slope(ip,ik) ! O(1) lookup, no section loop + ! Vegetation drag force (explicit, added to frc): + ! F_veg = -phi * cd_eff * u0 * |u0| + ! Flux update (Manning friction handled implicitly in denominator): + ! q_new = (q_old + (F_ext + F_veg) * dt) / (1 + g*n^2*|q|/hu^(7/3) * dt) + ! ----------------------------------------------------------------------- + ! + end subroutine + +end module \ No newline at end of file From 7bcc2fcd50059816e27552d348ed1cf128ea94df Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 14 Apr 2026 15:39:22 +0200 Subject: [PATCH 104/118] - Add implementation figure --- source/code_docs/vegetation_lookup_figure.png | Bin 0 -> 159928 bytes source/code_docs/vegetation_lookup_figure.py | 151 ++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 source/code_docs/vegetation_lookup_figure.png create mode 100644 source/code_docs/vegetation_lookup_figure.py diff --git a/source/code_docs/vegetation_lookup_figure.png b/source/code_docs/vegetation_lookup_figure.png new file mode 100644 index 0000000000000000000000000000000000000000..d54d87bca223d56792e3757d04924e67b0f7dec3 GIT binary patch literal 159928 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

sh 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 Ud#N&JWM1ZFm8;4H7fk~G2k0OTdH?_b literal 0 HcmV?d00001 diff --git a/source/code_docs/vegetation_lookup_figure.py b/source/code_docs/vegetation_lookup_figure.py new file mode 100644 index 000000000..55d32f888 --- /dev/null +++ b/source/code_docs/vegetation_lookup_figure.py @@ -0,0 +1,151 @@ +""" +Visualisation of SFINCS vegetation drag lookup table concept. +Run with: python vegetation_lookup_figure.py +""" + +import numpy as np +import matplotlib.pyplot as plt +import matplotlib.patches as mpatches +from matplotlib.gridspec import GridSpec + +# -------------------------------------------------------------------------- +# Example vegetation: 3 vertical sections stacked from bed +# -------------------------------------------------------------------------- +sections = [ + {"ah": 0.5, "cd_wd": 0.8, "label": "section 1\n(dense canopy base)", "color": "#4CAF50"}, + {"ah": 0.8, "cd_wd": 0.4, "label": "section 2\n(mid canopy)", "color": "#8BC34A"}, + {"ah": 0.4, "cd_wd": 0.15, "label": "section 3\n(sparse canopy top)", "color": "#CDDC39"}, +] + +# Cumulative section boundaries +bottoms = [0.0] +for s in sections: + bottoms.append(bottoms[-1] + s["ah"]) +tops = bottoms[1:] +h_veg_total = bottoms[-1] # = 1.7 m + +# -------------------------------------------------------------------------- +# Build lookup table (vegetation_nlookup = 20) +# -------------------------------------------------------------------------- +nlookup = 20 +dh = h_veg_total / nlookup +h_nodes = np.arange(0, nlookup + 1) * dh # shape (21,) + +table = np.zeros(nlookup + 1) +for k in range(1, nlookup + 1): + h_k = k * dh + sec_bot = 0.0 + for s in sections: + sec_top = sec_bot + s["ah"] + table[k] += s["cd_wd"] * max(0.0, min(sec_top, h_k) - sec_bot) + sec_bot = sec_top + +slope_table = np.diff(table) # length nlookup + +# -------------------------------------------------------------------------- +# Runtime lookup example: water depth hu +# -------------------------------------------------------------------------- +hu = 1.1 # example water depth at a timestep +hu_eff = min(hu, h_veg_total) +frac = hu_eff / dh +ik = min(int(frac), nlookup - 1) +frac_r = frac - ik +veg_cd_eff = table[ik] + frac_r * slope_table[ik] + +# -------------------------------------------------------------------------- +# Plot +# -------------------------------------------------------------------------- +fig = plt.figure(figsize=(13, 6)) +fig.suptitle("SFINCS vegetation drag — lookup table concept", fontsize=13, fontweight="bold") +gs = GridSpec(1, 3, figure=fig, wspace=0.40, left=0.06, right=0.97, top=0.88, bottom=0.10) + +# ── Panel A: vegetation sections ───────────────────────────────────────── +ax1 = fig.add_subplot(gs[0]) +ax1.set_title("A Vegetation sections\n(single uv-point)", fontsize=10) + +for i, s in enumerate(sections): + ax1.barh( + bottoms[i] + s["ah"] / 2, 1.0, + height=s["ah"], left=0, + color=s["color"], edgecolor="k", linewidth=0.8, alpha=0.85 + ) + ax1.text( + 0.5, bottoms[i] + s["ah"] / 2, + f'cd·b·N = {s["cd_wd"]:.2f}\nah = {s["ah"]} m', + ha="center", va="center", fontsize=7.5 + ) + # section boundary lines + ax1.axhline(bottoms[i], color="gray", lw=0.7, ls="--") + +ax1.axhline(h_veg_total, color="gray", lw=0.7, ls="--") +ax1.set_xlim(0, 1); ax1.set_xticks([]) +ax1.set_ylim(-0.15, 2.1) +ax1.set_ylabel("Height above bed (m)") +ax1.set_xlabel("← stem density schematic →") + +# water surface at hu +ax1.axhline(hu, color="#1565C0", lw=2, ls="-", label=f"water depth hu = {hu} m") +ax1.fill_betweenx([0, hu], 0, 1, color="#90CAF9", alpha=0.25) +ax1.legend(fontsize=7.5, loc="upper right") + +# ── Panel B: lookup table ───────────────────────────────────────────────── +ax2 = fig.add_subplot(gs[1]) +ax2.set_title("B Pre-computed lookup table\n(built once in initialize_vegetation)", fontsize=10) + +ax2.step(table, h_nodes, where="post", color="k", lw=1.2, label="table values") +ax2.plot(table, h_nodes, "o", color="k", ms=4, zorder=5) + +# shade each section contribution band +sec_bot = 0.0 +for s in sections: + sec_top = sec_bot + s["ah"] + ax2.axhspan(sec_bot, sec_top, color=s["color"], alpha=0.20) + sec_bot = sec_top + +# interpolation at hu +ax2.axhline(hu_eff, color="#1565C0", lw=1.5, ls="--", label=f"hu = {hu} m") +ax2.plot(veg_cd_eff, hu_eff, "*", color="red", ms=12, zorder=10, + label=f"veg_cd_eff = {veg_cd_eff:.3f} m²/s² (interpolated)") + +# show interpolation bracket +ax2.plot([table[ik], table[ik+1]], [h_nodes[ik], h_nodes[ik+1]], + "r-", lw=1.5, label="linear interpolation") +ax2.plot([table[ik], table[ik+1]], [h_nodes[ik], h_nodes[ik+1]], + "rs", ms=6) + +ax2.set_xlabel("Cumulative drag integral\n∑ cd·b·N · submerged thickness (m²/s²)") +ax2.set_ylabel("Depth level h_k (m)") +ax2.set_ylim(-0.15, 2.1) +ax2.legend(fontsize=7.5, loc="lower right") + +# ── Panel C: flux update (implicit) ────────────────────────────────────── +ax3 = fig.add_subplot(gs[2]) +ax3.set_title("C Explicit flux update\n(every timestep in compute_fluxes)", fontsize=10) +ax3.axis("off") + +textblock = ( + r"$\bf{Runtime\ lookup\ (O(1),\ no\ inner\ loop):}$" + "\n\n" + r"$\mathrm{frac} = \min(h_u,\; h_{veg}) \;/\; \Delta h$" + "\n" + r"$ik = \lfloor \mathrm{frac} \rfloor$" + "\n" + r"$cd_{eff} = \mathrm{table}[ik] + (\mathrm{frac}-ik)\times\mathrm{slope}[ik]$" + "\n\n" + r"$\bf{Explicit\ momentum\ update:}$" + "\n\n" + r"$F_{veg} = -\phi\;cd_{eff}\;u_0\;|u_0|$" + "\n\n" + r"$q^{n+1} = \dfrac{q^n + (F_{ext} + F_{veg})\,\Delta t}" + r"{1 + \dfrac{g\,n^2\,|q|}{h_u^{7/3}}\,\Delta t}$" + + "\n\n" + r"$\bf{Key\ properties:}$" + "\n" + "• No inner loop over sections at runtime\n" + "• Linear interpolation between table bins\n" + "• Sections stacked from bed upward\n" + " (consistent with SnapWave swvegatt)\n" + r"• $\phi$ = wet fraction (subgrid correction)" +) + +ax3.text(0.03, 0.97, textblock, transform=ax3.transAxes, + fontsize=9, va="top", ha="left", + bbox=dict(boxstyle="round,pad=0.5", fc="#F5F5F5", ec="#BDBDBD"), + linespacing=1.6) + +plt.savefig("vegetation_lookup_figure.png", dpi=150) +print("Saved: vegetation_lookup_figure.png") +plt.show() From 86f1ffa825ca9463f65aa1a07f029c2182477abc Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 14 Apr 2026 15:39:44 +0200 Subject: [PATCH 105/118] - Add fixme note --- source/src/sfincs_momentum.f90 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/source/src/sfincs_momentum.f90 b/source/src/sfincs_momentum.f90 index 0a12fb13c..0dfcf9dc4 100644 --- a/source/src/sfincs_momentum.f90 +++ b/source/src/sfincs_momentum.f90 @@ -613,10 +613,17 @@ subroutine compute_fluxes(dt, tloop) ! Direct lookup in pre-computed table - no inner loop over vegetation layers ! if (vegetation_lookup_hmax_uv(ip) > 0.0 .and. hwet > 0.0) then + ! frac_veg = min(hu, vegetation_lookup_hmax_uv(ip)) / vegetation_lookup_dh_uv(ip) + ! ik_veg = min(int(frac_veg), vegetation_nlookup - 1) + ! frac_veg = frac_veg - real(ik_veg) - frc = frc - phi * (vegetation_cd_sum_table(ip, ik_veg) + frac_veg * vegetation_cd_slope_table(ip, ik_veg)) * uv0(ip) * abs(uv0(ip)) ! FIXME - double check wet averaged vs grid averaged properties + ! + ! FIXME - double check wet averaged vs grid averaged properties + ! + frc = frc - phi * (vegetation_cd_sum_table(ip, ik_veg) + frac_veg * vegetation_cd_slope_table(ip, ik_veg)) * uv0(ip) * abs(uv0(ip)) + ! endif ! endif From da3533b57adcda09dd3f66685812c2760c03a793 Mon Sep 17 00:00:00 2001 From: Leynse Date: Tue, 14 Apr 2026 18:12:59 +0200 Subject: [PATCH 106/118] - Update last name --- source/src/sfincs_ncoutput.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/src/sfincs_ncoutput.F90 b/source/src/sfincs_ncoutput.F90 index 5d5e1dc51..71eb63393 100644 --- a/source/src/sfincs_ncoutput.F90 +++ b/source/src/sfincs_ncoutput.F90 @@ -952,7 +952,7 @@ subroutine ncoutput_quadtree_map_init() NF90(nf90_def_dim(map_file%ncid, 'runtime', 1, map_file%runtime_dimid)) ! total_runtime, average_dt ! if (store_vegetation) then - NF90(nf90_def_dim(map_file%ncid, 'nsec', vegetation_vertical_segments, map_file%nsec_dimid)) ! number of vegetation vertical sections + NF90(nf90_def_dim(map_file%ncid, 'vegetation_vertical_segments', vegetation_vertical_segments, map_file%nsec_dimid)) ! number of vegetation vertical sections endif ! ! Some metadata attributes From 0d6e39a8d65454a37130d10cedbed2b08fb3d580 Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 15 Apr 2026 13:30:48 +0200 Subject: [PATCH 107/118] - Bugfix in calculating kwav_ig! --- source/src/snapwave/snapwave_solver.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 3c8063b4a..badcf125f 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -81,7 +81,7 @@ subroutine compute_wave_field() ! cg_ig = Cg expon = -(sigm_ig * sqrt(depth / g))**2.5 - kwav_ig = sig**2 / g * (1.0 - exp(expon))**-0.4 + kwav_ig = sigm_ig**2 / g * (1.0 - exp(expon))**-0.4 ! else ! From a5e6dbe3c3e37d85d1a4f3947b8e2b2585d50d50 Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 15 Apr 2026 13:31:25 +0200 Subject: [PATCH 108/118] - Suggestion of Marlies to keep the original formulation for Hmx_ig --- source/src/snapwave/snapwave_solver.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index badcf125f..f2116605b 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -103,8 +103,8 @@ subroutine compute_wave_field() ! ! Why is this different from Hmx for regular waves where we use gamma * h? ! - !Hmx_ig(k) = 0.88 / kwav_ig(k) * tanh(gamma_ig * kwav_ig(k) * depth(k) / 0.88) ! Note - uses gamma_ig - Hmx_ig(k) = gamma_ig * depth(k) + Hmx_ig(k) = 0.88 / kwav_ig(k) * tanh(gamma_ig * kwav_ig(k) * depth(k) / 0.88) ! Note - uses gamma_ig + !Hmx_ig(k) = gamma_ig * depth(k) ! endif ! From 9f75711ca43467fdd36e366137c5f08145bb168d Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 22 Apr 2026 13:14:54 +0200 Subject: [PATCH 109/118] - Bump version --- source/src/sfincs_lib.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/src/sfincs_lib.f90 b/source/src/sfincs_lib.f90 index 1be322339..cf80780af 100644 --- a/source/src/sfincs_lib.f90 +++ b/source/src/sfincs_lib.f90 @@ -94,8 +94,8 @@ function sfincs_initialize() result(ierr) ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! - build_revision = "$Rev: v2.3.2 mt. Faber+branch:main+281+292+318+snapwave_domain_updates" - build_date = "$Date: 2026-04-13" + build_revision = "$Rev: v2.3.2 mt. Faber+branch:main+281+292+318+snapwave_domain_updates+wavemaker_updates_igoptdefault15" + build_date = "$Date: 2026-04-20" ! call write_log('', 1) call write_log('------------ Welcome to SFINCS ------------', 1) From 76d3709f054f91b15ca82637dbbdfda130fa56b2 Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 22 Apr 2026 16:05:26 +0200 Subject: [PATCH 110/118] - Change to hwet --- source/src/sfincs_momentum.f90 | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/source/src/sfincs_momentum.f90 b/source/src/sfincs_momentum.f90 index 0dfcf9dc4..41c79f0f1 100644 --- a/source/src/sfincs_momentum.f90 +++ b/source/src/sfincs_momentum.f90 @@ -614,14 +614,12 @@ subroutine compute_fluxes(dt, tloop) ! if (vegetation_lookup_hmax_uv(ip) > 0.0 .and. hwet > 0.0) then ! - frac_veg = min(hu, vegetation_lookup_hmax_uv(ip)) / vegetation_lookup_dh_uv(ip) + frac_veg = min(hwet, vegetation_lookup_hmax_uv(ip)) / vegetation_lookup_dh_uv(ip) ! ik_veg = min(int(frac_veg), vegetation_nlookup - 1) ! frac_veg = frac_veg - real(ik_veg) ! - ! FIXME - double check wet averaged vs grid averaged properties - ! frc = frc - phi * (vegetation_cd_sum_table(ip, ik_veg) + frac_veg * vegetation_cd_slope_table(ip, ik_veg)) * uv0(ip) * abs(uv0(ip)) ! endif From 0181d452ec5a3ed66d19d9cd4944b89db2ab9d74 Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 22 Apr 2026 16:37:21 +0200 Subject: [PATCH 111/118] - Bump version --- source/src/sfincs_lib.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/src/sfincs_lib.f90 b/source/src/sfincs_lib.f90 index 3c5c8b403..91d358302 100644 --- a/source/src/sfincs_lib.f90 +++ b/source/src/sfincs_lib.f90 @@ -94,8 +94,8 @@ function sfincs_initialize() result(ierr) ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! - build_revision = "$Rev: v2.3.2 mt. Faber+branch:main+281+292+315+318+snapwave_domain_updates+wavemaker_updates_igoptdefault15" - build_date = "$Date: 2026-04-20" + build_revision = "$Rev: v2.3.2 mt. Faber+branch:main+281+292+315+318+snapwave_domain_updates+wavemaker_updates" + build_date = "$Date: 2026-04-22" ! call write_log('', 1) call write_log('------------ Welcome to SFINCS ------------', 1) From f9c9b9f0c51b4542a7d65079011654cb9bc7d57a Mon Sep 17 00:00:00 2001 From: Maarten van Ormondt Date: Wed, 29 Apr 2026 15:29:19 +0200 Subject: [PATCH 112/118] Reinit Tp for inner/Neumann; ignore docs/_build Reinitialize the per-node Tp only for internal and Neumann-connected cells during the wind iteration so boundary cells keep their prescribed Tp (as set by update_boundaries). Implemented a loop that sets Tp(k)=Tpini for inner(k) and Tp(neumannconnected(k)) where present. Also added docs/_build to .gitignore and cleaned up minor whitespace. --- .gitignore | 1 + source/src/snapwave/snapwave_solver.f90 | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 22752d026..97ffc6a99 100644 --- a/.gitignore +++ b/.gitignore @@ -65,3 +65,4 @@ source/third_party_open/netcdf/x64 source/sfincs/sfincs.opt.yaml /source/sfincs_lib/*.yaml /source/third_party_open/netcdf/netcdf-fortran-4.6.1/Debug +/docs/_build diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index f2116605b..0a4a43d64 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -443,12 +443,23 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! if (wind) then ! - DoverA = 0.0 + DoverA = 0.0 ndissip = 3.0 WsorE = 0.0 WsorA = 0.0 Ak = waveps / sigmax - Tp = Tpini + ! + ! Re-initialise Tp at inner / neumann-connected cells only; + ! boundary cells must keep their prescribed Tp (set by + ! update_boundaries) so the wind iteration starts from the + ! correct boundary forcing. + ! + do k = 1, no_nodes + ! + if (inner(k)) Tp(k) = Tpini + if (neumannconnected(k) > 0) Tp(neumannconnected(k)) = Tpini + ! + enddo ! do k = 1, no_nodes ! @@ -461,7 +472,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! call compute_celerities(depth(k), sig(k), sinth, costh, ntheta, gamma, dhdx(k), dhdy(k), sinhkh(k), Hmx(k), kwav(k), cg(k), ctheta(:,k)) ! - enddo + enddo ! endif ! From fb0c6e8765ea7d2b05793d17312627803cb73e24 Mon Sep 17 00:00:00 2001 From: Leynse Date: Wed, 29 Apr 2026 10:43:36 +0200 Subject: [PATCH 113/118] - Add gamma_fac_br as in PR #281 --- source/src/sfincs_snapwave.f90 | 3 +- source/src/snapwave/snapwave_data.f90 | 1 + source/src/snapwave/snapwave_solver.f90 | 41 +++++++++++++++++++++---- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index 01d10dc74..00a263f80 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -643,7 +643,8 @@ subroutine read_snapwave_input() ! Settings related to IG waves: call read_int_input(500,'snapwave_igwaves',igwaves_opt,1) call read_real_input(500,'snapwave_alpha_ig',alpha_ig,1.0) !TODO choose whether snapwave_alphaig or snapwave_gamma_ig - call read_real_input(500,'snapwave_gammaig',gamma_ig,0.2) + call read_real_input(500,'snapwave_gammaig', gamma_ig, 0.7) ! Wave breaking parameter for IG waves, default=0.7 + call read_real_input(500,'snapwave_gamma_fac_br',gamma_fac_br,0.45) ! factor times gamma that is used to determine the maximum incident wave breaking point in the surf zone using local incident wave height over water depth ratio, among others used to set the IG source term to 0 shallower than this point call read_real_input(500,'snapwave_shinc2ig',shinc2ig,1.0) ! Ratio of how much of the calculated IG wave source term, is subtracted from the incident wave energy (0-1, 1=default=all energy as sink) call read_real_input(500,'snapwave_alphaigfac',alphaigfac,1.0) ! Multiplication factor for IG shoaling source/sink term call read_real_input(500,'snapwave_baldock_ratio_ig',baldock_ratio_ig,0.2) diff --git a/source/src/snapwave/snapwave_data.f90 b/source/src/snapwave/snapwave_data.f90 index a5d2f173e..6d1c484fa 100644 --- a/source/src/snapwave/snapwave_data.f90 +++ b/source/src/snapwave/snapwave_data.f90 @@ -261,6 +261,7 @@ module snapwave_data ! integer :: ig_opt ! option of IG wave settings (1 = default = conservative shoaling based dSxx and Baldock breaking) real*4 :: alpha_ig,gamma_ig ! coefficients in Baldock wave breaking dissipation model for IG waves + real*4 :: gamma_fac_br ! factor times gamma that is used to determine the maximum incident wave breaking point in the surf zone using local incident wave height over water depth ratio, among others used to set the IG source term to 0 shallower than this point real*4 :: shinc2ig ! Ratio of how much of the calculated IG wave source term, is subtracted from the incident wave energy (0-1, 0=default) real*4 :: alphaigfac ! Multiplication factor for IG shoaling source/sink term, default = 1.0 real*4 :: eeinc2ig ! ratio of incident wave energy as first estimate of IG wave energy at boundary diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 0a4a43d64..4d9147751 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -1,4 +1,4 @@ -module snapwave_solver +module snapwave_solver use sfincs_log @@ -169,7 +169,7 @@ subroutine compute_wave_field() igwaves, kwav_ig, cg_ig,H_ig,ctheta_ig,Hmx_ig, ee_ig,fw_ig, & beta, srcig, alphaig, Dw_ig, Df_ig, & vegetation, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, Dveg, & - zb, nwav, ig_opt, alpha_ig, gamma_ig, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) + zb, nwav, ig_opt, alpha_ig, gamma_ig, gamma_fac_br, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) ! call timer(t3) ! @@ -196,7 +196,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & igwaves,kwav_ig, cg_ig,H_ig,ctheta_ig,Hmx_ig, ee_ig,fw_ig, & betamean, srcig, alphaig, Dw_ig, Df_ig, & vegetation, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, Dveg, & - zb, nwav, ig_opt, alfa_ig, gamma_ig, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) + zb, nwav, ig_opt, alfa_ig, gamma_ig, gamma_fac_br, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) ! use snapwave_windsource ! @@ -334,6 +334,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & real*4 :: Ek_ig real*4 :: Hk_ig real*4 :: alfa_ig,gamma_ig ! coefficients in Baldock wave breaking dissipation model for IG waves + real*4 :: gamma_fac_br ! factor times gamma that is used to determine the maximum incident wave breaking point in the surf zone using local incident wave height over water depth ratio, among others used to set the IG source term to 0 shallower than this point real*4 :: eeinc2ig ! ratio of incident wave energy as first estimate of IG wave energy at boundary real*4 :: Tinc2ig ! ratio compared to period Tinc to estimate Tig real*4 :: alphaigfac ! Multiplication factor for IG shoaling source/sink term, default = 1.0 @@ -1147,7 +1148,7 @@ subroutine baldock (rho, g, alfa, gamma, depth, H, T, iexp, Dw, Hmax) end subroutine baldock - subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local) + subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, ee, ee_ig, ig_opt, alphaigfac, alphaig_local, beta_local, srcig_local, gamma, gamma_fac_br) ! ! Determining of IG source term as defined in Leijnse et al. 2024 ! @@ -1174,7 +1175,9 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d real*4, dimension(ntheta,no_nodes), intent(in) :: ee_ig ! energy density infragravity waves integer, intent(in) :: ig_opt ! option of IG wave settings (1 = default = conservative shoaling based dSxx and Baldock breaking) real*4, intent(in) :: alphaigfac ! Multiplication factor for IG shoaling source/sink term, default = 1.0 - real*4, intent(in) :: dtheta ! directional resolution + real*4, intent(in) :: dtheta ! directional resolution + real*4, intent(in) :: gamma ! coefficients in Baldock wave breaking dissipation + real*4, intent(in) :: gamma_fac_br ! factor times gamma that is used to determine the maximum incident wave breaking point in the surf zone using local incident wave height over water depth ratio, among others used to set the IG source term to 0 shallower than this point ! ! Inout variables ! @@ -1199,6 +1202,12 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d real*4, dimension(no_nodes) :: E_ig_local ! mean wave energy infragravity waves - just local real*4 :: dSxx ! difference in Radiation stress real*4 :: Sxx_cons ! conservative estimate of radiation stress using conservative shoaling + real*4 :: transition_factor ! Transition factor for letting srcig go to zero smoothly, around gamma*gamma_fac_br + real*4 :: transition_factor_width_1 ! Width factor of generalized (Fermi–Dirac style) transfer function with adjustable midpoint and width + real*4 :: transition_factor_width_2 ! Width factor of generalized (Fermi–Dirac style) transfer function with adjustable midpoint and width + real*4 :: gamma_fac_br_transition ! Transitioned version of gamma_fac_br, so that for steep slopes it remains 1.0 + real*4 :: beta_limit_1 ! Cut-off beta_local for end of validity alphaig formulation of Leijnse et al. 2024 + real*4 :: beta_limit_2 ! Beta_local limit for transition function ! ! Set internal variables ! @@ -1209,7 +1218,15 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! E_local = 0.0 E_ig_local = 0.0 - Sxx = 0.0 + ! + ! Used is generalized (Fermi–Dirac style) transfer function with adjustable midpoint and width + ! + transition_factor_width_1 = 0.005 + transition_factor_width_2 = 0.002 + beta_limit_1 = 0.07 + !beta_limit_2 = beta_limit_1 - 0.01 + beta_limit_2 = beta_limit_1 - 0.02 + ! ! Pre-compute Sxx for all nodes ! !$omp parallel do schedule(static) @@ -1323,6 +1340,18 @@ subroutine determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, d ! NOTE - already here multiplied with ee(itheta,k), for direct inclusion in 'R'-term srcig_local(itheta, k) = alphaigfac * alphaig_local(itheta,k) * sqrt(Eprev_ig(itheta)) * cgprev(itheta) / depthprev(itheta,k) * dSxx / ds(itheta, k) /max(E_local(k), 1.0e-6) * ee(itheta,k) ! + ! Limit srcig to 0 after waves start (significantly) breaking, as defined here as gam=Hrms,inc / h > (gamma_fac_br * gamma) + ! Ergo, it is assumed that after this point IG waves are free, and no bound wave forcing is happening anymore, so srcig should be 0 from here on + ! + ! Let srcig transition to 0 more smoothly using fac_transition that reduced from 1 to 0 around gamma_fac_br * snapwave_gamma + ! But, only for beta_local < 0.07, so adjust based on beta_local so that transition_factor = 1.0 for Beta_local = 0.07 + ! + gamma_fac_br_transition = gamma_fac_br + ((1-gamma_fac_br) / (1 + exp(- (beta_local(itheta,k) - beta_limit_2) / transition_factor_width_2))) + ! + transition_factor = 1.0 - (1.0 / (1.0 + exp(- (gam - (gamma_fac_br_transition * gamma)) / transition_factor_width_1))) + ! + srcig_local(itheta, k) = transition_factor * srcig_local(itheta, k) + ! endif ! else ! TL: option to add future parameterisations here for e.g. coral reef type coasts From d696902e716473fd2357f77d9ae72be1362e63cc Mon Sep 17 00:00:00 2001 From: Tim Leijnse Date: Wed, 6 May 2026 15:54:36 +0200 Subject: [PATCH 114/118] - issue for Buckley solved if no limiter at all - Later improve limiter --- source/src/sfincs_lib.f90 | 4 ++-- source/src/sfincs_momentum.f90 | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/source/src/sfincs_lib.f90 b/source/src/sfincs_lib.f90 index 7937abbe2..04d08f5ec 100644 --- a/source/src/sfincs_lib.f90 +++ b/source/src/sfincs_lib.f90 @@ -94,8 +94,8 @@ function sfincs_initialize() result(ierr) ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! - build_revision = "$Rev: v2.3.2 mt. Faber+branch:snapwave_domain_update" - build_date = "$Date: 2026-04-02" + build_revision = "$Rev: v2.3.2 mt. Faber+branch:snapwave_domain_update+331" + build_date = "$Date: 2026-05-06" ! call write_log('', 1) call write_log('------------ Welcome to SFINCS ------------', 1) diff --git a/source/src/sfincs_momentum.f90 b/source/src/sfincs_momentum.f90 index 4e19f72fa..a8bc8f852 100644 --- a/source/src/sfincs_momentum.f90 +++ b/source/src/sfincs_momentum.f90 @@ -597,7 +597,8 @@ subroutine compute_fluxes(dt, tloop) ! facmax = 0.25*sqrt(g)*rhow*gammax**2 ! fmax = facmax*hu*sqrt(hu)/tp/rhow (we already divided by rhow in sfincs_snapwave) ! - fwmax = 0.8 * hwet * sqrt(hwet) / 15 + !fwmax = 0.8 * hwet * sqrt(hwet) / 15 + fwmax = 999 ! frc = frc + phi * sign(min(abs(fwuv(ip)), fwmax), fwuv(ip)) ! From a6a4da130165fa198cf3a0b7549f988b2853c45d Mon Sep 17 00:00:00 2001 From: Tim Leijnse Date: Wed, 6 May 2026 17:06:17 +0200 Subject: [PATCH 115/118] - Temp save, need to still make it work here/in sfincs_snapwave --- source/src/sfincs_momentum.f90 | 6 +++++- source/src/sfincs_snapwave.f90 | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/source/src/sfincs_momentum.f90 b/source/src/sfincs_momentum.f90 index a8bc8f852..fbfa2cdb7 100644 --- a/source/src/sfincs_momentum.f90 +++ b/source/src/sfincs_momentum.f90 @@ -598,9 +598,13 @@ subroutine compute_fluxes(dt, tloop) ! fmax = facmax*hu*sqrt(hu)/tp/rhow (we already divided by rhow in sfincs_snapwave) ! !fwmax = 0.8 * hwet * sqrt(hwet) / 15 - fwmax = 999 + !fwmax = 999 + fwmaxfac = 0.25 * sqrt(g) * rho * snapwave_gammax**2 / snapwave_tpmean + ! + fwmax = fwmaxfac * hwet * sqrt(hwet) ! frc = frc + phi * sign(min(abs(fwuv(ip)), fwmax), fwuv(ip)) + ! endif ! diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index 00a263f80..6251ad0d8 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -554,11 +554,14 @@ subroutine compute_snapwave(t) snapwave_beta = beta snapwave_srcig = srcig snapwave_alphaig = alphaig - ! + ! ! Convert wave force to correct unit [Dw/C] as expected by SFINCS, assumed to be piecewise (seems to work) snapwave_Fx = Fx * rho * depth snapwave_Fy = Fy * rho * depth ! + ! Pre-alculate wave forces limiter factor + !fwmaxfac = 0.25 * sqrt(g) * rho * gammax**2 / tpmean_bwv + ! ! Loop over points and set Tp, cg, direction, spreading to 0 where H and/or H_ig are zero ! TL: needed because e.g. Tp is set to Tpini initially, so shows values even if cell remains dry with H=0 do k = 1, no_nodes From 4884c365597480e248598ec07df46d2f2843c478 Mon Sep 17 00:00:00 2001 From: Tim Leijnse Date: Fri, 8 May 2026 09:36:28 +0200 Subject: [PATCH 116/118] - Option to determine fwmaxfac once every 'update_wave_field' call in sfincs_snapwave --- source/src/sfincs_data.f90 | 3 +++ source/src/sfincs_momentum.f90 | 11 +++++------ source/src/sfincs_snapwave.f90 | 8 +++++++- source/src/snapwave/snapwave_solver.f90 | 2 +- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/source/src/sfincs_data.f90 b/source/src/sfincs_data.f90 index 14066306a..344203865 100644 --- a/source/src/sfincs_data.f90 +++ b/source/src/sfincs_data.f90 @@ -419,6 +419,9 @@ module sfincs_data ! real*4, dimension(:), allocatable :: uvmean ! + ! Wave forces limiter determined in sfincs_snapwave + real*4 :: fwmaxfac + ! !!! Wave makers ! character*256 :: wavemaker_wvmfile ! polylines diff --git a/source/src/sfincs_momentum.f90 b/source/src/sfincs_momentum.f90 index fbfa2cdb7..4a8c796a3 100644 --- a/source/src/sfincs_momentum.f90 +++ b/source/src/sfincs_momentum.f90 @@ -597,14 +597,13 @@ subroutine compute_fluxes(dt, tloop) ! facmax = 0.25*sqrt(g)*rhow*gammax**2 ! fmax = facmax*hu*sqrt(hu)/tp/rhow (we already divided by rhow in sfincs_snapwave) ! - !fwmax = 0.8 * hwet * sqrt(hwet) / 15 - !fwmax = 999 - fwmaxfac = 0.25 * sqrt(g) * rho * snapwave_gammax**2 / snapwave_tpmean + ! old: fwmax = 0.8 * hwet * sqrt(hwet) / 15 + ! fix for lab cases: fwmax = 999 ! - fwmax = fwmaxfac * hwet * sqrt(hwet) + fwmax = fwmaxfac * hwet * sqrt(hwet) + ! Note, fwmaxfac is determined in sfincs_snapwave every 'update_wave_field' call ! - frc = frc + phi * sign(min(abs(fwuv(ip)), fwmax), fwuv(ip)) - + frc = frc + phi * sign(min(abs(fwuv(ip)), fwmax), fwuv(ip)) ! endif ! diff --git a/source/src/sfincs_snapwave.f90 b/source/src/sfincs_snapwave.f90 index 6251ad0d8..8a1b6b8a0 100644 --- a/source/src/sfincs_snapwave.f90 +++ b/source/src/sfincs_snapwave.f90 @@ -37,6 +37,7 @@ module sfincs_snapwave real*4 :: snapwave_hsmean real*4 :: snapwave_tpmean real*4 :: snapwave_tpigmean + real*4 :: snapwave_fwmaxfac ! contains ! @@ -512,6 +513,9 @@ subroutine update_wave_field(t, tloop) ! !$acc update device(fwuv) ! + ! Set wave forces fwmaxfac factor + fwmaxfac = snapwave_fwmaxfac + ! call system_clock(count1, count_rate, count_max) tloop = tloop + 1.0*(count1 - count0)/count_rate ! @@ -560,7 +564,9 @@ subroutine compute_snapwave(t) snapwave_Fy = Fy * rho * depth ! ! Pre-alculate wave forces limiter factor - !fwmaxfac = 0.25 * sqrt(g) * rho * gammax**2 / tpmean_bwv + snapwave_fwmaxfac = 0.25 * sqrt(g) * rho * gammax**2 / tpmean_bwv + ! + ! FIXME - should we limit snapwave_fwmaxfac to a certain range? ! ! Loop over points and set Tp, cg, direction, spreading to 0 where H and/or H_ig are zero ! TL: needed because e.g. Tp is set to Tpini initially, so shows values even if cell remains dry with H=0 diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index 4d9147751..13b7d9cbe 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -610,7 +610,7 @@ subroutine solve_energy_balance2Dstat(x,y,dhdx, dhdy, no_nodes,inner, & ! call determine_infragravity_source_sink_term(inner, no_nodes, ntheta, w, ds, prev, dtheta, cg_ig, nwav, depth, zb, H, & ee, ee_ig, ig_opt, alphaigfac, & - alphaig_local, beta_local, srcig_local) + alphaig_local, beta_local, srcig_local, gamma, gamma_fac_br) ! endif ! From 61c04d0636cf0634363ca18e6edb09e23a3a6698 Mon Sep 17 00:00:00 2001 From: Tim Leijnse Date: Wed, 20 May 2026 15:08:21 +0200 Subject: [PATCH 117/118] - bump date --- source/src/snapwave/snapwave_solver.f90 | 1 - 1 file changed, 1 deletion(-) diff --git a/source/src/snapwave/snapwave_solver.f90 b/source/src/snapwave/snapwave_solver.f90 index e5808848e..16af218f0 100644 --- a/source/src/snapwave/snapwave_solver.f90 +++ b/source/src/snapwave/snapwave_solver.f90 @@ -171,7 +171,6 @@ subroutine compute_wave_field() steep_fac1, steep_fac2, steep_fac3, steep_fac4, steep_fac5, & vegetation, no_secveg, veg_ah, veg_bstems, veg_Nstems, veg_Cd, Dveg, & zb, nwav, ig_opt, alpha_ig, gamma_ig, gamma_fac_br, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) - zb, nwav, ig_opt, alpha_ig, gamma_ig, gamma_fac_br, eeinc2ig, Tinc2ig, alphaigfac, shinc2ig, iterative_srcig) ! call timer(t3) ! From 5cd02d101b341e07d2ae021daeffce821e22727a Mon Sep 17 00:00:00 2001 From: Tim Leijnse Date: Wed, 27 May 2026 16:44:51 +0200 Subject: [PATCH 118/118] 336 direction dependent wavemaker issue (#337) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix directional asymmetry in wavemaker initialization for south-facing wavemakers Two bugs in initialize_wavemakers() that caused incorrect or zero forcing for wavemakers with phi in the south half-plane (Q3/Q4): Q3 validity check (phi ∈ [π, 1.5π)): wrong index passed to uv_index_z_nm — used Z-cell index ip instead of UV index nmu for the first left-neighbor (md1) check. This caused nearly all Q3 candidates to pass the validity filter, producing spurious wavemaker points for south-west-facing lines. "Below" direction angfac (Q3 nd1/nd2, Q4 nd1/nd2): sin(π − φ) ≡ sin(φ) and sin(φ) ≤ 0 for φ ∈ [π, 2π), so max(sin(π − φ), 0) always returned zero, silencing all south-pointing wavemaker UV faces. Fixed to max(−sin(φ), 0). * - Please double check this Claude bugfix #3 @maarten ! Fix wavemaker side-pointer not set for refined (*2) UV half-edges On quadtree-refined grids, each coarse cell side can have two UV faces (*1 and *2). Only the *1 face was stored in wavemaker_nmu/nmd/num/ndm, so the *2 face injected flux without the continuity solver tracking it, causing mass drift near the wavemaker. No effect on uniform grids. * - only write hm0_ig min/mean/max for wavemaker points * - Last small fixes * - Remove write statements * Warn on wavemaker points at refinement boundary Add a logical flag to detect wavemaker points adjacent to quadtree refinement and emit a log warning. Declares refinement_warning, initializes it to .false., sets it to .true. in the wavemaker point checks (where kcs(iz)==1), and writes a WARNING message to the log if any such cases are found. This helps notify users that wavemaker points along refinement boundaries are not recommended. * - Cleanup message --------- Co-authored-by: Maarten van Ormondt --- source/src/sfincs_lib.f90 | 4 +-- source/src/sfincs_wavemaker.f90 | 64 ++++++++++++++++++++++++++++----- 2 files changed, 58 insertions(+), 10 deletions(-) diff --git a/source/src/sfincs_lib.f90 b/source/src/sfincs_lib.f90 index f584c0bc7..607cdb22f 100644 --- a/source/src/sfincs_lib.f90 +++ b/source/src/sfincs_lib.f90 @@ -94,8 +94,8 @@ function sfincs_initialize() result(ierr) ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! - build_revision = "$Rev: v2.3.2 mt. Faber+branch:301-all-snapwave-changes-in-one" - build_date = "$Date: 2026-05-19" + build_revision = "$Rev: v2.3.2 mt. Faber+branch:336-added_onto_301" + build_date = "$Date: 2026-05-21" ! call write_log('', 1) call write_log('------------ Welcome to SFINCS ------------', 1) diff --git a/source/src/sfincs_wavemaker.f90 b/source/src/sfincs_wavemaker.f90 index 8d81b8891..28951f3ee 100644 --- a/source/src/sfincs_wavemaker.f90 +++ b/source/src/sfincs_wavemaker.f90 @@ -51,7 +51,7 @@ subroutine initialize_wavemakers() real*4, dimension(:), allocatable :: wavemaker_xfp real*4, dimension(:), allocatable :: wavemaker_yfp ! - logical :: iok, ok + logical :: iok, ok, refinement_warning ! integer ib1, ib2, ib, ic, nmb, nrwvm ! @@ -304,7 +304,7 @@ subroutine initialize_wavemakers() ! if (nmu>0) then ! - iz = uv_index_z_nm(ip) + iz = uv_index_z_nm(nmu) ! if (indwm(iz)==0) then ! @@ -759,6 +759,8 @@ subroutine initialize_wavemakers() write(logstr,*)'Setting wave makers ...' call write_log(logstr, 0) ! + refinement_warning = .false. ! set to true if we find a wavemaker point that has refinemed neighbor + ! do ip = 1, np ! if (kcs(ip)==4) then @@ -798,6 +800,8 @@ subroutine initialize_wavemakers() iz = uv_index_z_nmu(nmu) ! if (kcs(iz) == 1) then + ! + refinement_warning = .true. ! iwm = iwm + 1 ! @@ -807,6 +811,8 @@ subroutine initialize_wavemakers() wavemaker_idir(iwm) = 1 wavemaker_angfac(iwm) = max(cos(phi(ip) - 0.0), 0.0) ! + wavemaker_nmu(nok) = iwm + ! endif ! endif @@ -842,6 +848,8 @@ subroutine initialize_wavemakers() iz = uv_index_z_nmu(nmu) ! if (kcs(iz) == 1) then + ! + refinement_warning = .true. ! iwm = iwm + 1 ! @@ -851,6 +859,8 @@ subroutine initialize_wavemakers() wavemaker_idir(iwm) = 1 wavemaker_angfac(iwm) = max(sin(phi(ip) - 0.0), 0.0) ! + wavemaker_num(nok) = iwm + ! endif ! endif @@ -888,6 +898,8 @@ subroutine initialize_wavemakers() iz = uv_index_z_nm(nmu) ! if (kcs(iz) == 1) then + ! + refinement_warning = .true. ! iwm = iwm + 1 ! @@ -897,6 +909,8 @@ subroutine initialize_wavemakers() wavemaker_idir(iwm) = -1 wavemaker_angfac(iwm) = max(cos(pi - phi(ip)), 0.0) ! + wavemaker_nmd(nok) = iwm + ! endif ! endif @@ -932,6 +946,8 @@ subroutine initialize_wavemakers() iz = uv_index_z_nmu(nmu) ! if (kcs(iz) == 1) then + ! + refinement_warning = .true. ! iwm = iwm + 1 ! @@ -941,6 +957,8 @@ subroutine initialize_wavemakers() wavemaker_idir(iwm) = 1 wavemaker_angfac(iwm) = max(sin(phi(ip) - 0.0), 0.0) ! + wavemaker_num(nok) = iwm + ! endif ! endif @@ -978,6 +996,8 @@ subroutine initialize_wavemakers() iz = uv_index_z_nm(nmu) ! if (kcs(iz) == 1) then + ! + refinement_warning = .true. ! iwm = iwm + 1 ! @@ -987,6 +1007,8 @@ subroutine initialize_wavemakers() wavemaker_idir(iwm) = -1 wavemaker_angfac(iwm) = max(cos(pi - phi(ip)), 0.0) ! + wavemaker_nmd(nok) = iwm + ! endif ! endif @@ -1007,7 +1029,7 @@ subroutine initialize_wavemakers() wavemaker_index_nmi(iwm) = iz wavemaker_index_nmb(iwm) = ip wavemaker_idir(iwm) = -1 - wavemaker_angfac(iwm) = max(sin(pi - phi(ip)), 0.0) + wavemaker_angfac(iwm) = max(-sin(phi(ip)), 0.0) ! wavemaker_ndm(nok) = iwm ! @@ -1022,6 +1044,8 @@ subroutine initialize_wavemakers() iz = uv_index_z_nm(nmu) ! if (kcs(iz) == 1) then + ! + refinement_warning = .true. ! iwm = iwm + 1 ! @@ -1029,7 +1053,9 @@ subroutine initialize_wavemakers() wavemaker_index_nmi(iwm) = iz wavemaker_index_nmb(iwm) = ip wavemaker_idir(iwm) = -1 - wavemaker_angfac(iwm) = max(sin(pi - phi(ip)), 0.0) + wavemaker_angfac(iwm) = max(-sin(phi(ip)), 0.0) + ! + wavemaker_ndm(nok) = iwm ! endif ! @@ -1067,6 +1093,8 @@ subroutine initialize_wavemakers() iz = uv_index_z_nmu(nmu) ! if (kcs(iz) == 1) then + ! + refinement_warning = .true. ! iwm = iwm + 1 ! @@ -1076,6 +1104,8 @@ subroutine initialize_wavemakers() wavemaker_idir(iwm) = 1 wavemaker_angfac(iwm) = max(cos(phi(ip) - 0.0), 0.0) ! + wavemaker_nmu(nok) = iwm + ! endif ! endif @@ -1096,7 +1126,7 @@ subroutine initialize_wavemakers() wavemaker_index_nmi(iwm) = iz wavemaker_index_nmb(iwm) = ip wavemaker_idir(iwm) = -1 - wavemaker_angfac(iwm) = max(sin(pi - phi(ip)), 0.0) + wavemaker_angfac(iwm) = max(-sin(phi(ip)), 0.0) ! wavemaker_ndm(nok) = iwm ! @@ -1111,6 +1141,8 @@ subroutine initialize_wavemakers() iz = uv_index_z_nm(nmu) ! if (kcs(iz) == 1) then + ! + refinement_warning = .true. ! iwm = iwm + 1 ! @@ -1118,7 +1150,9 @@ subroutine initialize_wavemakers() wavemaker_index_nmi(iwm) = iz wavemaker_index_nmb(iwm) = ip wavemaker_idir(iwm) = -1 - wavemaker_angfac(iwm) = max(sin(pi - phi(ip)), 0.0) + wavemaker_angfac(iwm) = max(-sin(phi(ip)), 0.0) + ! + wavemaker_ndm(nok) = iwm ! endif ! @@ -1128,6 +1162,15 @@ subroutine initialize_wavemakers() endif enddo ! + ! Give warning if we found a wavemaker point that has refined neighbor + ! + if (refinement_warning) then + ! + write(logstr,'(a)')' WARNING! Found wavemaker point along quadtree refinement boundary, this is not recommended! The simulation will continue.' + call write_log(logstr, 1) + ! + endif + ! ! Set flags for kcuv points ! do iwm = 1, wavemaker_nr_uv_points @@ -1482,7 +1525,7 @@ subroutine update_wavemaker_fluxes(t, dt, tloop) ! tp_ig = max(tp_ig, wavemaker_tpmin) ! - endif + endif ! ! Now determine zwav_ig and zwav_inc based on spectrum or monochromatic signal. ! Time series of zwav_ig and zwav_inc will be used to modulate water level at wave maker points. @@ -1522,7 +1565,7 @@ subroutine update_wavemaker_fluxes(t, dt, tloop) ! fm_inc = 1.0 / tp_inc ! Wave period ! - do ifreq = 1, wavemaker_nfreqs_ig + do ifreq = 1, wavemaker_nfreqs_inc ! wavemaker_phi_inc(ifreq) = modulo(wavemaker_phi_inc(ifreq) + wavemaker_dphi_inc(ifreq) * dt, 2 * pi) wavemaker_cost_inc(ifreq) = cos(2 * pi * t * wavemaker_freq_inc(ifreq) + wavemaker_phi_inc(ifreq)) @@ -1624,6 +1667,11 @@ subroutine update_wavemaker_fluxes(t, dt, tloop) ! zsnmb = zs0nmb + min(zinc + zig, wavemaker_gammax * dwvm) ! total water level in wave maker (i.e. mean water level plus wave) ! + if (( zinc + zig) > wavemaker_gammax * dwvm) then + write(*,*)'WARNING! Incident wave height at wave maker exceeds maximum allowed value based on local water depth! Value: ', zinc + zig, ' Max allowed: ', wavemaker_gammax * dwvm + endif + + ! endif ! if (subgrid) then