Skip to content

Commit 29de56c

Browse files
UNST-9664: dambreak may not have effect on 1d links (#797)
* UNST-9664: dambreak may not have effect on 1d links * UNST-9664: blank space commit * UNST-9664: Review comments * UNST0-9664: review comment part 2 * move test_dflowfm_dambreak for new unit test setup * UNST-9664: Kegen can contain negative values --------- Co-authored-by: FlorisBuwaldaDeltares <floris.buwalda@Deltares.nl>
1 parent e4c6021 commit 29de56c

File tree

5 files changed

+71
-2
lines changed

5 files changed

+71
-2
lines changed

src/engines_gpl/dflowfm/packages/dflowfm_kernel/src/dflowfm_kernel/compute/m_dambreak_breach.f90

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ module m_dambreak_breach
5050
have_dambreaks_links, should_write_dambreaks, set_flow_areas_for_dambreaks, &
5151
indicate_links_that_contain_dambreaks, get_active_dambreak_index, &
5252
get_dambreak_names, retrieve_set_of_flowlinks_dambreak, &
53-
update_counters_for_dambreaks, add_dambreak_signal
53+
update_counters_for_dambreaks, add_dambreak_signal, &
54+
remove_1d_links_from_dambreak_polygon_list
5455

5556
interface
5657
module subroutine adjust_bobs_for_dambreaks()
@@ -148,6 +149,11 @@ pure module function get_dambreak_names() result(names)
148149
character(len=128), dimension(:), allocatable :: names !< the dambreak names
149150
end function get_dambreak_names
150151

152+
pure module subroutine remove_1d_links_from_dambreak_polygon_list(numgen, kegen)
153+
integer, intent(inout) :: numgen !< number of flow links in kegen
154+
integer, dimension(:), intent(inout) :: kegen !< array with the link indices
155+
end subroutine remove_1d_links_from_dambreak_polygon_list
156+
151157
end interface
152158

153159
! This type was moved to the module level to work around a linker issue with intel oneapi 2025.3.2 and the gfortran linker on linux.

src/engines_gpl/dflowfm/packages/dflowfm_kernel/src/dflowfm_kernel/compute/m_dambreak_breach_submodule.f90

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1269,4 +1269,36 @@ subroutine calculate_start_link_and_widths(dambreak, start_location_x, start_loc
12691269
end do
12701270

12711271
end subroutine calculate_start_link_and_widths
1272+
1273+
!> Remove 1D links and 1D2D longitudinal links from the dambreak polygon list.
1274+
!! This function filters out flow links that are not suitable for dambreak calculations
1275+
!! by examining the flow link type (kcu). Only 2D flow links and 1D2D lateral links
1276+
!! are retained in the list.
1277+
!!
1278+
!! Flow link types filtered out:
1279+
!! - kcu = 1: 1D flow links
1280+
!! - kcu = 4: 1D2D longitudinal flow links
1281+
!!
1282+
!! The function compacts the kegen array by removing unwanted links and updates
1283+
!! numgen to reflect the new count of valid links.
1284+
pure module subroutine remove_1d_links_from_dambreak_polygon_list(numgen, kegen)
1285+
use m_flowgeom, only: kcu
1286+
use network_data, only: LINK_1D, LINK_1D2D_LONGITUDINAL, LINK_1D2D_STREETINLET, LINK_1D2D_ROOF
1287+
integer, intent(inout) :: numgen !< number of flow links in kegen
1288+
integer, dimension(:), intent(inout) :: kegen !< array with the link indices
1289+
integer :: i, cell, numcells
1290+
numcells = 0
1291+
do i = 1, numgen
1292+
cell = abs(kegen(i))
1293+
! remove 1d links and 1d2d longitudinal links from the dambreak polygon list.
1294+
select case (abs(kcu(cell)))
1295+
case(LINK_1D, LINK_1D2D_LONGITUDINAL, LINK_1D2D_STREETINLET, LINK_1D2D_ROOF)
1296+
case default
1297+
numcells = numcells + 1
1298+
kegen(numcells) = kegen(i)
1299+
end select
1300+
end do
1301+
numgen = numcells
1302+
end subroutine remove_1d_links_from_dambreak_polygon_list
1303+
12721304
end submodule m_dambreak_breach_submodule

src/engines_gpl/dflowfm/packages/dflowfm_kernel/src/dflowfm_kernel/prepost/flow_init_structurecontrol_implementation.f90

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
! Deltares, and remain the property of Stichting Deltares. All rights reserved.
2727
!
2828
!-------------------------------------------------------------------------------
29+
2930
!> submodule that contains the implementation of flow_init_structurecontrol.
3031
submodule(m_flow_init_structurecontrol) flow_init_structurecontrol_implementation
3132
use precision_basics, only: dp
@@ -53,7 +54,7 @@ module function flow_init_structurecontrol() result(status)
5354
use m_longculverts_data, only: nlongculverts
5455
use m_partitioninfo, only: jampi
5556
use messagehandling, only: IDLEN
56-
use m_dambreak_breach, only: update_counters_for_dambreaks, update_dambreak_administration
57+
use m_dambreak_breach, only: update_counters_for_dambreaks, update_dambreak_administration, remove_1d_links_from_dambreak_polygon_list
5758
use m_update_counters_for_structures, only: update_counters_for_dambreak_or_pump
5859
use m_1d_structures, only: update_bedlevels_for_bridges
5960

@@ -122,6 +123,7 @@ module function flow_init_structurecontrol() result(status)
122123
! NOTE: kegen below does not apply to general structures. Just a placeholder for the link snapping of all structure types.
123124
select case (pstru%type)
124125
case (ST_DAMBREAK)
126+
call remove_1d_links_from_dambreak_polygon_list(numgen, kegen)
125127
num_dambreak_links = num_dambreak_links + numgen
126128
call update_counters_for_dambreaks(pstru%id, numgen, dambridx, i, kedb, kegen)
127129
case (ST_PUMP)

src/engines_gpl/dflowfm/packages/dflowfm_kernel/test/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ f90twtest(${test_target}
2626
src/test_ec_module_block.f90
2727
src/test_unstruc_model.f90
2828
src/test_mdu_file_read_write.f90
29+
src/test_dflowfm_dambreak.f90
2930
F2HFILES
3031
${CMAKE_CURRENT_SOURCE_DIR}/src/test_dflowfm_kernel_example.f90
3132
${CMAKE_CURRENT_SOURCE_DIR}/src/test_3d_layer_administration.f90
@@ -37,6 +38,7 @@ f90twtest(${test_target}
3738
${CMAKE_CURRENT_SOURCE_DIR}/src/test_ec_module_block.f90
3839
${CMAKE_CURRENT_SOURCE_DIR}/src/test_unstruc_model.f90
3940
${CMAKE_CURRENT_SOURCE_DIR}/src/test_mdu_file_read_write.f90
41+
${CMAKE_CURRENT_SOURCE_DIR}/src/test_dflowfm_dambreak.f90
4042
OUTDIR "${CMAKE_CURRENT_BINARY_DIR}"
4143
LIBRARIES dflowfm_kernel test_helpers
4244
VISUAL_STUDIO_PATH engines_gpl/dflowfm/test
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
module test_dflowfm_dambreak
2+
use assertions_gtest
3+
implicit none
4+
5+
contains
6+
7+
!$f90tw TESTCODE(TEST, test_skip_1d_flowlinks, test_skip_1d_flowlinks, test_skip_1d_flowlinks,
8+
!> Test whether remove_1d_links_from_dambreak_polygon_list removes 1D flow links from the list of polygon vertices in a dambreak test case. This is necessary to prevent the 1D flow links
9+
subroutine test_skip_1d_flowlinks() bind(C)
10+
use precision, only: dp
11+
use m_flowgeom, only: kcu
12+
use m_dambreak_breach, only: remove_1d_links_from_dambreak_polygon_list
13+
integer, parameter :: PATH_LENGTH = 2
14+
integer :: num_cells
15+
integer, dimension(:), allocatable :: cell_numbers
16+
real(kind=dp), parameter :: tolerance = 1e-8_dp
17+
real(kind=dp), dimension(PATH_LENGTH) :: x, y, running_distance, expected_running_distance
18+
19+
cell_numbers = [1, 2, 3, 4, 5, 6, 7, 8]
20+
kcu = [2, 4, 2, 3, 1, 2, -1, -2 ]
21+
num_cells = size(cell_numbers)
22+
call remove_1d_links_from_dambreak_polygon_list(num_cells, cell_numbers)
23+
call f90_expect_eq(num_cells, 5, "number of cells must be equal to 5")
24+
call f90_expect_true(all(cell_numbers(1:num_cells) == [1, 3, 4, 6, 8]), "cells numbers must be equal to [1, 3, 4, 6, 8]")
25+
end subroutine test_skip_1d_flowlinks
26+
!$f90tw)
27+
end module test_dflowfm_dambreak

0 commit comments

Comments
 (0)