<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD Journal Publishing with OASIS Tables v3.0 20080202//EN" "https://jats.nlm.nih.gov/nlm-dtd/publishing/3.0/journalpub-oasis3.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:oasis="http://docs.oasis-open.org/ns/oasis-exchange/table" xml:lang="en" dtd-version="3.0" article-type="research-article">
  <front>
    <journal-meta><journal-id journal-id-type="publisher">GMD</journal-id><journal-title-group>
    <journal-title>Geoscientific Model Development</journal-title>
    <abbrev-journal-title abbrev-type="publisher">GMD</abbrev-journal-title><abbrev-journal-title abbrev-type="nlm-ta">Geosci. Model Dev.</abbrev-journal-title>
  </journal-title-group><issn pub-type="epub">1991-9603</issn><publisher>
    <publisher-name>Copernicus Publications</publisher-name>
    <publisher-loc>Göttingen, Germany</publisher-loc>
  </publisher></journal-meta>
    <article-meta>
      <article-id pub-id-type="doi">10.5194/gmd-19-3953-2026</article-id><title-group><article-title><monospace>SWEpy</monospace>: an open-source GPU-accelerated solver for near-field inundation and far-field tsunami modeling</article-title><alt-title><monospace>SWEpy</monospace></alt-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author" corresp="no" rid="aff1">
          <name><surname>Fuenzalida</surname><given-names>Juan</given-names></name>
          
        <ext-link>https://orcid.org/0009-0000-2075-8394</ext-link></contrib>
        <contrib contrib-type="author" corresp="no" rid="aff2">
          <name><surname>Kusanovic</surname><given-names>Danilo</given-names></name>
          
        </contrib>
        <contrib contrib-type="author" corresp="yes" rid="aff1">
          <name><surname>Meza</surname><given-names>Joaquín</given-names></name>
          <email>joaquin.meza@usm.cl</email>
        <ext-link>https://orcid.org/0000-0002-4513-549X</ext-link></contrib>
        <contrib contrib-type="author" corresp="no" rid="aff3">
          <name><surname>Meneses</surname><given-names>Rodrigo</given-names></name>
          
        </contrib>
        <contrib contrib-type="author" corresp="no" rid="aff1">
          <name><surname>Catalán</surname><given-names>Patricio A.</given-names></name>
          
        <ext-link>https://orcid.org/0000-0002-6567-5776</ext-link></contrib>
        <aff id="aff1"><label>1</label><institution>Departamento de Obras Civiles, Universidad Técnica Federico Santa María, Valparaiso, Chile</institution>
        </aff>
        <aff id="aff2"><label>2</label><institution>Department of Civil and Environmental Engineering, University of California Davis, Davis, CA, 95616, USA</institution>
        </aff>
        <aff id="aff3"><label>3</label><institution>Escuela de Ingenieria Civil, Universidad de Valparaiso, Valparaiso, Chile</institution>
        </aff>
      </contrib-group>
      <author-notes><corresp id="corr1">Joaquín Meza (joaquin.meza@usm.cl)</corresp></author-notes><pub-date><day>13</day><month>May</month><year>2026</year></pub-date>
      
      <volume>19</volume>
      <issue>9</issue>
      <fpage>3953</fpage><lpage>3987</lpage>
      <history>
        <date date-type="received"><day>12</day><month>August</month><year>2025</year></date>
           <date date-type="rev-request"><day>4</day><month>October</month><year>2025</year></date>
           <date date-type="rev-recd"><day>3</day><month>February</month><year>2026</year></date>
           <date date-type="accepted"><day>25</day><month>March</month><year>2026</year></date>
      </history>
      <permissions>
        <copyright-statement>Copyright: © 2026 Juan Fuenzalida et al.</copyright-statement>
        <copyright-year>2026</copyright-year>
      <license license-type="open-access"><license-p>This work is licensed under the Creative Commons Attribution 4.0 International License. To view a copy of this licence, visit <ext-link ext-link-type="uri" xlink:href="https://creativecommons.org/licenses/by/4.0/">https://creativecommons.org/licenses/by/4.0/</ext-link></license-p></license></permissions><self-uri xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026.html">This article is available from https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026.html</self-uri><self-uri xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026.pdf">The full text article is available as a PDF file from https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026.pdf</self-uri>
      <abstract><title>Abstract</title>

      <p id="d2e134">We present <monospace>SWEpy</monospace>, an open-source Python finite volume (FV) software for solving the shallow water equations (SWEs) on unstructured triangular meshes. The framework combines flexibility and high performance through GPU acceleration and a well-balanced, positivity-preserving, higher-order central-upwind (CU) scheme. These features are required for simulation of hydrodynamic phenomena such as tsunami propagation, flooding, and dam-break flows in complex and large geometries.</p>

      <p id="d2e140">To reduce numerical diffusion, a phenomenon commonly encountered in FV methods, <monospace>SWEpy</monospace> incorporates a second-order WENO reconstruction together with a third-order strong stability-preserving Runge–Kutta time integration scheme. These numerical components are particularly well-suited for far-field tsunami modeling, where minimizing artificial diffusion is essential to accurately preserve wave amplitude, phase, and dispersion over long propagation distances.</p>

      <p id="d2e146">The performance, stability, and accuracy of <monospace>SWEpy</monospace> are validated using canonical benchmarks, including Synolakis’ conical island and Bryson’s flow over a Gaussian bump. Its capabilities are further demonstrated through large-scale simulations of the 1959 Malpasset Dam failure and the 2010 Maule tsunami, highlighting its effectiveness in realistic scenarios. Overall, these results show that <monospace>SWEpy</monospace> framework delivers high-resolution solutions on consumer-grade hardware, providing a user-friendly and computationally efficient platform for both research applications and operational forecasting.</p>
  </abstract>
    </article-meta>
  </front>
<body>
      

<sec id="Ch1.S1" sec-type="intro">
  <label>1</label><title>Introduction</title>
      <p id="d2e164">Accurate simulation of hazardous hydrological events – such as dam failures, tsunamis, and urban flooding – is essential for risk assessment, emergency planning, and the operation of early warning systems <xref ref-type="bibr" rid="bib1.bibx18 bib1.bibx30 bib1.bibx58 bib1.bibx7 bib1.bibx40" id="paren.1"/>. Accordingly, over the past three decades, a wide range of numerical tools has been developed for these applications, including both open-source and commercial software <xref ref-type="bibr" rid="bib1.bibx3 bib1.bibx44" id="paren.2"/>. These software enable stakeholders to generate reliable data for evaluating community vulnerability.</p>
      <p id="d2e173">However, emerging global challenges – including rapid urbanization, climate change, and increasing socio-economic uncertainty, particularly in developing regions <xref ref-type="bibr" rid="bib1.bibx88" id="paren.3"/> – are placing greater demands on risk management frameworks. Meeting these demands requires advanced modeling tools that are not only accurate and computationally efficient, but also flexible, scalable, and accessible to a diverse range of users across research, planning, and operational settings. In this context, open-source software plays an important role by enabling collaborative development, encouraging users to extend, adapt, and improve models while remaining accessible without commercial barriers.</p>
      <p id="d2e179">To better understand the current landscape, we compile a representative (though not exhaustive) set of freely available shallow water equation (SWE) solvers in Table <xref ref-type="table" rid="T1"/>, highlighting key features such as numerical schemes, grid types, and parallelization capabilities. As shown, while many tools excel in specific applications – such as rainfall–runoff modeling or flood simulation – there remains a gap in flexible solvers that combine unstructured triangular meshes with high-order reconstruction methods for improved accuracy in complex geometries.</p>

<table-wrap id="T1" specific-use="star" orientation="landscape"><label>Table 1</label><caption><p id="d2e188">Overview of some of the openly available SWE solvers, highlighting application scope, numerical formulation, grid type, and parallel execution strategies. The <italic>Parallelization framework</italic> column identifies the primary model-level parallel approach (e.g., MPI, OpenMP, CUDA, Kokkos, CuPy), while the <italic>GPU</italic> column indicates the availability of native GPU acceleration. The table is not intended to be exhaustive, but rather to contextualize SWEpy relative to commonly used flooding and tsunami models.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="8">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="left"/>
     <oasis:colspec colnum="3" colname="col3" align="left"/>
     <oasis:colspec colnum="4" colname="col4" align="left"/>
     <oasis:colspec colnum="5" colname="col5" align="left"/>
     <oasis:colspec colnum="6" colname="col6" align="left"/>
     <oasis:colspec colnum="7" colname="col7" align="left"/>
     <oasis:colspec colnum="8" colname="col8" align="left"/>
     <oasis:thead>
       <oasis:row>
         <oasis:entry colname="col1"/>
         <oasis:entry colname="col2"/>
         <oasis:entry colname="col3"/>
         <oasis:entry colname="col4">Parallelization</oasis:entry>
         <oasis:entry colname="col5">License/</oasis:entry>
         <oasis:entry colname="col6"/>
         <oasis:entry colname="col7"/>
         <oasis:entry colname="col8"/>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Model</oasis:entry>
         <oasis:entry colname="col2">Reference</oasis:entry>
         <oasis:entry colname="col3">GPU</oasis:entry>
         <oasis:entry colname="col4">framework</oasis:entry>
         <oasis:entry colname="col5">Availability</oasis:entry>
         <oasis:entry colname="col6">Scope</oasis:entry>
         <oasis:entry colname="col7">Scheme type</oasis:entry>
         <oasis:entry colname="col8">Grid</oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">SERGHEI-SWE</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx19" id="text.4"/>
                  </oasis:entry>
         <oasis:entry colname="col3">Yes</oasis:entry>
         <oasis:entry colname="col4">MPI <inline-formula><mml:math id="M4" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> Kokkos</oasis:entry>
         <oasis:entry colname="col5">Open-source (BSD)</oasis:entry>
         <oasis:entry colname="col6">Rainfall runoff</oasis:entry>
         <oasis:entry colname="col7">FV Roe</oasis:entry>
         <oasis:entry colname="col8">Cartesian</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">TRITON</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx64" id="text.5"/>
                  </oasis:entry>
         <oasis:entry colname="col3">Yes</oasis:entry>
         <oasis:entry colname="col4">MPI <inline-formula><mml:math id="M5" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> CUDA</oasis:entry>
         <oasis:entry colname="col5">Open-source (BSD)</oasis:entry>
         <oasis:entry colname="col6">Flooding</oasis:entry>
         <oasis:entry colname="col7">FV Roe</oasis:entry>
         <oasis:entry colname="col8">Cartesian</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">PARFLOOD</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx89" id="text.6"/>
                  </oasis:entry>
         <oasis:entry colname="col3">Yes</oasis:entry>
         <oasis:entry colname="col4">MPI <inline-formula><mml:math id="M6" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> CUDA</oasis:entry>
         <oasis:entry colname="col5">Upon request</oasis:entry>
         <oasis:entry colname="col6">Flooding</oasis:entry>
         <oasis:entry colname="col7">FV HLLC</oasis:entry>
         <oasis:entry colname="col8">Cartesian</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">HiPIMS</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx93" id="text.7"/>
                  </oasis:entry>
         <oasis:entry colname="col3">Yes</oasis:entry>
         <oasis:entry colname="col4">CUDA</oasis:entry>
         <oasis:entry colname="col5">Open-source (GPLv3)</oasis:entry>
         <oasis:entry colname="col6">Rainfall runoff</oasis:entry>
         <oasis:entry colname="col7">FV HLLC</oasis:entry>
         <oasis:entry colname="col8">Cartesian</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">DRR/FI</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx48" id="text.8"/>
                  </oasis:entry>
         <oasis:entry colname="col3">No</oasis:entry>
         <oasis:entry colname="col4">MPI</oasis:entry>
         <oasis:entry colname="col5">–</oasis:entry>
         <oasis:entry colname="col6">Rainfall runoff</oasis:entry>
         <oasis:entry colname="col7">FD Leapfrog</oasis:entry>
         <oasis:entry colname="col8">Cartesian</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">SW2D-GPU</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx16" id="text.9"/>
                  </oasis:entry>
         <oasis:entry colname="col3">Yes</oasis:entry>
         <oasis:entry colname="col4">CUDA</oasis:entry>
         <oasis:entry colname="col5">Open-source</oasis:entry>
         <oasis:entry colname="col6">Flooding, lake water level</oasis:entry>
         <oasis:entry colname="col7">FD Leapfrog</oasis:entry>
         <oasis:entry colname="col8">Cartesian</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">LisFlood-FP 8.0</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx76" id="text.10"/>
                  </oasis:entry>
         <oasis:entry colname="col3">Yes</oasis:entry>
         <oasis:entry colname="col4">CUDA</oasis:entry>
         <oasis:entry colname="col5">Open-source (GPLv3)</oasis:entry>
         <oasis:entry colname="col6">Flooding</oasis:entry>
         <oasis:entry colname="col7">FE/FV DG</oasis:entry>
         <oasis:entry colname="col8">Cartesian</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">IBER</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx34" id="text.11"/>
                  </oasis:entry>
         <oasis:entry colname="col3">Yes</oasis:entry>
         <oasis:entry colname="col4">CUDA</oasis:entry>
         <oasis:entry colname="col5">Freeware</oasis:entry>
         <oasis:entry colname="col6">Flooding, rivers, estuaries</oasis:entry>
         <oasis:entry colname="col7">FV Roe</oasis:entry>
         <oasis:entry colname="col8">Unstr. tri. &amp; quad.</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">SW2D-Lemon</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx78" id="text.12"/>
                  </oasis:entry>
         <oasis:entry colname="col3">No</oasis:entry>
         <oasis:entry colname="col4">–</oasis:entry>
         <oasis:entry colname="col5">Freeware</oasis:entry>
         <oasis:entry colname="col6">Flooding (upscaled model)</oasis:entry>
         <oasis:entry colname="col7">FV HLL</oasis:entry>
         <oasis:entry colname="col8">Unstr. poly.</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">B-flood</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx46" id="text.13"/>
                  </oasis:entry>
         <oasis:entry colname="col3">No</oasis:entry>
         <oasis:entry colname="col4">–</oasis:entry>
         <oasis:entry colname="col5">Open-source (GPL)</oasis:entry>
         <oasis:entry colname="col6">Flash flooding</oasis:entry>
         <oasis:entry colname="col7">FV HLLC</oasis:entry>
         <oasis:entry colname="col8">Adaptive quad.</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">FullSWOF</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx27" id="text.14"/>
                  </oasis:entry>
         <oasis:entry colname="col3">No</oasis:entry>
         <oasis:entry colname="col4">MPI</oasis:entry>
         <oasis:entry colname="col5">Open-source (CeCILL)</oasis:entry>
         <oasis:entry colname="col6">Rainfall runoff</oasis:entry>
         <oasis:entry colname="col7">FV HLLC</oasis:entry>
         <oasis:entry colname="col8">Cartesian</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">TELEMAC</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx66" id="text.15"/>
                  </oasis:entry>
         <oasis:entry colname="col3">No</oasis:entry>
         <oasis:entry colname="col4">MPI</oasis:entry>
         <oasis:entry colname="col5">Open-source (GPLv3)</oasis:entry>
         <oasis:entry colname="col6">General purpose</oasis:entry>
         <oasis:entry colname="col7">Various FE/FV Godunov</oasis:entry>
         <oasis:entry colname="col8">Unstr. tri.</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">GeoClaw</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx9" id="text.16"/>
                  </oasis:entry>
         <oasis:entry colname="col3">Partial<sup>c</sup></oasis:entry>
         <oasis:entry colname="col4">OpenMP</oasis:entry>
         <oasis:entry colname="col5">Open-source (BSD)</oasis:entry>
         <oasis:entry colname="col6">General purpose</oasis:entry>
         <oasis:entry colname="col7">FV wave-propagation (Godunov-type)</oasis:entry>
         <oasis:entry colname="col8">Adaptive Cartesian</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">HEC-RAS 2D</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx12" id="text.17"/>
                  </oasis:entry>
         <oasis:entry colname="col3">Partial<sup>a</sup></oasis:entry>
         <oasis:entry colname="col4">–</oasis:entry>
         <oasis:entry colname="col5">Freeware</oasis:entry>
         <oasis:entry colname="col6">Channel, floodplain</oasis:entry>
         <oasis:entry colname="col7">Implicit FV</oasis:entry>
         <oasis:entry colname="col8">Unstr. poly.</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">HMS</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx77" id="text.18"/>
                  </oasis:entry>
         <oasis:entry colname="col3">No</oasis:entry>
         <oasis:entry colname="col4">MPI</oasis:entry>
         <oasis:entry colname="col5">Open-source (GPL)</oasis:entry>
         <oasis:entry colname="col6">Overland flow with transport-reaction</oasis:entry>
         <oasis:entry colname="col7">FV HLLC</oasis:entry>
         <oasis:entry colname="col8">Unstr. tri. &amp; quad.</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">COMCOT</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx92" id="text.19"/>
                  </oasis:entry>
         <oasis:entry colname="col3">No</oasis:entry>
         <oasis:entry colname="col4">OpenMP</oasis:entry>
         <oasis:entry colname="col5">Open-source (GPL)</oasis:entry>
         <oasis:entry colname="col6">Tsunami GPI<sup>b</sup></oasis:entry>
         <oasis:entry colname="col7">FD Leapfrog</oasis:entry>
         <oasis:entry colname="col8">Cartesian</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">Tsunami-HySEA</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx62" id="text.20"/>
                  </oasis:entry>
         <oasis:entry colname="col3">Yes</oasis:entry>
         <oasis:entry colname="col4">CUDA</oasis:entry>
         <oasis:entry colname="col5">Open-source (GPL)</oasis:entry>
         <oasis:entry colname="col6">Tsunami GPI</oasis:entry>
         <oasis:entry colname="col7">FV WAF</oasis:entry>
         <oasis:entry colname="col8">Cartesian</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">TsunAWI</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx6" id="text.21"/>
                  </oasis:entry>
         <oasis:entry colname="col3">No</oasis:entry>
         <oasis:entry colname="col4">MPI</oasis:entry>
         <oasis:entry colname="col5">Open-source (GPL)</oasis:entry>
         <oasis:entry colname="col6">Tsunami GPI</oasis:entry>
         <oasis:entry colname="col7">FE LC–LNC</oasis:entry>
         <oasis:entry colname="col8">Unstr. tri.</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">MOST</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx84" id="text.22"/>
                  </oasis:entry>
         <oasis:entry colname="col3">No</oasis:entry>
         <oasis:entry colname="col4">OpenMP/OpenACC/OpenCL</oasis:entry>
         <oasis:entry colname="col5">Upon request</oasis:entry>
         <oasis:entry colname="col6">Tsunami GPI</oasis:entry>
         <oasis:entry colname="col7">FD</oasis:entry>
         <oasis:entry colname="col8">Cartesian</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">ADCIRC</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx83" id="text.23"/>
                  </oasis:entry>
         <oasis:entry colname="col3">No</oasis:entry>
         <oasis:entry colname="col4">MPI</oasis:entry>
         <oasis:entry colname="col5">Upon request</oasis:entry>
         <oasis:entry colname="col6">Coastal, storm surge</oasis:entry>
         <oasis:entry colname="col7">FE Galerkin</oasis:entry>
         <oasis:entry colname="col8">Unstr. tri.</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">exaHyPE</oasis:entry>
         <oasis:entry colname="col2">
                    <xref ref-type="bibr" rid="bib1.bibx72" id="text.24"/>
                  </oasis:entry>
         <oasis:entry colname="col3">Yes</oasis:entry>
         <oasis:entry colname="col4">Multiple</oasis:entry>
         <oasis:entry colname="col5">Open-source (BSD)</oasis:entry>
         <oasis:entry colname="col6">General hyperbolic PDEs</oasis:entry>
         <oasis:entry colname="col7">ADER-DG/FV</oasis:entry>
         <oasis:entry colname="col8">Adaptive Cartesian</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><monospace>SWEpy</monospace></oasis:entry>
         <oasis:entry colname="col2">This article</oasis:entry>
         <oasis:entry colname="col3">Yes</oasis:entry>
         <oasis:entry colname="col4">CuPy (CUDA)</oasis:entry>
         <oasis:entry colname="col5">Open-source (GPL)</oasis:entry>
         <oasis:entry colname="col6">General purpose</oasis:entry>
         <oasis:entry colname="col7">FV Central-Upwind</oasis:entry>
         <oasis:entry colname="col8">Unstr. tri.</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table><table-wrap-foot><p id="d2e197"><sup>a</sup> GPU support in development (HEC-RAS 2025 Alpha). <sup>b</sup> Generation, Propagation, Inundation. <sup>c</sup> GPU support under active development (not yet merged into the main release). MPI is available in the dispersive (SGN) version through PETSc.</p></table-wrap-foot></table-wrap>

      <p id="d2e1034">These programs solve nonlinear SWEs, which have become the cornerstone of two-dimensional free-surface flow modeling across a wide range of applications <xref ref-type="bibr" rid="bib1.bibx28" id="paren.25"/>. However, the growing demand for higher spatial resolution and real-time performance has motivated alternative approaches. Some efforts have focused on simplified formulations <xref ref-type="bibr" rid="bib1.bibx25" id="paren.26"/> or machine-learning surrogates <xref ref-type="bibr" rid="bib1.bibx45 bib1.bibx96 bib1.bibx75" id="paren.27"/> to reduce computational cost, often at the expense of physical fidelity <xref ref-type="bibr" rid="bib1.bibx31" id="paren.28"/>. In contrast, a more robust strategy relies on parallelization, leveraging high-performance computing on CPUs and GPUs <xref ref-type="bibr" rid="bib1.bibx19 bib1.bibx64 bib1.bibx72" id="paren.29"/> to achieve significant speedups without compromising accuracy.</p>
      <p id="d2e1052">Indeed, several mature SWE solvers have demonstrated strong performance and robustness in large-scale, real-world applications. Examples include Tsunami-HySEA <xref ref-type="bibr" rid="bib1.bibx62" id="paren.30"/>, GeoClaw <xref ref-type="bibr" rid="bib1.bibx9" id="paren.31"/>, MOST <xref ref-type="bibr" rid="bib1.bibx84" id="paren.32"/>, ADCIRC <xref ref-type="bibr" rid="bib1.bibx83" id="paren.33"/>, exaHYPE <xref ref-type="bibr" rid="bib1.bibx72" id="paren.34"/>, and TsunAWI <xref ref-type="bibr" rid="bib1.bibx6" id="paren.35"/>. These software exploit parallelization through OpenMP, MPI, CUDA, or hybrid approaches, and employ either fixed meshes or adaptive mesh refinement (AMR) to efficiently capture localized dynamics. Their successful deployment in tsunami early-warning systems, coastal hazard analysis, and continental-scale flooding underscores the critical role of scalable high-performance computing in SWE modeling.</p>
      <p id="d2e1074">Despite their advanced capabilities, many existing solvers are implemented in low-level languages such as FORTRAN, C<inline-formula><mml:math id="M10" display="inline"><mml:mrow><mml:mo>+</mml:mo><mml:mo>+</mml:mo></mml:mrow></mml:math></inline-formula>, or C, and depend on specialized APIs (e.g., CUDA, MPI, or OpenMP). While these choices enable high performance, they can also limit accessibility for users without advanced programming expertise. In contrast, high-level languages like Python provide a more accessible alternative. However, efficient parallelization in Python is not straightforward due to limitations such as the Global Interpreter Lock <xref ref-type="bibr" rid="bib1.bibx87" id="paren.36"/>. To overcome these challenges, libraries such as Numba <xref ref-type="bibr" rid="bib1.bibx56" id="paren.37"/>, PyCUDA <xref ref-type="bibr" rid="bib1.bibx47" id="paren.38"/>, TensorFlow <xref ref-type="bibr" rid="bib1.bibx1" id="paren.39"/>, PyTorch <xref ref-type="bibr" rid="bib1.bibx2" id="paren.40"/>, and Dask <xref ref-type="bibr" rid="bib1.bibx73" id="paren.41"/> enable efficient parallel execution – particularly on GPUs – through compiled kernels and SIMD-based approaches.</p>
      <p id="d2e1106">In this context, CuPy <xref ref-type="bibr" rid="bib1.bibx70" id="paren.42"/> provides a particularly attractive solution. As a drop-in replacement for NumPy <xref ref-type="bibr" rid="bib1.bibx41" id="paren.43"/>, CuPy executes array operations using NVIDIA CUDA kernels, enabling seamless GPU acceleration with minimal code modification. By building on the mature CUDA ecosystem, it supports custom kernels, reproducible high-performance execution, and scalable multi-GPU workflows – all while maintaining a user-friendly interface that avoids low-level GPU programming. While today experimental support exists for alternative backends in CuPy, the focus on a well-established CUDA platform provides a robust and reliable foundation for advanced numerical modeling without sacrificing efficiency or accessibility.</p>
      <p id="d2e1115">Although most SWE solvers incorporate some form of parallelization, they vary significantly in scope, numerical methods, grid geometries, and implementation/parallelization strategies (e.g., CUDA, Kokkos, MPI, or OpenMP). Some are tailored to specific applications, such as rainfall–runoff modeling (e.g., SERGHEI-SWE, HiPIMS) or tsunami generation-propagation-inundation (e.g., COMCOT, Tsunami-HySEA, TsunAWI), while others are designed for more general-purpose simulations. This diversity reflects necessary design trade-offs, but also highlights the lack of a unified framework that combines flexibility across these dimensions.</p>
      <p id="d2e1119">A key factor influencing both solver performance and applicability is grid discretization. Structured Cartesian grids are widely used due to their simplicity and computational efficiency, particularly when combined with adaptive mesh refinement (AMR). In contrast, unstructured triangular meshes provide greater geometric flexibility, enabling localized refinement in regions with complex bathymetry, irregular coastlines, or urban features without requiring hierarchical grid structures <xref ref-type="bibr" rid="bib1.bibx74" id="paren.44"/>. This flexibility makes them especially well-suited for multi-scale problems – such as tsunami propagation coupled with near-shore inundation – where localized resolution is critical, and can eliminate the need for nested grids in complex simulations <xref ref-type="bibr" rid="bib1.bibx39 bib1.bibx10" id="paren.45"/>.</p>
      <p id="d2e1128">A large class of SWE solvers is based on finite-volume (FV) Godunov-type schemes, which employ approximate Riemann solvers – such as Roe, HLL, or HLLC – to compute numerical fluxes. These methods are well established, robust, and highly optimized for large-scale applications, providing accurate resolution of wave propagation and discontinuities. An alternative class of methods are offered by central-upwind (CU) schemes, which avoid the explicit solution of Riemann problems by estimating local propagation speeds to construct numerical fluxes. Although not intended to replace Riemann-solver-based methods, CU schemes provide a conceptually simpler and more flexible framework, particularly attractive for implementations on unstructured grids and for coupling with high-order reconstruction techniques. Originally introduced for Cartesian grids by <xref ref-type="bibr" rid="bib1.bibx52" id="text.46"/> and later extended to triangular meshes by <xref ref-type="bibr" rid="bib1.bibx50" id="text.47"/>, CU schemes approximate fluxes by integrating over local Riemann fans defined by these estimated speeds.</p>
      <p id="d2e1137">Despite their advantages, CU formulations for the SWE are often affected by excessive numerical diffusion. Recent efforts to mitigate this issue have largely focused on Cartesian-grid finite-difference formulations <xref ref-type="bibr" rid="bib1.bibx53 bib1.bibx24 bib1.bibx26" id="paren.48"/>, leaving triangular FV implementations comparatively underexplored. One promising strategy to reduce diffusion while preserving the CU framework is the incorporation of high-order polynomial reconstructions. However, advanced schemes such as ENO/WENO <xref ref-type="bibr" rid="bib1.bibx95" id="paren.49"/> introduce significant computational overhead due to large stencils, smoothness indicator evaluations, and potentially complex neighbor-search procedures. In this context, high-performance computing becomes essential. Although high-order WENO schemes can be computationally prohibitive in serial CPU implementations, their high arithmetic intensity makes them particularly well suited for GPU acceleration, where their computational cost can be effectively amortized.</p>
      <p id="d2e1146">Furthermore, the behavior of the SWE is governed not only by flux terms but also by source terms in the balance equations, as well as domain characteristics such as bathymetry and boundary conditions. This diversity of physical settings requires numerical formulations that can accommodate a broad range of scenarios while maintaining both accuracy and stability. In addition to the choice of numerical flux, the design of spatial discretization plays a critical role and must satisfy key physical and numerical properties, including well-balancing and positivity preservation, as extensively discussed in the literature (e.g., <xref ref-type="bibr" rid="bib1.bibx52 bib1.bibx50 bib1.bibx86" id="altparen.50"/>). Well-balancing ensures the exact preservation of steady states – such as a lake at rest over variable topography or geostrophic equilibrium – thereby preventing spurious oscillations that can degrade accuracy in long-term or large-scale simulations. Positivity preservation, on the other hand, guarantees non-negative water depths, which is essential for stable and physically meaningful solutions near wet-dry interfaces. Achieving these properties requires carefully designed reconstruction operators that are consistently integrated with the underlying numerical scheme.</p>
      <p id="d2e1152">Motivated by these considerations, we introduce <monospace>SWEpy</monospace>, an open-source, Python-based FV solver for the SWE on unstructured triangular grids with GPU acceleration. The proposed framework is designed to overcome limitations of existing approaches by enabling efficient and flexible modeling of both near-field and far-field phenomena within a unified formulation. The main contributions of this work are threefold: (1) the development of a CU scheme extended to higher-order accuracy through quadratic WENO reconstruction and third-order strong-stability-preserving (SSP) Runge–Kutta time integration, reducing numerical diffusion while accurately capturing both shock-dominated and wave-propagation regimes; (2) an open-source release under the GNU General Public License (GPL), promoting transparency, reproducibility, and community-driven development; and (3) a Python/CuPy implementation that enables efficient GPU acceleration on CUDA-compatible hardware, lowering the barrier to high-performance computing while maintaining computational efficiency. <monospace>SWEpy</monospace> is designed to be well-balanced and positivity-preserving, and its performance is validated against both canonical benchmarks and real-world applications, including the Malpasset dam-break (near-field inundation) and the 2010 Maule tsunami (basin-scale propagation). Building on these results, the remainder of this paper is organized as follows: Sect. <xref ref-type="sec" rid="Ch1.S2"/> presents the governing equations and FV formulation; Sect. <xref ref-type="sec" rid="Ch1.S3"/> describes the numerical scheme and reconstruction procedures; Sect. <xref ref-type="sec" rid="Ch1.S4"/> details the Python/CuPy implementation; Sect. <xref ref-type="sec" rid="Ch1.S5"/> presents validation and performance results; and Sect. <xref ref-type="sec" rid="Ch1.S6"/> concludes with a discussion of implications and future directions.</p>
</sec>
<sec id="Ch1.S2">
  <label>2</label><title>Problem Setting</title>
      <p id="d2e1180">This section defines the physical problem, presents the governing equations, and derives the semi-discrete form of the SWEs, which provides the foundation for the CU scheme with WENO reconstruction on unstructured triangular grids implemented in <monospace>SWEpy</monospace>.</p>
<sec id="Ch1.S2.SS1">
  <label>2.1</label><title>Governing Equations</title>
      <p id="d2e1193">The SWEs, originally introduced in one dimension by Saint-Venant (1871), are obtained in two dimensions through a depth-averaging of the Navier–Stokes equations under the hydrostatic pressure assumption. Assuming incompressibility and an appropriate scaling in which vertical accelerations are negligible, the vertical momentum equation reduces to a hydrostatic pressure distribution. This simplification allows the continuity and horizontal momentum equations to be integrated from the bed to the free surface, yielding a system expressed in terms of depth-averaged variables <xref ref-type="bibr" rid="bib1.bibx17 bib1.bibx22 bib1.bibx42 bib1.bibx91" id="paren.51"/>. The resulting equations constitute the foundation of computational models for free-surface flows in rivers, coastal regions, and urban floodplains, and are capable of describing a wide range of phenomena, including flood waves, tsunamis, and storm surges <xref ref-type="bibr" rid="bib1.bibx28" id="paren.52"/>.</p>
      <p id="d2e1202">To establish a consistent notation, we define the state vector <inline-formula><mml:math id="M11" display="inline"><mml:mrow><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>=</mml:mo><mml:mo>(</mml:mo><mml:mi>h</mml:mi><mml:mo>,</mml:mo><mml:mi>h</mml:mi><mml:mi>u</mml:mi><mml:mo>,</mml:mo><mml:mi>h</mml:mi><mml:mi>v</mml:mi><mml:msup><mml:mo>)</mml:mo><mml:mo>⊤</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula>, where <inline-formula><mml:math id="M12" display="inline"><mml:mrow><mml:mi>h</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>,</mml:mo><mml:mi>t</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> denotes the water depth measured from the bathymetry <inline-formula><mml:math id="M13" display="inline"><mml:mrow><mml:mi>B</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> to the free surface <inline-formula><mml:math id="M14" display="inline"><mml:mrow><mml:mi>w</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>,</mml:mo><mml:mi>t</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> relative to the <inline-formula><mml:math id="M15" display="inline"><mml:mrow><mml:mi>z</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:math></inline-formula> reference plane. The variables <inline-formula><mml:math id="M16" display="inline"><mml:mrow><mml:mi>u</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>,</mml:mo><mml:mi>t</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M17" display="inline"><mml:mrow><mml:mi>v</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>,</mml:mo><mml:mi>t</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> represent the depth-averaged velocity components in the <inline-formula><mml:math id="M18" display="inline"><mml:mi>x</mml:mi></mml:math></inline-formula> and <inline-formula><mml:math id="M19" display="inline"><mml:mi>y</mml:mi></mml:math></inline-formula> directions, while <inline-formula><mml:math id="M20" display="inline"><mml:mrow><mml:mi>h</mml:mi><mml:mi>u</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>,</mml:mo><mml:mi>t</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M21" display="inline"><mml:mrow><mml:mi>h</mml:mi><mml:mi>v</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>,</mml:mo><mml:mi>t</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> correspond to the associated discharge fluxes. Scalar quantities (e.g., <inline-formula><mml:math id="M22" display="inline"><mml:mi>h</mml:mi></mml:math></inline-formula>) are denoted by regular symbols, whereas vector quantities (e.g., <inline-formula><mml:math id="M23" display="inline"><mml:mi mathvariant="bold-italic">q</mml:mi></mml:math></inline-formula>) are indicated in bold. A schematic representation of these variables is provided in Fig. <xref ref-type="fig" rid="F1"/>.</p>

      <fig id="F1" specific-use="star"><label>Figure 1</label><caption><p id="d2e1436">Model setting and physical variables used in the SWE.</p></caption>
          <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f01.png"/>

        </fig>

      <p id="d2e1446">This definition of variables allows to express the SWEs in conserved vector form as:

            <disp-formula id="Ch1.E1" content-type="numbered"><label>1</label><mml:math id="M24" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mi>t</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:mi mathvariant="bold-italic">f</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:msub><mml:mo>)</mml:mo><mml:mi>x</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:mi mathvariant="bold-italic">g</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:msub><mml:mo>)</mml:mo><mml:mi>y</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mi mathvariant="normal">B</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>)</mml:mo><mml:mo>+</mml:mo><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>)</mml:mo><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          where <inline-formula><mml:math id="M25" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:mo>⋅</mml:mo><mml:msub><mml:mo>)</mml:mo><mml:mi>t</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M26" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:mo>⋅</mml:mo><mml:msub><mml:mo>)</mml:mo><mml:mi>x</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, and <inline-formula><mml:math id="M27" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:mo>⋅</mml:mo><mml:msub><mml:mo>)</mml:mo><mml:mi>y</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> denote partial derivatives with respect to <inline-formula><mml:math id="M28" display="inline"><mml:mi>t</mml:mi></mml:math></inline-formula>, <inline-formula><mml:math id="M29" display="inline"><mml:mi>x</mml:mi></mml:math></inline-formula>, and <inline-formula><mml:math id="M30" display="inline"><mml:mi>y</mml:mi></mml:math></inline-formula>, respectively. In addition, the associated vector quantities are

                <disp-formula specific-use="gather" content-type="numbered"><mml:math id="M31" display="block"><mml:mtable displaystyle="true"><mml:mlabeledtr id="Ch1.E2"><mml:mtd><mml:mtext>2</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>=</mml:mo><mml:mo>(</mml:mo><mml:mi>h</mml:mi><mml:mo>,</mml:mo><mml:mi>h</mml:mi><mml:mi>u</mml:mi><mml:mo>,</mml:mo><mml:mi>h</mml:mi><mml:mi>v</mml:mi><mml:msup><mml:mo>)</mml:mo><mml:mo>⊤</mml:mo></mml:msup><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="Ch1.E3"><mml:mtd><mml:mtext>3</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mi mathvariant="bold-italic">f</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:msup><mml:mfenced open="(" close=")"><mml:mrow><mml:mi>h</mml:mi><mml:mi>u</mml:mi><mml:mo>,</mml:mo><mml:mi>h</mml:mi><mml:msup><mml:mi>u</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>+</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mi>g</mml:mi><mml:msup><mml:mi>h</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow><mml:mn mathvariant="normal">2</mml:mn></mml:mfrac></mml:mstyle><mml:mo>,</mml:mo><mml:mi>h</mml:mi><mml:mi>u</mml:mi><mml:mi>v</mml:mi></mml:mrow></mml:mfenced><mml:mo>⊤</mml:mo></mml:msup><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="Ch1.E4"><mml:mtd><mml:mtext>4</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mi mathvariant="bold-italic">g</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:msup><mml:mfenced close=")" open="("><mml:mrow><mml:mi>h</mml:mi><mml:mi>v</mml:mi><mml:mo>,</mml:mo><mml:mi>h</mml:mi><mml:mi>u</mml:mi><mml:mi>v</mml:mi><mml:mo>,</mml:mo><mml:mi>h</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>+</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mi>g</mml:mi><mml:msup><mml:mi>h</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow><mml:mn mathvariant="normal">2</mml:mn></mml:mfrac></mml:mstyle></mml:mrow></mml:mfenced><mml:mo>⊤</mml:mo></mml:msup><mml:mo>,</mml:mo><mml:mspace width="1em" linebreak="nobreak"/><mml:mtext>and</mml:mtext></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="Ch1.E5"><mml:mtd><mml:mtext>5</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mi mathvariant="normal">B</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:msup><mml:mfenced close=")" open="("><mml:mrow><mml:mn mathvariant="normal">0</mml:mn><mml:mo>,</mml:mo><mml:mo>-</mml:mo><mml:mi>g</mml:mi><mml:mi>h</mml:mi><mml:msub><mml:mi>B</mml:mi><mml:mi>x</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:mo>-</mml:mo><mml:mi>g</mml:mi><mml:mi>h</mml:mi><mml:msub><mml:mi>B</mml:mi><mml:mi>y</mml:mi></mml:msub></mml:mrow></mml:mfenced><mml:mo>⊤</mml:mo></mml:msup><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr></mml:mtable></mml:math></disp-formula>

          where <inline-formula><mml:math id="M32" display="inline"><mml:mrow><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> denotes additional source terms, including Coriolis forcing, bottom friction, rheological effects, and turbulence.</p>
      <p id="d2e1812">In this study, we consider bottom friction <inline-formula><mml:math id="M33" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mi mathvariant="normal">F</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> and Coriolis forcing <inline-formula><mml:math id="M34" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mi mathvariant="normal">C</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula>, which are particularly relevant for modeling dam-break flows and large-scale tsunami propagation, respectively. Bottom friction is modeled using the semi-empirical Manning–Strickler formulation <xref ref-type="bibr" rid="bib1.bibx22" id="paren.53"/>, while the Coriolis term accounts for rotational effects. These source terms are given by

                <disp-formula specific-use="gather" content-type="numbered"><mml:math id="M35" display="block"><mml:mtable displaystyle="true"><mml:mlabeledtr id="Ch1.E6"><mml:mtd><mml:mtext>6</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:msub><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mi mathvariant="normal">C</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:msup><mml:mfenced close=")" open="("><mml:mrow><mml:mn mathvariant="normal">0</mml:mn><mml:mo>,</mml:mo><mml:mi>f</mml:mi><mml:mi>h</mml:mi><mml:mi>v</mml:mi><mml:mo>,</mml:mo><mml:mo>-</mml:mo><mml:mi>f</mml:mi><mml:mi>h</mml:mi><mml:mi>u</mml:mi></mml:mrow></mml:mfenced><mml:mo>⊤</mml:mo></mml:msup><mml:mo>,</mml:mo><mml:mtext>and</mml:mtext></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="Ch1.E7"><mml:mtd><mml:mtext>7</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mtable class="split" rowspacing="0.2ex" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mi mathvariant="normal">F</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mo>=</mml:mo><mml:mfenced open="(" close=""><mml:mrow><mml:mn mathvariant="normal">0</mml:mn><mml:mo>,</mml:mo><mml:mo>-</mml:mo><mml:mi>g</mml:mi><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msup><mml:mi>n</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow><mml:mrow><mml:msup><mml:mi>h</mml:mi><mml:mrow><mml:mn mathvariant="normal">7</mml:mn><mml:mo>/</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:mfrac></mml:mstyle><mml:mi>h</mml:mi><mml:mi>u</mml:mi><mml:msqrt><mml:mrow><mml:mo>(</mml:mo><mml:mi>h</mml:mi><mml:mi>u</mml:mi><mml:msup><mml:mo>)</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>+</mml:mo><mml:mo>(</mml:mo><mml:mi>h</mml:mi><mml:mi>v</mml:mi><mml:msup><mml:mo>)</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:msqrt><mml:mo>,</mml:mo></mml:mrow></mml:mfenced></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:msup><mml:mfenced open="" close=")"><mml:mrow><mml:mo>-</mml:mo><mml:mi>g</mml:mi><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msup><mml:mi>n</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow><mml:mrow><mml:msup><mml:mi>h</mml:mi><mml:mrow><mml:mn mathvariant="normal">7</mml:mn><mml:mo>/</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:mfrac></mml:mstyle><mml:mi>h</mml:mi><mml:mi>v</mml:mi><mml:msqrt><mml:mrow><mml:mo>(</mml:mo><mml:mi>h</mml:mi><mml:mi>u</mml:mi><mml:msup><mml:mo>)</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>+</mml:mo><mml:mo>(</mml:mo><mml:mi>h</mml:mi><mml:mi>v</mml:mi><mml:msup><mml:mo>)</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:msqrt></mml:mrow></mml:mfenced><mml:mo>⊤</mml:mo></mml:msup><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mtd></mml:mlabeledtr></mml:mtable></mml:math></disp-formula>

          where <inline-formula><mml:math id="M36" display="inline"><mml:mi>n</mml:mi></mml:math></inline-formula> denotes the Manning friction coefficient and <inline-formula><mml:math id="M37" display="inline"><mml:mi>f</mml:mi></mml:math></inline-formula> is the Coriolis parameter, typically approximated as <inline-formula><mml:math id="M38" display="inline"><mml:mrow><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">4</mml:mn></mml:mrow></mml:msup><mml:mo>,</mml:mo><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> <xref ref-type="bibr" rid="bib1.bibx49" id="paren.54"/>. For long-range tsunami propagation, both bathymetric and Coriolis source terms (<inline-formula><mml:math id="M39" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mi mathvariant="normal">B</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M40" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mi mathvariant="normal">C</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>) are considered, whereas flooding applications incorporate bathymetry and bottom friction (<inline-formula><mml:math id="M41" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mi mathvariant="normal">B</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M42" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mi mathvariant="normal">F</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>).</p>
      <p id="d2e2145">The resulting system of nonlinear hyperbolic equations requires robust numerical methods to accurately capture shocks and maintain stability, particularly in the presence of complex geometries and wet-dry interfaces. These challenges are addressed in <monospace>SWEpy</monospace> through a CU scheme on unstructured triangular grids, as detailed in Sect. 3.</p>
</sec>
<sec id="Ch1.S2.SS2">
  <label>2.2</label><title>Semi-discrete formulation</title>
      <p id="d2e2159">FVMs provide a robust framework for solving the SWEs, ensuring conservation of mass and momentum while accurately handling discontinuities such as shocks and wet-dry fronts <xref ref-type="bibr" rid="bib1.bibx57 bib1.bibx65 bib1.bibx85" id="paren.55"/>. In this approach, the governing equations are integrated over discrete control volumes, yielding cell-averaged quantities that are evolved in time through numerical fluxes evaluated at cell interfaces. This formulation naturally captures sharp features, such as hydraulic jumps and bore propagation, without the need for additional artificial viscosity <xref ref-type="bibr" rid="bib1.bibx79" id="paren.56"/>, making it particularly well suited for shallow water flows characterized by abrupt regime transitions.</p>
      <p id="d2e2168">To improve well-balancing<fn id="Ch1.Footn1"><p id="d2e2171">This means the exact preservation of steady states, particularly in the presence of variable bathymetry.</p></fn>, we reformulate the system by expressing the conserved variables in terms of the free-surface elevation <inline-formula><mml:math id="M43" display="inline"><mml:mrow><mml:mi>w</mml:mi><mml:mo>=</mml:mo><mml:mi>h</mml:mi><mml:mo>+</mml:mo><mml:mi>B</mml:mi></mml:mrow></mml:math></inline-formula> rather than the water depth <inline-formula><mml:math id="M44" display="inline"><mml:mi>h</mml:mi></mml:math></inline-formula>. Specifically, the state vector becomes <inline-formula><mml:math id="M45" display="inline"><mml:mrow><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>,</mml:mo><mml:mi>t</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mo>(</mml:mo><mml:mi>w</mml:mi><mml:mo>,</mml:mo><mml:mi>h</mml:mi><mml:mi>u</mml:mi><mml:mo>,</mml:mo><mml:mi>h</mml:mi><mml:mi>v</mml:mi><mml:msup><mml:mo>)</mml:mo><mml:mo>⊤</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula>. This substitution mitigates numerical imbalances associated with topographic gradients and leads to the following system:

            <disp-formula id="Ch1.E8" content-type="numbered"><label>8</label><mml:math id="M46" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mi>t</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:mi mathvariant="bold-italic">F</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>,</mml:mo><mml:mi>B</mml:mi><mml:msub><mml:mo>)</mml:mo><mml:mi>x</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:mi mathvariant="bold-italic">G</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>,</mml:mo><mml:mi>B</mml:mi><mml:msub><mml:mo>)</mml:mo><mml:mi>y</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mi mathvariant="normal">B</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>,</mml:mo><mml:mi>B</mml:mi><mml:mo>)</mml:mo><mml:mo>+</mml:mo><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>,</mml:mo><mml:mi>B</mml:mi><mml:mo>)</mml:mo><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          where

                <disp-formula specific-use="gather" content-type="numbered"><mml:math id="M47" display="block"><mml:mtable displaystyle="true"><mml:mlabeledtr id="Ch1.E9"><mml:mtd><mml:mtext>9</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mi mathvariant="bold-italic">F</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>,</mml:mo><mml:mi>B</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:msup><mml:mfenced close=")" open="("><mml:mrow><mml:mi>h</mml:mi><mml:mi>u</mml:mi><mml:mo>,</mml:mo><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mo>(</mml:mo><mml:mi>h</mml:mi><mml:mi>u</mml:mi><mml:msup><mml:mo>)</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow><mml:mrow><mml:mi>w</mml:mi><mml:mo>-</mml:mo><mml:mi>B</mml:mi></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>+</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mn mathvariant="normal">2</mml:mn></mml:mfrac></mml:mstyle><mml:mi>g</mml:mi><mml:mo>(</mml:mo><mml:mi>w</mml:mi><mml:mo>-</mml:mo><mml:mi>B</mml:mi><mml:msup><mml:mo>)</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>,</mml:mo><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mo>(</mml:mo><mml:mi>h</mml:mi><mml:mi>u</mml:mi><mml:mo>)</mml:mo><mml:mo>(</mml:mo><mml:mi>h</mml:mi><mml:mi>v</mml:mi><mml:mo>)</mml:mo></mml:mrow><mml:mrow><mml:mi>w</mml:mi><mml:mo>-</mml:mo><mml:mi>B</mml:mi></mml:mrow></mml:mfrac></mml:mstyle></mml:mrow></mml:mfenced><mml:mo>⊤</mml:mo></mml:msup><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="Ch1.E10"><mml:mtd><mml:mtext>10</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mi mathvariant="bold-italic">G</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>,</mml:mo><mml:mi>B</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:msup><mml:mfenced close=")" open="("><mml:mrow><mml:mi>h</mml:mi><mml:mi>v</mml:mi><mml:mo>,</mml:mo><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mo>(</mml:mo><mml:mi>h</mml:mi><mml:mi>u</mml:mi><mml:mo>)</mml:mo><mml:mo>(</mml:mo><mml:mi>h</mml:mi><mml:mi>v</mml:mi><mml:mo>)</mml:mo></mml:mrow><mml:mrow><mml:mi>w</mml:mi><mml:mo>-</mml:mo><mml:mi>B</mml:mi></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>,</mml:mo><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mo>(</mml:mo><mml:mi>h</mml:mi><mml:mi>v</mml:mi><mml:msup><mml:mo>)</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow><mml:mrow><mml:mi>w</mml:mi><mml:mo>-</mml:mo><mml:mi>B</mml:mi></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>+</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mn mathvariant="normal">2</mml:mn></mml:mfrac></mml:mstyle><mml:mi>g</mml:mi><mml:mo>(</mml:mo><mml:mi>w</mml:mi><mml:mo>-</mml:mo><mml:mi>B</mml:mi><mml:msup><mml:mo>)</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:mfenced><mml:mo>⊤</mml:mo></mml:msup><mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr></mml:mtable></mml:math></disp-formula></p>
      <p id="d2e2550">We then consider a triangular discretization of the polygonal spatial domain <inline-formula><mml:math id="M48" display="inline"><mml:mrow><mml:mi mathvariant="normal">Ω</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mo>⋃</mml:mo><mml:mi>j</mml:mi></mml:msub><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, including additional “ghost” cells for boundary conditions, as displayed in Fig. <xref ref-type="fig" rid="F2"/> (bottom border). Integrating Eq. (<xref ref-type="disp-formula" rid="Ch1.E8"/>) over each cell <inline-formula><mml:math id="M49" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> and applying the Gauss divergence theorem yields:

            <disp-formula id="Ch1.E11" content-type="numbered"><label>11</label><mml:math id="M50" display="block"><mml:mrow><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mi>d</mml:mi><mml:mrow><mml:mi mathvariant="normal">d</mml:mi><mml:mi>t</mml:mi></mml:mrow></mml:mfrac></mml:mstyle><mml:munder><mml:mo movablelimits="false">∫</mml:mo><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:munder><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mi mathvariant="normal">d</mml:mi><mml:mi mathvariant="normal">Ω</mml:mi><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mo>+</mml:mo><mml:munder><mml:mo movablelimits="false">∮</mml:mo><mml:mrow><mml:mo>∂</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:munder><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">F</mml:mi><mml:mo>,</mml:mo><mml:mi mathvariant="bold-italic">G</mml:mi><mml:mo>)</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">n</mml:mi><mml:mo stretchy="false" mathvariant="normal">^</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:mi mathvariant="normal">d</mml:mi><mml:msub><mml:mi>l</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mo>=</mml:mo><mml:mspace width="0.125em" linebreak="nobreak"/><mml:munder><mml:mo movablelimits="false">∫</mml:mo><mml:mi mathvariant="normal">Ω</mml:mi></mml:munder><mml:mo mathsize="1.1em">(</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mi>B</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mo mathsize="1.1em">)</mml:mo><mml:mi mathvariant="normal">d</mml:mi><mml:mi mathvariant="normal">Ω</mml:mi><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>

      <fig id="F2" specific-use="star"><label>Figure 2</label><caption><p id="d2e2689">Illustration of a triangular unstructured grid. The figure shows on the  left an example of a finite volume grid, while on the right a typical triangular cell with some attributes used in the semi-discrete formulation.</p></caption>
          <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f02.png"/>

        </fig>

      <p id="d2e2698">Let <inline-formula><mml:math id="M51" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> (<inline-formula><mml:math id="M52" display="inline"><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:math></inline-formula>) denote the cells neighboring <inline-formula><mml:math id="M53" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>. Now, let <inline-formula><mml:math id="M54" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> be the barycenter of <inline-formula><mml:math id="M55" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, and <inline-formula><mml:math id="M56" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Γ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> the edge shared with <inline-formula><mml:math id="M57" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>, with length <inline-formula><mml:math id="M58" display="inline"><mml:mrow><mml:msub><mml:mi>l</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>. The outward unit normal vector to <inline-formula><mml:math id="M59" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Γ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> is given by <inline-formula><mml:math id="M60" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">n</mml:mi><mml:mo mathvariant="normal" stretchy="false">^</mml:mo></mml:mover><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mfenced open="(" close=")"><mml:mrow><mml:mi>cos⁡</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>)</mml:mo><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mo>,</mml:mo><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mi>sin⁡</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:mfenced></mml:mrow></mml:math></inline-formula>, where <inline-formula><mml:math id="M61" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> denotes its orientation. Then, the semi-discrete formulation is written as

            <disp-formula id="Ch1.E12" content-type="numbered"><label>12</label><mml:math id="M62" display="block"><mml:mrow><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mi>d</mml:mi><mml:mrow><mml:mi mathvariant="normal">d</mml:mi><mml:mi>t</mml:mi></mml:mrow></mml:mfrac></mml:mstyle><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>t</mml:mi><mml:mo>)</mml:mo><mml:mo>+</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mrow><mml:mi mathvariant="normal">|</mml:mi><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mi mathvariant="normal">|</mml:mi></mml:mrow></mml:mfrac></mml:mstyle><mml:munder><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>∈</mml:mo><mml:msub><mml:mi mathvariant="script">N</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:munder><mml:msub><mml:mi mathvariant="script">F</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mspace linebreak="nobreak" width="0.125em"/><mml:msub><mml:mi>l</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mrow><mml:msub><mml:mi mathvariant="normal">B</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          where <inline-formula><mml:math id="M63" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mstyle displaystyle="false"><mml:mfrac style="text"><mml:mn mathvariant="normal">1</mml:mn><mml:mrow><mml:mo>|</mml:mo><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi><mml:mo>|</mml:mo></mml:mrow></mml:mfrac></mml:mstyle><mml:msub><mml:mo>∫</mml:mo><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:msub><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>,</mml:mo><mml:mi>t</mml:mi><mml:mo>)</mml:mo><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mi mathvariant="normal">d</mml:mi><mml:mi mathvariant="normal">Ω</mml:mi></mml:mrow></mml:math></inline-formula> denotes the cell-averaged state, and <inline-formula><mml:math id="M64" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="script">F</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> is the numerical flux across the interface <inline-formula><mml:math id="M65" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Γ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>, accounting for interactions between neighboring cells. This flux is constructed from the physical flux functions <inline-formula><mml:math id="M66" display="inline"><mml:mi mathvariant="bold-italic">F</mml:mi></mml:math></inline-formula> and <inline-formula><mml:math id="M67" display="inline"><mml:mi mathvariant="bold-italic">G</mml:mi></mml:math></inline-formula> in Eq. (<xref ref-type="disp-formula" rid="Ch1.E9"/>) and depends on reconstructed states at the interface, denoted <inline-formula><mml:math id="M68" display="inline"><mml:mrow><mml:msubsup><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M69" display="inline"><mml:mrow><mml:msubsup><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup></mml:mrow></mml:math></inline-formula>, obtained via suitable reconstruction operators.</p>
      <p id="d2e3143">The boundary integrals are evaluated using Gaussian quadrature, with the number of quadrature points determined by the order of the reconstruction. Since the reconstructed states are time-dependent, Eq. (<xref ref-type="disp-formula" rid="Ch1.E12"/>) defines a system of ordinary differential equations that needs to be integrated numerically. In this equation, the terms <inline-formula><mml:math id="M70" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mrow><mml:msub><mml:mi mathvariant="normal">B</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M71" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> represent consistent discretizations of the bathymetric and additional source terms, respectively, and will be detailed in the following sections. This formulation provides the basis for the CU discretization described in Sect. 3.</p>
</sec>
</sec>
<sec id="Ch1.S3">
  <label>3</label><title><monospace>SWEpy</monospace> Numerical Model</title>
      <p id="d2e3192">Building on the semi-discrete formulation, <monospace>SWEpy</monospace> employs a CU FVM for solving hyperbolic conservation laws on unstructured triangular grids. This approach was originally introduced by <xref ref-type="bibr" rid="bib1.bibx50" id="text.57"/>, with parallel developments addressing well-balancing and related formulations by <xref ref-type="bibr" rid="bib1.bibx13" id="text.58"/> and <xref ref-type="bibr" rid="bib1.bibx94" id="text.59"/>, and further refined in subsequent studies. This section presents a concise description of the numerical formulation adopted in this work.</p>
<sec id="Ch1.S3.SS1">
  <label>3.1</label><title>Central-Upwind Numerical Fluxes on Triangular Grids</title>
      <p id="d2e3214">The CU scheme avoids the explicit solution of Riemann problems by estimating local wave propagation speeds to construct numerical fluxes. This results in a method that balances computational simplicity with robustness, making it particularly well suited for shallow water flows over complex geometries, including variable bathymetry and wet-dry interfaces.</p>
      <p id="d2e3218">The numerical flux <inline-formula><mml:math id="M72" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="script">F</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> in Eq. (<xref ref-type="disp-formula" rid="Ch1.E12"/>) is formulated as the projection onto the edge-normal direction <inline-formula><mml:math id="M73" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Γ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>:

            <disp-formula id="Ch1.E13" content-type="numbered"><label>13</label><mml:math id="M74" display="block"><mml:mtable rowspacing="0.2ex" class="split" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi mathvariant="script">F</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mo>=</mml:mo><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mo mathsize="1.5em">(</mml:mo><mml:msub><mml:mi>F</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mi>cos⁡</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>)</mml:mo><mml:mo>+</mml:mo><mml:msub><mml:mi>G</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mi>sin⁡</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>)</mml:mo><mml:mo mathsize="1.5em">)</mml:mo><mml:mo>-</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="normal">out</mml:mi></mml:msubsup></mml:mrow><mml:mrow><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup><mml:mo>+</mml:mo><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup></mml:mrow></mml:mfrac></mml:mstyle></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>s</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi>s</mml:mi></mml:msub></mml:mrow></mml:munderover><mml:msub><mml:mi>c</mml:mi><mml:mi>s</mml:mi></mml:msub><mml:mo mathsize="1.1em">[</mml:mo><mml:msubsup><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo>-</mml:mo><mml:msubsup><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo mathsize="1.1em">]</mml:mo><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>

          where <inline-formula><mml:math id="M75" display="inline"><mml:mrow><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup></mml:mrow></mml:math></inline-formula> are the Gaussian quadrature points along the edge, and <inline-formula><mml:math id="M76" display="inline"><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mi>s</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> are the associated weights. The number of integration points <inline-formula><mml:math id="M77" display="inline"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi>s</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> depends on the reconstruction order to ensure accurate integration. The terms <inline-formula><mml:math id="M78" display="inline"><mml:mrow><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M79" display="inline"><mml:mrow><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup></mml:mrow></mml:math></inline-formula> represent the inward and outward local propagation speeds, given in Eq. (<xref ref-type="disp-formula" rid="Ch1.E19"/>). In addition, the flux projection components in Eq. (<xref ref-type="disp-formula" rid="Ch1.E13"/>) are:

                <disp-formula specific-use="gather" content-type="numbered"><mml:math id="M80" display="block"><mml:mtable displaystyle="true"><mml:mlabeledtr id="Ch1.E14"><mml:mtd><mml:mtext>14</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mtable class="split" rowspacing="0.2ex" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi>F</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mrow><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup><mml:mo>+</mml:mo><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup></mml:mrow></mml:mfrac></mml:mstyle><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>s</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi>s</mml:mi></mml:msub></mml:mrow></mml:munderover><mml:msub><mml:mi>c</mml:mi><mml:mi>s</mml:mi></mml:msub><mml:mfenced close="" open="["><mml:mrow><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup><mml:mi mathvariant="bold-italic">F</mml:mi><mml:mfenced open="(" close=")"><mml:mrow><mml:msubsup><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo>,</mml:mo><mml:mi>B</mml:mi><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:mfenced></mml:mrow></mml:mfenced></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mfenced close="]" open=""><mml:mrow><mml:mo>+</mml:mo><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup><mml:mi mathvariant="bold-italic">F</mml:mi><mml:mfenced open="(" close=")"><mml:mrow><mml:msubsup><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo>,</mml:mo><mml:mi>B</mml:mi><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:mfenced></mml:mrow></mml:mfenced><mml:mo>,</mml:mo><mml:mspace linebreak="nobreak" width="1em"/><mml:mtext>and</mml:mtext></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="Ch1.E15"><mml:mtd><mml:mtext>15</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mtable rowspacing="0.2ex" class="split" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi>G</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mrow><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup><mml:mo>+</mml:mo><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup></mml:mrow></mml:mfrac></mml:mstyle><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>s</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi>s</mml:mi></mml:msub></mml:mrow></mml:munderover><mml:msub><mml:mi>c</mml:mi><mml:mi>s</mml:mi></mml:msub><mml:mfenced open="[" close=""><mml:mrow><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup><mml:mi mathvariant="bold-italic">G</mml:mi><mml:mfenced open="(" close=")"><mml:mrow><mml:msubsup><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo>,</mml:mo><mml:mi>B</mml:mi><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:mfenced></mml:mrow></mml:mfenced></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mfenced open="" close="]"><mml:mrow><mml:mo>+</mml:mo><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup><mml:mi mathvariant="bold-italic">G</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:msubsup><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo>,</mml:mo><mml:mi>B</mml:mi><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:mfenced></mml:mrow></mml:mfenced><mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mtd></mml:mlabeledtr></mml:mtable></mml:math></disp-formula>

          In Eqs. (<xref ref-type="disp-formula" rid="Ch1.E14"/>) and (<xref ref-type="disp-formula" rid="Ch1.E15"/>), the vectors <inline-formula><mml:math id="M81" display="inline"><mml:mrow><mml:msubsup><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M82" display="inline"><mml:mrow><mml:msubsup><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup></mml:mrow></mml:math></inline-formula> denote the limiting values of <inline-formula><mml:math id="M83" display="inline"><mml:mrow><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> at the interface point <inline-formula><mml:math id="M84" display="inline"><mml:mrow><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup></mml:mrow></mml:math></inline-formula> approached from within <inline-formula><mml:math id="M85" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M86" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>, respectively. Moreover, due to the form of the fluxes <inline-formula><mml:math id="M87" display="inline"><mml:mrow><mml:msub><mml:mi>F</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M88" display="inline"><mml:mrow><mml:msub><mml:mi>G</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>, divisions by zero may arise near wet–dry interfaces. To prevent such singularities, a consistent flux treatment is required, as addressed through the positivity-preserving reconstruction described in Sect. 3.4.</p>
      <p id="d2e4053">Substituting Eqs. (<xref ref-type="disp-formula" rid="Ch1.E13"/>), (<xref ref-type="disp-formula" rid="Ch1.E14"/>) and (<xref ref-type="disp-formula" rid="Ch1.E15"/>) into Eq. (<xref ref-type="disp-formula" rid="Ch1.E12"/>) yields

            <disp-formula id="Ch1.E16" content-type="numbered"><label>16</label><mml:math id="M89" display="block"><mml:mrow><mml:mtable class="split" rowspacing="0.2ex" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mi mathvariant="normal">d</mml:mi><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub></mml:mrow><mml:mrow><mml:mi mathvariant="normal">d</mml:mi><mml:mi>t</mml:mi></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>=</mml:mo><mml:mo>-</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mrow><mml:mo>|</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>|</mml:mo></mml:mrow></mml:mfrac></mml:mstyle><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mn mathvariant="normal">3</mml:mn></mml:munderover><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msub><mml:mi>l</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mi>cos⁡</mml:mi><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow><mml:mrow><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup><mml:mo>+</mml:mo><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup></mml:mrow></mml:mfrac></mml:mstyle><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>s</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi>s</mml:mi></mml:msub></mml:mrow></mml:munderover><mml:msub><mml:mi>c</mml:mi><mml:mi>s</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mfenced close="]" open="["><mml:mrow><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup><mml:mi mathvariant="bold-italic">F</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo>,</mml:mo><mml:mi>B</mml:mi><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:mfenced><mml:mo>+</mml:mo><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup><mml:mi mathvariant="bold-italic">F</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo>,</mml:mo><mml:mi>B</mml:mi><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:mfenced></mml:mrow></mml:mfenced></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mo>-</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mrow><mml:mo>|</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>|</mml:mo></mml:mrow></mml:mfrac></mml:mstyle><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mn mathvariant="normal">3</mml:mn></mml:munderover><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msub><mml:mi>l</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mi>sin⁡</mml:mi><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow><mml:mrow><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup><mml:mo>+</mml:mo><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup></mml:mrow></mml:mfrac></mml:mstyle><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>s</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi>s</mml:mi></mml:msub></mml:mrow></mml:munderover><mml:msub><mml:mi>c</mml:mi><mml:mi>s</mml:mi></mml:msub><mml:mfenced close="" open="["><mml:mrow><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup><mml:mi mathvariant="bold-italic">G</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo>,</mml:mo><mml:mi>B</mml:mi><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:mfenced></mml:mrow></mml:mfenced></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mfenced close="]" open=""><mml:mrow><mml:mo>+</mml:mo><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup><mml:mi mathvariant="bold-italic">G</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo>,</mml:mo><mml:mi>B</mml:mi><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:mfenced></mml:mrow></mml:mfenced></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mo>+</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mrow><mml:mo>|</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>|</mml:mo></mml:mrow></mml:mfrac></mml:mstyle><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mn mathvariant="normal">3</mml:mn></mml:munderover><mml:msub><mml:mi>l</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup></mml:mrow><mml:mrow><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup><mml:mo>+</mml:mo><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup></mml:mrow></mml:mfrac></mml:mstyle><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>s</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi>s</mml:mi></mml:msub></mml:mrow></mml:munderover><mml:msub><mml:mi>c</mml:mi><mml:mi>s</mml:mi></mml:msub><mml:mfenced close="]" open="["><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo>-</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:mfenced></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mo>+</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mrow><mml:msub><mml:mi mathvariant="normal">B</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:math></disp-formula></p>
      <p id="d2e4717">where <inline-formula><mml:math id="M90" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the cell-averaged state, the bathymetry <inline-formula><mml:math id="M91" display="inline"><mml:mrow><mml:mi>B</mml:mi><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> follows the same reconstruction criterion as the flux variables, and <inline-formula><mml:math id="M92" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the discretized source term, discussed in the following subsection.</p>
      <p id="d2e4771">The one-sided local speeds<fn id="Ch1.Footn2"><p id="d2e4774">Maximum wave speeds governing information propagation across the <inline-formula><mml:math id="M93" display="inline"><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:math></inline-formula> interface.</p></fn> <inline-formula><mml:math id="M94" display="inline"><mml:mrow><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M95" display="inline"><mml:mrow><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup></mml:mrow></mml:math></inline-formula> are evaluated at Gaussian quadrature points using desingularized velocities to ensure stable behavior near dry states. The velocity components are regularized as

            <disp-formula id="Ch1.E17" content-type="numbered"><label>17</label><mml:math id="M96" display="block"><mml:mrow><mml:mi>u</mml:mi><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msqrt><mml:mn mathvariant="normal">2</mml:mn></mml:msqrt><mml:mo>,</mml:mo><mml:mi>h</mml:mi><mml:mo>(</mml:mo><mml:mi>h</mml:mi><mml:mi>u</mml:mi><mml:mo>)</mml:mo></mml:mrow><mml:msqrt><mml:mrow><mml:msup><mml:mi>h</mml:mi><mml:mn mathvariant="normal">4</mml:mn></mml:msup><mml:mo>+</mml:mo><mml:mo>max⁡</mml:mo><mml:mo>(</mml:mo><mml:msup><mml:mi>h</mml:mi><mml:mn mathvariant="normal">4</mml:mn></mml:msup><mml:mo>,</mml:mo><mml:mi mathvariant="italic">ε</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msqrt></mml:mfrac></mml:mstyle><mml:mo>,</mml:mo><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mtext>and</mml:mtext><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mi>v</mml:mi><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msqrt><mml:mn mathvariant="normal">2</mml:mn></mml:msqrt><mml:mo>,</mml:mo><mml:mi>h</mml:mi><mml:mo>(</mml:mo><mml:mi>h</mml:mi><mml:mi>v</mml:mi><mml:mo>)</mml:mo></mml:mrow><mml:msqrt><mml:mrow><mml:msup><mml:mi>h</mml:mi><mml:mn mathvariant="normal">4</mml:mn></mml:msup><mml:mo>+</mml:mo><mml:mo>max⁡</mml:mo><mml:mo>(</mml:mo><mml:msup><mml:mi>h</mml:mi><mml:mn mathvariant="normal">4</mml:mn></mml:msup><mml:mo>,</mml:mo><mml:mi mathvariant="italic">ε</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msqrt></mml:mfrac></mml:mstyle><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          where <inline-formula><mml:math id="M97" display="inline"><mml:mrow><mml:mi>h</mml:mi><mml:mo>=</mml:mo><mml:mi>w</mml:mi><mml:mo>-</mml:mo><mml:mi>B</mml:mi></mml:mrow></mml:math></inline-formula> denotes the water depth and <inline-formula><mml:math id="M98" display="inline"><mml:mi mathvariant="italic">ε</mml:mi></mml:math></inline-formula> is a small tolerance parameter that prevents singularities as <inline-formula><mml:math id="M99" display="inline"><mml:mrow><mml:mi>h</mml:mi><mml:mo>→</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:math></inline-formula>. These velocities are then projected onto the outward normal direction of the interface <inline-formula><mml:math id="M100" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Γ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>, yielding

            <disp-formula id="Ch1.E18" content-type="numbered"><label>18</label><mml:math id="M101" display="block"><mml:mtable rowspacing="0.2ex" class="split" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:msubsup><mml:mi>u</mml:mi><mml:mi>j</mml:mi><mml:mi mathvariant="italic">θ</mml:mi></mml:msubsup><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mo>=</mml:mo><mml:mi>cos⁡</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>)</mml:mo><mml:mo>,</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo>+</mml:mo><mml:mi>sin⁡</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>)</mml:mo><mml:mo>,</mml:mo><mml:msub><mml:mi>v</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mtext>and</mml:mtext><mml:mspace width="0.25em" linebreak="nobreak"/><mml:msubsup><mml:mi>u</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="italic">θ</mml:mi></mml:msubsup><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mi>cos⁡</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>)</mml:mo><mml:mo>,</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mo>+</mml:mo><mml:mi>sin⁡</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>)</mml:mo><mml:mo>,</mml:mo><mml:msub><mml:mi>v</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>

          where the subscripts <inline-formula><mml:math id="M102" display="inline"><mml:mi>j</mml:mi></mml:math></inline-formula> and <inline-formula><mml:math id="M103" display="inline"><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:math></inline-formula> denote reconstructed values from cell <inline-formula><mml:math id="M104" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> and its neighbor <inline-formula><mml:math id="M105" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>, respectively.</p>
      <p id="d2e5242">The one-sided local wave speeds are then obtained by taking extrema over all Gaussian points:

            <disp-formula id="Ch1.E19" content-type="numbered"><label>19</label><mml:math id="M106" display="block"><mml:mrow><mml:mtable rowspacing="0.2ex" class="split" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mo>=</mml:mo><mml:munder><mml:mo movablelimits="false">max⁡</mml:mo><mml:mi>s</mml:mi></mml:munder><mml:mfenced open="{" close=""><mml:mrow><mml:mo movablelimits="false">max⁡</mml:mo><mml:mfenced open="{" close=""><mml:mrow><mml:msubsup><mml:mi>u</mml:mi><mml:mi>j</mml:mi><mml:mi mathvariant="italic">θ</mml:mi></mml:msubsup><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo>+</mml:mo><mml:msqrt><mml:mrow><mml:mi>g</mml:mi><mml:msub><mml:mi>h</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:msqrt><mml:mo>,</mml:mo><mml:mspace width="0.25em" linebreak="nobreak"/><mml:msubsup><mml:mi>u</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="italic">θ</mml:mi></mml:msubsup><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:mfenced></mml:mrow></mml:mfenced></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mfenced open="" close="}"><mml:mfenced open="" close="}"><mml:mrow><mml:mo>+</mml:mo><mml:msqrt><mml:mrow><mml:mi>g</mml:mi><mml:msub><mml:mi>h</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:msqrt><mml:mo>,</mml:mo><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:mfenced></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup><mml:mo>=</mml:mo><mml:mo>-</mml:mo><mml:munder><mml:mo movablelimits="false">min⁡</mml:mo><mml:mi>s</mml:mi></mml:munder><mml:mfenced open="{" close=""><mml:mrow><mml:mo movablelimits="false">min⁡</mml:mo><mml:mfenced open="{" close=""><mml:mrow><mml:msubsup><mml:mi>u</mml:mi><mml:mi>j</mml:mi><mml:mi mathvariant="italic">θ</mml:mi></mml:msubsup><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo>-</mml:mo><mml:msqrt><mml:mrow><mml:mi>g</mml:mi><mml:msub><mml:mi>h</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:msqrt><mml:mo>,</mml:mo><mml:mspace linebreak="nobreak" width="0.25em"/><mml:msubsup><mml:mi>u</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi mathvariant="italic">θ</mml:mi></mml:msubsup><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:mfenced></mml:mrow></mml:mfenced></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mfenced open="" close="}"><mml:mfenced open="" close="}"><mml:mrow><mml:mo>-</mml:mo><mml:msqrt><mml:mrow><mml:mi>g</mml:mi><mml:msub><mml:mi>h</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:msqrt><mml:mo>,</mml:mo><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:mfenced></mml:mfenced><mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:math></disp-formula></p>
</sec>
<sec id="Ch1.S3.SS2">
  <label>3.2</label><title>Well-balancing of the source terms</title>
      <p id="d2e5550">A fundamental requirement for robust SWE solvers – particularly in applications involving complex topography such as dam-break flows and tsunamis – is well-balancing. This property is defined as the exact preservation of steady-state solutions without introducing spurious oscillations. Well-balance is essential for maintaining physical accuracy in scenarios such as the lake-at-rest condition or geostrophic equilibrium, where source terms must precisely counterbalance flux gradients <xref ref-type="bibr" rid="bib1.bibx51 bib1.bibx14 bib1.bibx61 bib1.bibx20 bib1.bibx21 bib1.bibx29 bib1.bibx38 bib1.bibx60 bib1.bibx15" id="paren.60"/>. Therefore, in <monospace>SWEpy</monospace>, well-balancing is achieved through a consistent discretization of the source terms, ensuring that numerical fluxes remain in equilibrium with the underlying physical forces across both fully wet domains and regions with variable bathymetry.</p>
<sec id="Ch1.S3.SS2.SSS1">
  <label>3.2.1</label><title>Bathymetry gradient contribution</title>
      <p id="d2e5566">For the bathymetry source term, a well-balanced discretization is constructed by enforcing the lake-at-rest condition, ensuring consistency with the corresponding momentum flux contributions <xref ref-type="bibr" rid="bib1.bibx14" id="paren.61"/>. Thus, variables are first reconstructed using polynomial approximations, after which the resulting expressions are integrated over both the cell and its interfaces using Gaussian quadrature. This procedure yields a general formulation that is applicable to arbitrary reconstruction orders:

              <disp-formula id="Ch1.E20" content-type="numbered"><label>20</label><mml:math id="M107" display="block"><mml:mtable rowspacing="0.2ex" class="split" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:msubsup><mml:mover accent="true"><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mrow><mml:msub><mml:mi mathvariant="normal">B</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mi>l</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mo>=</mml:mo><mml:mo>-</mml:mo><mml:mi>g</mml:mi><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>s</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mrow><mml:msubsup><mml:mi>N</mml:mi><mml:mi>s</mml:mi><mml:mi mathvariant="normal">int</mml:mi></mml:msubsup></mml:mrow></mml:munderover><mml:msub><mml:mi>c</mml:mi><mml:mi>s</mml:mi></mml:msub><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mo>∂</mml:mo><mml:mi>w</mml:mi><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mi>j</mml:mi><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow><mml:mrow><mml:mo>∂</mml:mo><mml:mi>x</mml:mi></mml:mrow></mml:mfrac></mml:mstyle><mml:mo mathsize="1.1em">(</mml:mo><mml:msub><mml:mi>w</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mi>j</mml:mi><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo>-</mml:mo><mml:mi>B</mml:mi><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mi>j</mml:mi><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo mathsize="1.1em">)</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mo>+</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mi>g</mml:mi><mml:mrow><mml:mn mathvariant="normal">2</mml:mn><mml:mo>|</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>|</mml:mo></mml:mrow></mml:mfrac></mml:mstyle><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mn mathvariant="normal">3</mml:mn></mml:munderover><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>s</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi>s</mml:mi></mml:msub></mml:mrow></mml:munderover><mml:msub><mml:mi>c</mml:mi><mml:mi>s</mml:mi></mml:msub><mml:msub><mml:mi>l</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>(</mml:mo><mml:msub><mml:mi>w</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo>-</mml:mo><mml:mi>B</mml:mi><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:msup><mml:mo>)</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mi>cos⁡</mml:mi><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:msubsup><mml:mover accent="true"><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mrow><mml:msub><mml:mi mathvariant="normal">B</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">3</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mo>=</mml:mo><mml:mo>-</mml:mo><mml:mi>g</mml:mi><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>s</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mrow><mml:msubsup><mml:mi>N</mml:mi><mml:mi>s</mml:mi><mml:mi mathvariant="normal">int</mml:mi></mml:msubsup></mml:mrow></mml:munderover><mml:msub><mml:mi>c</mml:mi><mml:mi>s</mml:mi></mml:msub><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mo>∂</mml:mo><mml:mi>w</mml:mi><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mi>j</mml:mi><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow><mml:mrow><mml:mo>∂</mml:mo><mml:mi>y</mml:mi></mml:mrow></mml:mfrac></mml:mstyle><mml:mo mathsize="1.1em">(</mml:mo><mml:msub><mml:mi>w</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mi>j</mml:mi><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo>-</mml:mo><mml:mi>B</mml:mi><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mi>j</mml:mi><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo mathsize="1.1em">)</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mo>+</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mi>g</mml:mi><mml:mrow><mml:mn mathvariant="normal">2</mml:mn><mml:mo>|</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>|</mml:mo></mml:mrow></mml:mfrac></mml:mstyle><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mn mathvariant="normal">3</mml:mn></mml:munderover><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>s</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi>s</mml:mi></mml:msub></mml:mrow></mml:munderover><mml:msub><mml:mi>c</mml:mi><mml:mi>s</mml:mi></mml:msub><mml:msub><mml:mi>l</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>(</mml:mo><mml:msub><mml:mi>w</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:mo>-</mml:mo><mml:mi>B</mml:mi><mml:mo>(</mml:mo><mml:msubsup><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mi>s</mml:mi></mml:msubsup><mml:mo>)</mml:mo><mml:msup><mml:mo>)</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mi>sin⁡</mml:mi><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>

            In Eq. (<xref ref-type="disp-formula" rid="Ch1.E20"/>), <inline-formula><mml:math id="M108" display="inline"><mml:mrow><mml:msubsup><mml:mi>N</mml:mi><mml:mi>s</mml:mi><mml:mtext>int</mml:mtext></mml:msubsup></mml:mrow></mml:math></inline-formula> denotes the number of Gaussian quadrature points <inline-formula><mml:math id="M109" display="inline"><mml:mrow><mml:msubsup><mml:mi>M</mml:mi><mml:mi>j</mml:mi><mml:mi>s</mml:mi></mml:msubsup></mml:mrow></mml:math></inline-formula> used over the cell interior <inline-formula><mml:math id="M110" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, and <inline-formula><mml:math id="M111" display="inline"><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mi>s</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> are the corresponding weights. The bathymetry <inline-formula><mml:math id="M112" display="inline"><mml:mi>B</mml:mi></mml:math></inline-formula> is reconstructed using the same-order operator employed for the flow variables, ensuring consistency in the discretization.</p>
      <p id="d2e6100">This formulation enforces a consistent balance between source terms and flux contributions, eliminating spurious flows over irregular topography and ensuring the preservation of equilibrium states, as verified in the steady-state benchmarks in Sect. 5.</p>
</sec>
<sec id="Ch1.S3.SS2.SSS2">
  <label>3.2.2</label><title>Manning friction</title>
      <p id="d2e6111">The structure of the Manning friction source term allows for a straightforward well-balanced discretization, as it is directly proportional to the discharge components <inline-formula><mml:math id="M113" display="inline"><mml:mover accent="true"><mml:mrow><mml:mi>h</mml:mi><mml:mi>u</mml:mi></mml:mrow><mml:mo mathvariant="normal">‾</mml:mo></mml:mover></mml:math></inline-formula> and <inline-formula><mml:math id="M114" display="inline"><mml:mover accent="true"><mml:mrow><mml:mi>h</mml:mi><mml:mi>v</mml:mi></mml:mrow><mml:mo mathvariant="normal">‾</mml:mo></mml:mover></mml:math></inline-formula>. Consequently, the term vanishes at equilibrium without requiring additional modifications. However, near wet–dry interfaces or in regions where <inline-formula><mml:math id="M115" display="inline"><mml:mrow><mml:mi>h</mml:mi><mml:mo>→</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:math></inline-formula>, desingularization is necessary to avoid division by zero and ensure numerical stability.</p>
      <p id="d2e6152">Following <xref ref-type="bibr" rid="bib1.bibx20" id="text.62"/>, we define the discrete friction coefficient as

              <disp-formula id="Ch1.E21" content-type="numbered"><label>21</label><mml:math id="M116" display="block"><mml:mtable rowspacing="0.2ex" class="split" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:mi mathvariant="script">G</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:mo>)</mml:mo><mml:mo>:</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mo>=</mml:mo><mml:mo>-</mml:mo><mml:mi>g</mml:mi><mml:msup><mml:mi>n</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:msup><mml:mfenced close=")" open="("><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mn mathvariant="normal">2</mml:mn><mml:msub><mml:mover accent="true"><mml:mi>h</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub></mml:mrow><mml:mrow><mml:msubsup><mml:mover accent="true"><mml:mi>h</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msubsup><mml:mo>+</mml:mo><mml:mo>max⁡</mml:mo><mml:mfenced close=")" open="("><mml:mrow><mml:msubsup><mml:mover accent="true"><mml:mi>h</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msubsup><mml:mo>,</mml:mo><mml:msup><mml:mi mathvariant="italic">ε</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:mfenced></mml:mrow></mml:mfrac></mml:mstyle></mml:mfenced><mml:mrow><mml:mn mathvariant="normal">7</mml:mn><mml:mo>/</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:msqrt><mml:mrow><mml:mo>(</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>h</mml:mi><mml:mi>u</mml:mi></mml:mrow><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:msubsup><mml:mo>)</mml:mo><mml:mi>j</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msubsup><mml:mo>+</mml:mo><mml:mo>(</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>h</mml:mi><mml:mi>v</mml:mi></mml:mrow><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:msubsup><mml:mo>)</mml:mo><mml:mi>j</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msubsup></mml:mrow></mml:msqrt><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>

            where <inline-formula><mml:math id="M117" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi>h</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mover accent="true"><mml:mi>w</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mover accent="true"><mml:mi>B</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> denotes the cell-averaged water depth and <inline-formula><mml:math id="M118" display="inline"><mml:mi mathvariant="italic">ε</mml:mi></mml:math></inline-formula> is a small regularization parameter introduced to avoid singularities.</p>
      <p id="d2e6337">The corresponding discretized friction source term is then given by

              <disp-formula id="Ch1.E22" content-type="numbered"><label>22</label><mml:math id="M119" display="block"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mrow><mml:msub><mml:mi mathvariant="normal">F</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:msub><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mo>=</mml:mo><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mi mathvariant="script">G</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:mo>)</mml:mo><mml:msup><mml:mfenced open="[" close="]"><mml:mtable class="matrix" columnalign="center center center" framespacing="0em"><mml:mtr><mml:mtd><mml:mn mathvariant="normal">0</mml:mn></mml:mtd><mml:mtd><mml:mrow><mml:mo>(</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>h</mml:mi><mml:mi>u</mml:mi></mml:mrow><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:msub><mml:mo>)</mml:mo><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mo>(</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>h</mml:mi><mml:mi>v</mml:mi></mml:mrow><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:msub><mml:mo>)</mml:mo><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mi>T</mml:mi></mml:msup><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

            This formulation is treated semi-implicitly during time integration, as described in Sect. 3.5, to account for the stiffness of the friction source term <xref ref-type="bibr" rid="bib1.bibx20" id="paren.63"/>. In <monospace>SWEpy</monospace>, the coefficient <inline-formula><mml:math id="M120" display="inline"><mml:mi mathvariant="script">G</mml:mi></mml:math></inline-formula> is evaluated in a vectorized manner across all cells on the GPU, enabling efficient parallel computation even for large-scale grids. Although the Manning coefficient <inline-formula><mml:math id="M121" display="inline"><mml:mi>n</mml:mi></mml:math></inline-formula> may vary spatially, it is taken as constant throughout the domain in the presented numerical experiments.</p>
</sec>
<sec id="Ch1.S3.SS2.SSS3">
  <label>3.2.3</label><title>Coriolis</title>
      <p id="d2e6449">The Coriolis source term vanishes under zero-discharge equilibria (i.e., <inline-formula><mml:math id="M122" display="inline"><mml:mrow><mml:mi>h</mml:mi><mml:mi>u</mml:mi><mml:mo>=</mml:mo><mml:mi>h</mml:mi><mml:mi>v</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:math></inline-formula>), ensuring inherent well-balancing in such states without requiring specialized discretization beyond direct averaging. Accordingly, the cell-averaged Coriolis source term is:

              <disp-formula id="Ch1.E23" content-type="numbered"><label>23</label><mml:math id="M123" display="block"><mml:mrow><mml:mo>(</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">C</mml:mi></mml:msub><mml:msub><mml:mo>)</mml:mo><mml:mi>j</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mi>f</mml:mi><mml:mspace width="0.125em" linebreak="nobreak"/><mml:msup><mml:mfenced open="[" close="]"><mml:mtable class="matrix" columnalign="center center center" framespacing="0em"><mml:mtr><mml:mtd><mml:mn mathvariant="normal">0</mml:mn></mml:mtd><mml:mtd><mml:mrow><mml:mo>(</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>h</mml:mi><mml:mi>v</mml:mi></mml:mrow><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:msub><mml:mo>)</mml:mo><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mo>-</mml:mo><mml:mo>(</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>h</mml:mi><mml:mi>u</mml:mi></mml:mrow><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:msub><mml:mo>)</mml:mo><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mo>⊤</mml:mo></mml:msup><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

            where <inline-formula><mml:math id="M124" display="inline"><mml:mi>f</mml:mi></mml:math></inline-formula> is the Coriolis parameter, typically approximated as <inline-formula><mml:math id="M125" display="inline"><mml:mrow><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">4</mml:mn></mml:mrow></mml:msup><mml:mspace linebreak="nobreak" width="0.125em"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> in mid-latitude regions <xref ref-type="bibr" rid="bib1.bibx49" id="paren.64"/>, as adopted in the Maule 2010 tsunami validation in Sect. 5.2.2.</p>
      <p id="d2e6578">For large-scale geophysical flows, however, a more rigurous condition – geostrophic balance – may be required. In this regime, horizontal pressure gradients are balanced by Coriolis forces, leading to nontrivial steady states. Several numerical approaches have been proposed to preserve this balance in rotating SWEs <xref ref-type="bibr" rid="bib1.bibx29 bib1.bibx21" id="paren.65"/>. In the present work, <monospace>SWEpy</monospace> employs standard well-balancing, with extensions toward geostrophic preservation left for future development.</p>
</sec>
</sec>
<sec id="Ch1.S3.SS3">
  <label>3.3</label><title>Spatial Reconstruction Operators and Scheme Formulation</title>
      <p id="d2e6597">The design of these reconstruction operators is guided by both physical and numerical requirements inherent to shallow water flows, including variable bathymetry, surface roughness, and domain scale. These features demand accurate representation of gradients and discontinuities, particularly in near-field regimes (e.g., shocks and wet–dry fronts) and far-field wave propagation, as demonstrated in Sect. <xref ref-type="sec" rid="Ch1.S5"/>.</p>
      <p id="d2e6602">To ensure physically meaningful and numerically stable solutions, the reconstruction must satisfy key properties. These include well-balancing, which guarantees the exact preservation of steady states – such as lake-at-rest or geostrophic equilibrium – thereby preventing spurious oscillations <xref ref-type="bibr" rid="bib1.bibx14" id="paren.66"/>, and positivity preservation, which enforces non-negative water depths and is essential for realistic inundation modeling.</p>
      <p id="d2e6608">Numerical experiments involving long-range tsunami propagation (in Sect. <xref ref-type="sec" rid="Ch1.S5"/>) indicate that low-order reconstructions (constant or linear) introduce excessive numerical diffusion, leading to significant attenuation of wave amplitudes. This motivates the use of higher-order reconstruction operators. Accordingly, the reconstructed variables are represented as piecewise polynomials over each cell <inline-formula><mml:math id="M126" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, given by:

            <disp-formula id="Ch1.E24" content-type="numbered"><label>24</label><mml:math id="M127" display="block"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo stretchy="false" mathvariant="normal">̃</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:msub><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:msubsup><mml:mi>p</mml:mi><mml:mi>j</mml:mi><mml:mi>q</mml:mi></mml:msubsup><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>)</mml:mo><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          where <inline-formula><mml:math id="M128" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the cell-averaged variable to be reconstructed, <inline-formula><mml:math id="M129" display="inline"><mml:mrow><mml:msubsup><mml:mi>p</mml:mi><mml:mi>j</mml:mi><mml:mi>q</mml:mi></mml:msubsup></mml:mrow></mml:math></inline-formula> the interpolating polynomial with coefficients derived from local geometry and neighboring variable cell-averaged values. This cell-wise approach allows tailored approximations, with stencil selection critical for accuracy and stability.</p>
      <p id="d2e6708">Figure <xref ref-type="fig" rid="F3"/> illustrates the stencil structure, where <inline-formula><mml:math id="M130" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> (red) is the reference cell, surrounded by first-order neighbors (blue) and second-order neighbors (green). For each <inline-formula><mml:math id="M131" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>, the stencils are defined as

            <disp-formula id="Ch1.Ex1"><mml:math id="M132" display="block"><mml:mtable class="split" rowspacing="0.2ex" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mo mathvariant="italic">{</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:msub><mml:mi>j</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:msub><mml:mi>j</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:msub><mml:mi>j</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:msub><mml:mi>j</mml:mi><mml:mn mathvariant="normal">3</mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo mathvariant="italic">}</mml:mo><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mo>;</mml:mo><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mo mathvariant="italic">{</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:msub><mml:mi>j</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:msub><mml:mi>j</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:msub><mml:mi>j</mml:mi><mml:mn mathvariant="normal">11</mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:msub><mml:mi>j</mml:mi><mml:mn mathvariant="normal">12</mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo mathvariant="italic">}</mml:mo><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mo>;</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mo mathvariant="italic">{</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:msub><mml:mi>j</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:msub><mml:mi>j</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:msub><mml:mi>j</mml:mi><mml:mn mathvariant="normal">21</mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:msub><mml:mi>j</mml:mi><mml:mn mathvariant="normal">22</mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo mathvariant="italic">}</mml:mo><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mo>;</mml:mo><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mo mathvariant="italic">{</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:msub><mml:mi>j</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:msub><mml:mi>j</mml:mi><mml:mn mathvariant="normal">3</mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:msub><mml:mi>j</mml:mi><mml:mn mathvariant="normal">31</mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:msub><mml:mi>j</mml:mi><mml:mn mathvariant="normal">32</mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo mathvariant="italic">}</mml:mo><mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>

          Linear reconstructions use only the first stencil, <inline-formula><mml:math id="M133" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>i</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>, whereas quadratic reconstructions – requiring two Gaussian points per edge – utilize the full stencil, <inline-formula><mml:math id="M134" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>. The right panel of Fig. <xref ref-type="fig" rid="F3"/> illustrates the selection of these sub-stencils, where the barycenters of the selected cells are constrained to lie within cones defined by lines connecting the reference cell’s barycenter to its vertices.</p>

      <fig id="F3" specific-use="star"><label>Figure 3</label><caption><p id="d2e6993">Stencil illustration for the <inline-formula><mml:math id="M135" display="inline"><mml:mi>j</mml:mi></mml:math></inline-formula>th cell (left) and its sectorial division (right). The blue triangles represent first-order neighbors <inline-formula><mml:math id="M136" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>, while the green triangles denote second-order neighbors <inline-formula><mml:math id="M137" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>.</p></caption>
          <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f03.png"/>

        </fig>

<sec id="Ch1.S3.SS3.SSS1">
  <label>3.3.1</label><title>Linear Piecewise Reconstruction with Minmod Gradient Limiter</title>
      <p id="d2e7046">The linear reconstruction in Eq. (<xref ref-type="disp-formula" rid="Ch1.E24"/>) is expressed as

              <disp-formula id="Ch1.E25" content-type="numbered"><label>25</label><mml:math id="M138" display="block"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo stretchy="false" mathvariant="normal">̃</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:msub><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:mo>(</mml:mo><mml:msub><mml:mi>q</mml:mi><mml:mi>x</mml:mi></mml:msub><mml:msub><mml:mo>)</mml:mo><mml:mi>j</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>-</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>)</mml:mo><mml:mo>+</mml:mo><mml:mo>(</mml:mo><mml:msub><mml:mi>q</mml:mi><mml:mi>y</mml:mi></mml:msub><mml:msub><mml:mo>)</mml:mo><mml:mi>j</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>y</mml:mi><mml:mo>-</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>)</mml:mo><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

            where <inline-formula><mml:math id="M139" display="inline"><mml:mrow><mml:mi>D</mml:mi><mml:msub><mml:mi>q</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mo>(</mml:mo><mml:mo>(</mml:mo><mml:msub><mml:mi>q</mml:mi><mml:mi>x</mml:mi></mml:msub><mml:msub><mml:mo>)</mml:mo><mml:mi>j</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:mo>(</mml:mo><mml:msub><mml:mi>q</mml:mi><mml:mi>y</mml:mi></mml:msub><mml:msub><mml:mo>)</mml:mo><mml:mi>j</mml:mi></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> denotes the numerical gradient.</p>
      <p id="d2e7189">The selection of this gradient defines the linear reconstruction. A variety of gradient estimation techniques exists in the literature, including classical limiter-based methods <xref ref-type="bibr" rid="bib1.bibx68 bib1.bibx81 bib1.bibx90" id="paren.67"/>, FV formulations <xref ref-type="bibr" rid="bib1.bibx4 bib1.bibx23 bib1.bibx43 bib1.bibx57" id="paren.68"/>, and CU schemes for the Saint-Venant system <xref ref-type="bibr" rid="bib1.bibx14 bib1.bibx50" id="paren.69"/>.</p>
      <p id="d2e7201">In <monospace>SWEpy</monospace>, we follow <xref ref-type="bibr" rid="bib1.bibx14" id="text.70"/> and construct three conservative linear polynomials <inline-formula><mml:math id="M140" display="inline"><mml:mrow><mml:msubsup><mml:mi>L</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>,</mml:mo><mml:mi>l</mml:mi></mml:mrow><mml:mi>j</mml:mi></mml:msubsup><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> over the cell <inline-formula><mml:math id="M141" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> and its neighboring pairs <inline-formula><mml:math id="M142" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M143" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mo>,</mml:mo><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> (see Fig. <xref ref-type="fig" rid="F3"/>). The candidate gradient is defined as

              <disp-formula id="Ch1.E26" content-type="numbered"><label>26</label><mml:math id="M144" display="block"><mml:mrow><mml:msubsup><mml:mi>q</mml:mi><mml:mi>j</mml:mi><mml:mo>′</mml:mo></mml:msubsup><mml:mo>=</mml:mo><mml:mi mathvariant="italic">ϑ</mml:mi><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mtext>minmod</mml:mtext><mml:mo mathvariant="italic" mathsize="1.1em">{</mml:mo><mml:mi mathvariant="normal">∇</mml:mi><mml:msubsup><mml:mi>L</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>,</mml:mo><mml:mi>l</mml:mi></mml:mrow><mml:mi>j</mml:mi></mml:msubsup><mml:mo mathvariant="italic" mathsize="1.1em">}</mml:mo><mml:mo>,</mml:mo><mml:mspace linebreak="nobreak" width="1em"/><mml:mtext>with</mml:mtext><mml:mspace width="1em" linebreak="nobreak"/><mml:mi mathvariant="italic">θ</mml:mi><mml:mo>∈</mml:mo><mml:mo>[</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:mo>]</mml:mo><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

            If substituting <inline-formula><mml:math id="M145" display="inline"><mml:mrow><mml:msubsup><mml:mi>q</mml:mi><mml:mi>j</mml:mi><mml:mo>′</mml:mo></mml:msubsup></mml:mrow></mml:math></inline-formula> into Eq. (<xref ref-type="disp-formula" rid="Ch1.E25"/>) yields values at edge midpoints that exceed local extrema, the reconstruction is reduced to a constant state equal to the cell average; otherwise, the gradient is accepted, i.e., <inline-formula><mml:math id="M146" display="inline"><mml:mrow><mml:mi>D</mml:mi><mml:msub><mml:mi>q</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msubsup><mml:mi>q</mml:mi><mml:mi>j</mml:mi><mml:mo>′</mml:mo></mml:msubsup></mml:mrow></mml:math></inline-formula>.</p>
      <p id="d2e7382">The minmod operator presented by <xref ref-type="bibr" rid="bib1.bibx14" id="text.71"/>, selects the admissible gradient with the smallest magnitude, thereby limiting spurious oscillations while preserving monotonicity. This ensures consistency with the source term discretization and supports well-balancing. However, it may introduce numerical diffusion in smooth regions, as observed in Sect. <xref ref-type="sec" rid="Ch1.S5"/>. A summary of the procedure is provided in Algorithm <xref ref-type="other" rid="App1.Ch1.S1.Prog1"/> in the Appendix.</p>
</sec>
<sec id="Ch1.S3.SS3.SSS2">
  <label>3.3.2</label><title>Quadratic (WENO)</title>
      <p id="d2e7400">To reduce the numerical diffusion observed in low-order reconstructions – particularly in long-range wave propagation (e.g., tsunami simulations in Sect. <xref ref-type="sec" rid="Ch1.S5"/>) – we implement a quadratic weighted essentially non-oscillatory (WENO) reconstruction. The approach follows <xref ref-type="bibr" rid="bib1.bibx97" id="text.72"/> and is adapted to unstructured triangular grids as in <xref ref-type="bibr" rid="bib1.bibx80" id="text.73"/>, while preserving the spatial constraints required for stability.</p>
      <p id="d2e7411">The reconstruction combines a quadratic polynomial <inline-formula><mml:math id="M147" display="inline"><mml:mrow><mml:msub><mml:mi>p</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula>, obtained over the full stencil, with four linear polynomials <inline-formula><mml:math id="M148" display="inline"><mml:mrow><mml:msub><mml:mi>p</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> (<inline-formula><mml:math id="M149" display="inline"><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>,</mml:mo><mml:mi mathvariant="normal">…</mml:mi><mml:mo>,</mml:mo><mml:mn mathvariant="normal">4</mml:mn></mml:mrow></mml:math></inline-formula>) defined on sub-stencils:

              <disp-formula id="Ch1.E27" content-type="numbered"><label>27</label><mml:math id="M150" display="block"><mml:mtable class="split" rowspacing="0.2ex" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo stretchy="false" mathvariant="normal">̃</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msub><mml:mi>w</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow><mml:mrow><mml:msub><mml:mi mathvariant="italic">γ</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:mfrac></mml:mstyle><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi>p</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>)</mml:mo><mml:mo>-</mml:mo><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mn mathvariant="normal">4</mml:mn></mml:munderover><mml:msub><mml:mi mathvariant="italic">γ</mml:mi><mml:mi>k</mml:mi></mml:msub><mml:msub><mml:mi>p</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mfenced></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mo>+</mml:mo><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mn mathvariant="normal">4</mml:mn></mml:munderover><mml:msub><mml:mi>w</mml:mi><mml:mi>k</mml:mi></mml:msub><mml:msub><mml:mi>p</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>)</mml:mo><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>

            where the nonlinear weights <inline-formula><mml:math id="M151" display="inline"><mml:mrow><mml:msub><mml:mi>w</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>w</mml:mi><mml:mi>k</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> are computed from smoothness indicators <inline-formula><mml:math id="M152" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> (quadratic) and <inline-formula><mml:math id="M153" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mi>k</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> (linear) according to <inline-formula><mml:math id="M154" display="inline"><mml:mrow><mml:msub><mml:mi>w</mml:mi><mml:mi>l</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mover accent="true"><mml:mi>w</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>l</mml:mi></mml:msub><mml:mo>/</mml:mo><mml:mo>(</mml:mo><mml:msub><mml:mi>w</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mo>+</mml:mo><mml:msubsup><mml:mo>∑</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mn mathvariant="normal">4</mml:mn></mml:msubsup><mml:msub><mml:mover accent="true"><mml:mi>w</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>k</mml:mi></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula>, with <inline-formula><mml:math id="M155" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi>w</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>l</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="italic">γ</mml:mi><mml:mi>l</mml:mi></mml:msub><mml:mfenced close=")" open="("><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>+</mml:mo><mml:mi mathvariant="italic">τ</mml:mi><mml:mo>/</mml:mo><mml:mo>(</mml:mo><mml:mi mathvariant="italic">ϵ</mml:mi><mml:mo>+</mml:mo><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mi>l</mml:mi></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:mfenced></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M156" display="inline"><mml:mi mathvariant="italic">τ</mml:mi></mml:math></inline-formula> a correction term derived from the <inline-formula><mml:math id="M157" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mi>l</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> values <xref ref-type="bibr" rid="bib1.bibx97" id="paren.74"/>. The quadratic interpolant <inline-formula><mml:math id="M158" display="inline"><mml:mrow><mml:msub><mml:mi>p</mml:mi><mml:mrow><mml:mi>q</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> is constructed via a least-squares fit to the cell-averaged states over <inline-formula><mml:math id="M159" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> and its first- and second-order neighbors, while preserving the mean value in <inline-formula><mml:math id="M160" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>. Its implementation relies solely on geometric quantities (e.g., barycenters and area moments), avoiding numerical quadrature and improving efficiency, as detailed in <xref ref-type="bibr" rid="bib1.bibx33" id="paren.75"/>.</p>
      <p id="d2e7810">The stencil selection is performed efficiently using index-based searches on structured grids; more general geometric search strategies can be incorporated to relax grid constraints. The overall procedure is summarized in Algorithm <xref ref-type="other" rid="App1.Ch1.S1.Prog2"/>, and is designed for efficient GPU parallelization within <monospace>SWEpy</monospace>.</p>
      <p id="d2e7818">This WENO reconstruction achieves high-order accuracy in smooth regions while limiting oscillations near sharp gradients, making it particularly suitable for far-field simulations where controlling numerical diffusion is critical without relying on Riemann solvers <xref ref-type="bibr" rid="bib1.bibx50" id="paren.76"/>.</p>
</sec>
</sec>
<sec id="Ch1.S3.SS4">
  <label>3.4</label><title>Wet/dry fronts reconstruction</title>
      <p id="d2e7833">High-order reconstructions, while effective in reducing numerical diffusion in smooth regions, may produce nonphysical negative water depths near wet–dry interfaces, where the free surface intersects the bathymetry. To enforce positivity – i.e., <inline-formula><mml:math id="M161" display="inline"><mml:mrow><mml:mi>h</mml:mi><mml:mo>≥</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:math></inline-formula> – we adopt the conservative correction of <xref ref-type="bibr" rid="bib1.bibx14" id="text.77"/>. When negative depths are detected, the reconstruction is replaced by a linear polynomial that preserves the cell average, thereby maintaining mass conservation.</p>
      <p id="d2e7851">The correction depends on the number of dry vertices. If two vertices are dry, the reconstructed surface is defined by a plane passing through those vertices at bathymetric elevation and the cell barycenter at the mean surface level. If only one vertex is dry, the plane passes through the dry vertex at bathymetry, a neighboring wet vertex at an adjusted elevation, and the barycenter. In both cases, the plane is constructed to ensure <inline-formula><mml:math id="M162" display="inline"><mml:mrow><mml:mi>h</mml:mi><mml:mo>=</mml:mo><mml:mi>w</mml:mi><mml:mo>-</mml:mo><mml:mi>B</mml:mi><mml:mo>≥</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:math></inline-formula> throughout the cell while preserving the mean value.</p>
      <p id="d2e7874">In practice, reverting locally to a first-order, positivity-preserving reconstruction at wet–dry fronts provides improved robustness with minimal impact on overall accuracy, since high-order reconstruction remains active away from these regions and governs wave propagation. A schematic illustration of this procedure is shown in Fig. <xref ref-type="fig" rid="F4"/>.</p>

      <fig id="F4" specific-use="star"><label>Figure 4</label><caption><p id="d2e7882">Schematic representation of the wet/dry treatment: <bold>(a)</bold> two dry points and <bold>(b)</bold> one dry point.</p></caption>
          <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f04.png"/>

        </fig>

      <p id="d2e7897">This approach guarantees non-negative water depths across the domain, which is essential for stability in inundation problems such as the Conical Island test and the Malpasset dam-break case (Sect. <xref ref-type="sec" rid="Ch1.S5"/>). The correction procedure is summarized in Algorithm <xref ref-type="other" rid="App1.Ch1.S1.Prog3"/> and implemented efficiently using GPU-based parallelization.</p>
      <p id="d2e7904">While this method ensures positivity, it does not strictly preserve well-balancing near wet–dry fronts, where small imbalances may arise <xref ref-type="bibr" rid="bib1.bibx61" id="paren.78"/>. This behavior was examined using the analytical solution of Synolakis for wave run-up<fn id="Ch1.Footn3"><p id="d2e7910">Refer to the Analytical Benchmarks section of the User Manual <inline-formula><mml:math id="M163" display="inline"><mml:mi mathvariant="italic">&amp;</mml:mi></mml:math></inline-formula> Technical Reference <xref ref-type="bibr" rid="bib1.bibx63" id="paren.79"/>.</p></fn>, where the method demonstrates good accuracy in the wet–dry region. The results also reveal sensitivity to temporal discretization and the Courant number. A detailed analysis of these aspects is the subject of ongoing work, focusing on the numerical and theoretical properties of wet–dry reconstruction techniques and their suitability for different flow regimes.</p>
</sec>
<sec id="Ch1.S3.SS5">
  <label>3.5</label><title>Temporal discretization</title>
      <p id="d2e7932">Following the spatial discretization, the resulting semi-discrete system of Eq. (<xref ref-type="disp-formula" rid="Ch1.E12"/>) is integrated in time to ensure stability and accuracy across different flow regimes. In <monospace>SWEpy</monospace>, we employ both the explicit Euler (EE) method and a four-stage, third-order strong stability-preserving Runge–Kutta scheme (SSP RK4,3, hereafter RK4,3) described by <xref ref-type="bibr" rid="bib1.bibx36" id="text.80"/>.</p>
      <p id="d2e7943">For flows involving Manning friction, a semi-implicit treatment is adopted to improve stability while maintaining computational efficiency <xref ref-type="bibr" rid="bib1.bibx20" id="paren.81"/>. We define the discrete flux operator as

            <disp-formula id="Ch1.E28" content-type="numbered"><label>28</label><mml:math id="M164" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="script">H</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo mathvariant="normal" stretchy="false">̃</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mo>-</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mrow><mml:mi mathvariant="normal">|</mml:mi><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mi mathvariant="normal">|</mml:mi></mml:mrow></mml:mfrac></mml:mstyle><mml:munder><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>∈</mml:mo><mml:msub><mml:mi mathvariant="script">N</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:munder><mml:mo mathsize="1.1em">(</mml:mo><mml:msub><mml:mi mathvariant="script">F</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo mathsize="1.1em">)</mml:mo><mml:msub><mml:mi>l</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">S</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mrow><mml:msub><mml:mi mathvariant="normal">B</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          where <inline-formula><mml:math id="M165" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> denotes the cell-averaged conserved variables and <inline-formula><mml:math id="M166" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo stretchy="false" mathvariant="normal">̃</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> their reconstructions.</p>
      <p id="d2e8078">The semi-implicit Runge–Kutta update, written in Shu–Osher form, reads

            <disp-formula id="Ch1.E29" content-type="numbered"><label>29</label><mml:math id="M167" display="block"><mml:mtable class="split" rowspacing="0.2ex" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:mo mathsize="1.1em">(</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:msup><mml:mo mathsize="1.1em">)</mml:mo><mml:mi>i</mml:mi></mml:msup></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mo>=</mml:mo><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>l</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow><mml:mrow><mml:mi>i</mml:mi><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:munderover><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo mathsize="1.1em">(</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:msup><mml:mo mathsize="1.1em">)</mml:mo><mml:mi>l</mml:mi></mml:msup><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mo>+</mml:mo><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>t</mml:mi></mml:mrow><mml:mn mathvariant="normal">2</mml:mn></mml:mfrac></mml:mstyle><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>l</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow><mml:mrow><mml:mi>i</mml:mi><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:munderover><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:msubsup><mml:mi mathvariant="script">H</mml:mi><mml:mi>j</mml:mi><mml:mi>l</mml:mi></mml:msubsup></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mo>+</mml:mo><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>t</mml:mi><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mo mathsize="1.1em">(</mml:mo><mml:mi mathvariant="script">G</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:mo>)</mml:mo><mml:msup><mml:mo mathsize="1.1em">)</mml:mo><mml:mrow><mml:mi>i</mml:mi><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup><mml:msup><mml:mfenced open="[" close="]"><mml:mtable class="matrix" columnalign="center center center" framespacing="0em"><mml:mtr><mml:mtd><mml:mn mathvariant="normal">0</mml:mn></mml:mtd><mml:mtd><mml:mrow><mml:mo>(</mml:mo><mml:msubsup><mml:mover accent="true"><mml:mrow><mml:mi>h</mml:mi><mml:mi>u</mml:mi></mml:mrow><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi><mml:mi>i</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mo>(</mml:mo><mml:msubsup><mml:mover accent="true"><mml:mrow><mml:mi>h</mml:mi><mml:mi>v</mml:mi></mml:mrow><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi><mml:mi>i</mml:mi></mml:msubsup><mml:mo>)</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mi>T</mml:mi></mml:msup><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mi>i</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">3</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">4</mml:mn></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>

          where <inline-formula><mml:math id="M168" display="inline"><mml:mrow><mml:msubsup><mml:mover accent="true"><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi><mml:mi>l</mml:mi></mml:msubsup></mml:mrow></mml:math></inline-formula> are intermediate stage values, with <inline-formula><mml:math id="M169" display="inline"><mml:mrow><mml:msubsup><mml:mover accent="true"><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msubsup><mml:mo>=</mml:mo><mml:msubsup><mml:mover accent="true"><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>n</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M170" display="inline"><mml:mrow><mml:msubsup><mml:mover accent="true"><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>n</mml:mi><mml:mo>+</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mo>=</mml:mo><mml:msubsup><mml:mover accent="true"><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi><mml:mn mathvariant="normal">4</mml:mn></mml:msubsup></mml:mrow></mml:math></inline-formula>. The nonzero RK4,3 coefficients are

            <disp-formula id="Ch1.E30" content-type="numbered"><label>30</label><mml:math id="M171" display="block"><mml:mrow><mml:mtable class="array" columnalign="right center left"><mml:mtr><mml:mtd><mml:mfenced open="(" close=")"><mml:mtable class="matrix" columnalign="center center center center center" framespacing="0em"><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mrow><mml:mn mathvariant="normal">2</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mrow><mml:mn mathvariant="normal">3</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mrow><mml:mn mathvariant="normal">3</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mrow><mml:mn mathvariant="normal">4</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced></mml:mtd><mml:mtd><mml:mo>=</mml:mo></mml:mtd><mml:mtd><mml:mrow><mml:mfenced open="(" close=")"><mml:mtable class="matrix" columnalign="center center center center center" framespacing="0em"><mml:mtr><mml:mtd><mml:mn mathvariant="normal">1</mml:mn></mml:mtd><mml:mtd><mml:mn mathvariant="normal">1</mml:mn></mml:mtd><mml:mtd><mml:mrow><mml:mn mathvariant="normal">2</mml:mn><mml:mo>/</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>/</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:mtd><mml:mtd><mml:mn mathvariant="normal">1</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mfenced close=")" open="("><mml:mtable class="matrix" columnalign="center center center center" framespacing="0em"><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mrow><mml:mn mathvariant="normal">2</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mrow><mml:mn mathvariant="normal">3</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mrow><mml:mn mathvariant="normal">4</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced></mml:mtd><mml:mtd><mml:mo>=</mml:mo></mml:mtd><mml:mtd><mml:mrow><mml:mfenced open="(" close=")"><mml:mtable class="matrix" columnalign="center center center center" framespacing="0em"><mml:mtr><mml:mtd><mml:mn mathvariant="normal">1</mml:mn></mml:mtd><mml:mtd><mml:mn mathvariant="normal">1</mml:mn></mml:mtd><mml:mtd><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>/</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:mtd><mml:mtd><mml:mn mathvariant="normal">1</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:math></disp-formula>

          The EE scheme follows directly with <inline-formula><mml:math id="M172" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M173" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:math></inline-formula>.</p>
      <p id="d2e8625">This semi-implicit formulation improves robustness in the presence of stiff source terms, particularly in friction-dominated regimes and near wet–dry interfaces, as demonstrated in the dam-break simulations (Sect. <xref ref-type="sec" rid="Ch1.S5"/>).</p>
      <p id="d2e8631">Time-step selection is governed by a Courant–Friedrichs–Lewy (CFL) condition,

            <disp-formula id="Ch1.E31" content-type="numbered"><label>31</label><mml:math id="M174" display="block"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:mi mathvariant="normal">CFL</mml:mi><mml:mo>⋅</mml:mo><mml:munder><mml:mo movablelimits="false">min⁡</mml:mo><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:munder><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msub><mml:mi>r</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow><mml:mrow><mml:mo>max⁡</mml:mo><mml:mo mathvariant="italic">{</mml:mo><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>in</mml:mtext></mml:msubsup><mml:mo>,</mml:mo><mml:msubsup><mml:mi>a</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow><mml:mtext>out</mml:mtext></mml:msubsup><mml:mo mathvariant="italic">}</mml:mo></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

          where <inline-formula><mml:math id="M175" display="inline"><mml:mrow><mml:msub><mml:mi>r</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> is the perpendicular distance from edge <inline-formula><mml:math id="M176" display="inline"><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:math></inline-formula> to the opposite vertex, and CFL is user-defined. Theoretical stability bounds suggest CFL <inline-formula><mml:math id="M177" display="inline"><mml:mrow><mml:mo>≤</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>/</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:math></inline-formula> for the CU scheme <xref ref-type="bibr" rid="bib1.bibx50" id="paren.82"/>, and CFL <inline-formula><mml:math id="M178" display="inline"><mml:mrow><mml:mo>≤</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>/</mml:mo><mml:mn mathvariant="normal">6</mml:mn></mml:mrow></mml:math></inline-formula> when accounting for wet/dry reconstruction <xref ref-type="bibr" rid="bib1.bibx14" id="paren.83"/> to guarantee positivity (<inline-formula><mml:math id="M179" display="inline"><mml:mrow><mml:mi>h</mml:mi><mml:mo>=</mml:mo><mml:mi>w</mml:mi><mml:mo>-</mml:mo><mml:mi>B</mml:mi><mml:mo>≥</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:math></inline-formula>). In practice, slightly larger values may be admissible. For RK4,3, <inline-formula><mml:math id="M180" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>t</mml:mi></mml:mrow></mml:math></inline-formula> is computed at the first stage and appropriately scaled in subsequent stages to balance stability and efficiency.</p>
</sec>
</sec>
<sec id="Ch1.S4">
  <label>4</label><title>Architecture &amp; parallel structure </title>
      <p id="d2e8799">Having introduced the CU-fluxes, spatial reconstructions, and source-term discretizations in Sect. <xref ref-type="sec" rid="Ch1.S3"/>, we now describe their GPU implementation in <monospace>SWEpy</monospace>. The framework is designed to combine modularity, extensibility, and high-performance parallel execution. This enables efficient large-scale simulations while allowing users to incorporate additional physical processes – such as rheology or infiltration – within a consistent spatial and temporal discretization framework.</p>
      <p id="d2e8807"><monospace>SWEpy</monospace> adopts a modular programming paradigm <xref ref-type="bibr" rid="bib1.bibx71" id="paren.84"/>, in which the FV solver is decomposed into independent, reusable components. These modules handle different tasks, including grid loading, analysis configuration, preprocessing, time-step integration, spatial reconstruction, numerical flux, source term computations, and data output. This modular structure enhances user accessibility by isolating functionalities into self-contained units. It also promotes community-driven development through simple modification or extension of modules to accommodate additional source terms, boundary conditions, and other user-specific needs.</p>
      <p id="d2e8815">Although this design supports flexibility, the inclusion of new physical processes (e.g., infiltration or sediment transport) requires careful consideration to ensure consistency with the underlying numerical schemes and GPU-oriented implementation. An overview of the software architecture and its parallel workflow is presented in Fig. <xref ref-type="fig" rid="F5"/>.</p>
      <p id="d2e8822">Developed in <monospace>Python</monospace>, <monospace>SWEpy</monospace> utilizes <monospace>CuPy</monospace><fn id="Ch1.Footn4"><p id="d2e8833">A CUDA-enabled analogue of NumPy – to perform array-based computations directly on GPUs <xref ref-type="bibr" rid="bib1.bibx70" id="paren.85"/>.</p></fn>. This approach enables significant speedups of parallel operations without requiring low-level programming in C<inline-formula><mml:math id="M181" display="inline"><mml:mrow><mml:mo>+</mml:mo><mml:mo>+</mml:mo></mml:mrow></mml:math></inline-formula> or CUDA. Cell-centered variables (e.g., states and fluxes) are stored as indexed arrays – for example, the mean water level in cell <inline-formula><mml:math id="M182" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mn mathvariant="normal">3</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> is accessed as <monospace>Wj[3]</monospace> – allowing the solver to naturally exploit the data parallelism of FVM. Key operations, including reconstruction and flux evaluation, are vectorized over the entire mesh, minimizing CPU–GPU data transfers and leveraging efficient single-instruction, multiple-data (SIMD) execution <xref ref-type="bibr" rid="bib1.bibx41" id="paren.86"/>. This design accelerates the CU scheme on unstructured triangular grids (Sect. <xref ref-type="sec" rid="Ch1.S3"/>) while maintaining scalability for large-scale applications, such as the Maule tsunami simulation (Sect. <xref ref-type="sec" rid="Ch1.S5"/>). As a result, <monospace>SWEpy</monospace> can deliver high-resolution solutions on consumer-grade hardware, in some cases achieving real-time or faster-than-real-time performance.</p>
      <p id="d2e8875">The execution workflow is organized into three stages – Preprocessing, Run Analysis, and Post-processing – summarized in Fig. <xref ref-type="fig" rid="F5"/>. In the diagram, green boxes denote GPU-accelerated tasks, segmented boxes represent time-stepping and major phases, and arrows crossing green regions indicate CPU–GPU synchronization points, providing a conceptual map of data flow, parallelism, and modularity. The following sections describe each phase and its associated modules, with the primary functions highlighted in italics.</p>

      <fig id="F5" specific-use="star"><label>Figure 5</label><caption><p id="d2e8882">Overview of the <monospace>SWEpy</monospace> software parallel structure and architecture. The green box contains tasks performed on the GPU. The innermost segmented box contains tasks done by the chosen timestepping method. Outer segmented boxes indicate phases. Postprocessing phase highlights stagnation and divergence detection, and user controlled data saving. Arrows going into/out of green box indicate CPU-GPU synchronization. We highlight that the figure provides a high-level overview of module organization and data flow, rather than a function-level representation of the code structure.</p></caption>
        <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f05.png"/>

      </fig>

<sec id="Ch1.S4.SS1">
  <label>4.1</label><title>Preprocessing</title>
<sec id="Ch1.S4.SS1.SSS1">
  <label>4.1.1</label><title>Loading input data <italic>(FileLoader.load_from_files)</italic></title>
      <p id="d2e8911">As shown in the upper portion of Fig. <xref ref-type="fig" rid="F5"/>, the preprocessing phase initializes the simulation by organizing all input data for efficient GPU execution, reducing subsequent CPU–GPU transfers and enabling scalability on large unstructured grids.</p>
      <p id="d2e8916"><monospace>SWEpy</monospace> takes as input a user-defined triangular mesh – specified through vertex coordinates, connectivity, and bathymetry values – along with initial conditions for the conserved variables, boundary ghost-cell definitions, and a configuration file containing simulation parameters (e.g., numerical tolerances, final time, gravitational acceleration, CFL number, and optional source-term coefficients such as Manning roughness or Coriolis effects).</p>
      <p id="d2e8921">All inputs are consolidated into the <italic>mesh</italic> dictionary, which serves as the central data structure throughout the simulation.</p>
</sec>
<sec id="Ch1.S4.SS1.SSS2">
  <label>4.1.2</label><title>Bathymetry generation <italic>(Utilities.bathymetry_midpoint/2)</italic></title>
      <p id="d2e8938">Bathymetry is reconstructed using an interpolator consistent with the chosen spatial reconstruction. For instance, a linear interpolator is employed with the minmod scheme <xref ref-type="bibr" rid="bib1.bibx14" id="paren.87"/>.  This process involves interpolating vertex values to both edge Gaussian points and the cell interiors, which are required for source term evaluations in Eq. (<xref ref-type="disp-formula" rid="Ch1.E20"/>).</p>
      <p id="d2e8946">The interpolation relies on simple algebraic operations (such as computing the gradient of a plane defined by the three vertices of each triangle) and is vectorized for efficient execution on the GPU. Relevant quantities are precomputed and stored to further enhance performance.</p>
</sec>
<sec id="Ch1.S4.SS1.SSS3">
  <label>4.1.3</label><title>Geometric computations on the mesh <italic>(FileLoader.compute_element_properties)</italic></title>
      <p id="d2e8960">Key geometric properties required by the numerical scheme, such as cell areas <inline-formula><mml:math id="M183" display="inline"><mml:mrow><mml:mo>|</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>|</mml:mo></mml:mrow></mml:math></inline-formula>, edge lengths <inline-formula><mml:math id="M184" display="inline"><mml:mrow><mml:msub><mml:mi>l</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>, barycenters <inline-formula><mml:math id="M185" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula>, perpendicular heights <inline-formula><mml:math id="M186" display="inline"><mml:mrow><mml:msub><mml:mi>r</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>, and second area moments <inline-formula><mml:math id="M187" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mi>x</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>I</mml:mi><mml:mi>y</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>I</mml:mi><mml:mrow><mml:mi>x</mml:mi><mml:mi>y</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> <italic>(Utilities.second_moments</italic>; see <xref ref-type="bibr" rid="bib1.bibx33" id="altparen.88"/>), are computed in parallel for all cells.</p>
      <p id="d2e9063">Using CuPy’s vectorized array operations, these quantities are evaluated directly from vertex coordinates, enabling simultaneous computation across the entire grid on the GPU. This approach significantly accelerates the preprocessing stage, particularly for the high-resolution meshes typical of flood and tsunami simulations.</p>
</sec>
<sec id="Ch1.S4.SS1.SSS4">
  <label>4.1.4</label><title>Stencil generation for high-order reconstruction <italic>(Utilities.precomp_weno2)</italic></title>
      <p id="d2e9077">For quadratic WENO reconstruction, a vectorized procedure identifies first- and second-order neighbors in a single time, while flagging boundary cells with incomplete stencils for fallback to the minmod scheme. The least-squares matrices (right-hand side of Eq. <xref ref-type="disp-formula" rid="App1.Ch1.S1.E36"/>), which depend only on grid geometry, are precomputed using CuPy’s <monospace>linalg</monospace> routines. Matrix inversions and multiplications are performed in parallel over stacked systems, and the resulting coefficients are stored as arrays for efficient reuse during the run-analysis phase.</p>
      <p id="d2e9085">By shifting these computations to the GPU and avoiding repeated stencil assembly, the preprocessing establishes a data-parallel foundation, enabling <monospace>SWEpy</monospace> to handle complex simulations with minimized runtime delays.</p>
</sec>
</sec>
<sec id="Ch1.S4.SS2">
  <label>4.2</label><title>Run-analysis <italic>(ShallowWater.run/run_with_TS)</italic></title>
      <p id="d2e9103">The run-analysis phase – depicted by the central segmented box in Fig. <xref ref-type="fig" rid="F5"/> – forms the core of <monospace>SWEpy</monospace>'s time integration. In this stage, the solution is advanced iteratively through spatial reconstruction, source-term evaluation, flux computation, and state updates, all implemented to exploit GPU parallelism. By leveraging CuPy’s array-based operations, these calculations are performed concurrently across the entire mesh, minimizing serial bottlenecks and enabling efficient simulation of large-scale flows, such as those presented in Sect. <xref ref-type="sec" rid="Ch1.S5"/>.</p>
      <p id="d2e9113">Prior to entering the main time-stepping loop, the program chooses the “timestep” function to be used according to user selection <italic>(ShallowWater.choose_timestep)</italic>. This timestep function is central as it defines the sequence of operations performed at each iteration – including reconstruction, flux evaluation, and source-term treatment – consistent with the CU formulation and the chosen temporal discretization. In essence, it encapsulates the definition of a single update step.</p>
      <p id="d2e9119">This design provides flexibility: by modifying or extending the timestep routines using the components described below, users can readily switch between reconstruction strategies, source-term models, time integration schemes, and even flux definitions.</p>
<sec id="Ch1.S4.SS2.SSS1">
  <label>4.2.1</label><title>Reconstruction <italic>(PieceWiseReconstruction.minmod/weno2)</italic></title>
      <p id="d2e9133">For minmod reconstruction, <monospace>SWEpy</monospace> evaluates cell-centered gradients using neighboring average states and reconstructs the conserved variables <inline-formula><mml:math id="M188" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:msub><mml:mi>M</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> at edge midpoints for flux computations in Eq. (<xref ref-type="disp-formula" rid="Ch1.E16"/>). Water surface values are also reconstructed at vertices to support wet/dry treatment. An optional diffusion parameter, <inline-formula><mml:math id="M189" display="inline"><mml:mrow><mml:mi mathvariant="italic">ϑ</mml:mi><mml:mo>∈</mml:mo><mml:mo>[</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:mo>]</mml:mo></mml:mrow></mml:math></inline-formula> (cf. Eq. <xref ref-type="disp-formula" rid="Ch1.E26"/>, can be specified to control numerical dissipation: larger values reduce diffusion but may increase the risk of spurious oscillations.</p>
      <p id="d2e9186">All gradient evaluations and interpolations are implemented using CuPy’s vectorized operations, exploiting SIMD parallelism to process all cells simultaneously on the GPU. As a result, the sequential loops described in Algorithm <xref ref-type="other" rid="App1.Ch1.S1.Prog1"/> are effectively replaced by fully parallel array-based computations, significantly improving performance.</p>
      <p id="d2e9191">For WENO reconstruction, <monospace>SWEpy</monospace> solves the LSQ linear systems in Eq. (<xref ref-type="disp-formula" rid="App1.Ch1.S1.E36"/>) using precomputed matrices to obtain the reconstruction polynomials. These polynomials are then evaluated at the required quadrature points: edge Gaussian points for flux computations in Eq. (<xref ref-type="disp-formula" rid="Ch1.E16"/>), interior Gaussian points for source-term evaluation in Eq. (<xref ref-type="disp-formula" rid="Ch1.E20"/>), and cell vertices for wet/dry treatment.</p>
      <p id="d2e9204">Because the reconstruction stencils are preassembled during preprocessing, all evaluations can be carried out simultaneously across the mesh using GPU-accelerated operations. Consequently, the cell-wise iterations described in Algorithm <xref ref-type="other" rid="App1.Ch1.S1.Prog2"/> are fully vectorized and executed in parallel, significantly enhancing computational efficiency.</p>
      <p id="d2e9209">Boundary cells lacking full second-order neighbors, identified during preprocessing, default to minmod reconstruction. Wet/dry fronts are corrected by replacing invalid reconstructions (negative depths) using CuPy's fancy indexing to locate and adjust affected cells in parallel, executing Algorithm <xref ref-type="other" rid="App1.Ch1.S1.Prog3"/> via SIMD commands on the GPU without explicit loops. This means that “for-loops” in Algorithm <xref ref-type="other" rid="App1.Ch1.S1.Prog3"/> are replaced by SIMD commands for all cells, efficiently performed over the GPU.</p>
      <p id="d2e9216">The modular design of <monospace>SWEpy</monospace> further allows users to define custom reconstruction operators, provided they supply interpolated values at the required points. This facilitates extensions – such as hybrid reconstruction strategies – while maintaining GPU efficiency.</p>
</sec>
<sec id="Ch1.S4.SS2.SSS2">
  <label>4.2.2</label><title>Source Terms <italic>(CentralUpwindMethod.source_term/2, coriolis, friction_term)</italic></title>
      <p id="d2e9233">Bathymetry source terms are evaluated in all cells using Eq. (<xref ref-type="disp-formula" rid="Ch1.E20"/>), based on the precomputed bathymetry reconstruction and the selected spatial operator. Additional contributions, such as Coriolis and friction terms, are computed from the cell states and stored for use during the update step.</p>
      <p id="d2e9238">All source-term evaluations are fully vectorized and executed on the GPU, ensuring efficient parallel computation, including for optional physics. The modular framework also allows users to incorporate additional source-term models, provided they remain consistent with the chosen spatial discretization, reconstruction strategy, and time-integration scheme.</p>
</sec>
<sec id="Ch1.S4.SS2.SSS3">
  <label>4.2.3</label><title>Local speeds and time steps <italic>(CentralUpwindMethod.one_sided_speed/2)</italic></title>
      <p id="d2e9252">Using the reconstructed states, velocities are desingularized and projected onto edge normals to evaluate the local propagation speeds in Eq. (<xref ref-type="disp-formula" rid="Ch1.E19"/>). These computations are performed simultaneously for all edges using GPU-parallel operations. When adaptive time stepping is enabled, the time increment <inline-formula><mml:math id="M190" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>t</mml:mi></mml:mrow></mml:math></inline-formula> is determined from the CFL stability condition based on the computed wave speeds, maximizing the allowable step size to improve efficiency while limiting numerical diffusion (cf. Eq. <xref ref-type="disp-formula" rid="Ch1.E31"/>).</p>
      <p id="d2e9269">Explicit Euler (EE) integration applies Eq. (<xref ref-type="disp-formula" rid="Ch1.E16"/>) through fully vectorized GPU operations, with CPU synchronization limited to advancing the timestep (one cycle in Fig. <xref ref-type="fig" rid="F5"/>). The SSP RK(4,3) scheme <xref ref-type="bibr" rid="bib1.bibx37" id="paren.89"/> and the classical four-stage RK4 method are implemented as sequences of scaled explicit Euler updates. These stages are executed sequentially on the GPU, avoiding iterative solvers and minimizing overhead, with optional friction corrections applied at each stage.</p>
      <p id="d2e9279">The modular design of the <italic>timestep</italic> function allows user-defined integration schemes to be seamlessly incorporated into the GPU workflow. This enables future extensions, such as predictor–corrector methods or modified Newton–Raphson iterations for implicit formulations, although the latter remain less suited to efficient GPU execution.</p>
</sec>
<sec id="Ch1.S4.SS2.SSS4">
  <label>4.2.4</label><title>Variable update and correction (<italic>timestep</italic> function)</title>
      <p id="d2e9297">Fluxes are assembled from the reconstructed states and local wave speeds, and the cell averages are updated according to the CU scheme in Eq. (<xref ref-type="disp-formula" rid="Ch1.E16"/>) through a single GPU-parallel operation, followed by the enforcement of ghost-cell boundary conditions. For Manning friction, an intermediate semi-implicit correction is applied to the discharge, performed vector-wise across the grid.</p>
      <p id="d2e9302">In multi-stage RK schemes, intermediate states and fluxes are computed and stored on the GPU, with optional friction corrections applied at each stage. This design minimizes CPU–GPU synchronization while preserving the intended order of accuracy as represented in Table <xref ref-type="table" rid="T2"/>.</p>
</sec>
<sec id="Ch1.S4.SS2.SSS5">
  <label>4.2.5</label><title>Boundary conditions <italic>(BoundaryConditions.impose)</italic></title>
      <p id="d2e9318">The program enforces user-defined boundary conditions through the ghost cell states. Because each ghost cell is independent, mixed boundary conditions along domain boundaries can be applied simultaneously. The modular structure of the code further supports the implementation of more advanced boundary treatments, such as transport-based models for coupling with external solvers, commonly referred to as sequential or iterative coupling.</p>
      <p id="d2e9321">The boundary conditions currently implemented through ghost cells include: (a) a zero-order extrapolation permeable (soft) boundary, in which the border cell state is replicated in the adjacent ghost cell; and (b) an impermeable (wall) boundary, where the water height is replicated while the flow direction is reversed, effectively reflecting the flux and enforcing a zero-normal-flow condition at the interface.</p>
      <p id="d2e9324">We note that periodic boundary conditions can be incorporated by defining boundary cells as neighbors of other boundary cells. For example, to impose periodicity between the top and bottom boundaries of a channel, the bottom cells are treated as the upward neighbors of the top boundary cells, and vice versa. This approach is used in several of our experiments. Please refer to the User Manual <inline-formula><mml:math id="M191" display="inline"><mml:mi mathvariant="italic">&amp;</mml:mi></mml:math></inline-formula> Technical Reference <xref ref-type="bibr" rid="bib1.bibx63" id="paren.90"/> for details.</p>
</sec>
</sec>
<sec id="Ch1.S4.SS3">
  <label>4.3</label><title>Postprocessing <italic>(FileSaver module)</italic></title>
      <p id="d2e9350">The post-processing phase, illustrated in the lower portion of Fig. <xref ref-type="fig" rid="F5"/>, concludes the simulation by handling data output and termination criteria. Leveraging the modular design of <monospace>SWEpy</monospace>, this stage supports customizable workflows tailored to both research analysis and operational monitoring. Users can integrate predefined or custom routines to export results at any point during runtime, enabling both real-time inspection and efficient post-simulation analysis.</p>
      <p id="d2e9358">For data storage, <monospace>SWEpy</monospace> provides built-in functionality to save initial conditions and bathymetry <italic>(FileSaver.save_bathymetry)</italic> in <monospace>.vtk</monospace> format prior to the simulation, followed by solution snapshots at user-defined intervals <inline-formula><mml:math id="M192" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:msub><mml:mi>t</mml:mi><mml:mtext>save</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> throughout the run <italic>(FileSaver.save_animation)</italic>. This format is optimized for visualization tools such as ParaView <xref ref-type="bibr" rid="bib1.bibx5" id="paren.91"/>, allowing users to render both static fields and time-resolved animations over unstructured grids. In addition, time series data at selected locations (e.g., virtual gauges for tsunami validation; see Sect. <xref ref-type="sec" rid="Ch1.S5"/>) can be recorded at the same <inline-formula><mml:math id="M193" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:msub><mml:mi>t</mml:mi><mml:mtext>save</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> <italic>(FileSaver.save_TS)</italic>. Because these routines are integrated directly into the runtime, they enable continuous monitoring of the evolving solution – an important feature for identifying anomalies in long simulations without interrupting execution. Efficient data handling is ensured through CuPy’s GPU-compatible NumPy routines (e.g., <monospace>save</monospace>, <monospace>savez</monospace>, <monospace>savetxt</monospace>), which allow high-frequency output with minimal performance overhead.</p>
      <p id="d2e9418">By default, the simulation terminates once the prescribed final time is reached. However, the modular framework allows for additional user-defined stopping criteria, such as divergence detection (e.g., when an adaptive <inline-formula><mml:math id="M194" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>t</mml:mi></mml:mrow></mml:math></inline-formula> falls below a threshold) or stagnation monitoring (e.g., negligible state evolution over a specified number of iterations). These criteria can be implemented by extending or modifying the <italic>run</italic> functions. In our experiments, such controls proved effective in preventing unproductive simulations and complemented the live visualization capabilities for real-time decision-making. More broadly, this flexibility enhances <monospace>SWEpy</monospace>'s applicability, enabling integration with external tools for automated error handling or real-time coupling in hybrid modeling workflows.</p>
</sec>
</sec>
<sec id="Ch1.S5">
  <label>5</label><title>Results and Discussion</title>
      <p id="d2e9447">This section presents a series of numerical experiments to validate <monospace>SWEpy</monospace>'s implementation, accuracy, and performance against analytical benchmarks and real-world cases, demonstrating the effectiveness of the CU scheme with WENO reconstructions and GPU acceleration as described in Sects. <xref ref-type="sec" rid="Ch1.S3"/> and <xref ref-type="sec" rid="Ch1.S4"/>. We begin with canonical tests that assess spatial and temporal accuracy, well-balancing, positivity preservation, and numerical diffusion reduction, followed by synthetic scenarios that highlight the versatility of the reconstruction operators. Finally, large-scale simulations of the 1959 Malpasset dam failure and the 2010 Maule tsunami assess real-world applicability by comparing results with historical data and established solvers such as TELEMAC <xref ref-type="bibr" rid="bib1.bibx66" id="paren.92"/>. These experiments underscore <monospace>SWEpy</monospace>'s robustness for inundation modeling over complex topography and long-range wave propagation, achieving high-resolution outcomes on consumer hardware with computation times reduced by factors of up to <inline-formula><mml:math id="M195" display="inline"><mml:mrow><mml:mn mathvariant="normal">21</mml:mn><mml:mo>×</mml:mo></mml:mrow></mml:math></inline-formula> via CuPy parallelism.</p>
<sec id="Ch1.S5.SS1">
  <label>5.1</label><title>Benchmark tests</title>
<sec id="Ch1.S5.SS1.SSS1">
  <label>5.1.1</label><title>Spatial convergence order study</title>
      <p id="d2e9489">To validate <monospace>SWEpy</monospace>'s spatial accuracy and verify the correct discretization of the bathymetry source term (Eq. <xref ref-type="disp-formula" rid="Ch1.E20"/>), we replicate the convergence test of <xref ref-type="bibr" rid="bib1.bibx14" id="text.93"/>, focusing on scenarios where well-balancing is critical to preserve steady states over non-flat topography free of spurious oscillations. The test quantifies the order of convergence for different spatial reconstruction operators (Sect. <xref ref-type="sec" rid="Ch1.S3.SS3"/>) over a smooth Gaussian bump.</p>
      <p id="d2e9502">The computational domain is a <inline-formula><mml:math id="M196" display="inline"><mml:mrow><mml:mn mathvariant="normal">2</mml:mn><mml:mo>×</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mi mathvariant="normal">m</mml:mi></mml:mrow></mml:math></inline-formula> rectangle discretized into a regular mesh of equilateral triangles, where triangles along the top and bottom boundaries are halved to ensure consistent boundary treatment. The bottom topography is defined as

              <disp-formula id="Ch1.E32" content-type="numbered"><label>32</label><mml:math id="M197" display="block"><mml:mrow><mml:mi>B</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.5</mml:mn><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mi>exp⁡</mml:mi><mml:mo mathsize="1.1em">(</mml:mo><mml:mo>-</mml:mo><mml:mn mathvariant="normal">25</mml:mn><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:msup><mml:mo>)</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>-</mml:mo><mml:mn mathvariant="normal">50</mml:mn><mml:mo>(</mml:mo><mml:mi>y</mml:mi><mml:mo>-</mml:mo><mml:mn mathvariant="normal">0.5</mml:mn><mml:msup><mml:mo>)</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo mathsize="1.1em">)</mml:mo><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

            The initial conditions consist of a uniform free-surface elevation <inline-formula><mml:math id="M198" display="inline"><mml:mrow><mml:mi>w</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1.0</mml:mn><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mi mathvariant="normal">m</mml:mi></mml:mrow></mml:math></inline-formula> and a velocity field <inline-formula><mml:math id="M199" display="inline"><mml:mrow><mml:mi>u</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.3</mml:mn></mml:mrow></mml:math></inline-formula> m s<sup>−1</sup>, <inline-formula><mml:math id="M201" display="inline"><mml:mrow><mml:mi>v</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:math></inline-formula> m s<sup>−1</sup>. Fully permeable (zero-gradient) boundary conditions are applied on all sides, with <inline-formula><mml:math id="M203" display="inline"><mml:mrow><mml:mi>g</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:math></inline-formula> m s<sup>−2</sup>. The flow evolves to a steady, non-uniform state by <inline-formula><mml:math id="M205" display="inline"><mml:mrow><mml:mi>t</mml:mi><mml:mo>≈</mml:mo><mml:mn mathvariant="normal">0.07</mml:mn><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mi mathvariant="normal">s</mml:mi></mml:mrow></mml:math></inline-formula>, at which point temporal errors become negligible and spatial errors dominate.</p>
      <p id="d2e9733">The reference solution is computed on a fine grid with <inline-formula><mml:math id="M206" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mi>x</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">512</mml:mn></mml:mrow></mml:math></inline-formula> horizontal divisions (approximately <inline-formula><mml:math id="M207" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.18</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">6</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> cells) at <inline-formula><mml:math id="M208" display="inline"><mml:mrow><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.07</mml:mn><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mi mathvariant="normal">s</mml:mi></mml:mrow></mml:math></inline-formula>. Figure <xref ref-type="fig" rid="F6"/> illustrates the Gaussian bump on a coarse grid (<inline-formula><mml:math id="M209" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mi>x</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">32</mml:mn></mml:mrow></mml:math></inline-formula>) and the corresponding reference solution. The <inline-formula><mml:math id="M210" display="inline"><mml:mrow><mml:msup><mml:mi>L</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> error is defined as

              <disp-formula id="Ch1.Ex2"><mml:math id="M211" display="block"><mml:mrow><mml:mo>‖</mml:mo><mml:mi>e</mml:mi><mml:msub><mml:mo>‖</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:msqrt><mml:mrow><mml:munder><mml:mo movablelimits="false">∑</mml:mo><mml:mi>j</mml:mi></mml:munder><mml:mo>|</mml:mo><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>|</mml:mo><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mo mathsize="1.1em">(</mml:mo><mml:msub><mml:mover accent="true"><mml:mi>w</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>w</mml:mi><mml:mrow><mml:mi mathvariant="normal">ref</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:msup><mml:mo mathsize="1.1em">)</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:msqrt><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

            Convergence orders are then estimated via successive grid refinements. Table <xref ref-type="table" rid="T2"/> reports errors and orders for grids <inline-formula><mml:math id="M212" display="inline"><mml:mrow><mml:mi>p</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:math></inline-formula> to <inline-formula><mml:math id="M213" display="inline"><mml:mn mathvariant="normal">3</mml:mn></mml:math></inline-formula> (<inline-formula><mml:math id="M214" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mi>x</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">32</mml:mn><mml:mo>⋅</mml:mo><mml:msup><mml:mn mathvariant="normal">2</mml:mn><mml:mi>p</mml:mi></mml:msup></mml:mrow></mml:math></inline-formula>) across combinations of reconstruction operator and time-stepping scheme, while Fig. <xref ref-type="fig" rid="F7"/> shows the log–log relationship between error and effective grid spacing <inline-formula><mml:math id="M215" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>x</mml:mi></mml:mrow></mml:math></inline-formula>, with fitted power laws consistent with the expected convergence rates.</p>

      <fig id="F6" specific-use="star"><label>Figure 6</label><caption><p id="d2e9932">Bottom topography on a <inline-formula><mml:math id="M216" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mi>x</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">32</mml:mn></mml:mrow></mml:math></inline-formula> point grid (left) and reference solution (right) for the Gauss bump. The zoomed-in circular window highlights the grid structure pattern. </p></caption>
            <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f06.png"/>

          </fig>

<table-wrap id="T2" specific-use="star"><label>Table 2</label><caption><p id="d2e9959"><inline-formula><mml:math id="M217" display="inline"><mml:mrow><mml:msup><mml:mi>L</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> errors and numerical orders of accuracy. Grid number <inline-formula><mml:math id="M218" display="inline"><mml:mi>p</mml:mi></mml:math></inline-formula> corresponds to <inline-formula><mml:math id="M219" display="inline"><mml:mrow><mml:mi>n</mml:mi><mml:mi>x</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">32</mml:mn><mml:mo>⋅</mml:mo><mml:msup><mml:mn mathvariant="normal">2</mml:mn><mml:mi>p</mml:mi></mml:msup></mml:mrow></mml:math></inline-formula> horizontal divisions of the domain.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="7">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="right"/>
     <oasis:colspec colnum="3" colname="col3" align="right" colsep="1"/>
     <oasis:colspec colnum="4" colname="col4" align="right"/>
     <oasis:colspec colnum="5" colname="col5" align="right" colsep="1"/>
     <oasis:colspec colnum="6" colname="col6" align="right"/>
     <oasis:colspec colnum="7" colname="col7" align="right"/>
     <oasis:thead>
       <oasis:row>
         <oasis:entry colname="col1">Grid</oasis:entry>
         <oasis:entry rowsep="1" namest="col2" nameend="col3" align="center" colsep="1">Explicit Euler – Const. </oasis:entry>
         <oasis:entry rowsep="1" namest="col4" nameend="col5" align="center" colsep="1">Explicit Euler – Lin. </oasis:entry>
         <oasis:entry rowsep="1" namest="col6" nameend="col7" align="center">RK4,3 – Lin. </oasis:entry>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1"/>
         <oasis:entry colname="col2"><inline-formula><mml:math id="M220" display="inline"><mml:mrow><mml:msup><mml:mi>L</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula>Err</oasis:entry>
         <oasis:entry colname="col3">Ord</oasis:entry>
         <oasis:entry colname="col4"><inline-formula><mml:math id="M221" display="inline"><mml:mrow><mml:msup><mml:mi>L</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> Err</oasis:entry>
         <oasis:entry colname="col5">Ord</oasis:entry>
         <oasis:entry colname="col6"><inline-formula><mml:math id="M222" display="inline"><mml:mrow><mml:msup><mml:mi>L</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> Err</oasis:entry>
         <oasis:entry colname="col7">Ord</oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M223" display="inline"><mml:mrow><mml:mi>p</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">1.7 <inline-formula><mml:math id="M224" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−3</sup></oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">6.4 <inline-formula><mml:math id="M226" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−4</sup></oasis:entry>
         <oasis:entry colname="col5">–</oasis:entry>
         <oasis:entry colname="col6">6.4 <inline-formula><mml:math id="M228" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−4</sup></oasis:entry>
         <oasis:entry colname="col7">–</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M230" display="inline"><mml:mn mathvariant="normal">1</mml:mn></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">7.6 <inline-formula><mml:math id="M231" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−4</sup></oasis:entry>
         <oasis:entry colname="col3">1.15</oasis:entry>
         <oasis:entry colname="col4">1.6 <inline-formula><mml:math id="M233" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−4</sup></oasis:entry>
         <oasis:entry colname="col5">1.91</oasis:entry>
         <oasis:entry colname="col6">1.6 <inline-formula><mml:math id="M235" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−4</sup></oasis:entry>
         <oasis:entry colname="col7">1.90</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M237" display="inline"><mml:mn mathvariant="normal">2</mml:mn></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">3.1 <inline-formula><mml:math id="M238" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−4</sup></oasis:entry>
         <oasis:entry colname="col3">1.28</oasis:entry>
         <oasis:entry colname="col4">3.9 <inline-formula><mml:math id="M240" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−5</sup></oasis:entry>
         <oasis:entry colname="col5">1.63</oasis:entry>
         <oasis:entry colname="col6">3.8 <inline-formula><mml:math id="M242" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−5</sup></oasis:entry>
         <oasis:entry colname="col7">1.78</oasis:entry>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1"><inline-formula><mml:math id="M244" display="inline"><mml:mn mathvariant="normal">3</mml:mn></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">1.2 <inline-formula><mml:math id="M245" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−4</sup></oasis:entry>
         <oasis:entry colname="col3">1.43</oasis:entry>
         <oasis:entry colname="col4">9.6 <inline-formula><mml:math id="M247" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−6</sup></oasis:entry>
         <oasis:entry colname="col5">2.01</oasis:entry>
         <oasis:entry colname="col6">8.8 <inline-formula><mml:math id="M249" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−6</sup></oasis:entry>
         <oasis:entry colname="col7">2.12</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">Grid</oasis:entry>
         <oasis:entry rowsep="1" namest="col2" nameend="col3" align="center" colsep="1">Explicit Euler – Quad </oasis:entry>
         <oasis:entry rowsep="1" namest="col4" nameend="col5" align="center" colsep="1">RK4,3 – Quad. </oasis:entry>
         <oasis:entry rowsep="1" namest="col6" nameend="col7" align="center">RK4 – Quad. </oasis:entry>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1"/>
         <oasis:entry colname="col2"><inline-formula><mml:math id="M251" display="inline"><mml:mrow><mml:msup><mml:mi>L</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> Err</oasis:entry>
         <oasis:entry colname="col3">Ord</oasis:entry>
         <oasis:entry colname="col4"><inline-formula><mml:math id="M252" display="inline"><mml:mrow><mml:msup><mml:mi>L</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> Err</oasis:entry>
         <oasis:entry colname="col5">Ord</oasis:entry>
         <oasis:entry colname="col6"><inline-formula><mml:math id="M253" display="inline"><mml:mrow><mml:msup><mml:mi>L</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> Err</oasis:entry>
         <oasis:entry colname="col7">Ord</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M254" display="inline"><mml:mrow><mml:mi>p</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">2.9 <inline-formula><mml:math id="M255" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−4</sup></oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">2.9 <inline-formula><mml:math id="M257" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−4</sup></oasis:entry>
         <oasis:entry colname="col5">–</oasis:entry>
         <oasis:entry colname="col6">2.9 <inline-formula><mml:math id="M259" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−4</sup></oasis:entry>
         <oasis:entry colname="col7">–</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M261" display="inline"><mml:mn mathvariant="normal">1</mml:mn></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">6.7 <inline-formula><mml:math id="M262" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−5</sup></oasis:entry>
         <oasis:entry colname="col3">1.90</oasis:entry>
         <oasis:entry colname="col4">6.6 <inline-formula><mml:math id="M264" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−5</sup></oasis:entry>
         <oasis:entry colname="col5">1.90</oasis:entry>
         <oasis:entry colname="col6">6.6 <inline-formula><mml:math id="M266" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−5</sup></oasis:entry>
         <oasis:entry colname="col7">2.13</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M268" display="inline"><mml:mn mathvariant="normal">2</mml:mn></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">1.6 <inline-formula><mml:math id="M269" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−5</sup></oasis:entry>
         <oasis:entry colname="col3">1.78</oasis:entry>
         <oasis:entry colname="col4">1.5 <inline-formula><mml:math id="M271" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−5</sup></oasis:entry>
         <oasis:entry colname="col5">1.78</oasis:entry>
         <oasis:entry colname="col6">1.5 <inline-formula><mml:math id="M273" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−5</sup></oasis:entry>
         <oasis:entry colname="col7">2.11</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"><inline-formula><mml:math id="M275" display="inline"><mml:mn mathvariant="normal">3</mml:mn></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col2">3.9 <inline-formula><mml:math id="M276" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−6</sup></oasis:entry>
         <oasis:entry colname="col3">2.02</oasis:entry>
         <oasis:entry colname="col4">3.6 <inline-formula><mml:math id="M278" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−6</sup></oasis:entry>
         <oasis:entry colname="col5">2.12</oasis:entry>
         <oasis:entry colname="col6">3.5 <inline-formula><mml:math id="M280" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−6</sup></oasis:entry>
         <oasis:entry colname="col7">2.14</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>

      <fig id="F7" specific-use="star"><label>Figure 7</label><caption><p id="d2e10849">Log-log plot of <inline-formula><mml:math id="M282" display="inline"><mml:mrow><mml:msup><mml:mi>L</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> error versus grid size <inline-formula><mml:math id="M283" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>x</mml:mi></mml:mrow></mml:math></inline-formula>, with fitted power-law curves indicating convergence orders.</p></caption>
            <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f07.png"/>

          </fig>

      <p id="d2e10879">The results confirm the robustness of all configurations. Constant reconstruction yields better-than-first-order accuracy, while linear and quadratic reconstructions approach second-order convergence, in agreement with the scheme’s formal order for smooth solutions.</p>
      <p id="d2e10882">The theoretically attainable third-order accuracy with quadratic reconstruction is not achieved, suggesting that further refinement of either the numerical flux formulation or the bathymetry source term discretization may be needed to fully realize higher-degree polynomial benefits. This order degradation is an expected behavior, also reported by <xref ref-type="bibr" rid="bib1.bibx14" id="text.94"/>, and more recently by <xref ref-type="bibr" rid="bib1.bibx69" id="text.95"/>. However, a detailed convergence analysis of the extended scheme is beyond the scope of this work. Nevertheless, WENO-based quadratic reconstruction consistently produces the smallest errors, outperforming lower-order approaches across all resolutions. This improved accuracy is particularly relevant in precision-critical scenarios, where error propagation over long timescales can be significant.</p>
      <p id="d2e10892">From a practical performance standpoint, generating the fine-grid reference solution with explicit Euler time-stepping and linear reconstruction required approximately 5 min wall-clock time on consumer-grade GPU hardware, including output at a high-frequency interval of <inline-formula><mml:math id="M284" display="inline"><mml:mrow><mml:mn mathvariant="normal">0.01</mml:mn><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mi mathvariant="normal">s</mml:mi></mml:mrow></mml:math></inline-formula> for animation purposes. This demonstrates that <monospace>SWEpy</monospace> can deliver high-resolution, well-balanced solutions for flows over smooth-bottom at modest computational cost.</p>
</sec>
<sec id="Ch1.S5.SS1.SSS2">
  <label>5.1.2</label><title>Well-balancing test </title>
      <p id="d2e10917">We simulate a static flat water surface over white-noise-generated bathymetry to verify the well-balanced property for all reconstruction operators. The domain is a <inline-formula><mml:math id="M285" display="inline"><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>×</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mspace linebreak="nobreak" width="0.125em"/><mml:msup><mml:mi mathvariant="normal">m</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> domain, with a random bathymetry with mean depth of <inline-formula><mml:math id="M286" display="inline"><mml:mrow><mml:mi>d</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:math></inline-formula>, uniformly distributed in <inline-formula><mml:math id="M287" display="inline"><mml:mrow><mml:mo>[</mml:mo><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1.1</mml:mn><mml:mi>d</mml:mi><mml:mo>;</mml:mo><mml:mo>-</mml:mo><mml:mn mathvariant="normal">0.9</mml:mn><mml:mi>d</mml:mi><mml:mo>]</mml:mo></mml:mrow></mml:math></inline-formula>, discretized using a right-triangles mesh with <inline-formula><mml:math id="M288" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>x</mml:mi><mml:mo>=</mml:mo><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>y</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.01</mml:mn></mml:mrow></mml:math></inline-formula>. The dry tolerance is set to <inline-formula><mml:math id="M289" display="inline"><mml:mrow><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">17</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> to assess machine-precision accuracy. Simulations use explicit Euler time-stepping with an adaptive timestep and CFL <inline-formula><mml:math id="M290" display="inline"><mml:mrow><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.25</mml:mn></mml:mrow></mml:math></inline-formula>.</p>
      <p id="d2e11019">The initial water surface is set to <inline-formula><mml:math id="M291" display="inline"><mml:mn mathvariant="normal">0</mml:mn></mml:math></inline-formula> <inline-formula><mml:math id="M292" display="inline"><mml:mi mathvariant="normal">m</mml:mi></mml:math></inline-formula> and the velocity field is set to zero in both directions. Figure <xref ref-type="fig" rid="F8"/> shows the random bathymetry and the maximum water height over time for the three reconstructions, confirming that no spurious oscillations arise. These results, while potentially surprising, are in fact expected since the bathymetry source term discretization is exactly well balanced by construction. This means that even in the presence of boundary conditions, unphysical oscillations or flows will not appear. Notably, this experiment also confirms the well-balancing property with the Runge Kutta scheme, since it is implemented as four successive explicit Euler steps.</p>

      <fig id="F8" specific-use="star"><label>Figure 8</label><caption><p id="d2e11040"><bold>(a)</bold> Maximum water height over time. <bold>(b)</bold> Randomly generated bathymetry.</p></caption>
            <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f08.png"/>

          </fig>

</sec>
<sec id="Ch1.S5.SS1.SSS3">
  <label>5.1.3</label><title>Conical island wetting–drying benchmark</title>
      <p id="d2e11062">To evaluate <monospace>SWEpy</monospace>'s wet/dry handling and reconstruction performance during wave-obstacle interactions, which are essential for coastal inundation modeling, we simulate the conical island benchmark, a laboratory experiment <xref ref-type="bibr" rid="bib1.bibx11" id="paren.96"/> widely used for SWE validation <xref ref-type="bibr" rid="bib1.bibx82" id="paren.97"/>. This test assesses (i) positivity preservation on sloped topography, where runup/rundown induces dynamic wetting without unphysical negative water depths, and (ii) operator fidelity in capturing complex wavefronts. The domain is a <inline-formula><mml:math id="M293" display="inline"><mml:mrow><mml:mn mathvariant="normal">41</mml:mn><mml:mo>×</mml:mo><mml:mn mathvariant="normal">30</mml:mn></mml:mrow></mml:math></inline-formula> m tank with permeable (soft) boundaries to absorb reflections, thereby minimizing boundary artifacts. The domain is discretized using an equilateral triangular mesh with edge length 0.5 m (approximately 12 000 cells) , ensuring spatial isotropy. The bathymetry consists of a flat bottom with a truncated cone (base diameter 7.2 m, crest diameter 2.2 m, height 0.625 m) centered at the origin, simulating an island. The initial free-surface elevation is given by the solitary-wave profile:

              <disp-formula id="Ch1.E33" content-type="numbered"><label>33</label><mml:math id="M294" display="block"><mml:mrow><mml:mi>w</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mi>H</mml:mi><mml:mi>d</mml:mi></mml:mfrac></mml:mstyle><mml:mspace width="0.125em" linebreak="nobreak"/><mml:msup><mml:mi mathvariant="normal">sech</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo mathsize="1.1em">(</mml:mo><mml:mi mathvariant="italic">γ</mml:mi><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>-</mml:mo><mml:msub><mml:mi>X</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:mo>)</mml:mo><mml:mo mathsize="1.1em">)</mml:mo><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

            with <inline-formula><mml:math id="M295" display="inline"><mml:mrow><mml:mi>d</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.320</mml:mn><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mi mathvariant="normal">m</mml:mi></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M296" display="inline"><mml:mrow><mml:mi>H</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.02976</mml:mn><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mi mathvariant="normal">m</mml:mi></mml:mrow></mml:math></inline-formula>, and <inline-formula><mml:math id="M297" display="inline"><mml:mrow><mml:mi mathvariant="italic">γ</mml:mi><mml:mo>=</mml:mo><mml:msqrt><mml:mrow><mml:mn mathvariant="normal">3</mml:mn><mml:mi>H</mml:mi><mml:mo>/</mml:mo><mml:mn mathvariant="normal">4</mml:mn><mml:msup><mml:mi>d</mml:mi><mml:mn mathvariant="normal">3</mml:mn></mml:msup></mml:mrow></mml:msqrt></mml:mrow></mml:math></inline-formula>, positioned at <inline-formula><mml:math id="M298" display="inline"><mml:mrow><mml:msub><mml:mi>X</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:mo>-</mml:mo><mml:mn mathvariant="normal">13</mml:mn><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mi mathvariant="normal">m</mml:mi></mml:mrow></mml:math></inline-formula>. The initial velocity field is

              <disp-formula id="Ch1.E34" content-type="numbered"><label>34</label><mml:math id="M299" display="block"><mml:mtable class="split" rowspacing="0.2ex" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mi>u</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mi>g</mml:mi><mml:mi>d</mml:mi></mml:mfrac></mml:mstyle><mml:mi>w</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>)</mml:mo><mml:mfenced open="(" close=")"><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>-</mml:mo><mml:mn mathvariant="normal">0.25</mml:mn><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mi>w</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>)</mml:mo></mml:mrow><mml:mi>d</mml:mi></mml:mfrac></mml:mstyle></mml:mrow></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mi>v</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula></p>
      <p id="d2e11332">The initial condition is derived to ensure consistent propagation and extruded uniformly in the <inline-formula><mml:math id="M300" display="inline"><mml:mi>y</mml:mi></mml:math></inline-formula>-direction to simulate a two-dimensional wave front. Simulations are conducted with constant, minmod, and WENO reconstruction operators for cross-comparison, employing an explicit Euler time integration scheme with a Courant-Friedrichs-Lewy (CFL) number of 0.25. The reason for this temporal integration setup is twofold: (1) it demonstrates the solver's capability to operate at higher effective CFL numbers, and (2) it is sufficiently low to keep oscillations controlled, thereby isolating spatial-reconstruction effects and enabling a focused assessment of how each operator handles wet/dry transitions and wavefront modeling as the soliton interacts with the cone, as shown in the initial setup of Fig. <xref ref-type="fig" rid="F9"/>.</p>

      <fig id="F9" specific-use="star"><label>Figure 9</label><caption><p id="d2e11346"><bold>(a)</bold> Configuration of original experiment (digitized from <xref ref-type="bibr" rid="bib1.bibx11" id="altparen.98"/>) for the conical island benchmark. <bold>(b)</bold> 3D view illustrating the solitary wave profile approaching the truncated cone.</p></caption>
            <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f09.png"/>

          </fig>

      <p id="d2e11364">Figure <xref ref-type="fig" rid="F10"/> shows the free-surface elevation at each computational element (<inline-formula><mml:math id="M301" display="inline"><mml:mrow><mml:msub><mml:mi>W</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>) for each reconstruction operator at <inline-formula><mml:math id="M302" display="inline"><mml:mrow><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">7</mml:mn><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mi mathvariant="normal">s</mml:mi></mml:mrow></mml:math></inline-formula>, as the leading wave passes gauge 16. This snapshot provides a spatial context for the subsequent time-series comparison, highlighting differences in wavefront sharpness and height at the gauge location. The WENO reconstruction yields the sharpest and highest wave at gauge 16 (<inline-formula><mml:math id="M303" display="inline"><mml:mrow><mml:mi mathvariant="italic">η</mml:mi><mml:mo>≈</mml:mo><mml:mn mathvariant="normal">0.041</mml:mn><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mi mathvariant="normal">m</mml:mi></mml:mrow></mml:math></inline-formula>), the minmod reconstruction shows moderate attenuation (<inline-formula><mml:math id="M304" display="inline"><mml:mrow><mml:mi mathvariant="italic">η</mml:mi><mml:mo>≈</mml:mo><mml:mn mathvariant="normal">0.03</mml:mn><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mi mathvariant="normal">m</mml:mi></mml:mrow></mml:math></inline-formula>), and the constant reconstruction produces a visibly diffused wavefront (<inline-formula><mml:math id="M305" display="inline"><mml:mrow><mml:mi mathvariant="italic">η</mml:mi><mml:mo>≈</mml:mo><mml:mn mathvariant="normal">0.011</mml:mn><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mi mathvariant="normal">m</mml:mi></mml:mrow></mml:math></inline-formula>). Green markers indicate the positions of gauges 1, 6, 16, and 22 (from left to right), consistent with the original experimental layout for direct validation of runup dynamics.</p>

      <fig id="F10" specific-use="star"><label>Figure 10</label><caption><p id="d2e11443">Comparison of wave structure while passing through gauge 16. Free-surface elevation at <inline-formula><mml:math id="M306" display="inline"><mml:mrow><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">7</mml:mn><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mi mathvariant="normal">s</mml:mi></mml:mrow></mml:math></inline-formula> for <bold>(a)</bold> constant, <bold>(b)</bold> minmod, and <bold>(c)</bold> WENO reconstruction operators. Green markers indicate the positions of gauges 1, 6, 16, and 22 (from left to right).</p></caption>
            <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f10.png"/>

          </fig>

      <p id="d2e11476">We note that, due to the nature of the wet/dry reconstruction procedure, minimal numerical artifacts arise near the wet/dry interface in the form of “wet” triangles with very small water column heights (approximately <inline-formula><mml:math id="M307" display="inline"><mml:mrow><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">5</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>–<inline-formula><mml:math id="M308" display="inline"><mml:mrow><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">4</mml:mn></mml:mrow></mml:msup><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mi mathvariant="normal">m</mml:mi></mml:mrow></mml:math></inline-formula>). This effect can be further mitigated by adjusting the dry tolerance parameter in the simulation configuration file or by grid refinement, as shown in Fig. <xref ref-type="fig" rid="F11"/>: The numerical artefacts are significantly reduced in the finer grid, with water column heights near the interface of order <inline-formula><mml:math id="M309" display="inline"><mml:mrow><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">10</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>–<inline-formula><mml:math id="M310" display="inline"><mml:mrow><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">9</mml:mn></mml:mrow></mml:msup><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mi mathvariant="normal">m</mml:mi></mml:mrow></mml:math></inline-formula>.</p>

      <fig id="F11" specific-use="star"><label>Figure 11</label><caption><p id="d2e11545"><bold>(a)</bold> Grid size comparison closeup. Water column heights (Hj) around protrusion of conical island diminish from the <bold>(b)</bold> coarse grid to the <bold>(c)</bold> fine grid.</p></caption>
            <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f11.png"/>

          </fig>

      <p id="d2e11562">Figure <xref ref-type="fig" rid="F12"/> presents time-series of water surface elevation for gauges 1, 6, 16, and 22 using the constant, minmod, and WENO reconstruction operators. The laboratory records, originally timed from wavemaker initiation, have been shifted by <inline-formula><mml:math id="M311" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>25 s to align the incident wave arrival time with simulations. This value corresponds to the estimated paddle deceleration inferred from signal traces in <xref ref-type="bibr" rid="bib1.bibx11" id="text.99"/>.</p>

      <fig id="F12" specific-use="star"><label>Figure 12</label><caption><p id="d2e11580">Time series of water heights at gauges 1 <bold>(a)</bold>, 6 <bold>(b)</bold>, 16 <bold>(c)</bold>, and 22 <bold>(d)</bold>. Solid line is laboratory data, and dashed lines are <monospace>SWEpy</monospace>'s solutions.</p></caption>
            <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f12.png"/>

          </fig>

      <p id="d2e11604">Across gauges, WENO accurately reproduces main crest height and arrival time with minimal phase error, while constant and minmod underestimate secondary oscillations and exhibit greater dissipation during rundown. Quantitatively, the <inline-formula><mml:math id="M312" display="inline"><mml:mrow><mml:msup><mml:mi>L</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> norm of differences between numerical and experimental series (Table <xref ref-type="table" rid="T3"/>) confirms that WENO and minmod exhibit similar performance, with WENO showing slightly higher averaged errors over the four gauges (<inline-formula><mml:math id="M313" display="inline"><mml:mrow><mml:msubsup><mml:mover accent="true"><mml:mrow><mml:mo>|</mml:mo><mml:mi>e</mml:mi><mml:mo>|</mml:mo></mml:mrow><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mn mathvariant="normal">2</mml:mn><mml:mtext>WENO</mml:mtext></mml:msubsup><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.0321</mml:mn></mml:mrow></mml:math></inline-formula> vs. <inline-formula><mml:math id="M314" display="inline"><mml:mrow><mml:msubsup><mml:mover accent="true"><mml:mrow><mml:mo>|</mml:mo><mml:mi>e</mml:mi><mml:mo>|</mml:mo></mml:mrow><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mn mathvariant="normal">2</mml:mn><mml:mtext>minmod</mml:mtext></mml:msubsup><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.0320</mml:mn></mml:mrow></mml:math></inline-formula>), while both outperform constant by approximately 40 % (<inline-formula><mml:math id="M315" display="inline"><mml:mrow><mml:msubsup><mml:mover accent="true"><mml:mrow><mml:mo>|</mml:mo><mml:mi>e</mml:mi><mml:mo>|</mml:mo></mml:mrow><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mn mathvariant="normal">2</mml:mn><mml:mtext>constant</mml:mtext></mml:msubsup><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.0533</mml:mn></mml:mrow></mml:math></inline-formula>).</p>

<table-wrap id="T3"><label>Table 3</label><caption><p id="d2e11698"><inline-formula><mml:math id="M316" display="inline"><mml:mrow><mml:msup><mml:mi>L</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> error of time series for each reconstructor at the different gauges.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="5">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="right"/>
     <oasis:colspec colnum="3" colname="col3" align="right"/>
     <oasis:colspec colnum="4" colname="col4" align="right"/>
     <oasis:colspec colnum="5" colname="col5" align="right"/>
     <oasis:thead>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Rec.</oasis:entry>
         <oasis:entry colname="col2">Gauge 1</oasis:entry>
         <oasis:entry colname="col3">Gauge 6</oasis:entry>
         <oasis:entry colname="col4">Gauge 16</oasis:entry>
         <oasis:entry colname="col5">Gauge 22</oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">Constant</oasis:entry>
         <oasis:entry colname="col2">0.0302</oasis:entry>
         <oasis:entry colname="col3">0.0373</oasis:entry>
         <oasis:entry colname="col4">0.1014</oasis:entry>
         <oasis:entry colname="col5">0.0443</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">Minmod</oasis:entry>
         <oasis:entry colname="col2">0.0254</oasis:entry>
         <oasis:entry colname="col3">0.0288</oasis:entry>
         <oasis:entry colname="col4">0.0325</oasis:entry>
         <oasis:entry colname="col5">0.0412</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">WENO</oasis:entry>
         <oasis:entry colname="col2">0.0262</oasis:entry>
         <oasis:entry colname="col3">0.0296</oasis:entry>
         <oasis:entry colname="col4">0.0316</oasis:entry>
         <oasis:entry colname="col5">0.0409</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>

      <p id="d2e11805">Since <inline-formula><mml:math id="M317" display="inline"><mml:mrow><mml:msup><mml:mi>L</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> is phase-sensitive and the phase shift cannot be determined exactly, we repeated the analysis by applying uniform shifts from <inline-formula><mml:math id="M318" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>0.10 to <inline-formula><mml:math id="M319" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula>0.30 s to the numerical series (Table <xref ref-type="table" rid="T4"/>). Across all tested shifts, WENO consistently achieved the lowest error scores, confirming its robustness to phase uncertainty and its suitability for dynamic wetting–drying reconstruction in coastal flows.</p>

<table-wrap id="T4" specific-use="star"><label>Table 4</label><caption><p id="d2e11838"><inline-formula><mml:math id="M320" display="inline"><mml:mrow><mml:msup><mml:mi>L</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> average error for each reconstructor with different time shifts of laboratory data to account for phase error.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="9">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="right"/>
     <oasis:colspec colnum="3" colname="col3" align="right"/>
     <oasis:colspec colnum="4" colname="col4" align="right"/>
     <oasis:colspec colnum="5" colname="col5" align="right"/>
     <oasis:colspec colnum="6" colname="col6" align="right"/>
     <oasis:colspec colnum="7" colname="col7" align="right"/>
     <oasis:colspec colnum="8" colname="col8" align="right"/>
     <oasis:colspec colnum="9" colname="col9" align="right"/>
     <oasis:thead>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Rec.</oasis:entry>
         <oasis:entry colname="col2"><inline-formula><mml:math id="M321" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula>0.30</oasis:entry>
         <oasis:entry colname="col3"><inline-formula><mml:math id="M322" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula>0.25</oasis:entry>
         <oasis:entry colname="col4"><inline-formula><mml:math id="M323" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula>0.20</oasis:entry>
         <oasis:entry colname="col5"><inline-formula><mml:math id="M324" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula>0.15</oasis:entry>
         <oasis:entry colname="col6"><inline-formula><mml:math id="M325" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula>0.10</oasis:entry>
         <oasis:entry colname="col7"><inline-formula><mml:math id="M326" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula>0.05</oasis:entry>
         <oasis:entry colname="col8"><inline-formula><mml:math id="M327" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>0.05</oasis:entry>
         <oasis:entry colname="col9"><inline-formula><mml:math id="M328" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>0.10</oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">Constant</oasis:entry>
         <oasis:entry colname="col2">0.0516</oasis:entry>
         <oasis:entry colname="col3">0.0518</oasis:entry>
         <oasis:entry colname="col4">0.0520</oasis:entry>
         <oasis:entry colname="col5">0.0523</oasis:entry>
         <oasis:entry colname="col6">0.0526</oasis:entry>
         <oasis:entry colname="col7">0.0529</oasis:entry>
         <oasis:entry colname="col8">0.0537</oasis:entry>
         <oasis:entry colname="col9">0.0540</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">Minmod</oasis:entry>
         <oasis:entry colname="col2">0.0285</oasis:entry>
         <oasis:entry colname="col3">0.0288</oasis:entry>
         <oasis:entry colname="col4">0.0292</oasis:entry>
         <oasis:entry colname="col5">0.0298</oasis:entry>
         <oasis:entry colname="col6">0.0304</oasis:entry>
         <oasis:entry colname="col7">0.0312</oasis:entry>
         <oasis:entry colname="col8">0.0329</oasis:entry>
         <oasis:entry colname="col9">0.0338</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">WENO</oasis:entry>
         <oasis:entry colname="col2">0.0274</oasis:entry>
         <oasis:entry colname="col3">0.0277</oasis:entry>
         <oasis:entry colname="col4">0.0282</oasis:entry>
         <oasis:entry colname="col5">0.0289</oasis:entry>
         <oasis:entry colname="col6">0.0298</oasis:entry>
         <oasis:entry colname="col7">0.0309</oasis:entry>
         <oasis:entry colname="col8">0.0334</oasis:entry>
         <oasis:entry colname="col9">0.0348</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>

      <p id="d2e12055">Figure <xref ref-type="fig" rid="F13"/> illustrates spatial diffusion effects by comparing the free-surface elevation at <inline-formula><mml:math id="M329" display="inline"><mml:mrow><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">13</mml:mn><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mi mathvariant="normal">s</mml:mi></mml:mrow></mml:math></inline-formula> across the three reconstruction operators, at a stage where the wave has traversed the island and formed the cardioid-shaped crest pattern observed in laboratory measurements. The WENO reconstruction (panel c) preserves sharp gradients,  with minimal attenuation and good retention of intricate structures. By contrast, the minmod reconstruction (panel b) maintains the overall pattern but introduces noticeable smoothing, while the constant reconstruction (panel a) dissipates most fine-scale features, resulting in a blurred profile. To quantify these differences, we computed the depth-integrated potential energy <inline-formula><mml:math id="M330" display="inline"><mml:mrow><mml:mi mathvariant="script">E</mml:mi><mml:mo>=</mml:mo><mml:mi mathvariant="italic">ρ</mml:mi><mml:mi>g</mml:mi><mml:msub><mml:mo>∫</mml:mo><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi mathvariant="normal">strip</mml:mi></mml:msub></mml:mrow></mml:msub><mml:msup><mml:mi mathvariant="italic">η</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>,</mml:mo><mml:mi mathvariant="normal">d</mml:mi><mml:mi mathvariant="normal">Ω</mml:mi></mml:mrow></mml:math></inline-formula> over a vertical strip from <inline-formula><mml:math id="M331" display="inline"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi>l</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">9.5</mml:mn><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mi mathvariant="normal">m</mml:mi></mml:mrow></mml:math></inline-formula> to <inline-formula><mml:math id="M332" display="inline"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi>r</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">14.5</mml:mn><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mi mathvariant="normal">m</mml:mi></mml:mrow></mml:math></inline-formula> downstream, where <inline-formula><mml:math id="M333" display="inline"><mml:mrow><mml:mi mathvariant="italic">η</mml:mi><mml:mo>=</mml:mo><mml:mi>w</mml:mi></mml:mrow></mml:math></inline-formula> since the still-water level is zero in the solitary-wave setup. The energies are <inline-formula><mml:math id="M334" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="script">E</mml:mi><mml:mtext>const</mml:mtext></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.015</mml:mn></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M335" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="script">E</mml:mi><mml:mtext>minmod</mml:mtext></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.020</mml:mn></mml:mrow></mml:math></inline-formula>, and <inline-formula><mml:math id="M336" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="script">E</mml:mi><mml:mtext>WENO</mml:mtext></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.044</mml:mn></mml:mrow></mml:math></inline-formula>, confirming WENO's superior wave energy retention in the post-interaction field. Combined with the <inline-formula><mml:math id="M337" display="inline"><mml:mrow><mml:msup><mml:mi>L</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> analysis, these findings underscore WENO's superior balance between low numerical diffusion and faithful waveform reproduction, whereas the constant reconstruction underperforms in both aspects.</p>

      <fig id="F13" specific-use="star"><label>Figure 13</label><caption><p id="d2e12216">Diffusion study. Solution at time <inline-formula><mml:math id="M338" display="inline"><mml:mrow><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">13</mml:mn></mml:mrow></mml:math></inline-formula> s for constant <bold>(a)</bold>, linear <bold>(b)</bold>, and quadratic <bold>(c)</bold> reconstructors. Green marks are the locations of gauges 1, 6, 16, and 22 (from left to right).</p></caption>
            <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f13.png"/>

          </fig>

      <p id="d2e12246">In this work, we use the energy-based measure <inline-formula><mml:math id="M339" display="inline"><mml:mi mathvariant="script">E</mml:mi></mml:math></inline-formula> to quantify the extent of numerical diffusion. This metric, together with the comparisons at measurement stations, provides sufficient evidence to support the conclusions regarding WENO's superior performance in capturing wave dynamics. As noted above, point measurements capture only one aspect of the numerical result, being useful for specific events such as wavefront arrival time, zones of maximum amplitudes, or inundation extent, among others. In addition, Fig. <xref ref-type="fig" rid="F13"/> shows a plan view to emphasize the importance of a global approach to the numerical results and their relation to the physical problem analyzed.</p>
      <p id="d2e12258">In that direction, and building on the finding that the WENO-based approach captures relevant information for global analysis, Fig. <xref ref-type="fig" rid="F14"/> provides a detailed sequence of the wavefront evolution under WENO reconstruction, illustrating how it maintains sharp gradients and structural integrity throughout the interaction at <inline-formula><mml:math id="M340" display="inline"><mml:mrow><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">7</mml:mn></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M341" display="inline"><mml:mn mathvariant="normal">8</mml:mn></mml:math></inline-formula>, and <inline-formula><mml:math id="M342" display="inline"><mml:mrow><mml:mn mathvariant="normal">9</mml:mn><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mi mathvariant="normal">s</mml:mi></mml:mrow></mml:math></inline-formula>. The leading crest propagates toward the island, splits, and wraps around its flanks, producing a clear diffraction pattern. In the lee, the opposing wavefronts converge and form a coherent cusp that advances shoreward. A small, nearly circular secondary wave is visible behind the main crest; this is a residual artifact of the wetting–drying correction process, but it decays rapidly and does not trigger further spurious oscillations. For the whole simulation, the shoreline evolves smoothly, and the wavefront retains sharp gradients throughout the interaction, even in the presence of zeroth-order boundary conditions. Thus, the wavefront sequence in Fig. <xref ref-type="fig" rid="F14"/> illustrates that <monospace>SWEpy</monospace>'s implementation incorporates the appropriate numerical foundations, enabling detailed descriptions of more complex real-world phenomena.</p>

      <fig id="F14" specific-use="star"><label>Figure 14</label><caption><p id="d2e12301">Wave-obstacle interaction study. Solution at times <inline-formula><mml:math id="M343" display="inline"><mml:mrow><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">7</mml:mn></mml:mrow></mml:math></inline-formula> s <bold>(a)</bold>, <inline-formula><mml:math id="M344" display="inline"><mml:mrow><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">8</mml:mn></mml:mrow></mml:math></inline-formula> s <bold>(b)</bold>, and <inline-formula><mml:math id="M345" display="inline"><mml:mrow><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">9</mml:mn></mml:mrow></mml:math></inline-formula> s <bold>(c)</bold>, using the WENO reconstruction operator. Green marks are the locations of gauges 1, 6, 16, and 22 (from left to right).</p></caption>
            <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f14.png"/>

          </fig>

      <p id="d2e12357">Overall, the conical-island benchmark confirms that <monospace>SWEpy</monospace> reproduces the key hydrodynamic processes involved in wave–obstacle interaction, including runup and rundown on sloping topography, diffraction around an emergent feature, and convergence in the lee. The comparison with laboratory measurements demonstrates that the WENO reconstruction consistently achieves the most faithful representation of surface elevation amplitude, phase, and post-interaction structure, while maintaining stability at wetting–drying fronts, and ensuring positivity preservation. Although small discrepancies remain–particularly in negative water levels following the first rundown–these can be attributed to physical processes not represented in the depth-averaged SWE framework (e.g., vertical accelerations) and to uncertainties in the temporal alignment between the laboratory and numerical time series. Taken together with the other validation cases, these results highlight the model’s capability to resolve complex nearshore hydrodynamics with high numerical fidelity, especially when paired with high-order reconstruction.</p>
</sec>
<sec id="Ch1.S5.SS1.SSS4">
  <label>5.1.4</label><title>Computational Performance and Scalability</title>
      <p id="d2e12371">To assess <monospace>SWEpy</monospace>'s computational efficiency, we performed scaling benchmarks from coarse to fine resolutions using the Conical Island and Gaussian Bump test cases introduced previously. Table <xref ref-type="table" rid="T5"/> summarizes execution times on an NVIDIA GeForce GTX 1650 GPU versus a serial single-core CPU implementation on an Intel Core i5-10300H.</p>

<table-wrap id="T5" specific-use="star"><label>Table 5</label><caption><p id="d2e12382">Average execution time per time-step for idealized benchmarks (NVIDIA GTX 1650 vs. Serial Intel Core i5-10300H CPU). Speedups are relative to the single-core CPU baseline.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="6">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="left"/>
     <oasis:colspec colnum="3" colname="col3" align="right"/>
     <oasis:colspec colnum="4" colname="col4" align="right"/>
     <oasis:colspec colnum="5" colname="col5" align="right"/>
     <oasis:colspec colnum="6" colname="col6" align="right"/>
     <oasis:thead>
       <oasis:row rowsep="1">

         <oasis:entry colname="col1">Test</oasis:entry>

         <oasis:entry colname="col2">Resolution</oasis:entry>

         <oasis:entry colname="col3">#Elements</oasis:entry>

         <oasis:entry colname="col4">GPU Time/step (s)</oasis:entry>

         <oasis:entry colname="col5">CPU Time/step (s)</oasis:entry>

         <oasis:entry colname="col6">Speedup</oasis:entry>

       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>

         <oasis:entry rowsep="1" colname="col1" morerows="2">C. Island</oasis:entry>

         <oasis:entry colname="col2">Coarse</oasis:entry>

         <oasis:entry colname="col3">2958</oasis:entry>

         <oasis:entry colname="col4">1.03</oasis:entry>

         <oasis:entry colname="col5">0.076</oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M346" display="inline"><mml:mrow><mml:mn mathvariant="normal">0.07</mml:mn><mml:mo>×</mml:mo></mml:mrow></mml:math></inline-formula></oasis:entry>

       </oasis:row>
       <oasis:row>

         <oasis:entry colname="col2">Medium</oasis:entry>

         <oasis:entry colname="col3">11 682</oasis:entry>

         <oasis:entry colname="col4">1.03</oasis:entry>

         <oasis:entry colname="col5">0.411</oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M347" display="inline"><mml:mrow><mml:mn mathvariant="normal">0.40</mml:mn><mml:mo>×</mml:mo></mml:mrow></mml:math></inline-formula></oasis:entry>

       </oasis:row>
       <oasis:row rowsep="1">

         <oasis:entry colname="col2">Fine</oasis:entry>

         <oasis:entry colname="col3">45 924</oasis:entry>

         <oasis:entry colname="col4">1.04</oasis:entry>

         <oasis:entry colname="col5">2.579</oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M348" display="inline"><mml:mrow><mml:mn mathvariant="normal">2.47</mml:mn><mml:mo>×</mml:mo></mml:mrow></mml:math></inline-formula></oasis:entry>

       </oasis:row>
       <oasis:row>

         <oasis:entry colname="col1" morerows="2">G. Bump</oasis:entry>

         <oasis:entry colname="col2">Coarse</oasis:entry>

         <oasis:entry colname="col3">18 992</oasis:entry>

         <oasis:entry colname="col4">0.96</oasis:entry>

         <oasis:entry colname="col5">0.73</oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M349" display="inline"><mml:mrow><mml:mn mathvariant="normal">0.76</mml:mn><mml:mo>×</mml:mo></mml:mrow></mml:math></inline-formula></oasis:entry>

       </oasis:row>
       <oasis:row>

         <oasis:entry colname="col2">Medium</oasis:entry>

         <oasis:entry colname="col3">74 848</oasis:entry>

         <oasis:entry colname="col4">1.22</oasis:entry>

         <oasis:entry colname="col5">8.39</oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M350" display="inline"><mml:mrow><mml:mn mathvariant="normal">6.90</mml:mn><mml:mo>×</mml:mo></mml:mrow></mml:math></inline-formula></oasis:entry>

       </oasis:row>
       <oasis:row>

         <oasis:entry colname="col2">Fine</oasis:entry>

         <oasis:entry colname="col3">1 184 128</oasis:entry>

         <oasis:entry colname="col4">8.37</oasis:entry>

         <oasis:entry colname="col5">219.29</oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M351" display="inline"><mml:mrow><mml:mn mathvariant="normal">26.20</mml:mn><mml:mo>×</mml:mo></mml:mrow></mml:math></inline-formula></oasis:entry>

       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>

      <p id="d2e12596">The results illustrate a characteristic performance transition between latency-bound and throughput-bound regimes typical of GPU-accelerated frameworks. For small meshes (e.g., Conical Island coarse, <inline-formula><mml:math id="M352" display="inline"><mml:mo>∼</mml:mo></mml:math></inline-formula> 3000 elements), the GPU execution time is dominated by fixed overheads–kernel launch latencies and host-device synchronization–resulting in negligible or even fractional speedups relative to the CPU. In this regime, the serial CPU implementation is competitive due to its lack of launch overhead.</p>
      <p id="d2e12607">However, scaling behavior improves dramatically with problem size. As the element count increases, the massive parallelism of the GPU is more effectively utilized. In the Gaussian Bump case with <inline-formula><mml:math id="M353" display="inline"><mml:mo>∼</mml:mo></mml:math></inline-formula> 1.2 million elements, the solver transitions into a throughput-bound regime, achieving a speedup of <inline-formula><mml:math id="M354" display="inline"><mml:mrow><mml:mn mathvariant="normal">26.2</mml:mn><mml:mo>×</mml:mo></mml:mrow></mml:math></inline-formula>. This confirms that <monospace>SWEpy</monospace>'s architecture is well-suited for high-resolution scenarios where the arithmetic intensity of WENO reconstruction saturates the GPU's CUDA cores.</p>
      <p id="d2e12630">It is worth noting that, to maintain a fair comparison with respect to code structure and accessibility, the CPU implementation was developed as a direct port of the GPU version. This design choice results in worse-than-linear time scaling with problem size, as seen in Table <xref ref-type="table" rid="T5"/>, and has two primary causes. First, both implementations follow a deliberately straightforward computational structure to preserve user accessibility. Second, the wet/dry algorithm relies on comparison and indexing operations (<monospace>np.where</monospace>, <monospace>np.count_nonzero</monospace>, and fancy indexing) over arrays that may not be in contiguous memory layout due to transposition and stacking; resolving this would require restructuring the code in ways that would break the structural similarity between the CPU and GPU versions, making the comparison less fair. As a consequence, the reported speedup values should be interpreted with care: they reflect the advantage of the GPU implementation over this specific unoptimized serial baseline.</p>
      <p id="d2e12641">Furthermore, system traces reveal the hardware utilization patterns across different scales. As shown in Table <xref ref-type="table" rid="T6"/>, GPU throughput – measured as SM occupancy, i.e., the average percentage of warps active in streaming multiprocessors during runtime – rises from 22.9 % at coarse resolution to 91.1 % at fine resolution in the Gaussian Bump benchmark, confirming effective saturation of the computing resources. In the Conical Island case, however, the wetting–drying correction procedure combined with the extended simulation duration significantly increases the number of GPU kernel launches without a proportional gain in throughput. This indicates that the high density of kernel launches throttles the efficient use of computational resources, suggesting that CuPy optimizations such as kernel fusion or element-wise kernels for arithmetic-intensive operations could substantially improve performance.</p>

<table-wrap id="T6" specific-use="star"><label>Table 6</label><caption><p id="d2e12649">GPU performance metrics derived from system traces for the Conical Island and Gaussian Bump benchmarks.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="7">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="left"/>
     <oasis:colspec colnum="3" colname="col3" align="right"/>
     <oasis:colspec colnum="4" colname="col4" align="right"/>
     <oasis:colspec colnum="5" colname="col5" align="right"/>
     <oasis:colspec colnum="6" colname="col6" align="right"/>
     <oasis:colspec colnum="7" colname="col7" align="right"/>
     <oasis:thead>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Test</oasis:entry>
         <oasis:entry colname="col2">Resolution</oasis:entry>
         <oasis:entry colname="col3">#Elements</oasis:entry>
         <oasis:entry colname="col4">GPU Time (s)</oasis:entry>
         <oasis:entry colname="col5">GPU Ops</oasis:entry>
         <oasis:entry colname="col6">GPU Throughput</oasis:entry>
         <oasis:entry colname="col7">VRAM Throughput</oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">C. Island</oasis:entry>
         <oasis:entry colname="col2">Coarse</oasis:entry>
         <oasis:entry colname="col3">2958</oasis:entry>
         <oasis:entry colname="col4">155.764</oasis:entry>
         <oasis:entry colname="col5">3 103 522</oasis:entry>
         <oasis:entry colname="col6">4.0 %</oasis:entry>
         <oasis:entry colname="col7">2.51 %</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"/>
         <oasis:entry colname="col2">Medium</oasis:entry>
         <oasis:entry colname="col3">11 682</oasis:entry>
         <oasis:entry colname="col4">337.416</oasis:entry>
         <oasis:entry colname="col5">6 477 322</oasis:entry>
         <oasis:entry colname="col6">7.2 %</oasis:entry>
         <oasis:entry colname="col7">3.76 %</oasis:entry>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1"/>
         <oasis:entry colname="col2">Fine</oasis:entry>
         <oasis:entry colname="col3">45 924</oasis:entry>
         <oasis:entry colname="col4">549.277</oasis:entry>
         <oasis:entry colname="col5">12 982 607</oasis:entry>
         <oasis:entry colname="col6">25.0 %</oasis:entry>
         <oasis:entry colname="col7">7.05 %</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">G. Bump</oasis:entry>
         <oasis:entry colname="col2">Coarse</oasis:entry>
         <oasis:entry colname="col3">74 848</oasis:entry>
         <oasis:entry colname="col4">36.38</oasis:entry>
         <oasis:entry colname="col5">524 831</oasis:entry>
         <oasis:entry colname="col6">22.9 %</oasis:entry>
         <oasis:entry colname="col7">4.8 %</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"/>
         <oasis:entry colname="col2">Medium</oasis:entry>
         <oasis:entry colname="col3">297 152</oasis:entry>
         <oasis:entry colname="col4">50.11</oasis:entry>
         <oasis:entry colname="col5">564 031</oasis:entry>
         <oasis:entry colname="col6">65.5 %</oasis:entry>
         <oasis:entry colname="col7">11.8 %</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1"/>
         <oasis:entry colname="col2">Fine</oasis:entry>
         <oasis:entry colname="col3">1 184 128</oasis:entry>
         <oasis:entry colname="col4">148.30</oasis:entry>
         <oasis:entry colname="col5">564 031</oasis:entry>
         <oasis:entry colname="col6">91.1 %</oasis:entry>
         <oasis:entry colname="col7">34.3 %</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>

      <p id="d2e12850">In terms of memory usage, the software exhibits a predictable VRAM utilization behavior, measured as the ratio of allocated to total available memory, that increases with mesh size. However, memory usage does not depend exclusively on mesh size. As shown in Table <xref ref-type="table" rid="T6"/>, the fine-resolution Conical Island grid has fewer elements than the coarse Gaussian Bump grid, yet exhibits higher memory utilization, owing to the additional memory demands of the active wetting-drying handling algorithm.</p>
      <p id="d2e12856">In addition, we quantified the cost of adaptive time-stepping. Profiling on the finest mesh showed that computing the adaptive <inline-formula><mml:math id="M355" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>t</mml:mi></mml:mrow></mml:math></inline-formula> accounts for approximately <inline-formula><mml:math id="M356" display="inline"><mml:mrow><mml:mn mathvariant="normal">3</mml:mn><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mi mathvariant="italic">%</mml:mi></mml:mrow></mml:math></inline-formula> of the total runtime (<inline-formula><mml:math id="M357" display="inline"><mml:mn mathvariant="normal">3.85</mml:mn></mml:math></inline-formula> s out of <inline-formula><mml:math id="M358" display="inline"><mml:mn mathvariant="normal">142.1</mml:mn></mml:math></inline-formula> s total for the Gaussian bump run). In contrast, imposing a fixed conservative time-step to ensure stability increased the total runtime to <inline-formula><mml:math id="M359" display="inline"><mml:mn mathvariant="normal">148.3</mml:mn></mml:math></inline-formula> s. Thus, the computational overhead of adaptive time-step control is negligible compared to the efficiency gains from maximizing the stable time-step size.</p>
      <p id="d2e12901">The performance analysis presented in this subsection characterizes how solver efficiency varies with problem size on a fixed single-GPU device. Unlike formal strong or weak scaling studies, which assess performance as the number of processing units or available memory varies, this analysis captures the transition from latency-bound to throughput-bound execution as the workload grows to saturate the available hardware. A multi-device scaling study remains an important avenue for future work.</p>
</sec>
</sec>
<sec id="Ch1.S5.SS2">
  <label>5.2</label><title>Real-life scenario 1: Malpasset Dam failure</title>
      <p id="d2e12913">To evaluate <monospace>SWEpy</monospace>’s performance in realistic inundation scenarios involving complex topography and moving wet/dry fronts, we reproduce the 1959 Malpasset dam failure on France’s Reyran River. The event is characterized by rapid flooding over highly irregular terrain <xref ref-type="bibr" rid="bib1.bibx66" id="paren.100"/>. This case is used to validate the model’s positivity-preserving reconstruction schemes, treatment of bathymetric source terms, and semi-implicit friction formulation described in Sect. <xref ref-type="sec" rid="Ch1.S3"/>.</p>
      <p id="d2e12924">The computational domain is discretized using an unstructured triangular grid adapted from the TELEMAC-2D validation dataset. The mesh contains 26 000 elements, with characteristic triangle heights <inline-formula><mml:math id="M360" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>r</mml:mi></mml:mrow></mml:math></inline-formula> (measured from a vertex to the opposing side) ranging from 4.01 to <inline-formula><mml:math id="M361" display="inline"><mml:mrow><mml:mn mathvariant="normal">401.95</mml:mn><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mi mathvariant="normal">m</mml:mi></mml:mrow></mml:math></inline-formula>, and an average value of <inline-formula><mml:math id="M362" display="inline"><mml:mrow><mml:mn mathvariant="normal">40.28</mml:mn><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mi mathvariant="normal">m</mml:mi></mml:mrow></mml:math></inline-formula>.</p>
      <p id="d2e12959">The bathymetric and topographic data are derived from the 1931 IGN Saint-Tropez map, with additional refinement upstream of the dam to better resolve steep gradients (Fig. <xref ref-type="fig" rid="F15"/>a, inset). The initial condition sets the reservoir water surface to an elevation of 100 m upstream of the dam, represented as a vertical plane between coordinates (4701.18, 4143.10) and (4655.50, 4392.10), and 0 m elsewhere, with all cells above sea level initialized as dry (Fig. <xref ref-type="fig" rid="F15"/>b). Boundary conditions are specified as impermeable walls, consistent with the TELEMAC reference configuration. The Manning roughness coefficient is set to <inline-formula><mml:math id="M363" display="inline"><mml:mrow><mml:mi>n</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.03</mml:mn></mml:mrow></mml:math></inline-formula> to match the TELEMAC reference setup. The simulation employs minmod reconstruction and adaptive time-stepping with a Courant–Friedrichs–Lewy (CFL) number of 0.33, and is run until <inline-formula><mml:math id="M364" display="inline"><mml:mrow><mml:msub><mml:mi>t</mml:mi><mml:mo>max⁡</mml:mo></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">4000</mml:mn></mml:mrow></mml:math></inline-formula> s.</p>

      <fig id="F15" specific-use="star"><label>Figure 15</label><caption><p id="d2e12996">Grid used in the simulation <bold>(a)</bold> with zoomed view of the upstream refined part, and initial water height <bold>(b)</bold>. Points are the locations of measured data.</p></caption>
          <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f15.png"/>

        </fig>

      <p id="d2e13011">Twelve virtual gauge locations are defined along the river valley to monitor the flood wave progression (Fig. <xref ref-type="fig" rid="F15"/>b). Three gauges (transformers A, B, and C) are used to measure wave arrival times, while nine gauges (P6–P14) record maximum water heights from <inline-formula><mml:math id="M365" display="inline"><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>:</mml:mo><mml:mn mathvariant="normal">400</mml:mn></mml:mrow></mml:math></inline-formula> scale laboratory experiments by Electricité de France. The simulated values of arrival times and peak heights are reported in Table <xref ref-type="table" rid="T7"/> alongside the corresponding experimental data and results from TELEMAC’s HLLC solver, widely regarded as the most accurate scheme for this benchmark.</p>

<table-wrap id="T7" specific-use="star"><label>Table 7</label><caption><p id="d2e13033">Simulation results and relative errors, evaluated against recorded data, for both TELEMAC and <monospace>SWEpy</monospace>.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="9">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="right"/>
     <oasis:colspec colnum="3" colname="col3" align="right" colsep="1"/>
     <oasis:colspec colnum="4" colname="col4" align="right"/>
     <oasis:colspec colnum="5" colname="col5" align="right"/>
     <oasis:colspec colnum="6" colname="col6" align="right" colsep="1"/>
     <oasis:colspec colnum="7" colname="col7" align="right"/>
     <oasis:colspec colnum="8" colname="col8" align="right"/>
     <oasis:colspec colnum="9" colname="col9" align="right"/>
     <oasis:thead>
       <oasis:row>
         <oasis:entry colname="col1">Point</oasis:entry>
         <oasis:entry rowsep="1" namest="col2" nameend="col3" align="center" colsep="1">Recorded Data </oasis:entry>
         <oasis:entry rowsep="1" namest="col4" nameend="col6" align="center" colsep="1"><monospace>SWEpy</monospace></oasis:entry>
         <oasis:entry rowsep="1" namest="col7" nameend="col9" align="center">TELEMAC </oasis:entry>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1"/>
         <oasis:entry colname="col2"><inline-formula><mml:math id="M366" display="inline"><mml:mrow><mml:msub><mml:mi>h</mml:mi><mml:mtext>max</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> [m]</oasis:entry>
         <oasis:entry colname="col3"><inline-formula><mml:math id="M367" display="inline"><mml:mrow><mml:msub><mml:mi>t</mml:mi><mml:mtext>ArrA</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> [s]</oasis:entry>
         <oasis:entry colname="col4"><inline-formula><mml:math id="M368" display="inline"><mml:mrow><mml:msub><mml:mi>h</mml:mi><mml:mtext>max</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> [m]</oasis:entry>
         <oasis:entry colname="col5"><inline-formula><mml:math id="M369" display="inline"><mml:mrow><mml:msub><mml:mi>t</mml:mi><mml:mtext>ArrA</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> [s]</oasis:entry>
         <oasis:entry colname="col6">Err [%]</oasis:entry>
         <oasis:entry colname="col7"><inline-formula><mml:math id="M370" display="inline"><mml:mrow><mml:msub><mml:mi>h</mml:mi><mml:mtext>max</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> [m]</oasis:entry>
         <oasis:entry colname="col8"><inline-formula><mml:math id="M371" display="inline"><mml:mrow><mml:msub><mml:mi>t</mml:mi><mml:mtext>ArrA</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> [s]</oasis:entry>
         <oasis:entry colname="col9">Err [%]</oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">A</oasis:entry>
         <oasis:entry colname="col2">–</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">–</oasis:entry>
         <oasis:entry colname="col5">–</oasis:entry>
         <oasis:entry colname="col6">–</oasis:entry>
         <oasis:entry colname="col7">–</oasis:entry>
         <oasis:entry colname="col8">–</oasis:entry>
         <oasis:entry colname="col9">–</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">B</oasis:entry>
         <oasis:entry colname="col2">–</oasis:entry>
         <oasis:entry colname="col3">1140</oasis:entry>
         <oasis:entry colname="col4">–</oasis:entry>
         <oasis:entry colname="col5">1071</oasis:entry>
         <oasis:entry colname="col6"><inline-formula><mml:math id="M372" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>6</oasis:entry>
         <oasis:entry colname="col7">–</oasis:entry>
         <oasis:entry colname="col8">1142.9</oasis:entry>
         <oasis:entry colname="col9">0</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">C</oasis:entry>
         <oasis:entry colname="col2">–</oasis:entry>
         <oasis:entry colname="col3">1320</oasis:entry>
         <oasis:entry colname="col4">–</oasis:entry>
         <oasis:entry colname="col5">1088</oasis:entry>
         <oasis:entry colname="col6"><inline-formula><mml:math id="M373" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>18</oasis:entry>
         <oasis:entry colname="col7">–</oasis:entry>
         <oasis:entry colname="col8">1387.3</oasis:entry>
         <oasis:entry colname="col9">5</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">P6</oasis:entry>
         <oasis:entry colname="col2">40.3</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">37.72</oasis:entry>
         <oasis:entry colname="col5">–</oasis:entry>
         <oasis:entry colname="col6"><inline-formula><mml:math id="M374" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>6</oasis:entry>
         <oasis:entry colname="col7">81.58</oasis:entry>
         <oasis:entry colname="col8">–</oasis:entry>
         <oasis:entry colname="col9">102</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">P7</oasis:entry>
         <oasis:entry colname="col2">14.6</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">18.13</oasis:entry>
         <oasis:entry colname="col5">–</oasis:entry>
         <oasis:entry colname="col6">24</oasis:entry>
         <oasis:entry colname="col7">55.88</oasis:entry>
         <oasis:entry colname="col8">–</oasis:entry>
         <oasis:entry colname="col9">283</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">P8</oasis:entry>
         <oasis:entry colname="col2">24.0</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">22.46</oasis:entry>
         <oasis:entry colname="col5">–</oasis:entry>
         <oasis:entry colname="col6"><inline-formula><mml:math id="M375" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>6</oasis:entry>
         <oasis:entry colname="col7">53.21</oasis:entry>
         <oasis:entry colname="col8">–</oasis:entry>
         <oasis:entry colname="col9">122</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">P9</oasis:entry>
         <oasis:entry colname="col2">12.8</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">18.6</oasis:entry>
         <oasis:entry colname="col5">–</oasis:entry>
         <oasis:entry colname="col6">45</oasis:entry>
         <oasis:entry colname="col7">48.14</oasis:entry>
         <oasis:entry colname="col8">–</oasis:entry>
         <oasis:entry colname="col9">276</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">P10</oasis:entry>
         <oasis:entry colname="col2">11.8</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">15.34</oasis:entry>
         <oasis:entry colname="col5">–</oasis:entry>
         <oasis:entry colname="col6">30</oasis:entry>
         <oasis:entry colname="col7">36.88</oasis:entry>
         <oasis:entry colname="col8">–</oasis:entry>
         <oasis:entry colname="col9">213</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">P11</oasis:entry>
         <oasis:entry colname="col2">8.3</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">6.21</oasis:entry>
         <oasis:entry colname="col5">–</oasis:entry>
         <oasis:entry colname="col6">-25</oasis:entry>
         <oasis:entry colname="col7">25.41</oasis:entry>
         <oasis:entry colname="col8">–</oasis:entry>
         <oasis:entry colname="col9">206</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">P12</oasis:entry>
         <oasis:entry colname="col2">10.1</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">5.89</oasis:entry>
         <oasis:entry colname="col5">–</oasis:entry>
         <oasis:entry colname="col6"><inline-formula><mml:math id="M376" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>42</oasis:entry>
         <oasis:entry colname="col7">19.29</oasis:entry>
         <oasis:entry colname="col8">–</oasis:entry>
         <oasis:entry colname="col9">91</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">P13</oasis:entry>
         <oasis:entry colname="col2">6.8</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">12.21</oasis:entry>
         <oasis:entry colname="col5">–</oasis:entry>
         <oasis:entry colname="col6">80</oasis:entry>
         <oasis:entry colname="col7">17.74</oasis:entry>
         <oasis:entry colname="col8">–</oasis:entry>
         <oasis:entry colname="col9">161</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">P14</oasis:entry>
         <oasis:entry colname="col2"><inline-formula><mml:math id="M377" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>5.4</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">4.32</oasis:entry>
         <oasis:entry colname="col5">–</oasis:entry>
         <oasis:entry colname="col6"><inline-formula><mml:math id="M378" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>20</oasis:entry>
         <oasis:entry colname="col7">12.71</oasis:entry>
         <oasis:entry colname="col8">–</oasis:entry>
         <oasis:entry colname="col9">135</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>

      <p id="d2e13592">This benchmark provides a rigorous test of <monospace>SWEpy</monospace>’s ability to handle complex bathymetry, apply semi-implicit friction for roughness effects, and accurately treat wetting–drying fronts in initially dry cells. While <monospace>SWEpy</monospace> exhibits notable discrepancies at certain locations, its relative errors are, in most cases, nearly an order of magnitude smaller than those produced by TELEMAC’s FV solver. As noted in TELEMAC’s validation guide, these discrepancies may stem from several factors: (i) measurement uncertainty in the <inline-formula><mml:math id="M379" display="inline"><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>:</mml:mo><mml:mn mathvariant="normal">400</mml:mn></mml:mrow></mml:math></inline-formula> scale physical model, (ii) omission of debris transport and sediment dynamics, and (iii) the fact that the dam breach was not truly instantaneous. In addition, the combination of rapidly varying topography and highly curved flow paths may violate the underlying assumptions of the SWE, further contributing to discrepancies between simulated and observed data.</p>
      <p id="d2e13613">TELEMAC’s accuracy improves with increasing distance from the dam, suggesting that numerical diffusion is a significant factor in the model and may help explain its closer agreement in arrival-time estimates. Point P13 stands out as a pronounced outlier for both solvers. Its location within a poorly resolved section of the inner riverbank likely contributes to the large discrepancy in the predicted maximum height. To support this hypothesis, nearby points located outside the riverbank record simulated water heights between 4 and 8 m, values that align more closely with the observed data. This poor resolution stems primarily from the coarse bathymetry dataset lifted from the original maps, therefore, finer remeshing would not necessarily resolve this discrepancy.</p>
      <p id="d2e13617">Given the complex bathymetry and the tightly spaced unstructured grid, some numerical artifacts arose in our first solutions from the interaction between the wet/dry treatment and the impermeable‐wall ghost‐cell boundary conditions. These occur in some border cells where the bathymetry outward normal points away from the domain, i.e., locations where water would naturally exit the computational area. Such cells can act as an artificial source of inflow, as observed in the animations provided in the supplement. In the present case, these artifacts do not significantly affect the solutions presented, since the water height introduced (<inline-formula><mml:math id="M380" display="inline"><mml:mo lspace="0mm">∼</mml:mo></mml:math></inline-formula> 0.01 m) is negligible compared to the wave arrival heights (<inline-formula><mml:math id="M381" display="inline"><mml:mo lspace="0mm">∼</mml:mo></mml:math></inline-formula> 10 m). However, careful grid construction can help prevent such situations. Figure <xref ref-type="fig" rid="F16"/> illustrates the original and corrected bathymetry near domain boundaries, showing a noticeable reduction in spurious water influx after applying the correction.</p>

      <fig id="F16" specific-use="star"><label>Figure 16</label><caption><p id="d2e13638">3D View of solution before <bold>(a)</bold> and after <bold>(b)</bold> grid correction. Artificial water influx is reduced thanks to the bathymetry fix.</p></caption>
          <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f16.png"/>

        </fig>

      <p id="d2e13653">Unfortunately, some artificial inflows remain even after applying this correction procedure. Figure <xref ref-type="fig" rid="F17"/> shows the wave arrival at transformers A and C, where the inundation pattern is correctly reproduced but small residual mass contributions from these artifacts are still visible in some cells outside the measurement zones, still with negligible sizes; confirming that these artefacts do not affect the reported results.</p>

      <fig id="F17" specific-use="star"><label>Figure 17</label><caption><p id="d2e13660">Top-down view of inundation wave arriving at transformer A <bold>(a)</bold> and C <bold>(b)</bold>. Transformer locations are marked with magenta boxes. Some water influx is present due to errors of the border-wet/dry interaction, but remains outside the measuring zones.</p></caption>
          <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f17.png"/>

        </fig>

      <p id="d2e13675">These results confirm that <monospace>SWEpy</monospace> can reliably reproduce complex inundation dynamics over irregular terrain while also identifying clear avenues for improvement. Zones with limited topographic resolution would benefit from targeted mesh refinement, and the integration of additional physical processes, such as rheology, sediment transport, and the influence of steep bathymetric gradients or strong flow curvature, could further enhance predictive skill.</p>
</sec>
<sec id="Ch1.S5.SS3">
  <label>5.3</label><title>Real-life scenario 2: Maule 2010 tsunami</title>
      <p id="d2e13689">To evaluate <monospace>SWEpy</monospace>'s capability for far-field tsunami simulation–specifically its ability to propagate long-period waves over transoceanic distances with minimal numerical dissipation – we reproduce the 2010 Maule tsunami, generated by an <inline-formula><mml:math id="M382" display="inline"><mml:mrow><mml:msub><mml:mi>M</mml:mi><mml:mi mathvariant="normal">w</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> 8.8 earthquake along the Chilean subduction zone <xref ref-type="bibr" rid="bib1.bibx8" id="paren.101"/>. This event produced measurable signals across the Pacific basin, where Coriolis effects are dynamically relevant and numerical accuracy over very long propagation paths is essential for preserving wave amplitude and shape. This test also enables an assessment of the combined impact of WENO spatial reconstruction and RK4,3 time integration, compared with minmod and explicit Euler methods.</p>
      <p id="d2e13709">The computational mesh is an equilateral triangular grid generated from GEBCO bathymetry <xref ref-type="bibr" rid="bib1.bibx35" id="paren.102"/> via a spherical–Cartesian transformation, containing approximately <inline-formula><mml:math id="M383" display="inline"><mml:mrow><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">6</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> cells (<inline-formula><mml:math id="M384" display="inline"><mml:mo lspace="0mm">∼</mml:mo></mml:math></inline-formula> 536 000 nodes). Because the mesh was constrained to a rectangular bounding box for refinement, additional cells were created at the corners; the effective number of wet cells representing the domain is therefore about 860 000. The initial sea-surface displacement is prescribed from the inversion by <xref ref-type="bibr" rid="bib1.bibx8" id="text.103"/> using the Okada fault-slip model, with zero initial velocity. Coriolis effects are included by setting <inline-formula><mml:math id="M385" display="inline"><mml:mrow><mml:mi>f</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">4</mml:mn></mml:mrow></mml:msup><mml:mspace linebreak="nobreak" width="0.125em"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>, typical in mid-latitude regions <xref ref-type="bibr" rid="bib1.bibx49" id="paren.104"/>. Simulations span 24 h of physical time, using adaptive time-stepping with a Courant–Friedrichs–Lewy (CFL) number of 0.25 for explicit Euler integration and 0.5 for RK4,3 integration, applied to each reconstruction–integrator configuration.</p>
      <p id="d2e13767">Two virtual wave gauges are positioned at the locations of NOAA DART buoys 32 412 (southwest of Lima, Peru) and 21 413 (southeast of Kyoto, Japan), as indicated in Fig. <xref ref-type="fig" rid="F18"/>. At each gauge, the water-column height is recorded every 60 s of simulated time, yielding continuous time series for the 24 h simulation period. This duration captures the primary tsunami signal and subsequent wave groups at both stations. The numerical results are compared with quality-controlled, rectified DART measurements <xref ref-type="bibr" rid="bib1.bibx67" id="paren.105"/>, enabling a direct evaluation of amplitude and phase preservation over basin-scale propagation.</p>

      <fig id="F18" specific-use="star"><label>Figure 18</label><caption><p id="d2e13778">Bathymetry grid employed for the Maule tsunami simulation.</p></caption>
          <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f18.png"/>

        </fig>

      <p id="d2e13787">Figure <xref ref-type="fig" rid="F19"/> compares the simulated tsunami waveforms at DART buoys 32 412 (panel a) and 21 413 (panel b) with quality-controlled observations and reference simulations from the HySEA model. At buoy 32 412, the WENO reconstruction with explicit Euler integration provides the closest match to the observed primary wave amplitude and timing, and retains secondary oscillations more effectively than the minmod and constant reconstructions. Minmod with a high limiter parameter (<inline-formula><mml:math id="M386" display="inline"><mml:mrow><mml:mi mathvariant="italic">ϑ</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1.4</mml:mn></mml:mrow></mml:math></inline-formula>) reduces phase drift relative to the constant scheme, but still underestimates the amplitude of later wave groups. At buoy 21 413, located in the northwestern Pacific, all SWEpy configurations exhibit greater attenuation of the signal, reflecting the cumulative impact of propagation distance and coarse resolution; here, the WENO scheme again preserves amplitude better than the other reconstructions, with the minmod operator becoming too oscillatory, although the differences are less pronounced. Across both sites, HySEA results at 1.5 million cells show closer agreement with the DART data than <monospace>SWEpy</monospace>, consistent with the benefits of higher effective resolution. While WENO incurs a modest computational cost increase over minmod (as explored later), it remains faster than real time for the domain and resolution tested, offering a consistent improvement in waveform fidelity.</p>

      <fig id="F19" specific-use="star"><label>Figure 19</label><caption><p id="d2e13809">Tsunami profile comparison at DART buoy 32 412 <bold>(a)</bold> and 21 413 <bold>(b)</bold>. Results from the HySEA model are included for reference. The explicit Euler <inline-formula><mml:math id="M387" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> WENO result for buoy 21 413 is omitted because of high-frequency oscillations that obscured the primary tsunami signal.</p></caption>
          <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f19.png"/>

        </fig>

      <p id="d2e13831">The explicit Euler <inline-formula><mml:math id="M388" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> WENO result is not shown for buoy 21 413 because the combination of explicit Euler and coarse resolution over the long propagation path generated high-frequency oscillations that obscured the primary tsunami signal (Fig. <xref ref-type="fig" rid="F20"/>). Table <xref ref-type="table" rid="T8"/> quantifies the performance of each configuration by comparing the maximum wave height <inline-formula><mml:math id="M389" display="inline"><mml:mrow><mml:msub><mml:mi>H</mml:mi><mml:mi mathvariant="normal">max</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> and arrival time <inline-formula><mml:math id="M390" display="inline"><mml:mrow><mml:msub><mml:mi>T</mml:mi><mml:mi mathvariant="normal">arr</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> of the first wave against the DART observations. These metrics complement the full time-series comparison by highlighting differences in amplitude attenuation and phase shift.</p>

<table-wrap id="T8" specific-use="star"><label>Table 8</label><caption><p id="d2e13870">Performance summary of <monospace>SWEpy</monospace> configurations and HySEA for the Maule 2010 tsunami benchmark. Maximum surface displacement <inline-formula><mml:math id="M391" display="inline"><mml:mrow><mml:msub><mml:mi>H</mml:mi><mml:mi mathvariant="normal">max</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> [m] and arrival time <inline-formula><mml:math id="M392" display="inline"><mml:mrow><mml:msub><mml:mi>T</mml:mi><mml:mi mathvariant="normal">arr</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> [min] are extracted at the first wave crest for DART buoys 32 412 (Lima) and 21 413 (Kyoto). Relative errors (%) are computed with respect to the DART observations.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="9">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="right"/>
     <oasis:colspec colnum="3" colname="col3" align="right"/>
     <oasis:colspec colnum="4" colname="col4" align="right"/>
     <oasis:colspec colnum="5" colname="col5" align="right" colsep="1"/>
     <oasis:colspec colnum="6" colname="col6" align="right"/>
     <oasis:colspec colnum="7" colname="col7" align="right"/>
     <oasis:colspec colnum="8" colname="col8" align="right"/>
     <oasis:colspec colnum="9" colname="col9" align="right"/>
     <oasis:thead>
       <oasis:row>
         <oasis:entry colname="col1">Method</oasis:entry>
         <oasis:entry rowsep="1" namest="col2" nameend="col5" align="center" colsep="1">Lima </oasis:entry>
         <oasis:entry rowsep="1" namest="col6" nameend="col9" align="center">Kyoto </oasis:entry>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1"/>
         <oasis:entry colname="col2"><inline-formula><mml:math id="M393" display="inline"><mml:mrow><mml:msub><mml:mi>H</mml:mi><mml:mi mathvariant="normal">max</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col3">Err%</oasis:entry>
         <oasis:entry colname="col4"><inline-formula><mml:math id="M394" display="inline"><mml:mrow><mml:msub><mml:mi>T</mml:mi><mml:mi mathvariant="normal">arr</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col5">Err%</oasis:entry>
         <oasis:entry colname="col6"><inline-formula><mml:math id="M395" display="inline"><mml:mrow><mml:msub><mml:mi>H</mml:mi><mml:mi mathvariant="normal">max</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col7">Err%</oasis:entry>
         <oasis:entry colname="col8"><inline-formula><mml:math id="M396" display="inline"><mml:mrow><mml:msub><mml:mi>T</mml:mi><mml:mi mathvariant="normal">arr</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col9">Err%</oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">DART Data</oasis:entry>
         <oasis:entry colname="col2">0.237</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">196</oasis:entry>
         <oasis:entry colname="col5">–</oasis:entry>
         <oasis:entry colname="col6">0.098</oasis:entry>
         <oasis:entry colname="col7">–</oasis:entry>
         <oasis:entry colname="col8">1296</oasis:entry>
         <oasis:entry colname="col9">–</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">RK4,3 <inline-formula><mml:math id="M397" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> WENO</oasis:entry>
         <oasis:entry colname="col2">0.1034</oasis:entry>
         <oasis:entry colname="col3"><inline-formula><mml:math id="M398" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>56.4</oasis:entry>
         <oasis:entry colname="col4">167.263</oasis:entry>
         <oasis:entry colname="col5"><inline-formula><mml:math id="M399" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>14.7</oasis:entry>
         <oasis:entry colname="col6">0.022</oasis:entry>
         <oasis:entry colname="col7"><inline-formula><mml:math id="M400" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>77.6</oasis:entry>
         <oasis:entry colname="col8">1151.39</oasis:entry>
         <oasis:entry colname="col9"><inline-formula><mml:math id="M401" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>11.2</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">explicit Euler <inline-formula><mml:math id="M402" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> WENO</oasis:entry>
         <oasis:entry colname="col2">0.1703</oasis:entry>
         <oasis:entry colname="col3"><inline-formula><mml:math id="M403" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>28.1</oasis:entry>
         <oasis:entry colname="col4">167.098</oasis:entry>
         <oasis:entry colname="col5"><inline-formula><mml:math id="M404" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>14.7</oasis:entry>
         <oasis:entry colname="col6">–</oasis:entry>
         <oasis:entry colname="col7">–</oasis:entry>
         <oasis:entry colname="col8">–</oasis:entry>
         <oasis:entry colname="col9">–</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">RK4,3 <inline-formula><mml:math id="M405" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> minmod</oasis:entry>
         <oasis:entry colname="col2">0.0851</oasis:entry>
         <oasis:entry colname="col3"><inline-formula><mml:math id="M406" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>64.1</oasis:entry>
         <oasis:entry colname="col4">167.197</oasis:entry>
         <oasis:entry colname="col5"><inline-formula><mml:math id="M407" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>14.7</oasis:entry>
         <oasis:entry colname="col6">0.02551</oasis:entry>
         <oasis:entry colname="col7"><inline-formula><mml:math id="M408" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>74.0</oasis:entry>
         <oasis:entry colname="col8">1152</oasis:entry>
         <oasis:entry colname="col9"><inline-formula><mml:math id="M409" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>11.1</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">explicit Euler <inline-formula><mml:math id="M410" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> minmod</oasis:entry>
         <oasis:entry colname="col2">0.1005</oasis:entry>
         <oasis:entry colname="col3"><inline-formula><mml:math id="M411" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>57.6</oasis:entry>
         <oasis:entry colname="col4">169.068</oasis:entry>
         <oasis:entry colname="col5"><inline-formula><mml:math id="M412" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>13.7</oasis:entry>
         <oasis:entry colname="col6">0.03611</oasis:entry>
         <oasis:entry colname="col7"><inline-formula><mml:math id="M413" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>63.2</oasis:entry>
         <oasis:entry colname="col8">1158.1</oasis:entry>
         <oasis:entry colname="col9"><inline-formula><mml:math id="M414" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>10.7</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">HySEA</oasis:entry>
         <oasis:entry colname="col2">0.1537</oasis:entry>
         <oasis:entry colname="col3"><inline-formula><mml:math id="M415" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>35.1</oasis:entry>
         <oasis:entry colname="col4">190.064</oasis:entry>
         <oasis:entry colname="col5"><inline-formula><mml:math id="M416" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>3.02</oasis:entry>
         <oasis:entry colname="col6">0.0534</oasis:entry>
         <oasis:entry colname="col7"><inline-formula><mml:math id="M417" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>45.5</oasis:entry>
         <oasis:entry colname="col8">1281</oasis:entry>
         <oasis:entry colname="col9"><inline-formula><mml:math id="M418" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>1.2</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>

      <p id="d2e14331">These metrics indicate that <monospace>SWEpy</monospace> underestimates the maximum crest height and predicts earlier arrivals at both stations, whereas HySEA exhibits smaller amplitude bias – particularly at Lima – and reduced phase error, consistent with the visual comparisons in Fig. <xref ref-type="fig" rid="F19"/>. The differences likely reflect a combination of: (i) source smoothing introduced during interpolation to the computational grid, (ii) bathymetric resolution, with the HySEA configuration employing nearly twice as many cells, and (iii) projection-related errors from the spherical–Cartesian transformation, given that HySEA solves the SWEs directly on the sphere. This last point is important, since we only converted the grid to Cartesian coordinates via a haversine transformation; however, formulas for fluxes, cell side length, and cell area were maintained, when they should be calculated considering transformations. Quantifying the contribution of each factor is left for future work, with the aim of guiding targeted improvements to <monospace>SWEpy</monospace>'s far-field performance through a rigorous treatment of the spherical case.</p>
      <p id="d2e14342">While initially producing the most accurate waveforms at the near-field gauge, the explicit Euler time integrator in combination with the WENO reconstruction develops spurious high-frequency oscillations after extended transoceanic propagation. These oscillations overwhelm the primary tsunami signal at the Kyoto gauge, making the solution unsuitable for quantitative analysis. Figure <xref ref-type="fig" rid="F20"/> illustrates the modeled free-surface elevation at the moments when the wave passes the Lima and Kyoto DART buoys, for both explicit Euler <inline-formula><mml:math id="M419" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> WENO and RK4,3 <inline-formula><mml:math id="M420" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> WENO configurations, highlighting the marked difference in solution smoothness.</p>

      <fig id="F20" specific-use="star"><label>Figure 20</label><caption><p id="d2e14363">Snapshots of simulated free-surface elevation for the Maule 2010 tsunami at the times when the leading crest passes the locations of DART buoys 32 412 (Lima) and 21 413 (Kyoto). Insets show zoomed view of wave at Lima buoy. Panels <bold>(a)</bold> and <bold>(b)</bold> correspond to explicit Euler integration, and panels <bold>(c)</bold> and <bold>(d)</bold> to RK4,3 integration. Buoy locations are marked with magenta circles. These views provide basin-scale context for the time-series comparisons in Fig. <xref ref-type="fig" rid="F19"/>.</p></caption>
          <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f20.png"/>

        </fig>

      <p id="d2e14386">Control of these oscillations could, in principle, be achieved by reducing the CFL number; however, this would further increase numerical diffusion. Even with a reduced value of CFL <inline-formula><mml:math id="M421" display="inline"><mml:mrow><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.2</mml:mn></mml:mrow></mml:math></inline-formula>, the oscillations remain excessive by the time the wave reaches Kyoto, producing spurious amplitudes of approximately <inline-formula><mml:math id="M422" display="inline"><mml:mn mathvariant="normal">0.3</mml:mn></mml:math></inline-formula> m, while simultaneously reducing the maximum height at Lima to <inline-formula><mml:math id="M423" display="inline"><mml:mn mathvariant="normal">0.14</mml:mn></mml:math></inline-formula> m.</p>
      <p id="d2e14413">Spurious oscillations in Fig. <xref ref-type="fig" rid="F20"/>b may develop as a result of the interaction between the high-order reconstruction and the temporal discretization, due to the reduced level of numerical diffusivity and, consequently, the lack of an effective numerical dissipation mechanism to control the generated oscillations. In addition, the spatial mesh and, in particular, the way boundary conditions are imposed may also contribute to this behavior (see inset of Fig. <xref ref-type="fig" rid="F20"/>a).</p>
      <p id="d2e14421">This phenomenon was investigated through an auxiliary numerical experiment in which a soliton propagating along a channel with periodic boundary conditions was considered; see Sect. S7.2 <italic>Instability study: impact of temporal discretization</italic> in the User Manual <inline-formula><mml:math id="M424" display="inline"><mml:mi mathvariant="italic">&amp;</mml:mi></mml:math></inline-formula> Technical Reference <xref ref-type="bibr" rid="bib1.bibx63" id="paren.106"/>. The results show that simulations employing a more diffusive reconstruction do not generate spurious oscillations, whereas the explicit Euler <inline-formula><mml:math id="M425" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> WENO combination leads to the development of resonance-type oscillations. These oscillations may partially explain the spurious oscillatory patterns observed in the figure, ultimately giving rise to numerical convective instabilities in space.</p>
      <p id="d2e14444">To explore grid convergence, additional runs were performed with closer HySEA-<monospace>SWEpy</monospace> resolution agreement, using results from a HySEA run with a <inline-formula><mml:math id="M426" display="inline"><mml:mo>∼</mml:mo></mml:math></inline-formula> 250 000  element resolution as reference, and a <monospace>SWEpy</monospace> grid of <inline-formula><mml:math id="M427" display="inline"><mml:mo>∼</mml:mo></mml:math></inline-formula> 280 000 (effective) elements. Also, to assess the reduction of oscillatory behaviour in the explicit Euler <inline-formula><mml:math id="M428" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> WENO case, a run with a CFL number of <inline-formula><mml:math id="M429" display="inline"><mml:mn mathvariant="normal">0.15</mml:mn></mml:math></inline-formula> was performed. Figure <xref ref-type="fig" rid="F21"/> shows the output at the DART buoys locations.</p>

      <fig id="F21" specific-use="star"><label>Figure 21</label><caption><p id="d2e14486">Tsunami profile comparison at DART buoy 32 412 <bold>(a)</bold> and 21 413 <bold>(b)</bold> for the coarser grids. Once again, results for the explicit Euler <inline-formula><mml:math id="M430" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> WENO at the Kyoto buoy have been omitted.</p></caption>
          <graphic xlink:href="https://gmd.copernicus.org/articles/19/3953/2026/gmd-19-3953-2026-f21.png"/>

        </fig>

      <p id="d2e14508">These results confirm two points discussed above: (1) The resolution of the mesh is indeed correlated to the arriving wave amplitude, with both <monospace>SWEpy</monospace> and HySEA achieving similar accuracy; and (2) control of the spurious oscillations via the CFL number is achievable with the trade-off of some quality degradation. This confirms that, with similar spatial resolution, <monospace>SWEpy</monospace> can attain comparable initial wave amplitudes to HySEA.</p>
      <p id="d2e14517">To illustrate computational efficiency and the benefits of GPU acceleration on a real-life problem, the Maule 2010 scenario was repeated on a different simplified, non linearized, mesh of approximately <inline-formula><mml:math id="M431" display="inline"><mml:mrow><mml:mn mathvariant="normal">2.5</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">5</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> elements, using different combinations of time integrators and spatial reconstructors. To test GPU-parallelization speedups, a serial, single core, CPU-only version of <monospace>SWEpy</monospace> was used as reference, where CuPy was replaced by the traditional NumPy. At this reduced resolution, wave-height errors ranged from <inline-formula><mml:math id="M432" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>98 % to <inline-formula><mml:math id="M433" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>13.4 % and arrival-time errors from <inline-formula><mml:math id="M434" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>2 % to <inline-formula><mml:math id="M435" display="inline"><mml:mrow><mml:mn mathvariant="normal">26.5</mml:mn><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mi mathvariant="italic">%</mml:mi></mml:mrow></mml:math></inline-formula> relative to DART observations, reflecting the expected degradation in solution quality. Despite this, execution times for all configurations were faster than real time (Table <xref ref-type="table" rid="T9"/>).</p>

<table-wrap id="T9"><label>Table 9</label><caption><p id="d2e14577">Comparison of methods explicit Euler <inline-formula><mml:math id="M436" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> minmod (fastest) and RK4,3 <inline-formula><mml:math id="M437" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> WENO (slowest). CPU times correspond to simulations ran on a serial CPU-only implementation. GPU times correspond to the present CuPy implementation.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="4">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="right"/>
     <oasis:colspec colnum="3" colname="col3" align="right"/>
     <oasis:colspec colnum="4" colname="col4" align="right"/>
     <oasis:thead>
       <oasis:row>
         <oasis:entry colname="col1">Method</oasis:entry>
         <oasis:entry colname="col2">CPU</oasis:entry>
         <oasis:entry colname="col3">GPU</oasis:entry>
         <oasis:entry colname="col4">Speedup</oasis:entry>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1"/>
         <oasis:entry colname="col2">(min)</oasis:entry>
         <oasis:entry colname="col3">(min)</oasis:entry>
         <oasis:entry colname="col4">(<inline-formula><mml:math id="M438" display="inline"><mml:mo lspace="0mm">×</mml:mo></mml:math></inline-formula>)</oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">explicit Euler <inline-formula><mml:math id="M439" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> minmod</oasis:entry>
         <oasis:entry colname="col2">37.32</oasis:entry>
         <oasis:entry colname="col3">2.87</oasis:entry>
         <oasis:entry colname="col4">13.0</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">WENO <inline-formula><mml:math id="M440" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> RK4,3</oasis:entry>
         <oasis:entry colname="col2">360.49</oasis:entry>
         <oasis:entry colname="col3">17.31</oasis:entry>
         <oasis:entry colname="col4">20.8</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>

      <p id="d2e14694">Tests were performed on an Intel<sup>®</sup> Core<sup>TM</sup> i5-10300H CPU (10th generation) and an NVIDIA GeForce GTX 1650 GPU, both consumer-grade components released more than six years prior to writing. However, this  performance comparison is intended to illustrate the benefits of GPU acceleration within the <monospace>SWEpy</monospace> framework using a standard single-core CPU baseline, rather than providing a hardware-optimized or scalability-focused performance study across architectures. These results underscore <monospace>SWEpy</monospace>’s ability to deliver high-performance simulations on widely available, non-specialized hardware.</p>
      <p id="d2e14709">As a whole, the Maule 2010 benchmark results demonstrate <monospace>SWEpy</monospace>’s ability to reproduce the main features of basin‐scale tsunami propagation, including crest arrival timing, amplitude decay, and the modulation of subsequent wave groups. Among the tested schemes, the WENO reconstruction consistently yields the most accurate far‐field waveforms, though in combination with explicit Euler integration it can develop basin‐scale oscillations that obscure the signal at distant stations (Fig. <xref ref-type="fig" rid="F20"/>). These oscillations persist even under reduced CFL numbers, with the trade‐off of increased diffusion and degraded amplitudes at nearer gauges. The RK4,3 integrator mitigates this instability while preserving much of WENO’s accuracy, making it the most balanced choice for long‐range simulations. GPU acceleration enables faster‐than‐real‐time performance even for the most demanding configuration, with speedups exceeding <inline-formula><mml:math id="M441" display="inline"><mml:mrow><mml:mn mathvariant="normal">20</mml:mn><mml:mo>×</mml:mo></mml:mrow></mml:math></inline-formula> on consumer‐grade hardware with respect to the serial implementation. Together, these results confirm the model’s applicability to large‐domain tsunami scenarios, while highlighting clear paths for improvement in projection accuracy, bathymetric resolution, and source initialization to close the remaining gaps with higher‐resolution reference models such as HySEA.</p>
</sec>
</sec>
<sec id="Ch1.S6" sec-type="conclusions">
  <label>6</label><title>Conclusions</title>
      <p id="d2e14737">We presented <monospace>SWEpy</monospace>, an open-source GPU-accelerated (CUDA) Python package for the SWEs on unstructured triangular grids. The solver addresses hydrodynamic hazard scenarios across a wide range of spatial and temporal scales, from localized flooding to transoceanic tsunami propagation, by combining conservative numerical schemes with high-performance computing capabilities on consumer-grade hardware. <monospace>SWEpy</monospace>'s modular design enables researchers to adapt or extend the code for specific applications while maintaining computational efficiency and numerical stability. Core features include robust wetting/drying treatment, low-diffusion reconstructions, and well-balanced source-term discretizations, which allow for reliable simulations in complex, high-risk environments.</p>
      <p id="d2e14746">To evaluate spatial accuracy, a grid-refinement study was conducted against a numerically converged reference solution computed with <monospace>SWEpy</monospace> on the finest mesh. The results demonstrated a monotonic reduction in <inline-formula><mml:math id="M442" display="inline"><mml:mrow><mml:msup><mml:mi>L</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> error with decreasing <inline-formula><mml:math id="M443" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>x</mml:mi></mml:mrow></mml:math></inline-formula>. Constant reconstruction achieved better-than-first-order accuracy, while both linear and quadratic variants exhibited second-order convergence. Although the quadratic WENO reconstruction did not reach full third-order accuracy due to flux–bathymetry coupling, it reduced errors by an average of <inline-formula><mml:math id="M444" display="inline"><mml:mo>∼</mml:mo></mml:math></inline-formula> 58 % relative to the linear reconstruction at matched resolution. Importantly, across all refinements, the well-balanced source-term discretization preserved steady-state conditions, providing a reliable numerical baseline for subsequent real-case validations.</p>
      <p id="d2e14780">Building on this, the accuracy and robustness of <monospace>SWEpy</monospace>, particularly its wet/dry treatment, were further assessed using the well-known Conical Island laboratory experiment, a benchmark widely used in coastal hydrodynamics. This configuration provides high-quality measurements of wave transformation, run-up, and diffraction around an isolated obstacle. <monospace>SWEpy</monospace> successfully reproduced the main free-surface patterns and wetting–drying transitions with a good agreement to experimental observations, confirming its ability to capture the fundamental physics of wave–structure interaction. Beyond serving as a verification benchmark, this experiment establishes confidence in the solver’s applicability to more complex and operationally relevant scenarios, including large-scale dam-break inundations and basin-scale tsunami propagation over realistic bathymetry.</p>
      <p id="d2e14789">Real-case applications such as the Malpasset dam-break and the Maule 2010 tsunami highlight different aspects of the solver's performance. In the Malpasset case, characterized by a short-duration, high-gradient flood in a confined valley, <monospace>SWEpy</monospace> maintained physically realistic wetting–drying behavior, conserved mass across advancing fronts, and achieved substantially lower water level errors than TELEMAC’s FV solver, with arrival times generally within <inline-formula><mml:math id="M445" display="inline"><mml:mo>∼</mml:mo></mml:math></inline-formula> 18 % of observations. In contrast, the Maule tsunami case exposed current limitations in large-scale basin-propagation. All <monospace>SWEpy</monospace> configurations underestimated the first-wave amplitude and predicted earlier arrival times at both DART buoys. Among the tested schemes, WENO <inline-formula><mml:math id="M446" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> EE performed best, with <inline-formula><mml:math id="M447" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>28 % error in amplitude and <inline-formula><mml:math id="M448" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>15 % error in arrival time, although it developed high-frequency oscillations over long propagation distances. The WENO <inline-formula><mml:math id="M449" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> RK4,3 scheme remained oscillation-free and reduced dissipation and phase drift relative to lower-order schemes; however, notable amplitude and timing biases persisted. These discrepancies likely stem from source smoothing during interpolation, projection errors between spherical and Cartesian coordinates (in contrast to HySEA’s spherical formulation), and coarser bathymetric resolution. Together, these findings identify clear directions for improvement, including enhanced projection accuracy, improved source initialization, and refined mesh resolution, which are critical for achieving stronger far-field predictive capability at ocean-basin scales.</p>
      <p id="d2e14835">From a computational perspective, <monospace>SWEpy</monospace> delivers high-performance even on modest hardware that is more than six years old at the time of writing. A performance and scalability study highlighted both the advantages of GPU acceleration and its limitations, particularly regarding kernel launch overhead. GPU and VRAM throughput were analyzed to identify which configurations most effectively utilize the hardware. Using a simplified unstructured mesh of approximately <inline-formula><mml:math id="M450" display="inline"><mml:mrow><mml:mn mathvariant="normal">2.5</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">5</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> elements, the 24 h Maule 2010 tsunami scenario (in its most demanding reconstruction and timestep configuration) was simulated in approximately 17 min on an NVIDIA GeForce GTX 1650 laptop GPU. This corresponds to a speedup of approximately <inline-formula><mml:math id="M451" display="inline"><mml:mo>∼</mml:mo></mml:math></inline-formula> 2100 % relative to the single-core CPU baseline, executed on an Intel<sup>®</sup> Core<sup>TM</sup> i5-10300H processor. These results, enabled by extensive CuPy-based vectorization and memory-efficient data structures, demonstrate that large-scale SWEs simulations on unstructured grids can be performed well within real time on widely accessible systems, significantly lowering the barrier to high-performance hydrodynamic modeling while maintaining scalability for more detailed studies.</p>
      <p id="d2e14869"><monospace>SWEpy</monospace> is built on the CuPy library, which is primarily developed for the NVIDIA CUDA ecosystem. While CuPy offers experimental support for AMD GPUs through the HIP/ROCm interface, all validation and performance results presented here rely exclusively on the stable CUDA backend to ensure numerical reproducibility, performance consistency, and software robustness in this initial release. As CuPy’s multi-backend capabilities continue to mature, <monospace>SWEpy</monospace> is well positioned to benefit from broader GPU compatibility without requiring fundamental changes to its core implementation.</p>
      <p id="d2e14877">Despite these advances, several limitations remain, as revealed by the validation studies. In the Maule 2010 tsunami case, amplitude underestimation and arrival-time biases indicate the need for improved bathymetric interpolation, reduced projection error between spherical and Cartesian coordinates, and higher-resolution meshes for basin-scale applications. In the Malpasset case, complex gridding and bathymetry interactions suggest that the wet/dry treatment may interact with ghost-cell boundary conditions, potentially introducing artificial sources of mass influx, which warrants further investigation. Additionally, the sub-third-order convergence observed for the quadratic WENO scheme indicates that flux–bathymetry coupling remains a limiting factor for spatial accuracy. More broadly, the solver inherits the hydrostatic assumption of the SWEs, which may introduce inaccuracies in steep or highly curved flows where vertical accelerations are significant. Ongoing development efforts are therefore focused on improving bathymetric handling, coordinate projection, spatial accuracy, and physical modeling to enhance the robustness and applicability of <monospace>SWEpy</monospace>.</p>
      <p id="d2e14883">From a software development perspective, the roadmap for <monospace>SWEpy</monospace> emphasizes continued optimization of GPU efficiency and further refinement of its modular architecture. This design facilitates community contributions and allows individual components – such as source terms, numerical schemes, and physical models – to evolve independently. While the current implementation targets single-GPU execution, future work may explore improved utilization of multi-core CPUs through process-based parallelism using Python’s native multiprocessing or CuPy-native kernel customization and fusion features. In contrast, implementing efficient MPI-based parallelization for unstructured grids entirely in Python remains challenging, as communication overhead can outweigh computational gains. Without hybrid C<inline-formula><mml:math id="M452" display="inline"><mml:mrow><mml:mo>+</mml:mo><mml:mo>+</mml:mo></mml:mrow></mml:math></inline-formula>/Python approaches – such as MPI wrappers around compiled kernels – pure Python MPI solutions often diminish the benefits of parallel execution. These considerations reinforce the current emphasis on GPU-centric acceleration, where high throughput can be achieved within a unified and accessible Python framework.</p>
      <p id="d2e14899">We anticipate that the flexibility of <monospace>SWEpy</monospace> provides a strong foundation for extending its capabilities beyond the current scope. Planned developments include additional source-term modules for rainfall and infiltration to support catchment-scale hydrology, as well as rheological models for non-Newtonian fluids to simulate landslides, tailings dam breaches, snow avalanches, and debris flows. The framework is also well suited for incorporating two-layer shallow water formulations (2LSWE), following recent advances in CU-type schemes <xref ref-type="bibr" rid="bib1.bibx15 bib1.bibx59" id="paren.107"/>, to model stratified and two-phase flows such as water–mud avalanches or estuarine mixing. These enhancements, together with ongoing improvements in bathymetric representation, mesh refinement, and large-scale projection accuracy, will further strengthen the solver’s predictive capabilities across a broad spectrum of hydrodynamic hazards. By maintaining its modular, open-source, and GPU-accelerated design, <monospace>SWEpy</monospace> is well positioned to evolve into a versatile and high-performance modeling framework that bridges the gap between research prototypes and operational tools for flood and tsunami risk assessment worldwide.</p>
</sec>

      
      </body>
    <back><app-group>

<app id="App1.Ch1.S1">
  <label>Appendix A</label><title>Reconstruction Operators</title>
<sec id="App1.Ch1.S1.SS1">
  <label>A1</label><title>Linear (Minmod) Reconstruction</title>
      <p id="d2e14929">The minmod linear reconstruction is detailed in Algorithm <xref ref-type="other" rid="App1.Ch1.S1.Prog1"/>.</p><boxed-text content-type="algorithm" position="float" id="App1.Ch1.S1.Prog1"><label>Algorithm A1</label><caption><p id="d2e14935">Minmod linear reconstruction.</p></caption><disp-quote content-type="algorithmic" specific-use="numbering{1}"><list>

    <list-item>

      <p id="d2e14942" specific-use="STATE">identify neighbors of each cell (cf. group <inline-formula><mml:math id="M453" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> in Fig. <xref ref-type="fig" rid="F3"/>)</p>
            </list-item>

    <list-item>

      <p id="d2e14964" specific-use="STATE">construct planes passing through the mean value of the variable at the barycenters of the cell and its neighbors.</p>
            </list-item>

    <list-item>

      <p id="d2e14970" specific-use="STATE">calculate  <inline-formula><mml:math id="M454" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:mo>(</mml:mo><mml:msub><mml:mi>q</mml:mi><mml:mi>x</mml:mi></mml:msub><mml:msub><mml:mo>)</mml:mo><mml:mi>j</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:mo>(</mml:mo><mml:msub><mml:mi>q</mml:mi><mml:mi>y</mml:mi></mml:msub><mml:msub><mml:mo>)</mml:mo><mml:mi>j</mml:mi></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula></p>
            </list-item>

    <list-item>

      <p id="d2e15011" specific-use="STATE">select the plane whose gradient's magnitude is lowest among its three constructed planes</p>
            </list-item>

    <list-item>

      <p id="d2e15017" specific-use="FOR"><bold>for</bold> <monospace>each cell</monospace> <bold>do</bold> <list>
    <list-item>
      <p id="d2e15031" specific-use="FOR"><bold>for</bold> <monospace>each side</monospace> <bold>do</bold> <list>
    <list-item>
      <p id="d2e15045" specific-use="IF"><bold>if</bold> <bold>not </bold><monospace>mean value at cell</monospace><inline-formula><mml:math id="M455" display="inline"><mml:mo>&lt;</mml:mo></mml:math></inline-formula><monospace>reconstructed value at midpoint</monospace><inline-formula><mml:math id="M456" display="inline"><mml:mo>&lt;</mml:mo></mml:math></inline-formula><monospace>mean value at side's neighbor</monospace> <bold>then</bold> <list>
    <list-item>
      <p id="d2e15078" specific-use="STATE">impose a constant plane passing through mean value of the variable over the cell</p></list-item></list></p></list-item>
    <list-item>
      <p id="d2e15083" specific-use="ENDIF"><bold>end</bold> <bold>if</bold></p></list-item></list></p></list-item>
    <list-item>
      <p id="d2e15092" specific-use="ENDFOR"><bold>end</bold> <bold>for</bold></p></list-item></list></p>
            </list-item>

    <list-item>

      <p id="d2e15103" specific-use="ENDFOR"><bold>end</bold> <bold>for</bold></p>
            </list-item>
          </list></disp-quote></boxed-text>
      <p id="d2e15112">This ensures monotonicity by selecting the least oscillatory interpolant. The algorithm is implemented in parallel for all cells in the <monospace>SWEpy</monospace> code by operating arrays containing the mentioned quantities.</p>
</sec>
<sec id="App1.Ch1.S1.SS2">
  <label>A2</label><title>Quadratic WENO Reconstruction</title>
      <p id="d2e15126">The quadratic WENO reconstruction is summarized in Algorithm <xref ref-type="other" rid="App1.Ch1.S1.Prog2"/>, which outlines the steps for computing the operator on unstructured triangular grids.</p><boxed-text content-type="algorithm" position="float" id="App1.Ch1.S1.Prog2"><label>Algorithm A2</label><caption><p id="d2e15132">Quadratic WENO reconstruction.</p></caption><disp-quote content-type="algorithmic" specific-use="numbering{1}"><list>

    <list-item>

      <p id="d2e15139" specific-use="STATE">identify neighbors of each cell (cf. group <inline-formula><mml:math id="M457" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> in Fig. <xref ref-type="fig" rid="F3"/>)</p>
            </list-item>

    <list-item>

      <p id="d2e15161" specific-use="STATE">identify neighbors of neighbors of each cell (cf. group <inline-formula><mml:math id="M458" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> in Fig. <xref ref-type="fig" rid="F3"/>)</p>
            </list-item>

    <list-item>

      <p id="d2e15185" specific-use="FOR"><bold>for</bold> <monospace>each cell</monospace> <bold>do</bold> <list>
    <list-item>
      <p id="d2e15199" specific-use="STATE">Construct quadratic polynomial interpolator <inline-formula><mml:math id="M459" display="inline"><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mi>q</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> (cf. Eq. <xref ref-type="disp-formula" rid="App1.Ch1.S1.E35"/>)</p></list-item>
    <list-item>
      <p id="d2e15217" specific-use="STATE">Construct linear interpolators <inline-formula><mml:math id="M460" display="inline"><mml:mrow><mml:msub><mml:mi>p</mml:mi><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>p</mml:mi><mml:mrow><mml:mn mathvariant="normal">2</mml:mn><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>p</mml:mi><mml:mrow><mml:mn mathvariant="normal">3</mml:mn><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>p</mml:mi><mml:mrow><mml:mn mathvariant="normal">4</mml:mn><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula></p></list-item>
    <list-item>
      <p id="d2e15273" specific-use="STATE">Set linear weights <inline-formula><mml:math id="M461" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">γ</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">γ</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">γ</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">γ</mml:mi><mml:mn mathvariant="normal">3</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">γ</mml:mi><mml:mn mathvariant="normal">4</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula></p></list-item>
    <list-item>
      <p id="d2e15316" specific-use="STATE">Calculate smoothness indicators <inline-formula><mml:math id="M462" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mn mathvariant="normal">3</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mn mathvariant="normal">4</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> (Eq. 2.8 in <xref ref-type="bibr" rid="bib1.bibx97" id="altparen.108"/>)</p></list-item>
    <list-item>
      <p id="d2e15363" specific-use="STATE">Calculate corrector <inline-formula><mml:math id="M463" display="inline"><mml:mi mathvariant="italic">τ</mml:mi></mml:math></inline-formula> for WENO-Z procedure (Eq. 2.13 in <xref ref-type="bibr" rid="bib1.bibx97" id="altparen.109"/>)</p></list-item>
    <list-item>
      <p id="d2e15379" specific-use="STATE">Calculate and normalize nonlinear weights <inline-formula><mml:math id="M464" display="inline"><mml:mrow><mml:msub><mml:mi>w</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>w</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>w</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>w</mml:mi><mml:mn mathvariant="normal">3</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>w</mml:mi><mml:mn mathvariant="normal">4</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula></p></list-item>
    <list-item>
      <p id="d2e15422" specific-use="STATE">Construct reconstruction operator over cell as <inline-formula><mml:math id="M465" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi>q</mml:mi><mml:mo mathvariant="normal" stretchy="false">̃</mml:mo></mml:mover><mml:mi>j</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mstyle displaystyle="false"><mml:mfrac style="text"><mml:mrow><mml:msub><mml:mi>w</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow><mml:mrow><mml:msub><mml:mi mathvariant="italic">γ</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:mfrac></mml:mstyle><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi>p</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mo>-</mml:mo><mml:msubsup><mml:mo>∑</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mn mathvariant="normal">4</mml:mn></mml:msubsup><mml:msub><mml:mi mathvariant="italic">γ</mml:mi><mml:mi>k</mml:mi></mml:msub><mml:msub><mml:mi>p</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mfenced><mml:mo>+</mml:mo><mml:msubsup><mml:mo>∑</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mn mathvariant="normal">4</mml:mn></mml:msubsup><mml:msub><mml:mi>w</mml:mi><mml:mi>k</mml:mi></mml:msub><mml:msub><mml:mi>p</mml:mi><mml:mrow><mml:mi>k</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula></p></list-item></list></p>
            </list-item>

    <list-item>

      <p id="d2e15522" specific-use="ENDFOR"><bold>end</bold> <bold>for</bold></p>
            </list-item>
          </list></disp-quote></boxed-text>
      <p id="d2e15531">The detailed calculation procedure for the quadratic polynomial <inline-formula><mml:math id="M466" display="inline"><mml:mrow><mml:msub><mml:mi>p</mml:mi><mml:mrow><mml:msub><mml:mi>j</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> relies solely on geometric information associated with the control cell <inline-formula><mml:math id="M467" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>. Consider the quadratic form:

            <disp-formula id="App1.Ch1.S1.E35" content-type="numbered"><label>A1</label><mml:math id="M468" display="block"><mml:mrow><mml:msub><mml:mi>p</mml:mi><mml:mrow><mml:msub><mml:mi>j</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:msub><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:msub><mml:mi>a</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi>a</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:mi>x</mml:mi><mml:mo>+</mml:mo><mml:msub><mml:mi>a</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mi>y</mml:mi><mml:mo>+</mml:mo><mml:msub><mml:mi>a</mml:mi><mml:mn mathvariant="normal">3</mml:mn></mml:msub><mml:msup><mml:mi>x</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>+</mml:mo><mml:msub><mml:mi>a</mml:mi><mml:mn mathvariant="normal">4</mml:mn></mml:msub><mml:msup><mml:mi>y</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>+</mml:mo><mml:msub><mml:mi>a</mml:mi><mml:mn mathvariant="normal">5</mml:mn></mml:msub><mml:mi>x</mml:mi><mml:mi>y</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          shown in Eq. (<xref ref-type="disp-formula" rid="Ch1.E27"/>), the associated integrals in the construction of the quadratic polynomials and smoothness indicators are calculated exactly.</p>
      <p id="d2e15661">This polynomial approximates the mean values over the stencil cells and exactly reproduces the mean in <inline-formula><mml:math id="M469" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">Ω</mml:mi><mml:mrow><mml:msub><mml:mi>j</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>. The associated integrals for smoothness indicators are computed exactly. Since the system is overdetermined (9 equations for 5 coefficients), it is solved via least-squares: given <inline-formula><mml:math id="M470" display="inline"><mml:mrow><mml:mi>M</mml:mi><mml:mi mathvariant="bold-italic">a</mml:mi><mml:mo>=</mml:mo><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi mathvariant="bold-italic">q</mml:mi></mml:mrow></mml:math></inline-formula>,

            <disp-formula id="App1.Ch1.S1.E36" content-type="numbered"><label>A2</label><mml:math id="M471" display="block"><mml:mrow><mml:mi mathvariant="bold-italic">a</mml:mi><mml:mover><mml:mo>=</mml:mo><mml:mi>lsq</mml:mi></mml:mover><mml:mo>(</mml:mo><mml:msup><mml:mi>M</mml:mi><mml:mi>t</mml:mi></mml:msup><mml:mi>M</mml:mi><mml:msup><mml:mo>)</mml:mo><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup><mml:msup><mml:mi>M</mml:mi><mml:mi>t</mml:mi></mml:msup><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
      <p id="d2e15738">This approach ensures high-order accuracy while preserving well-balancing in the CU scheme. A further detailed explanation of the reconstructor and its usage in the CU scheme will be in <xref ref-type="bibr" rid="bib1.bibx33" id="text.110"/>.</p>
</sec>
<sec id="App1.Ch1.S1.SS3">
  <label>A3</label><title>Wet/dry treatment</title>
      <p id="d2e15752">The positivity-preserving correction for wet/dry fronts is outlined in Algorithm <xref ref-type="other" rid="App1.Ch1.S1.Prog3"/>.</p><boxed-text content-type="algorithm" position="float" id="App1.Ch1.S1.Prog3" specific-use="star"><label>Algorithm A3</label><caption><p id="d2e15758">Positivity preserving wet/dry reconstruction.</p></caption><disp-quote content-type="algorithmic" specific-use="numbering{1}"><list>

    <list-item>

      <p id="d2e15765" specific-use="STATE">find cells at the wet/dry front</p>
            </list-item>

    <list-item>

      <p id="d2e15771" specific-use="FOR"><bold>for</bold> <monospace>each cell in front</monospace> <bold>do</bold> <list>
    <list-item>
      <p id="d2e15785" specific-use="STATE">determines if the cell has one or two dry vertices</p></list-item>
    <list-item>
      <p id="d2e15790" specific-use="IF"><bold>if</bold> <monospace>cell has two dry vertices</monospace> <bold>then</bold> <list>
    <list-item>
      <p id="d2e15804" specific-use="STATE"><inline-formula><mml:math id="M472" display="inline"><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:mo>:=</mml:mo><mml:mo>(</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub><mml:mo>)</mml:mo><mml:mo>←</mml:mo><mml:mtext mathvariant="monospace">dry vertex 1</mml:mtext></mml:mrow></mml:math></inline-formula></p></list-item>
    <list-item>
      <p id="d2e15850" specific-use="STATE"><inline-formula><mml:math id="M473" display="inline"><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>:=</mml:mo><mml:mo>(</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub><mml:mo>)</mml:mo><mml:mo>←</mml:mo><mml:mtext mathvariant="monospace">dry vertex 2</mml:mtext></mml:mrow></mml:math></inline-formula></p></list-item>
    <list-item>
      <p id="d2e15896" specific-use="STATE"><inline-formula><mml:math id="M474" display="inline"><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mn mathvariant="normal">3</mml:mn></mml:msub><mml:mo>:=</mml:mo><mml:mo>(</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>)</mml:mo><mml:mo>←</mml:mo><mml:mtext mathvariant="monospace">cell barycenter</mml:mtext></mml:mrow></mml:math></inline-formula></p></list-item>
    <list-item>
      <p id="d2e15932" specific-use="STATE"><inline-formula><mml:math id="M475" display="inline"><mml:mrow><mml:msub><mml:mi>B</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>B</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:mi>W</mml:mi><mml:mo>←</mml:mo><mml:mrow><mml:mtext mathvariant="monospace">bathymetry at </mml:mtext><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub></mml:mrow><mml:mtext mathvariant="monospace">, bat. at </mml:mtext><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub></mml:mrow><mml:mtext mathvariant="monospace">, cell mean water level</mml:mtext></mml:mrow></mml:mrow></mml:math></inline-formula></p></list-item>
    <list-item>
      <p id="d2e15988" specific-use="STATE">replace reconstruction with plane passing through <inline-formula><mml:math id="M476" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:msub><mml:mi>v</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>B</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M477" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:msub><mml:mi>v</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>B</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula>, and <inline-formula><mml:math id="M478" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:msub><mml:mi>v</mml:mi><mml:mn mathvariant="normal">3</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:mi>W</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula></p></list-item></list></p></list-item>
    <list-item>
      <p id="d2e16065" specific-use="ELSEIF"><bold>else</bold> <bold>if</bold> <monospace>cell has one dry vertex</monospace> <bold>then</bold> <list>
    <list-item>
      <p id="d2e16082" specific-use="STATE"><inline-formula><mml:math id="M479" display="inline"><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:mo>:=</mml:mo><mml:mo>(</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub><mml:mo>)</mml:mo><mml:mo>←</mml:mo><mml:mtext mathvariant="monospace">dry vertex</mml:mtext></mml:mrow></mml:math></inline-formula></p></list-item>
    <list-item>
      <p id="d2e16128" specific-use="STATE"><inline-formula><mml:math id="M480" display="inline"><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>:=</mml:mo><mml:mo>(</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msub><mml:mo>)</mml:mo><mml:mo>←</mml:mo><mml:mtext mathvariant="monospace">wet vertex</mml:mtext></mml:mrow></mml:math></inline-formula></p></list-item>
    <list-item>
      <p id="d2e16174" specific-use="STATE"><inline-formula><mml:math id="M481" display="inline"><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mn mathvariant="normal">3</mml:mn></mml:msub><mml:mo>:=</mml:mo><mml:mo>(</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>)</mml:mo><mml:mo>←</mml:mo><mml:mtext mathvariant="monospace">cell barycenter</mml:mtext></mml:mrow></mml:math></inline-formula></p></list-item>
    <list-item>
      <p id="d2e16210" specific-use="STATE"><inline-formula><mml:math id="M482" display="inline"><mml:mrow><mml:msub><mml:mi>B</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:mi>w</mml:mi><mml:mo>,</mml:mo><mml:mi>W</mml:mi><mml:mo>←</mml:mo><mml:mrow><mml:mtext mathvariant="monospace">bat. at </mml:mtext><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub></mml:mrow><mml:mtext mathvariant="monospace">, cell mean w.l., </mml:mtext><mml:mrow><mml:mn mathvariant="normal">3</mml:mn><mml:mo mathvariant="normal">/</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow><mml:mtext>(w - cell mean bat.)+bat. at </mml:mtext><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub></mml:mrow></mml:mrow></mml:mrow></mml:math></inline-formula></p></list-item>
    <list-item>
      <p id="d2e16265" specific-use="STATE">replace reconstruction with plane passing through <inline-formula><mml:math id="M483" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:msub><mml:mi>v</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>B</mml:mi><mml:mrow><mml:mi>j</mml:mi><mml:mi>k</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M484" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:msub><mml:mi>v</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:mi>W</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula>, and <inline-formula><mml:math id="M485" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:msub><mml:mi>v</mml:mi><mml:mn mathvariant="normal">3</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:mi>w</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula></p></list-item></list></p></list-item>
    <list-item>
      <p id="d2e16334" specific-use="ENDIF"><bold>end</bold> <bold>if</bold></p></list-item></list></p>
            </list-item>

    <list-item>

      <p id="d2e16344" specific-use="ENDFOR"><bold>end</bold> <bold>for</bold></p>
            </list-item>
          </list></disp-quote></boxed-text>
      <p id="d2e16353">This algorithm corrects reconstructions yielding negative depths by fitting a mass-conserving linear plane, executed in parallel on the GPU for efficiency.</p>
</sec>
</app>
  </app-group><notes notes-type="codedataavailability"><title>Code and data availability</title>

      <p id="d2e16362"><monospace>SWEpy</monospace> is available for CUDA-compatible devices through GitHub at <uri>https://github.com/joaquinmeza90/SWEpy.git</uri> (last access: 7 April 2026) (<ext-link xlink:href="https://doi.org/10.5281/zenodo.19464287" ext-link-type="DOI">10.5281/zenodo.19464287</ext-link>, <xref ref-type="bibr" rid="bib1.bibx55" id="altparen.111"/>), under a GPL license. To facilitate onboarding and ensure reproducibility, a comprehensive User Manual and Technical Reference  <xref ref-type="bibr" rid="bib1.bibx63" id="paren.112"/> – covering installation, input data formats, and benchmark execution – can be downloaded from the project’s official website: <uri>https://www.hydrology.cl/swepy</uri> (last access: 15 April 2026). A repository containing test cases showed in Sect. <xref ref-type="sec" rid="Ch1.S5"/> is available at <ext-link xlink:href="https://doi.org/10.5281/zenodo.16789889" ext-link-type="DOI">10.5281/zenodo.16789889</ext-link> <xref ref-type="bibr" rid="bib1.bibx54" id="paren.113"/>. This repository includes many of the cases reported here, except those for which data cannot be publicly released but can be obtained from the original sources (e.g., TELEMAC validation suite for Malpasset, GEBCO and NOAA for Maule).</p>
  </notes><notes notes-type="videosupplement"><title>Video supplement</title>

      <p id="d2e16394">Animations of both the Malpasset (3D and topdown view) and Maule (explicit Euler <inline-formula><mml:math id="M486" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> WENO and RK4,3 <inline-formula><mml:math id="M487" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> WENO configurations) scenarios simulated are available for visualization and download at <ext-link xlink:href="https://doi.org/10.5281/zenodo.16798435" ext-link-type="DOI">10.5281/zenodo.16798435</ext-link> <xref ref-type="bibr" rid="bib1.bibx32" id="paren.114"/>.</p>
  </notes><app-group>
        <supplementary-material position="anchor"><p id="d2e16417">The supplement related to this article is available online at <inline-supplementary-material xlink:href="https://doi.org/10.5194/gmd-19-3953-2026-supplement" xlink:title="pdf">https://doi.org/10.5194/gmd-19-3953-2026-supplement</inline-supplementary-material>.</p></supplementary-material>
        </app-group><notes notes-type="authorcontribution"><title>Author contributions</title>

      <p id="d2e16426">JF contributed to conceptualization, investigation, software development, model validation, visualization, and writing. DK contributed to conceptualization, software development, formal analysis, model validation, and writing. JM contributed to conceptualization, software development, formal analysis, model validation, and writing. RM contributed to conceptualization, formal analysis, model validation, and writing. PC contributed to formal analysis, model validation, and writing.</p>
  </notes><notes notes-type="competinginterests"><title>Competing interests</title>

      <p id="d2e16432">The contact author has declared that none of the authors has any competing interests.</p>
  </notes><notes notes-type="disclaimer"><title>Disclaimer</title>

      <p id="d2e16438">Publisher's note: Copernicus Publications remains neutral with regard to jurisdictional claims made in the text, published maps, institutional affiliations, or any other geographical representation in this paper. The authors bear the ultimate responsibility for providing appropriate place names. Views expressed in the text are those of the authors and do not necessarily reflect the views of the publisher.</p>
  </notes><ack><title>Acknowledgements</title><p id="d2e16445">The authors acknowledge the contributions of reviewers in improving this manuscript. Joaquín Meza was supported by Universidad Técnica Federico Santa María through the project PI_LII_23_06. Patricio Catalan was supported by Centro de Investigación para la Gestión Integrada del Riesgo de Desastres, ANID CIGIDEN R<inline-formula><mml:math id="M488" display="inline"><mml:mo>+</mml:mo></mml:math></inline-formula> CIN250023, and ANID CCTVal CIA2500027.</p></ack><notes notes-type="financialsupport"><title>Financial support</title>

      <p id="d2e16457">This research has been supported by the Agencia Nacional de Investigación y Desarrollo, Chile (ANID CIN (grant no. CIN250023, CIGIDEN)), the Agencia Nacional de Investigación y Desarrollo, Chile (ANID CIA, grant no. CIA2500027, CCTVal), and the Universidad Técnica Federico Santa María (grant no. PI_LII_23_06).</p>
  </notes><notes notes-type="reviewstatement"><title>Review statement</title>

      <p id="d2e16463">This paper was edited by James Kelly and reviewed by Kyle Mandli and one anonymous referee.</p>
  </notes><ref-list>
    <title>References</title>

      <ref id="bib1.bibx1"><label>Abadi et al.(2015)Abadi, Agarwal, Barham, Brevdo, Chen, Citro, Corrado, Davis, Dean, Devin, Ghemawat, Goodfellow, Harp, Irving, Isard, Jia, Jozefowicz, Kaiser, Kudlur, Levenberg, Mané, Monga, Moore, Murray, Olah, Schuster, Shlens, Steiner, Sutskever, Talwar, Tucker, Vanhoucke, Vasudevan, Viégas, Vinyals, Warden, Wattenberg, Wicke, Yu, and Zheng</label><mixed-citation>Abadi, M., Agarwal, A., Barham, P., Brevdo, E., Chen, Z., Citro, C., Corrado, G. S., Davis, A., Dean, J., Devin, M., Ghemawat, S., Goodfellow, I., Harp, A., Irving, G., Isard, M., Jia, Y., Jozefowicz, R., Kaiser, L., Kudlur, M., Levenberg, J., Mané, D., Monga, R., Moore, S., Murray, D., Olah, C., Schuster, M., Shlens, J., Steiner, B., Sutskever, I., Talwar, K., Tucker, P., Vanhoucke, V., Vasudevan, V., Viégas, F., Vinyals, O., Warden, P., Wattenberg, M., Wicke, M., Yu, Y., and Zheng, X.: TensorFlow: Large-Scale Machine Learning on Heterogeneous Systems, Technical report, Google, <uri>https://www.tensorflow.org/</uri> (last access: 15 April 2026),  2015.</mixed-citation></ref>
      <ref id="bib1.bibx2"><label>Ansel et al.(2024)Ansel, Yang, He, Gimelshein, Jain, Voznesensky, Bao, Bell, Berard, Burovski, Chauhan, Chourdia, Constable, Desmaison, DeVito, Ellison, Feng, Gong, Gschwind, Hirsh, Huang, Kalambarkar, Kirsch, Lazos, Lezcano, Liang, Liang, Lu, Luk, Maher, Pan, Puhrsch, Reso, Saroufim, Siraichi, Suk, Zhang, Suo, Tillet, Zhao, Wang, Zhou, Zou, Wang, Mathews, Wen, Chanan, Wu, and Chintala</label><mixed-citation>Ansel, J., Yang, E., He, H., Gimelshein, N., Jain, A., Voznesensky, M., Bao, B., Bell, P., Berard, D., Burovski, E., Chauhan, G., Chourdia, A., Constable, W., Desmaison, A., DeVito, Z., Ellison, E., Feng, W., Gong, J., Gschwind, M., Hirsh, B., Huang, S., Kalambarkar, K., Kirsch, L., Lazos, M., Lezcano, M., Liang, Y., Liang, J., Lu, Y., Luk, C. K., Maher, B., Pan, Y., Puhrsch, C., Reso, M., Saroufim, M., Siraichi, M. Y., Suk, H., Zhang, S., Suo, M., Tillet, P., Zhao, X., Wang, E., Zhou, K., Zou, R., Wang, X., Mathews, A., Wen, W., Chanan, G., Wu, P., and Chintala, S.: PyTorch 2: Faster Machine Learning Through Dynamic Python Bytecode Transformation and Graph Compilation, in: Proceedings of the 29th ACM International Conference on Architectural Support for Programming Languages and Operating Systems, Vol. 2, ASPLOS ’24, 929–947, ACM, <ext-link xlink:href="https://doi.org/10.1145/3620665.3640366" ext-link-type="DOI">10.1145/3620665.3640366</ext-link>, 2024.</mixed-citation></ref>
      <ref id="bib1.bibx3"><label>ANSYS Inc.(2013)</label><mixed-citation>ANSYS Inc.: ANSYS Fluent Theory Guide, ANSYS, Inc., 275 Technology Drive, Canonsburg, PA 15317,  <uri>https://ansyshelp.ansys.com/public//Views/Secured/corp/v242/en/flu_th/flu_th.html</uri> (last access: 15 April 2026), 2013.</mixed-citation></ref>
      <ref id="bib1.bibx4"><label>Arminjon and St-Cyr(2003)</label><mixed-citation> Arminjon, P. and St-Cyr, A.: Nessyahu–Tadmor-type central finite volume methods without predictor for 3D Cartesian and unstructured tetrahedral grids, Appl. Numer. Math., 46, 135–155, 2003.</mixed-citation></ref>
      <ref id="bib1.bibx5"><label>Ayachit(2015)</label><mixed-citation> Ayachit, U.: The paraview guide (full color version), Kitware,  ISBN 978-1930934306, 2015.</mixed-citation></ref>
      <ref id="bib1.bibx6"><label>Behrens(2008)</label><mixed-citation>Behrens, J.: TsunAWI – Unstructured Mesh Finite Element Model for the Computation of Tsunami Scenarios with Inundation, in: 5th NAFEMS CFD-Seminar: Simulation komplexer Strömungsvorgänge (CFD) – Anwendungen und Trends, ISBN 978-1-874376-33-0, <uri>https://epic.awi.de/id/eprint/18394/</uri> (last access: 7 May 2026), 2008</mixed-citation></ref>
      <ref id="bib1.bibx7"><label>Behrens et al.(2010)Behrens, Androsov, Babeyko, Harig, Klaschka, and Mentrup</label><mixed-citation>Behrens, J., Androsov, A., Babeyko, A. Y., Harig, S., Klaschka, F., and Mentrup, L.: A new multi-sensor approach to simulation assisted tsunami early warning, Nat. Hazards Earth Syst. Sci., 10, 1085–1100, <ext-link xlink:href="https://doi.org/10.5194/nhess-10-1085-2010" ext-link-type="DOI">10.5194/nhess-10-1085-2010</ext-link>, 2010.</mixed-citation></ref>
      <ref id="bib1.bibx8"><label>Benavente and Cummins(2013)</label><mixed-citation>Benavente, R. and Cummins, P. R.: Simple and reliable finite fault solutions for large earthquakes using the W‐phase: The Maule (<inline-formula><mml:math id="M489" display="inline"><mml:mrow><mml:msub><mml:mi>M</mml:mi><mml:mi mathvariant="normal">w</mml:mi></mml:msub><mml:mo>=</mml:mo></mml:mrow></mml:math></inline-formula> 8.8) and Tohoku (<inline-formula><mml:math id="M490" display="inline"><mml:mrow><mml:msub><mml:mi>M</mml:mi><mml:mi mathvariant="normal">w</mml:mi></mml:msub><mml:mo>=</mml:mo></mml:mrow></mml:math></inline-formula> 9.0) earthquakes, Geophys. Res. Lett., 40, 3591–3595, <ext-link xlink:href="https://doi.org/10.1002/grl.50648" ext-link-type="DOI">10.1002/grl.50648</ext-link>, 2013.</mixed-citation></ref>
      <ref id="bib1.bibx9"><label>Berger et al.(2011)Berger, George, LeVeque, and Mandli</label><mixed-citation>Berger, M. J., George, D. L., LeVeque, R. J., and Mandli, K. T.: The GeoClaw software for depth-averaged flows with adaptive refinement, Adv. Water Resour., 34, 1195–1206, <ext-link xlink:href="https://doi.org/10.1016/j.advwatres.2011.02.016" ext-link-type="DOI">10.1016/j.advwatres.2011.02.016</ext-link>, 2011.</mixed-citation></ref>
      <ref id="bib1.bibx10"><label>Bomers et al.(2019)Bomers, Schielen, and Hulscher</label><mixed-citation>Bomers, A., Schielen, R. M. J., and Hulscher, S. J. M. H.: The influence of grid shape and grid size on hydraulic river modelling performance, Environ. Fluid Mech., 19, 1273–1294, <ext-link xlink:href="https://doi.org/10.1007/s10652-019-09670-4" ext-link-type="DOI">10.1007/s10652-019-09670-4</ext-link>, 2019.</mixed-citation></ref>
      <ref id="bib1.bibx11"><label>Briggs et al.(1995)Briggs, Synolakis, Harkins, and Green</label><mixed-citation>Briggs, M. J., Synolakis, C. E., Harkins, G. S., and Green, D. R.: Laboratory experiments of tsunami runup on a circular island, Pure Appl. Geophys., 144, 569–593, <ext-link xlink:href="https://doi.org/10.1007/BF00874384" ext-link-type="DOI">10.1007/BF00874384</ext-link>, 1995</mixed-citation></ref>
      <ref id="bib1.bibx12"><label>Brunner(2021)</label><mixed-citation>Brunner, G.: HEC-RAS 2D User’s Manual Version 6.0, US Army Corps of Engineers, Institute for Water Resources, Hydrologic Engineering Center (HEC), Davis, CA, USA, <uri>https://www.hec.usace.army.mil/confluence/rasdocs/r2dum/latest</uri> (last access: 15 April 2026), 2021.</mixed-citation></ref>
      <ref id="bib1.bibx13"><label>Bryson and Levy(2005)</label><mixed-citation> Bryson, S. and Levy, D.: Balanced central schemes for the shallow water equations on unstructured grids, SIAM J. Sci. Comput., 27, 532–552, 2005.</mixed-citation></ref>
      <ref id="bib1.bibx14"><label>Bryson et al.(2011)Bryson, Epshteyn, Kurganov, and Petrova</label><mixed-citation>Bryson, S., Epshteyn, Y., Kurganov, A., and Petrova, G.: Well-balanced positivity preserving central-upwind scheme on triangular grids for the Saint-Venant system, ESAIM: Mathematical Modelling and Numerical Analysis, 45, 423–446, <ext-link xlink:href="https://doi.org/10.1051/m2an/2010060" ext-link-type="DOI">10.1051/m2an/2010060</ext-link>,  2011.</mixed-citation></ref>
      <ref id="bib1.bibx15"><label>Cao et al.(2024)Cao, Kurganov, Liu, and Zeitlin</label><mixed-citation>Cao, Y., Kurganov, A., Liu, Y., and Zeitlin, V.: Flux globalization-based well-balanced path-conservative central-upwind scheme for two-dimensional two-layer thermal rotating shallow water equations, J. Comput. Phys., 515, 113273, <ext-link xlink:href="https://doi.org/10.1016/j.jcp.2024.113273" ext-link-type="DOI">10.1016/j.jcp.2024.113273</ext-link>, 2024.</mixed-citation></ref>
      <ref id="bib1.bibx16"><label>Carlotto et al.(2021)Carlotto, Borges Chaffe, Innocente dos Santos, and Lee</label><mixed-citation>Carlotto, T., Borges Chaffe, P. L., Innocente dos Santos, C., and Lee, S.: SW2D-GPU: A two-dimensional shallow water model accelerated by GPGPU, Environ. Modell. Softw., 145, 105205, <ext-link xlink:href="https://doi.org/10.1016/j.envsoft.2021.105205" ext-link-type="DOI">10.1016/j.envsoft.2021.105205</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx17"><label>Castro-Orgaz and Hager(2019)Castro-Orgaz, Hager et al.</label><mixed-citation>Castro-Orgaz, O. and Hager, W. H.: Shallow water hydraulics, Springer, <ext-link xlink:href="https://doi.org/10.1007/978-3-030-13073-2" ext-link-type="DOI">10.1007/978-3-030-13073-2</ext-link>, 2019.</mixed-citation></ref>
      <ref id="bib1.bibx18"><label>Catalan et al.(2020)Catalan, Gubler, Cañas, Zuñiga, Zelaya, Pizarro, Valdes, Mena, Toledo, and and</label><mixed-citation>Catalán, P. A., Gubler, A., Cañas, J., Zúñiga, C., Zelaya, C., Pizarro, L., Valdés, C., Mena, R., Toledo, E., and Cienfuegos, R.: Design and operational implementation of the integrated tsunami forecast and warning system in Chile (SIPAT), Coast. Eng. J., 62, 373–388, <ext-link xlink:href="https://doi.org/10.1080/21664250.2020.1727402" ext-link-type="DOI">10.1080/21664250.2020.1727402</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx19"><label>Caviedes-Voullième et al.(2023)Caviedes-Voullième, Morales-Hernández, Norman, and Özgen Xian</label><mixed-citation>Caviedes-Voullième, D., Morales-Hernández, M., Norman, M. R., and Özgen-Xian, I.: SERGHEI (SERGHEI-SWE) v1.0: a performance-portable high-performance parallel-computing shallow-water solver for hydrology and environmental hydraulics, Geosci. Model Dev., 16, 977–1008, <ext-link xlink:href="https://doi.org/10.5194/gmd-16-977-2023" ext-link-type="DOI">10.5194/gmd-16-977-2023</ext-link>, 2023.</mixed-citation></ref>
      <ref id="bib1.bibx20"><label>Chertock et al.(2015)Chertock, Cui, Kurganov, and Wu</label><mixed-citation>Chertock, A., Cui, S., Kurganov, A., and Wu, T.: Well-balanced positivity preserving central-upwind scheme for the shallow water system with friction terms, Int. J. Numer. Meth. Fl., 78, 355–383, <ext-link xlink:href="https://doi.org/10.1002/fld.4023" ext-link-type="DOI">10.1002/fld.4023</ext-link>, 2015.</mixed-citation></ref>
      <ref id="bib1.bibx21"><label>Chertock et al.(2018)Chertock, Dudzinski, Kurganov, and Lukáčová-Medvid'ová</label><mixed-citation> Chertock, A., Dudzinski, M., Kurganov, A., and Lukáčová-Medvid'ová, M.: Well-balanced schemes for the shallow water equations with Coriolis forces, Numer. Math. (Heidelb.), 138, 939–973, 2018.</mixed-citation></ref>
      <ref id="bib1.bibx22"><label>Chow et al.(1988)</label><mixed-citation> Chow, V. T., Maidment, D. R., and Mays, L. W.: Applied Hydrology, McGraw-Hill, New York, USA, ISBN 978-0-07-010810-3, 1988.</mixed-citation></ref>
      <ref id="bib1.bibx23"><label>Christov and Popov(2008)</label><mixed-citation> Christov, I. and Popov, B.: New non-oscillatory central schemes on unstructured triangulations for hyperbolic systems of conservation laws, J. Comput. Phys., 227, 5736–5757, 2008.</mixed-citation></ref>
      <ref id="bib1.bibx24"><label>Chu et al.(2025)Chu, Kurganov, and Menshov</label><mixed-citation>Chu, S., Kurganov, A., and Menshov, I.: New adaptive low-dissipation central-upwind schemes, Appl. Numer. Math., 209, 155–170, <ext-link xlink:href="https://doi.org/10.1016/j.apnum.2024.11.010" ext-link-type="DOI">10.1016/j.apnum.2024.11.010</ext-link>, 2025.</mixed-citation></ref>
      <ref id="bib1.bibx25"><label>Courty et al.(2017)Courty, Pedrozo-Acuña, and Bates</label><mixed-citation>Courty, L. G., Pedrozo-Acuña, A., and Bates, P. D.: Itzï (version 17.1): an open-source, distributed GIS model for dynamic flood simulation, Geosci. Model Dev., 10, 1835–1847, <ext-link xlink:href="https://doi.org/10.5194/gmd-10-1835-2017" ext-link-type="DOI">10.5194/gmd-10-1835-2017</ext-link>, 2017.</mixed-citation></ref>
      <ref id="bib1.bibx26"><label>Cui et al.(2025)Cui, Gu, Kurganov, Wu, and Xin</label><mixed-citation>Cui, S., Gu, Y., Kurganov, A., Wu, K., and Xin, R.: Positivity-preserving new low-dissipation central-upwind schemes for compressible Euler equations, J. Comput. Phys., 538, 114189, <ext-link xlink:href="https://doi.org/10.1016/j.jcp.2025.114189" ext-link-type="DOI">10.1016/j.jcp.2025.114189</ext-link>, 2025.</mixed-citation></ref>
      <ref id="bib1.bibx27"><label>Delestre et al.(2017)Delestre, Darboux, James, Lucas, Laguerre, and Cordier</label><mixed-citation>Delestre, O., Darboux, F., James, F., Lucas, C., Laguerre, C., and Cordier, S.: FullSWOF: Full Shallow-Water equations for Overland Flow,  Journal of Open Source Software, 2, 448, <ext-link xlink:href="https://doi.org/10.21105/joss.00448" ext-link-type="DOI">10.21105/joss.00448</ext-link>, 2017.</mixed-citation></ref>
      <ref id="bib1.bibx28"><label>Delis and Nikolos(2021)</label><mixed-citation>Delis, A. I. and Nikolos, I. K.: Shallow Water Equations in Hydraulics: Modeling, Numerics and Applications, Water,  <ext-link xlink:href="https://doi.org/10.3390/w13243598" ext-link-type="DOI">10.3390/w13243598</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx29"><label>Desveaux and Masset(2022)</label><mixed-citation>Desveaux, V. and Masset, A.: A fully well-balanced scheme for shallow water equations with Coriolis force, Commun. Math. Sci., 20, 1875–1900, <ext-link xlink:href="https://doi.org/10.4310/CMS.2022.v20.n7.a4" ext-link-type="DOI">10.4310/CMS.2022.v20.n7.a4</ext-link>, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx30"><label>Fernández-Nóvoa et al.(2024)Fernández-Nóvoa, González-Cao, and García-Feal</label><mixed-citation>Fernández-Nóvoa, D., González-Cao, J., and García-Feal, O.: Enhancing Flood Risk Management: A Comprehensive Review on Flood Early Warning Systems with Emphasis on Numerical Modeling, Water, 16, <ext-link xlink:href="https://doi.org/10.3390/w16101408" ext-link-type="DOI">10.3390/w16101408</ext-link>, 2024.</mixed-citation></ref>
      <ref id="bib1.bibx31"><label>Fernández-Pato et al.(2018)Fernández-Pato, Morales-Hernández, and García-Navarro</label><mixed-citation>Fernández-Pato, J., Morales-Hernández, M., and García-Navarro, P.: Implicit 2D surface flow models performance assessment: Shallow Water Equations vs. Zero-Inertia Model, E3S Web Conf., 40, 05008, <ext-link xlink:href="https://doi.org/10.1051/e3sconf/20184005008" ext-link-type="DOI">10.1051/e3sconf/20184005008</ext-link>, 2018.</mixed-citation></ref>
      <ref id="bib1.bibx32"><label>Fuenzalida Alarcón(2025)</label><mixed-citation>Fuenzalida Alarcón, J. A.: Animations of Malpasset and Maule simulations using SWEpy, Zenodo [video], <ext-link xlink:href="https://doi.org/10.5281/zenodo.16798435" ext-link-type="DOI">10.5281/zenodo.16798435</ext-link>, 2025.</mixed-citation></ref>
      <ref id="bib1.bibx33"><label>Fuenzalida Alarcón et al.(2025)Fuenzalida A., Meneses, Meza, and Kusanovic</label><mixed-citation> Fuenzalida Alarcón, J. A., Meneses, R., Meza, J., and Kusanovic, D.: Adaptive Local Reconstruction for Solving Saint-Venant Equations in Irregular Domains, in preparation, 2025.</mixed-citation></ref>
      <ref id="bib1.bibx34"><label>García-Feal et al.(2018)García-Feal, González-Cao, Gómez-Gesteira, Cea, Domínguez, and Formella</label><mixed-citation>García-Feal, O., González-Cao, J., Gómez-Gesteira, M., Cea, L., Domínguez, J. M., and Formella, A.: An Accelerated Tool for Flood Modelling Based on Iber, Water, 10, 1459, <ext-link xlink:href="https://doi.org/10.3390/w10101459" ext-link-type="DOI">10.3390/w10101459</ext-link>, 2018.</mixed-citation></ref>
      <ref id="bib1.bibx35"><label>GEBCO Bathymetric Compilation Group 2024(2024)</label><mixed-citation>GEBCO Bathymetric Compilation Group 2024: The GEBCO_2024 Grid – a continuous terrain model of the global oceans and land, NERC EDS British Oceanographic Data Centre NOC [data set], <ext-link xlink:href="https://doi.org/10.5285/1C44CE99-0A0D-5F4F-E063-7086ABC0EA0F" ext-link-type="DOI">10.5285/1C44CE99-0A0D-5F4F-E063-7086ABC0EA0F</ext-link>, 2024.</mixed-citation></ref>
      <ref id="bib1.bibx36"><label>Gottlieb et al.(2001)Gottlieb, Shu, and Tadmor</label><mixed-citation>Gottlieb, S., Shu, C.-W., and Tadmor, E.: Strong Stability-Preserving High-Order Time Discretization Methods, SIAM Rev., 43, 89–112, <ext-link xlink:href="https://doi.org/10.1137/S003614450036757X" ext-link-type="DOI">10.1137/S003614450036757X</ext-link>, 2001.</mixed-citation></ref>
      <ref id="bib1.bibx37"><label>Gottlieb et al.(2010)Gottlieb, Shu, and Ketcheson</label><mixed-citation>Gottlieb, S., Shu, C.-W., and Ketcheson, D.: Strong Stability Preserving Runge-kutta And Multistep Time Discretizations, World Scientific Publishing, Singapore, Singapore,  <ext-link xlink:href="https://doi.org/10.1142/7498" ext-link-type="DOI">10.1142/7498</ext-link>, 2010.</mixed-citation></ref>
      <ref id="bib1.bibx38"><label>Greenberg and Leroux(1996)</label><mixed-citation>Greenberg, J. M. and Leroux, A. Y.: A Well-Balanced Scheme for the Numerical Processing of Source Terms in Hyperbolic Equations, SIAM J. Numer. Anal., 33, 1–16, <ext-link xlink:href="https://doi.org/10.1137/0733001" ext-link-type="DOI">10.1137/0733001</ext-link>, 1996.</mixed-citation></ref>
      <ref id="bib1.bibx39"><label>Harig et al.(2008)Harig, Chaeroni, Pranowo, and Behrens</label><mixed-citation>Harig, S., Chaeroni, Pranowo, W. S., and Behrens, J.: Tsunami simulations on several scales: Comparison of approaches with unstructured meshes and nested grids, Ocean Dynam., 58, 429–440, <ext-link xlink:href="https://doi.org/10.1007/s10236-008-0162-5" ext-link-type="DOI">10.1007/s10236-008-0162-5</ext-link>, 2008.</mixed-citation></ref>
      <ref id="bib1.bibx40"><label>Harig et al.(2019)Harig, Immerz, Weniza, Griffin, Weber, Babeyko, Rakowsky, Hartanto, Nurokhim, Handayani, and Weber</label><mixed-citation>Harig, S., Immerz, A., Weniza, Griffin, J., Weber, B., Babeyko, A., Rakowsky, N., Hartanto, D., Nurokhim, A., Handayani, T., and Weber, R.: The Tsunami Scenario Database of the Indonesia Tsunami Early Warning System (InaTEWS): Evolution of the Coverage and the Involved Modeling Approaches, Pure Appl. Geophys., 177, 1379–1401, <ext-link xlink:href="https://doi.org/10.1007/s00024-019-02305-1" ext-link-type="DOI">10.1007/s00024-019-02305-1</ext-link>, 2019.</mixed-citation></ref>
      <ref id="bib1.bibx41"><label>Harris et al.(2020)Harris, Millman, van der Walt, Gommers, Virtanen, Cournapeau, Wieser, Taylor, Berg, Smith, Kern, Picus, Hoyer, van Kerkwijk, Brett, Haldane, del Río, Wiebe, Peterson, Gérard-Marchant, Sheppard, Reddy, Weckesser, Abbasi, Gohlke, and Oliphant</label><mixed-citation>Harris, C. R., Millman, K. J., van der Walt, S. J., Gommers, R., Virtanen, P., Cournapeau, D., Wieser, E., Taylor, J., Berg, S., Smith, N. J., Kern, R., Picus, M., Hoyer, S., van Kerkwijk, M. H., Brett, M., Haldane, A., del Río, J. F., Wiebe, M., Peterson, P., Gérard-Marchant, P., Sheppard, K., Reddy, T., Weckesser, W., Abbasi, H., Gohlke, C., and Oliphant, T. E.: Array programming with NumPy, Nature, 585, 357–362, <ext-link xlink:href="https://doi.org/10.1038/s41586-020-2649-2" ext-link-type="DOI">10.1038/s41586-020-2649-2</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx42"><label>Hervouet(2007)</label><mixed-citation>Hervouet, J.-M.: Hydrodynamics of free surface flows: modelling with the finite element method, John Wiley &amp; Sons, <ext-link xlink:href="https://doi.org/10.1002/9780470319628" ext-link-type="DOI">10.1002/9780470319628</ext-link>, 2007.</mixed-citation></ref>
      <ref id="bib1.bibx43"><label>Jawahar and Kamath(2000)</label><mixed-citation> Jawahar, P. and Kamath, H.: A high-resolution procedure for Euler and Navier–Stokes computations on unstructured grids, J. Comput. Phys., 164, 165–203, 2000.</mixed-citation></ref>
      <ref id="bib1.bibx44"><label>Jodhani et al.(2023)Jodhani, Patel, and Madhavan</label><mixed-citation>Jodhani, K. H., Patel, D., and Madhavan, N.: A review on analysis of flood modelling using different numerical models, Mater. Today-Proc., 80, 3867–3876, <ext-link xlink:href="https://doi.org/10.1016/j.matpr.2021.07.405" ext-link-type="DOI">10.1016/j.matpr.2021.07.405</ext-link>, 2023.</mixed-citation></ref>
      <ref id="bib1.bibx45"><label>Kabir et al.(2020)Kabir, Patidar, Xia, Liang, Neal, and Pender</label><mixed-citation>Kabir, S., Patidar, S., Xia, X., Liang, Q., Neal, J., and Pender, G.: A deep convolutional neural network model for rapid prediction of fluvial flood inundation, J. Hydrol., 590, 125481, <ext-link xlink:href="https://doi.org/10.1016/j.jhydrol.2020.125481" ext-link-type="DOI">10.1016/j.jhydrol.2020.125481</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx46"><label>Kirstetter et al.(2021)Kirstetter, Delestre, Lagrée, Popinet, and Josserand</label><mixed-citation>Kirstetter, G., Delestre, O., Lagrée, P.-Y., Popinet, S., and Josserand, C.: B-flood 1.0: an open-source Saint-Venant model for flash-flood simulation using adaptive refinement, Geosci. Model Dev., 14, 7117–7132, <ext-link xlink:href="https://doi.org/10.5194/gmd-14-7117-2021" ext-link-type="DOI">10.5194/gmd-14-7117-2021</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx47"><label>Kloeckner et al.(2025)Kloeckner, Wohlgemuth, Lee, Rybak, Nitz, Chiang, Seibert, Bergtholdt, Unterthiner, Markall, Kotak, Favre-Nicolin, Opanchuk, Merry, Pinto, Milo, Collignon, Rathgeber, Perkins, Rutsky, Catanzaro, Park, Witherden, E. Givon, Pfister, Brubaker, ZA, Hausammann, and Gohlke</label><mixed-citation>Kloeckner, A., Wohlgemuth, G., Lee, G., Rybak, T., Nitz, A., Chiang, D., Seibert, S., Bergtholdt, M., Unterthiner, T., Markall, G., Kotak, M., Favre-Nicolin, V., Opanchuk, B., Merry, B., Pinto, N., Milo, F., Collignon, T., Rathgeber, F., Perkins, S., Rutsky, V., Catanzaro, B., Park, A., Witherden, F., E. Givon, L., Pfister, L., Brubaker, M., ZA, R., Hausammann, L., and Gohlke, C.: PyCUDA, Zenodo [code], <ext-link xlink:href="https://doi.org/10.5281/ZENODO.15620354" ext-link-type="DOI">10.5281/ZENODO.15620354</ext-link>, 2025.</mixed-citation></ref>
      <ref id="bib1.bibx48"><label>Kobayashi et al.(2015)Kobayashi, Kitamura, Ando, and Ohi</label><mixed-citation>Kobayashi, K., Kitamura, D., Ando, K., and Ohi, N.: Parallel computing for high-resolution/large-scale flood simulation using the K supercomputer, Hydrological Research Letters, 9, 61–68, <ext-link xlink:href="https://doi.org/10.3178/hrl.9.61" ext-link-type="DOI">10.3178/hrl.9.61</ext-link>, 2015.</mixed-citation></ref>
      <ref id="bib1.bibx49"><label>Kundu et al.(2012)Kundu, Cohen, and Dowling</label><mixed-citation>Kundu, P., Cohen, I., and Dowling, D.: Fluid Mechanics, Science Direct e-books, Elsevier Science, ISBN 978-0-12-382100-3, <uri>https://books.google.cl/books?id=iUo_4tsHQYUC</uri> (last access: 15 April 2026), 2012.</mixed-citation></ref>
      <ref id="bib1.bibx50"><label>Kurganov and Petrova(2005)</label><mixed-citation>Kurganov, A. and Petrova, G.: Central-upwind schemes on triangular grids for hyperbolic systems of conservation laws, Numer. Meth. Part D E., 21, 536–552, <ext-link xlink:href="https://doi.org/10.1002/num.20049" ext-link-type="DOI">10.1002/num.20049</ext-link>, 2005.</mixed-citation></ref>
      <ref id="bib1.bibx51"><label>Kurganov and Petrova(2007)</label><mixed-citation> Kurganov, A. and Petrova, G.: A Second-Order Well-Balanced Positivity Preserving Central-Upwind Scheme for the Saint-Venant System, Commun. Math. Sci., 5, 133–160, 2007.</mixed-citation></ref>
      <ref id="bib1.bibx52"><label>Kurganov and Tadmor(2000)</label><mixed-citation>Kurganov, A. and Tadmor, E.: New High-Resolution Central Schemes for Nonlinear Conservation Laws and Convection–Diffusion Equations, J. Comput. Phys., 160, 241–282, <ext-link xlink:href="https://doi.org/10.1006/jcph.2000.6459" ext-link-type="DOI">10.1006/jcph.2000.6459</ext-link>, 2000.</mixed-citation></ref>
      <ref id="bib1.bibx53"><label>Kurganov and Xin(2023)</label><mixed-citation>Kurganov, A. and Xin, R.: New Low-Dissipation Central-Upwind Schemes, J. Sci. Comput., 96, 56, <ext-link xlink:href="https://doi.org/10.1007/s10915-023-02281-8" ext-link-type="DOI">10.1007/s10915-023-02281-8</ext-link>, 2023.</mixed-citation></ref>
      <ref id="bib1.bibx54"><label>Kusanovic et al.(2025)</label><mixed-citation>Kusanovic, D. S., Juan, F., Meza, J., Meneses, R., and Catalan, P.: SWEpy, Zenodo [code], <ext-link xlink:href="https://doi.org/10.5281/zenodo.16789889" ext-link-type="DOI">10.5281/zenodo.16789889</ext-link>, 2025.</mixed-citation></ref>
      <ref id="bib1.bibx55"><label>Kusanovic et al.(2026)Kusanovic, Juan, Meza, Meneses, and Catalan</label><mixed-citation>Kusanovic, D. S., Juan, F., Meza, J., Meneses, R., and Catalan, P.: SWEpy, Zenodo [code], <ext-link xlink:href="https://doi.org/10.5281/zenodo.19464287" ext-link-type="DOI">10.5281/zenodo.19464287</ext-link>, 2026.</mixed-citation></ref>
      <ref id="bib1.bibx56"><label>Lam et al.(2015)Lam, Pitrou, and Seibert</label><mixed-citation>Lam, S. K., Pitrou, A., and Seibert, S.: Numba: a LLVM-based Python JIT compiler, in: Proceedings of the Second Workshop on the LLVM Compiler Infrastructure in HPC, LLVM '15, Association for Computing Machinery, New York, NY, USA, ISBN 9781450340052, <ext-link xlink:href="https://doi.org/10.1145/2833157.2833162" ext-link-type="DOI">10.1145/2833157.2833162</ext-link>, 2015.</mixed-citation></ref>
      <ref id="bib1.bibx57"><label>LeVeque(2002)</label><mixed-citation>LeVeque, R. J.: Finite Volume Methods for Hyperbolic Problems, Cambridge University Press, ISBN 9780511791253, <ext-link xlink:href="https://doi.org/10.1017/cbo9780511791253" ext-link-type="DOI">10.1017/cbo9780511791253</ext-link>, 2002.</mixed-citation></ref>
      <ref id="bib1.bibx58"><label>Lin et al.(2015)Lin, Wu, Yen, Chen, Hsu, Tsai, Lee, and Liu</label><mixed-citation>Lin, S. C., Wu, T.-R., Yen, E., Chen, H.-Y., Hsu, J., Tsai, Y.-L., Lee, C.-J., and Liu, P. L.-F.: Development of a tsunami early warning system for the South China Sea, Ocean Eng., 100, 1–18, <ext-link xlink:href="https://doi.org/10.1016/j.oceaneng.2015.02.003" ext-link-type="DOI">10.1016/j.oceaneng.2015.02.003</ext-link>, 2015.</mixed-citation></ref>
      <ref id="bib1.bibx59"><label>Liu(2021a)</label><mixed-citation>Liu, X.: A new well-balanced finite-volume scheme on unstructured triangular grids for two-dimensional two-layer shallow water flows with wet-dry fronts, J. Comput. Phys., 438, 110380, <ext-link xlink:href="https://doi.org/10.1016/j.jcp.2021.110380" ext-link-type="DOI">10.1016/j.jcp.2021.110380</ext-link>, 2021a.</mixed-citation></ref>
      <ref id="bib1.bibx60"><label>Liu(2021b)</label><mixed-citation>Liu, X.: A new well-balanced finite-volume scheme on unstructured triangular grids for two-dimensional two-layer shallow water flows with wet-dry fronts, J. Comput. Phys., 438, 110380, <ext-link xlink:href="https://doi.org/10.1016/j.jcp.2021.110380" ext-link-type="DOI">10.1016/j.jcp.2021.110380</ext-link>, 2021b.</mixed-citation></ref>
      <ref id="bib1.bibx61"><label>Liu et al.(2018)Liu, Albright, Epshteyn, and Kurganov</label><mixed-citation>Liu, X., Albright, J., Epshteyn, Y., and Kurganov, A.: Well-balanced positivity preserving central-upwind scheme with a novel wet/dry reconstruction on triangular grids for the Saint-Venant system, J. Comput. Phys., 374, 213–236, <ext-link xlink:href="https://doi.org/10.1016/j.jcp.2018.07.038" ext-link-type="DOI">10.1016/j.jcp.2018.07.038</ext-link>, 2018.</mixed-citation></ref>
      <ref id="bib1.bibx62"><label>Macías et al.(2017)Macías, Castro, Ortega, Escalante, and González-Vida</label><mixed-citation>Macías, J., Castro, M. J., Ortega, S., Escalante, C., and González-Vida, J. M.: Performance Benchmarking of Tsunami-HySEA Model for NTHMP's Inundation Mapping Activities, Pure Appl. Geophys., <ext-link xlink:href="https://doi.org/10.1007/s00024-017-1583-1" ext-link-type="DOI">10.1007/s00024-017-1583-1</ext-link>, 2017.</mixed-citation></ref>
      <ref id="bib1.bibx63"><label>Meza et al.(2026)Meza, Kusanovic, Juan, and Meneses</label><mixed-citation>Meza, J., Kusanovic, D. S., Juan, F., and Meneses, R.: SWEpy: Shallow Water Equation Python solver – User Manual &amp; Technical Reference, Zenodo, <ext-link xlink:href="https://doi.org/10.5281/zenodo.19323355" ext-link-type="DOI">10.5281/zenodo.19323355</ext-link>, 2026.</mixed-citation></ref>
      <ref id="bib1.bibx64"><label>Morales-Hernández et al.(2021)Morales-Hernández, Sharif, Kalyanapu, Ghafoor, Dullo, Gangrade, Kao, Norman, and Evans</label><mixed-citation>Morales-Hernández, M., Sharif, M. B., Kalyanapu, A., Ghafoor, S., Dullo, T., Gangrade, S., Kao, S.-C., Norman, M., and Evans, K.: TRITON: A Multi-GPU open source 2D hydrodynamic flood model, Environ. Modell. Softw., 141, 105034, <ext-link xlink:href="https://doi.org/10.1016/j.envsoft.2021.105034" ext-link-type="DOI">10.1016/j.envsoft.2021.105034</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx65"><label>Moukalled et al.(2015)Moukalled, Mangani, and Darwish</label><mixed-citation>Moukalled, F., Mangani, L., and Darwish, M.: The finite volume method, in: The finite volume method in computational fluid dynamics: An advanced introduction with OpenFOAM<sup>®</sup> and Matlab, Springer,  103–135, <ext-link xlink:href="https://doi.org/10.1007/978-3-319-16874-6" ext-link-type="DOI">10.1007/978-3-319-16874-6</ext-link>, 2015.</mixed-citation></ref>
      <ref id="bib1.bibx66"><label>Moulinec et al.(2011)Moulinec, Denis, Pham, Rougé, Hervouet, Razafindrakoto, Barber, Emerson, and Gu</label><mixed-citation>Moulinec, C., Denis, C., Pham, C.-T., Rougé, D., Hervouet, J.-M., Razafindrakoto, E., Barber, R., Emerson, D., and Gu, X.-J.: TELEMAC: An efficient hydrodynamics suite for massively parallel architectures, Comput. Fluid., 51, 30–34, <ext-link xlink:href="https://doi.org/10.1016/j.compfluid.2011.07.003" ext-link-type="DOI">10.1016/j.compfluid.2011.07.003</ext-link>, 2011.</mixed-citation></ref>
      <ref id="bib1.bibx67"><label>Mungov et al.(2005)</label><mixed-citation>National Oceanic and Atmospheric Administration: Deep-Ocean Assessment and Reporting of Tsunamis (DART(R)), NOAA National Centers for Environmental Information [data set], <ext-link xlink:href="https://doi.org/10.7289/V5F18WNS" ext-link-type="DOI">10.7289/V5F18WNS</ext-link>, 2005.</mixed-citation></ref>
      <ref id="bib1.bibx68"><label>Nessyahu and Tadmor(1990)</label><mixed-citation> Nessyahu, H. and Tadmor, E.: Non-oscillatory central differencing for hyperbolic conservation laws, J. Comput. Phys., 87, 408–463, 1990.</mixed-citation></ref>
      <ref id="bib1.bibx69"><label>Nguyen(2023)</label><mixed-citation>Nguyen, T.: Adaptive Central-Upwind Scheme on Triangular Grids for the Shallow Water Model with Variable Density, Int. J. Numer. Anal. Mod., 20, 229–266, <ext-link xlink:href="https://doi.org/10.4208/ijnam2023-1010" ext-link-type="DOI">10.4208/ijnam2023-1010</ext-link>, 2023.</mixed-citation></ref>
      <ref id="bib1.bibx70"><label>Okuta et al.(2017)Okuta, Unno, Nishino, Hido, and Loomis</label><mixed-citation>Okuta, R., Unno, Y., Nishino, D., Hido, S., and Loomis, C.: CuPy: A NumPy-Compatible Library for NVIDIA GPU Calculations, in: Proceedings of Workshop on Machine Learning Systems (LearningSys) in The Thirty-first Annual Conference on Neural Information Processing Systems (NIPS), <uri>http://learningsys.org/nips17/assets/papers/paper_16.pdf</uri> (last access: 15 April 2026), 2017.</mixed-citation></ref>
      <ref id="bib1.bibx71"><label>Parnas(1972)</label><mixed-citation>Parnas, D. L.: On the criteria to be used in decomposing systems into modules, Commun. ACM, 15, 1053–1058, <ext-link xlink:href="https://doi.org/10.1145/361598.361623" ext-link-type="DOI">10.1145/361598.361623</ext-link>, 1972.</mixed-citation></ref>
      <ref id="bib1.bibx72"><label>Reinarz et al.(2020)Reinarz, Charrier, Bader, Bovard, Dumbser, Duru, Fambri, Gabriel, Gallard, Köppel, Krenz, Rannabauer, Rezzolla, Samfass, Tavelli, and Weinzierl</label><mixed-citation>Reinarz, A., Charrier, D. E., Bader, M., Bovard, L., Dumbser, M., Duru, K., Fambri, F., Gabriel, A.-A., Gallard, J.-M., Köppel, S., Krenz, L., Rannabauer, L., Rezzolla, L., Samfass, P., Tavelli, M., and Weinzierl, T.: ExaHyPE: An engine for parallel dynamically adaptive simulations of wave problems, Comput. Phys. Commun., 254, 107251, <ext-link xlink:href="https://doi.org/10.1016/j.cpc.2020.107251" ext-link-type="DOI">10.1016/j.cpc.2020.107251</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx73"><label>Rocklin(2015)</label><mixed-citation>Rocklin, M.: Dask: Parallel computation with blocked algorithms and task scheduling, in: Proceedings of the 14th python in science conference, Citeseer,   130–136,  <ext-link xlink:href="https://doi.org/10.25080/Majora-7b98e3ed-013" ext-link-type="DOI">10.25080/Majora-7b98e3ed-013</ext-link>, 2015.</mixed-citation></ref>
      <ref id="bib1.bibx74"><label>Schubert et al.(2008)Schubert, Sanders, Smith, and Wright</label><mixed-citation>Schubert, J. E., Sanders, B. F., Smith, M. J., and Wright, N. G.: Unstructured mesh generation and landcover-based resistance for hydrodynamic modeling of urban flooding, Adv. Water Resour., 31, 1603–1621, <ext-link xlink:href="https://doi.org/10.1016/j.advwatres.2008.07.012" ext-link-type="DOI">10.1016/j.advwatres.2008.07.012</ext-link>, 2008.</mixed-citation></ref>
      <ref id="bib1.bibx75"><label>Shaeri Karimi et al.(2019)Shaeri Karimi, Saintilan, Wen, and Valavi</label><mixed-citation>Shaeri Karimi, S., Saintilan, N., Wen, L., and Valavi, R.: Application of Machine Learning to Model Wetland Inundation Patterns Across a Large Semiarid Floodplain, Water Resour. Res., 55, 8765–8778, <ext-link xlink:href="https://doi.org/10.1029/2019wr024884" ext-link-type="DOI">10.1029/2019wr024884</ext-link>, 2019.</mixed-citation></ref>
      <ref id="bib1.bibx76"><label>Shaw et al.(2021)Shaw, Kesserwani, Neal, Bates, and Sharifian</label><mixed-citation>Shaw, J., Kesserwani, G., Neal, J., Bates, P., and Sharifian, M. K.: LISFLOOD-FP 8.0: the new discontinuous Galerkin shallow-water solver for multi-core CPUs and GPUs, Geosci. Model Dev., 14, 3577–3602, <ext-link xlink:href="https://doi.org/10.5194/gmd-14-3577-2021" ext-link-type="DOI">10.5194/gmd-14-3577-2021</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx77"><label>Simons et al.(2013)Simons, Busse, Hou, Özgen, and Hinkelmann</label><mixed-citation>Simons, F., Busse, T., Hou, J., Özgen, I., and Hinkelmann, R.: A model for overland flow and associated processes within the Hydroinformatics Modelling System, J. Hydroinform., 16, 375–391, <ext-link xlink:href="https://doi.org/10.2166/hydro.2013.173" ext-link-type="DOI">10.2166/hydro.2013.173</ext-link>, 2013.</mixed-citation></ref>
      <ref id="bib1.bibx78"><label>Steinstraesser et al.(2022)Steinstraesser, Delenne, Finaud-Guyot, Guinot, Casapia, and Rousseau</label><mixed-citation>Steinstraesser, J. G. C., Delenne, C., Finaud-Guyot, P., Guinot, V., Casapia, J. L. K., and Rousseau, A.: SW2D-Lemon: A New Software for Upscaled Shallow Water Modeling, Springer Nature Singapore, 23–40, ISBN 9789811916007, <ext-link xlink:href="https://doi.org/10.1007/978-981-19-1600-7_2" ext-link-type="DOI">10.1007/978-981-19-1600-7_2</ext-link>, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx79"><label>Stiernström et al.(2021)Stiernström, Lundgren, Nazarov, and Mattsson</label><mixed-citation>Stiernström, V., Lundgren, L., Nazarov, M., and Mattsson, K.: A residual-based artificial viscosity finite difference method for scalar conservation laws, J. Comput. Phys., 430, 110100, <ext-link xlink:href="https://doi.org/10.1016/j.jcp.2020.110100" ext-link-type="DOI">10.1016/j.jcp.2020.110100</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx80"><label>Sunder et al.(2021)Sunder, Vaghani, and Shukla</label><mixed-citation>Sunder, D., Vaghani, D., and Shukla, R.: Third-Order WENO Schemes on Unstructured Meshes,  215–223, ISBN 978-981-15-5182-6, <ext-link xlink:href="https://doi.org/10.1007/978-981-15-5183-3_23" ext-link-type="DOI">10.1007/978-981-15-5183-3_23</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx81"><label>Sweby(1984)</label><mixed-citation> Sweby, P. K.: High resolution schemes using flux limiters for hyperbolic conservation laws, SIAM J. Numer. Anal., 21, 995–1011, 1984.</mixed-citation></ref>
      <ref id="bib1.bibx82"><label>Synolakis et al.(2008)Synolakis, Bernard, Titov, Kânoğlu, and González</label><mixed-citation>Synolakis, C. E., Bernard, E. N., Titov, V. V., Kânoğlu, U., and González, F. I.: Validation and Verification of Tsunami Numerical Models, Pure Appl. Geophys., 165, 2197–2228, <ext-link xlink:href="https://doi.org/10.1007/s00024-004-0427-y" ext-link-type="DOI">10.1007/s00024-004-0427-y</ext-link>, 2008.</mixed-citation></ref>
      <ref id="bib1.bibx83"><label>Tanaka et al.(2010)Tanaka, Bunya, Westerink, Dawson, and Luettich</label><mixed-citation>Tanaka, S., Bunya, S., Westerink, J. J., Dawson, C., and Luettich, R. A.: Scalability of an Unstructured Grid Continuous Galerkin Based Hurricane Storm Surge Model, J. Sci. Comput., 46, 329–358, <ext-link xlink:href="https://doi.org/10.1007/s10915-010-9402-1" ext-link-type="DOI">10.1007/s10915-010-9402-1</ext-link>, 2010.</mixed-citation></ref>
      <ref id="bib1.bibx84"><label>Titov et al.(2016)Titov, Kânoğlu, and Synolakis</label><mixed-citation>Titov, V., Kânoğlu, U., and Synolakis, C.: Development of MOST for Real-Time Tsunami Forecasting, J. Waterw. Port C., 142, <ext-link xlink:href="https://doi.org/10.1061/(asce)ww.1943-5460.0000357" ext-link-type="DOI">10.1061/(asce)ww.1943-5460.0000357</ext-link>, 2016.</mixed-citation></ref>
      <ref id="bib1.bibx85"><label>Toro(2001)</label><mixed-citation> Toro, E. F.: Shock-capturing methods for free-surface shallow flows, John Wiley, Chichester, New York, ISBN 978-0-471-98766-6, 2001.</mixed-citation></ref>
      <ref id="bib1.bibx86"><label>Toro et al.(1994)Toro, Spruce, and Speares</label><mixed-citation>Toro, E. F., Spruce, M., and Speares, W.: Restoration of the contact surface in the HLL-Riemann solver, Shock Waves, 4, 25–34, <ext-link xlink:href="https://doi.org/10.1007/bf01414629" ext-link-type="DOI">10.1007/bf01414629</ext-link>, 1994.</mixed-citation></ref>
      <ref id="bib1.bibx87"><label>Turner and Wouters(2024)</label><mixed-citation>Turner, A. and Wouters, T.: What’s new in python 3.13, Python Software Foundation, <uri>https://docs.python.org/3/whatsnew/3.13.html</uri> (last access: 15 April 2026), 2024.</mixed-citation></ref>
      <ref id="bib1.bibx88"><label>United Nations(2019)</label><mixed-citation>United Nations: World Urbanization Prospects: The 2018 Revision, ST/ESA/SER.A/420, United Nations, New York, United Nations Publication,  ISBN 978-92-1-148319-2, <uri>https://population.un.org/wup/assets/WUP2018-Report.pdf</uri> (last access: 15 April 2026), 2019.</mixed-citation></ref>
      <ref id="bib1.bibx89"><label>Vacondio et al.(2014)Vacondio, Dal Palù, and Mignosa</label><mixed-citation>Vacondio, R., Dal Palù, A., and Mignosa, P.: GPU-enhanced Finite Volume Shallow Water solver for fast flood simulations, Environ. Modell. Softw., 57, 60–75, <ext-link xlink:href="https://doi.org/10.1016/j.envsoft.2014.02.003" ext-link-type="DOI">10.1016/j.envsoft.2014.02.003</ext-link>, 2014.</mixed-citation></ref>
      <ref id="bib1.bibx90"><label>Van Leer(1997)</label><mixed-citation> Van Leer, B.: Towards the ultimate conservative difference scheme, J. Comput. Phys., 135, 229–248, 1997.</mixed-citation></ref>
      <ref id="bib1.bibx91"><label>Vreugdenhil(1994)</label><mixed-citation>Vreugdenhil, C. B.: Numerical Methods for Shallow-Water Flow, Springer Netherlands, ISBN 9789401583541, <ext-link xlink:href="https://doi.org/10.1007/978-94-015-8354-1" ext-link-type="DOI">10.1007/978-94-015-8354-1</ext-link>, 1994.</mixed-citation></ref>
      <ref id="bib1.bibx92"><label>Wang and Power(2011)</label><mixed-citation>Wang, X. and Power, W.: COMCOT: a Tsunami Generation Propagation and Run-up Model, GNS Science Report 2011/43, GNS Science,  <uri>https://shop.gns.cri.nz/sr_2011-043-pdf/</uri> (last access: 15 April 2026), 2011.</mixed-citation></ref>
      <ref id="bib1.bibx93"><label>Xia et al.(2019)Xia, Liang, and Ming</label><mixed-citation>Xia, X., Liang, Q., and Ming, X.: A full-scale fluvial flood modelling framework based on a high-performance integrated hydrodynamic modelling system (HiPIMS), Adv. Water Resour., 132, 103392, <ext-link xlink:href="https://doi.org/10.1016/j.advwatres.2019.103392" ext-link-type="DOI">10.1016/j.advwatres.2019.103392</ext-link>, 2019.</mixed-citation></ref>
      <ref id="bib1.bibx94"><label>Xie et al.(2005)Xie, Cai, Feng, and Xu</label><mixed-citation> Xie, W.-X., Cai, L., Feng, J.-H., and Xu, W.: Computations of shallow water equations with high-order central-upwind schemes on triangular meshes, Appl. Math. Comput., 170, 296–313, 2005.</mixed-citation></ref>
      <ref id="bib1.bibx95"><label>Zhang and Shu(2016)</label><mixed-citation>Zhang, Y.-T. and Shu, C.-W.: ENO and WENO Schemes, Elsevier, 103–122, <ext-link xlink:href="https://doi.org/10.1016/bs.hna.2016.09.009" ext-link-type="DOI">10.1016/bs.hna.2016.09.009</ext-link>, 2016.</mixed-citation></ref>
      <ref id="bib1.bibx96"><label>Zhou et al.(2022)Zhou, Wu, Nathan, and Wang</label><mixed-citation>Zhou, Y., Wu, W., Nathan, R., and Wang, Q. J.: Deep Learning‐Based Rapid Flood Inundation Modeling for Flat Floodplains With Complex Flow Paths, Water Resour. Res., 58, <ext-link xlink:href="https://doi.org/10.1029/2022wr033214" ext-link-type="DOI">10.1029/2022wr033214</ext-link>, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx97"><label>Zhu and Qiu(2018)</label><mixed-citation>Zhu, J. and Qiu, J.: New Finite Volume Weighted Essentially Nonoscillatory Schemes on Triangular Meshes, SIAM J. Sci. Comput., 40, A903–A928, <ext-link xlink:href="https://doi.org/10.1137/17M1112790" ext-link-type="DOI">10.1137/17M1112790</ext-link>, 2018.</mixed-citation></ref>

  </ref-list></back>
    <!--<article-title-html><span style="" class="text typewriter">SWEpy</span>: an open-source GPU-accelerated solver for near-field inundation and far-field tsunami modeling</article-title-html>
<abstract-html/>
<ref-html id="bib1.bib1"><label>Abadi et al.(2015)Abadi, Agarwal, Barham, Brevdo, Chen, Citro,
Corrado, Davis, Dean, Devin, Ghemawat, Goodfellow, Harp, Irving, Isard, Jia,
Jozefowicz, Kaiser, Kudlur, Levenberg, Mané, Monga, Moore, Murray, Olah,
Schuster, Shlens, Steiner, Sutskever, Talwar, Tucker, Vanhoucke, Vasudevan,
Viégas, Vinyals, Warden, Wattenberg, Wicke, Yu, and
Zheng</label><mixed-citation>
      
Abadi, M., Agarwal, A., Barham, P., Brevdo, E., Chen, Z., Citro, C., Corrado,
G. S., Davis, A., Dean, J., Devin, M., Ghemawat, S., Goodfellow, I., Harp,
A., Irving, G., Isard, M., Jia, Y., Jozefowicz, R., Kaiser, L., Kudlur, M.,
Levenberg, J., Mané, D., Monga, R., Moore, S., Murray, D., Olah, C.,
Schuster, M., Shlens, J., Steiner, B., Sutskever, I., Talwar, K., Tucker, P.,
Vanhoucke, V., Vasudevan, V., Viégas, F., Vinyals, O., Warden, P.,
Wattenberg, M., Wicke, M., Yu, Y., and Zheng, X.: TensorFlow: Large-Scale
Machine Learning on Heterogeneous Systems, Technical report, Google,
<a href="https://www.tensorflow.org/" target="_blank"/> (last access: 15 April 2026),  2015.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib2"><label>Ansel et al.(2024)Ansel, Yang, He, Gimelshein, Jain, Voznesensky,
Bao, Bell, Berard, Burovski, Chauhan, Chourdia, Constable, Desmaison, DeVito,
Ellison, Feng, Gong, Gschwind, Hirsh, Huang, Kalambarkar, Kirsch, Lazos,
Lezcano, Liang, Liang, Lu, Luk, Maher, Pan, Puhrsch, Reso, Saroufim,
Siraichi, Suk, Zhang, Suo, Tillet, Zhao, Wang, Zhou, Zou, Wang, Mathews, Wen,
Chanan, Wu, and Chintala</label><mixed-citation>
      
Ansel, J., Yang, E., He, H., Gimelshein, N., Jain, A., Voznesensky, M., Bao,
B., Bell, P., Berard, D., Burovski, E., Chauhan, G., Chourdia, A., Constable,
W., Desmaison, A., DeVito, Z., Ellison, E., Feng, W., Gong, J., Gschwind, M.,
Hirsh, B., Huang, S., Kalambarkar, K., Kirsch, L., Lazos, M., Lezcano, M.,
Liang, Y., Liang, J., Lu, Y., Luk, C. K., Maher, B., Pan, Y., Puhrsch, C.,
Reso, M., Saroufim, M., Siraichi, M. Y., Suk, H., Zhang, S., Suo, M., Tillet,
P., Zhao, X., Wang, E., Zhou, K., Zou, R., Wang, X., Mathews, A., Wen, W.,
Chanan, G., Wu, P., and Chintala, S.: PyTorch 2: Faster Machine Learning
Through Dynamic Python Bytecode Transformation and Graph Compilation, in:
Proceedings of the 29th ACM International Conference on Architectural Support
for Programming Languages and Operating Systems, Vol. 2, ASPLOS ’24,
929–947, ACM, <a href="https://doi.org/10.1145/3620665.3640366" target="_blank">https://doi.org/10.1145/3620665.3640366</a>, 2024.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib3"><label>ANSYS Inc.(2013)</label><mixed-citation>
      
ANSYS Inc.: ANSYS Fluent Theory Guide, ANSYS, Inc., 275 Technology Drive,
Canonsburg, PA 15317,  <a href="https://ansyshelp.ansys.com/public//Views/Secured/corp/v242/en/flu_th/flu_th.html" target="_blank"/>
(last access: 15 April 2026), 2013.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib4"><label>Arminjon and St-Cyr(2003)</label><mixed-citation>
      
Arminjon, P. and St-Cyr, A.: Nessyahu–Tadmor-type central finite volume
methods without predictor for 3D Cartesian and unstructured tetrahedral
grids, Appl. Numer. Math., 46, 135–155, 2003.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib5"><label>Ayachit(2015)</label><mixed-citation>
      
Ayachit, U.: The paraview guide (full color version), Kitware,  ISBN 978-1930934306, 2015.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib6"><label>Behrens(2008)</label><mixed-citation>
      
Behrens, J.: TsunAWI – Unstructured Mesh Finite Element Model for the Computation of Tsunami Scenarios with Inundation, in: 5th NAFEMS CFD-Seminar: Simulation komplexer Strömungsvorgänge (CFD) – Anwendungen und Trends, ISBN 978-1-874376-33-0, <a href="https://epic.awi.de/id/eprint/18394/" target="_blank"/> (last access: 7 May 2026), 2008

    </mixed-citation></ref-html>
<ref-html id="bib1.bib7"><label>Behrens et al.(2010)Behrens, Androsov, Babeyko, Harig, Klaschka, and
Mentrup</label><mixed-citation>
      
Behrens, J., Androsov, A., Babeyko, A. Y., Harig, S., Klaschka, F., and Mentrup, L.: A new multi-sensor approach to simulation assisted tsunami early warning, Nat. Hazards Earth Syst. Sci., 10, 1085–1100, <a href="https://doi.org/10.5194/nhess-10-1085-2010" target="_blank">https://doi.org/10.5194/nhess-10-1085-2010</a>, 2010.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib8"><label>Benavente and Cummins(2013)</label><mixed-citation>
      
Benavente, R. and Cummins, P. R.: Simple and reliable finite fault solutions
for large earthquakes using the W‐phase: The Maule (<i>M</i><sub>w</sub> = &thinsp;8.8) and Tohoku
(<i>M</i><sub>w</sub> = &thinsp;9.0) earthquakes, Geophys. Res. Lett., 40, 3591–3595,
<a href="https://doi.org/10.1002/grl.50648" target="_blank">https://doi.org/10.1002/grl.50648</a>, 2013.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib9"><label>Berger et al.(2011)Berger, George, LeVeque, and Mandli</label><mixed-citation>
      
Berger, M. J., George, D. L., LeVeque, R. J., and Mandli, K. T.: The GeoClaw
software for depth-averaged flows with adaptive refinement, Adv. Water
Resour., 34, 1195–1206, <a href="https://doi.org/10.1016/j.advwatres.2011.02.016" target="_blank">https://doi.org/10.1016/j.advwatres.2011.02.016</a>, 2011.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib10"><label>Bomers et al.(2019)Bomers, Schielen, and
Hulscher</label><mixed-citation>
      
Bomers, A., Schielen, R. M. J., and Hulscher, S. J. M. H.: The influence of
grid shape and grid size on hydraulic river modelling performance,
Environ. Fluid Mech., 19, 1273–1294,
<a href="https://doi.org/10.1007/s10652-019-09670-4" target="_blank">https://doi.org/10.1007/s10652-019-09670-4</a>, 2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib11"><label>Briggs et al.(1995)Briggs, Synolakis, Harkins, and
Green</label><mixed-citation>
      
Briggs, M. J., Synolakis, C. E., Harkins, G. S., and Green, D. R.: Laboratory
experiments of tsunami runup on a circular island, Pure Appl. Geophys., 144,
569–593, <a href="https://doi.org/10.1007/BF00874384" target="_blank">https://doi.org/10.1007/BF00874384</a>, 1995

    </mixed-citation></ref-html>
<ref-html id="bib1.bib12"><label>Brunner(2021)</label><mixed-citation>
      
Brunner, G.: HEC-RAS 2D User’s Manual Version 6.0, US Army Corps of Engineers, Institute for Water Resources,
Hydrologic Engineering Center (HEC), Davis, CA, USA,
<a href="https://www.hec.usace.army.mil/confluence/rasdocs/r2dum/latest" target="_blank"/> (last access: 15 April 2026),
2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib13"><label>Bryson and Levy(2005)</label><mixed-citation>
      
Bryson, S. and Levy, D.: Balanced central schemes for the shallow water
equations on unstructured grids, SIAM J. Sci. Comput., 27,
532–552, 2005.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib14"><label>Bryson et al.(2011)Bryson, Epshteyn, Kurganov, and
Petrova</label><mixed-citation>
      
Bryson, S., Epshteyn, Y., Kurganov, A., and Petrova, G.: Well-balanced
positivity preserving central-upwind scheme on triangular grids for the
Saint-Venant system, ESAIM: Mathematical Modelling and Numerical
Analysis, 45, 423–446, <a href="https://doi.org/10.1051/m2an/2010060" target="_blank">https://doi.org/10.1051/m2an/2010060</a>,  2011.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib15"><label>Cao et al.(2024)Cao, Kurganov, Liu, and Zeitlin</label><mixed-citation>
      
Cao, Y., Kurganov, A., Liu, Y., and Zeitlin, V.: Flux globalization-based
well-balanced path-conservative central-upwind scheme for two-dimensional
two-layer thermal rotating shallow water equations, J. Comput.
Phys., 515, 113273, <a href="https://doi.org/10.1016/j.jcp.2024.113273" target="_blank">https://doi.org/10.1016/j.jcp.2024.113273</a>, 2024.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib16"><label>Carlotto et al.(2021)Carlotto, Borges Chaffe, Innocente dos Santos,
and Lee</label><mixed-citation>
      
Carlotto, T., Borges Chaffe, P. L., Innocente dos Santos, C., and Lee, S.:
SW2D-GPU: A two-dimensional shallow water model accelerated by GPGPU,
Environ. Modell. Softw., 145, 105205,
<a href="https://doi.org/10.1016/j.envsoft.2021.105205" target="_blank">https://doi.org/10.1016/j.envsoft.2021.105205</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib17"><label>Castro-Orgaz and Hager(2019)Castro-Orgaz, Hager
et al.</label><mixed-citation>
      
Castro-Orgaz, O. and Hager, W. H.: Shallow water hydraulics, Springer, <a href="https://doi.org/10.1007/978-3-030-13073-2" target="_blank">https://doi.org/10.1007/978-3-030-13073-2</a>,
2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib18"><label>Catalan et al.(2020)Catalan, Gubler, Cañas, Zuñiga, Zelaya,
Pizarro, Valdes, Mena, Toledo, and and</label><mixed-citation>
      
Catalán, P. A., Gubler, A., Cañas, J., Zúñiga, C., Zelaya, C., Pizarro, L., Valdés, C., Mena, R., Toledo, E., and Cienfuegos, R.: Design and operational implementation of the integrated tsunami forecast and warning system in Chile (SIPAT), Coast. Eng. J., 62, 373–388, <a href="https://doi.org/10.1080/21664250.2020.1727402" target="_blank">https://doi.org/10.1080/21664250.2020.1727402</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib19"><label>Caviedes-Voullième et al.(2023)Caviedes-Voullième,
Morales-Hernández, Norman, and Özgen Xian</label><mixed-citation>
      
Caviedes-Voullième, D., Morales-Hernández, M., Norman, M. R., and Özgen-Xian, I.: SERGHEI (SERGHEI-SWE) v1.0: a performance-portable high-performance parallel-computing shallow-water solver for hydrology and environmental hydraulics, Geosci. Model Dev., 16, 977–1008, <a href="https://doi.org/10.5194/gmd-16-977-2023" target="_blank">https://doi.org/10.5194/gmd-16-977-2023</a>, 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib20"><label>Chertock et al.(2015)Chertock, Cui, Kurganov, and
Wu</label><mixed-citation>
      
Chertock, A., Cui, S., Kurganov, A., and Wu, T.: Well-balanced positivity
preserving central-upwind scheme for the shallow water system with friction
terms, Int. J. Numer. Meth. Fl., 78, 355–383,
<a href="https://doi.org/10.1002/fld.4023" target="_blank">https://doi.org/10.1002/fld.4023</a>, 2015.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib21"><label>Chertock et al.(2018)Chertock, Dudzinski, Kurganov, and Lukáčová-Medvid'ová</label><mixed-citation>
      
Chertock, A., Dudzinski, M., Kurganov, A., and Lukáčová-Medvid'ová, M.: Well-balanced schemes for the shallow water
equations with Coriolis forces, Numer. Math. (Heidelb.), 138, 939–973, 2018.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib22"><label>Chow et al.(1988)</label><mixed-citation>
      
Chow, V. T., Maidment, D. R., and Mays, L. W.: Applied Hydrology,
McGraw-Hill, New York, USA, ISBN 978-0-07-010810-3, 1988.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib23"><label>Christov and Popov(2008)</label><mixed-citation>
      
Christov, I. and Popov, B.: New non-oscillatory central schemes on unstructured
triangulations for hyperbolic systems of conservation laws, J.
Comput. Phys., 227, 5736–5757, 2008.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib24"><label>Chu et al.(2025)Chu, Kurganov, and Menshov</label><mixed-citation>
      
Chu, S., Kurganov, A., and Menshov, I.: New adaptive low-dissipation
central-upwind schemes, Appl. Numer. Math., 209, 155–170,
<a href="https://doi.org/10.1016/j.apnum.2024.11.010" target="_blank">https://doi.org/10.1016/j.apnum.2024.11.010</a>, 2025.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib25"><label>Courty et al.(2017)Courty, Pedrozo-Acuña, and Bates</label><mixed-citation>
      
Courty, L. G., Pedrozo-Acuña, A., and Bates, P. D.: Itzï (version 17.1): an open-source, distributed GIS model for dynamic flood simulation, Geosci. Model Dev., 10, 1835–1847, <a href="https://doi.org/10.5194/gmd-10-1835-2017" target="_blank">https://doi.org/10.5194/gmd-10-1835-2017</a>, 2017.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib26"><label>Cui et al.(2025)Cui, Gu, Kurganov, Wu, and Xin</label><mixed-citation>
      
Cui, S., Gu, Y., Kurganov, A., Wu, K., and Xin, R.: Positivity-preserving new
low-dissipation central-upwind schemes for compressible Euler equations,
J. Comput. Phys., 538, 114189,
<a href="https://doi.org/10.1016/j.jcp.2025.114189" target="_blank">https://doi.org/10.1016/j.jcp.2025.114189</a>, 2025.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib27"><label>Delestre et al.(2017)Delestre, Darboux, James, Lucas, Laguerre, and
Cordier</label><mixed-citation>
      
Delestre, O., Darboux, F., James, F., Lucas, C., Laguerre, C., and Cordier, S.:
FullSWOF: Full Shallow-Water equations for Overland Flow,  Journal of Open
Source Software, 2, 448, <a href="https://doi.org/10.21105/joss.00448" target="_blank">https://doi.org/10.21105/joss.00448</a>, 2017.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib28"><label>Delis and Nikolos(2021)</label><mixed-citation>
      
Delis, A. I. and Nikolos, I. K.: Shallow Water Equations in Hydraulics:
Modeling, Numerics and Applications, Water,  <a href="https://doi.org/10.3390/w13243598" target="_blank">https://doi.org/10.3390/w13243598</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib29"><label>Desveaux and Masset(2022)</label><mixed-citation>
      
Desveaux, V. and Masset, A.: A fully well-balanced scheme for shallow water
equations with Coriolis force, Commun. Math. Sci.,
20, 1875–1900, <a href="https://doi.org/10.4310/CMS.2022.v20.n7.a4" target="_blank">https://doi.org/10.4310/CMS.2022.v20.n7.a4</a>, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib30"><label>Fernández-Nóvoa et al.(2024)Fernández-Nóvoa, González-Cao, and
García-Feal</label><mixed-citation>
      
Fernández-Nóvoa, D., González-Cao, J., and García-Feal, O.: Enhancing Flood
Risk Management: A Comprehensive Review on Flood Early Warning Systems with
Emphasis on Numerical Modeling, Water, 16, <a href="https://doi.org/10.3390/w16101408" target="_blank">https://doi.org/10.3390/w16101408</a>, 2024.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib31"><label>Fernández-Pato et al.(2018)Fernández-Pato, Morales-Hernández, and
García-Navarro</label><mixed-citation>
      
Fernández-Pato, J., Morales-Hernández, M., and García-Navarro, P.: Implicit
2D surface flow models performance assessment: Shallow Water Equations vs.
Zero-Inertia Model, E3S Web Conf., 40, 05008,
<a href="https://doi.org/10.1051/e3sconf/20184005008" target="_blank">https://doi.org/10.1051/e3sconf/20184005008</a>, 2018.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib32"><label>Fuenzalida Alarcón(2025)</label><mixed-citation>
      
Fuenzalida Alarcón, J. A.: Animations of Malpasset and Maule simulations using SWEpy, Zenodo [video], <a href="https://doi.org/10.5281/zenodo.16798435" target="_blank">https://doi.org/10.5281/zenodo.16798435</a>, 2025.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib33"><label>Fuenzalida Alarcón et al.(2025)Fuenzalida A., Meneses, Meza, and
Kusanovic</label><mixed-citation>
      
Fuenzalida Alarcón, J. A., Meneses, R., Meza, J., and Kusanovic, D.: Adaptive Local
Reconstruction for Solving Saint-Venant Equations in Irregular Domains,
in preparation, 2025.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib34"><label>García-Feal et al.(2018)García-Feal, González-Cao,
Gómez-Gesteira, Cea, Domínguez, and Formella</label><mixed-citation>
      
García-Feal, O., González-Cao, J., Gómez-Gesteira, M., Cea, L., Domínguez,
J. M., and Formella, A.: An Accelerated Tool for Flood Modelling Based on
Iber, Water, 10, 1459, <a href="https://doi.org/10.3390/w10101459" target="_blank">https://doi.org/10.3390/w10101459</a>, 2018.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib35"><label>GEBCO Bathymetric Compilation Group 2024(2024)</label><mixed-citation>
      
GEBCO Bathymetric Compilation Group 2024: The GEBCO_2024 Grid – a continuous
terrain model of the global oceans and land, NERC EDS British Oceanographic Data Centre NOC [data set],
<a href="https://doi.org/10.5285/1C44CE99-0A0D-5F4F-E063-7086ABC0EA0F" target="_blank">https://doi.org/10.5285/1C44CE99-0A0D-5F4F-E063-7086ABC0EA0F</a>, 2024.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib36"><label>Gottlieb et al.(2001)Gottlieb, Shu, and Tadmor</label><mixed-citation>
      
Gottlieb, S., Shu, C.-W., and Tadmor, E.: Strong Stability-Preserving
High-Order Time Discretization Methods, SIAM Rev., 43, 89–112,
<a href="https://doi.org/10.1137/S003614450036757X" target="_blank">https://doi.org/10.1137/S003614450036757X</a>, 2001.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib37"><label>Gottlieb et al.(2010)Gottlieb, Shu, and Ketcheson</label><mixed-citation>
      
Gottlieb, S., Shu, C.-W., and Ketcheson, D.: Strong Stability Preserving
Runge-kutta And Multistep Time Discretizations, World Scientific Publishing,
Singapore, Singapore,  <a href="https://doi.org/10.1142/7498" target="_blank">https://doi.org/10.1142/7498</a>, 2010.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib38"><label>Greenberg and Leroux(1996)</label><mixed-citation>
      
Greenberg, J. M. and Leroux, A. Y.: A Well-Balanced Scheme for the Numerical
Processing of Source Terms in Hyperbolic Equations, SIAM J. Numer.
Anal., 33, 1–16, <a href="https://doi.org/10.1137/0733001" target="_blank">https://doi.org/10.1137/0733001</a>, 1996.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib39"><label>Harig et al.(2008)Harig, Chaeroni, Pranowo, and Behrens</label><mixed-citation>
      
Harig, S., Chaeroni, Pranowo, W. S., and Behrens, J.: Tsunami simulations on
several scales: Comparison of approaches with unstructured meshes and nested
grids, Ocean Dynam., 58, 429–440, <a href="https://doi.org/10.1007/s10236-008-0162-5" target="_blank">https://doi.org/10.1007/s10236-008-0162-5</a>, 2008.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib40"><label>Harig et al.(2019)Harig, Immerz, Weniza, Griffin, Weber, Babeyko,
Rakowsky, Hartanto, Nurokhim, Handayani, and Weber</label><mixed-citation>
      
Harig, S., Immerz, A., Weniza, Griffin, J., Weber, B., Babeyko, A., Rakowsky,
N., Hartanto, D., Nurokhim, A., Handayani, T., and Weber, R.: The Tsunami
Scenario Database of the Indonesia Tsunami Early Warning System (InaTEWS):
Evolution of the Coverage and the Involved Modeling Approaches, Pure
Appl. Geophys., 177, 1379–1401, <a href="https://doi.org/10.1007/s00024-019-02305-1" target="_blank">https://doi.org/10.1007/s00024-019-02305-1</a>, 2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib41"><label>Harris et al.(2020)Harris, Millman, van der Walt, Gommers, Virtanen,
Cournapeau, Wieser, Taylor, Berg, Smith, Kern, Picus, Hoyer, van Kerkwijk,
Brett, Haldane, del Río, Wiebe, Peterson, Gérard-Marchant,
Sheppard, Reddy, Weckesser, Abbasi, Gohlke, and Oliphant</label><mixed-citation>
      
Harris, C. R., Millman, K. J., van der Walt, S. J., Gommers, R., Virtanen, P.,
Cournapeau, D., Wieser, E., Taylor, J., Berg, S., Smith, N. J., Kern, R.,
Picus, M., Hoyer, S., van Kerkwijk, M. H., Brett, M., Haldane, A., del
Río, J. F., Wiebe, M., Peterson, P., Gérard-Marchant, P.,
Sheppard, K., Reddy, T., Weckesser, W., Abbasi, H., Gohlke, C., and Oliphant,
T. E.: Array programming with NumPy, Nature, 585, 357–362,
<a href="https://doi.org/10.1038/s41586-020-2649-2" target="_blank">https://doi.org/10.1038/s41586-020-2649-2</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib42"><label>Hervouet(2007)</label><mixed-citation>
      
Hervouet, J.-M.: Hydrodynamics of free surface flows: modelling with the finite
element method, John Wiley &amp; Sons, <a href="https://doi.org/10.1002/9780470319628" target="_blank">https://doi.org/10.1002/9780470319628</a>, 2007.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib43"><label>Jawahar and Kamath(2000)</label><mixed-citation>
      
Jawahar, P. and Kamath, H.: A high-resolution procedure for Euler and
Navier–Stokes computations on unstructured grids, J. Comput. Phys., 164, 165–203, 2000.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib44"><label>Jodhani et al.(2023)Jodhani, Patel, and Madhavan</label><mixed-citation>
      
Jodhani, K. H., Patel, D., and Madhavan, N.: A review on analysis of flood
modelling using different numerical models, Mater. Today-Proc., 80,
3867–3876, <a href="https://doi.org/10.1016/j.matpr.2021.07.405" target="_blank">https://doi.org/10.1016/j.matpr.2021.07.405</a>, 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib45"><label>Kabir et al.(2020)Kabir, Patidar, Xia, Liang, Neal, and
Pender</label><mixed-citation>
      
Kabir, S., Patidar, S., Xia, X., Liang, Q., Neal, J., and Pender, G.: A deep
convolutional neural network model for rapid prediction of fluvial flood
inundation, J. Hydrol., 590, 125481,
<a href="https://doi.org/10.1016/j.jhydrol.2020.125481" target="_blank">https://doi.org/10.1016/j.jhydrol.2020.125481</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib46"><label>Kirstetter et al.(2021)Kirstetter, Delestre, Lagrée, Popinet, and
Josserand</label><mixed-citation>
      
Kirstetter, G., Delestre, O., Lagrée, P.-Y., Popinet, S., and Josserand, C.: B-flood 1.0: an open-source Saint-Venant model for flash-flood simulation using adaptive refinement, Geosci. Model Dev., 14, 7117–7132, <a href="https://doi.org/10.5194/gmd-14-7117-2021" target="_blank">https://doi.org/10.5194/gmd-14-7117-2021</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib47"><label>Kloeckner et al.(2025)Kloeckner, Wohlgemuth, Lee, Rybak, Nitz,
Chiang, Seibert, Bergtholdt, Unterthiner, Markall, Kotak, Favre-Nicolin,
Opanchuk, Merry, Pinto, Milo, Collignon, Rathgeber, Perkins, Rutsky,
Catanzaro, Park, Witherden, E. Givon, Pfister, Brubaker, ZA, Hausammann, and
Gohlke</label><mixed-citation>
      
Kloeckner, A., Wohlgemuth, G., Lee, G., Rybak, T., Nitz, A., Chiang, D.,
Seibert, S., Bergtholdt, M., Unterthiner, T., Markall, G., Kotak, M.,
Favre-Nicolin, V., Opanchuk, B., Merry, B., Pinto, N., Milo, F., Collignon,
T., Rathgeber, F., Perkins, S., Rutsky, V., Catanzaro, B., Park, A.,
Witherden, F., E. Givon, L., Pfister, L., Brubaker, M., ZA, R., Hausammann,
L., and Gohlke, C.: PyCUDA, Zenodo [code], <a href="https://doi.org/10.5281/ZENODO.15620354" target="_blank">https://doi.org/10.5281/ZENODO.15620354</a>, 2025.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib48"><label>Kobayashi et al.(2015)Kobayashi, Kitamura, Ando, and
Ohi</label><mixed-citation>
      
Kobayashi, K., Kitamura, D., Ando, K., and Ohi, N.: Parallel computing for
high-resolution/large-scale flood simulation using the K supercomputer,
Hydrological Research Letters, 9, 61–68, <a href="https://doi.org/10.3178/hrl.9.61" target="_blank">https://doi.org/10.3178/hrl.9.61</a>, 2015.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib49"><label>Kundu et al.(2012)Kundu, Cohen, and Dowling</label><mixed-citation>
      
Kundu, P., Cohen, I., and Dowling, D.: Fluid Mechanics, Science Direct
e-books, Elsevier Science, ISBN 978-0-12-382100-3,
<a href="https://books.google.cl/books?id=iUo_4tsHQYUC" target="_blank"/> (last access: 15 April 2026), 2012.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib50"><label>Kurganov and Petrova(2005)</label><mixed-citation>
      
Kurganov, A. and Petrova, G.: Central-upwind schemes on triangular grids for
hyperbolic systems of conservation laws, Numer. Meth. Part D E., 21, 536–552, <a href="https://doi.org/10.1002/num.20049" target="_blank">https://doi.org/10.1002/num.20049</a>, 2005.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib51"><label>Kurganov and Petrova(2007)</label><mixed-citation>
      
Kurganov, A. and Petrova, G.: A Second-Order Well-Balanced Positivity
Preserving Central-Upwind Scheme for the Saint-Venant System, Commun. Math. Sci., 5, 133–160, 2007.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib52"><label>Kurganov and Tadmor(2000)</label><mixed-citation>
      
Kurganov, A. and Tadmor, E.: New High-Resolution Central Schemes for Nonlinear
Conservation Laws and Convection–Diffusion Equations, J. Comput. Phys., 160, 241–282,
<a href="https://doi.org/10.1006/jcph.2000.6459" target="_blank">https://doi.org/10.1006/jcph.2000.6459</a>, 2000.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib53"><label>Kurganov and Xin(2023)</label><mixed-citation>
      
Kurganov, A. and Xin, R.: New Low-Dissipation Central-Upwind Schemes, J. Sci. Comput., 96, 56, <a href="https://doi.org/10.1007/s10915-023-02281-8" target="_blank">https://doi.org/10.1007/s10915-023-02281-8</a>, 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib54"><label>Kusanovic et al.(2025)</label><mixed-citation>
      
Kusanovic, D. S., Juan, F., Meza, J., Meneses, R., and Catalan, P.: SWEpy, Zenodo [code], <a href="https://doi.org/10.5281/zenodo.16789889" target="_blank">https://doi.org/10.5281/zenodo.16789889</a>, 2025.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib55"><label>Kusanovic et al.(2026)Kusanovic, Juan, Meza, Meneses, and
Catalan</label><mixed-citation>
      
Kusanovic, D. S., Juan, F., Meza, J., Meneses, R., and Catalan, P.: SWEpy, Zenodo [code],
<a href="https://doi.org/10.5281/zenodo.19464287" target="_blank">https://doi.org/10.5281/zenodo.19464287</a>, 2026.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib56"><label>Lam et al.(2015)Lam, Pitrou, and Seibert</label><mixed-citation>
      
Lam, S. K., Pitrou, A., and Seibert, S.: Numba: a LLVM-based Python JIT
compiler, in: Proceedings of the Second Workshop on the LLVM Compiler
Infrastructure in HPC, LLVM '15, Association for Computing Machinery, New
York, NY, USA, ISBN 9781450340052, <a href="https://doi.org/10.1145/2833157.2833162" target="_blank">https://doi.org/10.1145/2833157.2833162</a>, 2015.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib57"><label>LeVeque(2002)</label><mixed-citation>
      
LeVeque, R. J.: Finite Volume Methods for Hyperbolic Problems, Cambridge
University Press, ISBN 9780511791253, <a href="https://doi.org/10.1017/cbo9780511791253" target="_blank">https://doi.org/10.1017/cbo9780511791253</a>, 2002.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib58"><label>Lin et al.(2015)Lin, Wu, Yen, Chen, Hsu, Tsai, Lee, and
Liu</label><mixed-citation>
      
Lin, S. C., Wu, T.-R., Yen, E., Chen, H.-Y., Hsu, J., Tsai, Y.-L., Lee, C.-J.,
and Liu, P. L.-F.: Development of a tsunami early warning system for the
South China Sea, Ocean Eng., 100, 1–18,
<a href="https://doi.org/10.1016/j.oceaneng.2015.02.003" target="_blank">https://doi.org/10.1016/j.oceaneng.2015.02.003</a>, 2015.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib59"><label>Liu(2021a)</label><mixed-citation>
      
Liu, X.: A new well-balanced finite-volume scheme on unstructured triangular
grids for two-dimensional two-layer shallow water flows with wet-dry fronts,
J. Comput. Phys., 438, 110380,
<a href="https://doi.org/10.1016/j.jcp.2021.110380" target="_blank">https://doi.org/10.1016/j.jcp.2021.110380</a>, 2021a.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib60"><label>Liu(2021b)</label><mixed-citation>
      
Liu, X.: A new well-balanced finite-volume scheme on unstructured triangular
grids for two-dimensional two-layer shallow water flows with wet-dry fronts,
J. Comput. Phys., 438, 110380,
<a href="https://doi.org/10.1016/j.jcp.2021.110380" target="_blank">https://doi.org/10.1016/j.jcp.2021.110380</a>, 2021b.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib61"><label>Liu et al.(2018)Liu, Albright, Epshteyn, and Kurganov</label><mixed-citation>
      
Liu, X., Albright, J., Epshteyn, Y., and Kurganov, A.: Well-balanced positivity
preserving central-upwind scheme with a novel wet/dry reconstruction on
triangular grids for the Saint-Venant system, J. Comput. Phys., 374, 213–236, <a href="https://doi.org/10.1016/j.jcp.2018.07.038" target="_blank">https://doi.org/10.1016/j.jcp.2018.07.038</a>,
2018.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib62"><label>Macías et al.(2017)Macías, Castro, Ortega, Escalante, and
González-Vida</label><mixed-citation>
      
Macías, J., Castro, M. J., Ortega, S., Escalante, C., and González-Vida,
J. M.: Performance Benchmarking of Tsunami-HySEA Model for NTHMP's
Inundation Mapping Activities, Pure Appl. Geophys.,
<a href="https://doi.org/10.1007/s00024-017-1583-1" target="_blank">https://doi.org/10.1007/s00024-017-1583-1</a>, 2017.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib63"><label>Meza et al.(2026)Meza, Kusanovic, Juan, and
Meneses</label><mixed-citation>
      
Meza, J., Kusanovic, D. S., Juan, F., and Meneses, R.: SWEpy: Shallow Water
Equation Python solver – User Manual &amp; Technical Reference, Zenodo,
<a href="https://doi.org/10.5281/zenodo.19323355" target="_blank">https://doi.org/10.5281/zenodo.19323355</a>, 2026.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib64"><label>Morales-Hernández et al.(2021)Morales-Hernández, Sharif, Kalyanapu,
Ghafoor, Dullo, Gangrade, Kao, Norman, and Evans</label><mixed-citation>
      
Morales-Hernández, M., Sharif, M. B., Kalyanapu, A., Ghafoor, S., Dullo, T.,
Gangrade, S., Kao, S.-C., Norman, M., and Evans, K.: TRITON: A Multi-GPU open
source 2D hydrodynamic flood model, Environ. Modell. Softw., 141,
105034, <a href="https://doi.org/10.1016/j.envsoft.2021.105034" target="_blank">https://doi.org/10.1016/j.envsoft.2021.105034</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib65"><label>Moukalled et al.(2015)Moukalled, Mangani, and
Darwish</label><mixed-citation>
      
Moukalled, F., Mangani, L., and Darwish, M.: The finite volume method, in: The
finite volume method in computational fluid dynamics: An advanced
introduction with OpenFOAM<span style="position:relative; bottom:0.5em; " class="text">®</span> and Matlab,
Springer,  103–135, <a href="https://doi.org/10.1007/978-3-319-16874-6" target="_blank">https://doi.org/10.1007/978-3-319-16874-6</a>, 2015.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib66"><label>Moulinec et al.(2011)Moulinec, Denis, Pham, Rougé, Hervouet,
Razafindrakoto, Barber, Emerson, and Gu</label><mixed-citation>
      
Moulinec, C., Denis, C., Pham, C.-T., Rougé, D., Hervouet, J.-M.,
Razafindrakoto, E., Barber, R., Emerson, D., and Gu, X.-J.: TELEMAC: An
efficient hydrodynamics suite for massively parallel architectures, Comput. Fluid., 51, 30–34, <a href="https://doi.org/10.1016/j.compfluid.2011.07.003" target="_blank">https://doi.org/10.1016/j.compfluid.2011.07.003</a>, 2011.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib67"><label>Mungov et al.(2005)</label><mixed-citation>
      
National Oceanic and
Atmospheric Administration: Deep-Ocean Assessment and Reporting of
Tsunamis (DART(R)), NOAA National Centers for Environmental Information [data set],
<a href="https://doi.org/10.7289/V5F18WNS" target="_blank">https://doi.org/10.7289/V5F18WNS</a>, 2005.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib68"><label>Nessyahu and Tadmor(1990)</label><mixed-citation>
      
Nessyahu, H. and Tadmor, E.: Non-oscillatory central differencing for
hyperbolic conservation laws, J. Comput. Phys., 87, 408–463,
1990.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib69"><label>Nguyen(2023)</label><mixed-citation>
      
Nguyen, T.: Adaptive Central-Upwind Scheme on Triangular Grids for the Shallow
Water Model with Variable Density, Int. J. Numer.
Anal. Mod., 20, 229–266, <a href="https://doi.org/10.4208/ijnam2023-1010" target="_blank">https://doi.org/10.4208/ijnam2023-1010</a>, 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib70"><label>Okuta et al.(2017)Okuta, Unno, Nishino, Hido, and
Loomis</label><mixed-citation>
      
Okuta, R., Unno, Y., Nishino, D., Hido, S., and Loomis, C.: CuPy: A
NumPy-Compatible Library for NVIDIA GPU Calculations, in: Proceedings of
Workshop on Machine Learning Systems (LearningSys) in The Thirty-first Annual
Conference on Neural Information Processing Systems (NIPS),
<a href="http://learningsys.org/nips17/assets/papers/paper_16.pdf" target="_blank"/> (last access: 15 April 2026),
2017.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib71"><label>Parnas(1972)</label><mixed-citation>
      
Parnas, D. L.: On the criteria to be used in decomposing systems into modules,
Commun. ACM, 15, 1053–1058, <a href="https://doi.org/10.1145/361598.361623" target="_blank">https://doi.org/10.1145/361598.361623</a>,
1972.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib72"><label>Reinarz et al.(2020)Reinarz, Charrier, Bader, Bovard, Dumbser, Duru,
Fambri, Gabriel, Gallard, Köppel, Krenz, Rannabauer, Rezzolla, Samfass,
Tavelli, and Weinzierl</label><mixed-citation>
      
Reinarz, A., Charrier, D. E., Bader, M., Bovard, L., Dumbser, M., Duru, K.,
Fambri, F., Gabriel, A.-A., Gallard, J.-M., Köppel, S., Krenz, L.,
Rannabauer, L., Rezzolla, L., Samfass, P., Tavelli, M., and Weinzierl, T.:
ExaHyPE: An engine for parallel dynamically adaptive simulations of wave
problems, Comput. Phys. Commun., 254, 107251,
<a href="https://doi.org/10.1016/j.cpc.2020.107251" target="_blank">https://doi.org/10.1016/j.cpc.2020.107251</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib73"><label>Rocklin(2015)</label><mixed-citation>
      
Rocklin, M.: Dask: Parallel computation with blocked algorithms and task
scheduling, in: Proceedings of the 14th python in science conference,
Citeseer,   130–136,  <a href="https://doi.org/10.25080/Majora-7b98e3ed-013" target="_blank">https://doi.org/10.25080/Majora-7b98e3ed-013</a>, 2015.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib74"><label>Schubert et al.(2008)Schubert, Sanders, Smith, and
Wright</label><mixed-citation>
      
Schubert, J. E., Sanders, B. F., Smith, M. J., and Wright, N. G.: Unstructured
mesh generation and landcover-based resistance for hydrodynamic modeling of
urban flooding, Adv. Water Resour., 31, 1603–1621,
<a href="https://doi.org/10.1016/j.advwatres.2008.07.012" target="_blank">https://doi.org/10.1016/j.advwatres.2008.07.012</a>, 2008.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib75"><label>Shaeri Karimi et al.(2019)Shaeri Karimi, Saintilan, Wen, and
Valavi</label><mixed-citation>
      
Shaeri Karimi, S., Saintilan, N., Wen, L., and Valavi, R.: Application of
Machine Learning to Model Wetland Inundation Patterns Across a Large Semiarid
Floodplain, Water Resour. Res., 55, 8765–8778,
<a href="https://doi.org/10.1029/2019wr024884" target="_blank">https://doi.org/10.1029/2019wr024884</a>, 2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib76"><label>Shaw et al.(2021)Shaw, Kesserwani, Neal, Bates, and
Sharifian</label><mixed-citation>
      
Shaw, J., Kesserwani, G., Neal, J., Bates, P., and Sharifian, M. K.: LISFLOOD-FP 8.0: the new discontinuous Galerkin shallow-water solver for multi-core CPUs and GPUs, Geosci. Model Dev., 14, 3577–3602, <a href="https://doi.org/10.5194/gmd-14-3577-2021" target="_blank">https://doi.org/10.5194/gmd-14-3577-2021</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib77"><label>Simons et al.(2013)Simons, Busse, Hou, Özgen, and
Hinkelmann</label><mixed-citation>
      
Simons, F., Busse, T., Hou, J., Özgen, I., and Hinkelmann, R.: A model for
overland flow and associated processes within the Hydroinformatics Modelling
System, J. Hydroinform., 16, 375–391,
<a href="https://doi.org/10.2166/hydro.2013.173" target="_blank">https://doi.org/10.2166/hydro.2013.173</a>, 2013.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib78"><label>Steinstraesser et al.(2022)Steinstraesser, Delenne, Finaud-Guyot,
Guinot, Casapia, and Rousseau</label><mixed-citation>
      
Steinstraesser, J. G. C., Delenne, C., Finaud-Guyot, P., Guinot, V., Casapia,
J. L. K., and Rousseau, A.: SW2D-Lemon: A New Software for Upscaled Shallow
Water Modeling, Springer Nature Singapore, 23–40, ISBN 9789811916007,
<a href="https://doi.org/10.1007/978-981-19-1600-7_2" target="_blank">https://doi.org/10.1007/978-981-19-1600-7_2</a>, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib79"><label>Stiernström et al.(2021)Stiernström, Lundgren, Nazarov, and
Mattsson</label><mixed-citation>
      
Stiernström, V., Lundgren, L., Nazarov, M., and Mattsson, K.: A
residual-based artificial viscosity finite difference method for scalar
conservation laws, J. Comput. Phys., 430, 110100,
<a href="https://doi.org/10.1016/j.jcp.2020.110100" target="_blank">https://doi.org/10.1016/j.jcp.2020.110100</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib80"><label>Sunder et al.(2021)Sunder, Vaghani, and Shukla</label><mixed-citation>
      
Sunder, D., Vaghani, D., and Shukla, R.: Third-Order WENO Schemes on
Unstructured Meshes,  215–223, ISBN 978-981-15-5182-6,
<a href="https://doi.org/10.1007/978-981-15-5183-3_23" target="_blank">https://doi.org/10.1007/978-981-15-5183-3_23</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib81"><label>Sweby(1984)</label><mixed-citation>
      
Sweby, P. K.: High resolution schemes using flux limiters for hyperbolic
conservation laws, SIAM J. Numer. Anal., 21, 995–1011, 1984.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib82"><label>Synolakis et al.(2008)Synolakis, Bernard, Titov, Kânoğlu, and
González</label><mixed-citation>
      
Synolakis, C. E., Bernard, E. N., Titov, V. V., Kânoğlu, U., and González,
F. I.: Validation and Verification of Tsunami Numerical Models, Pure
Appl. Geophys., 165, 2197–2228, <a href="https://doi.org/10.1007/s00024-004-0427-y" target="_blank">https://doi.org/10.1007/s00024-004-0427-y</a>, 2008.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib83"><label>Tanaka et al.(2010)Tanaka, Bunya, Westerink, Dawson, and
Luettich</label><mixed-citation>
      
Tanaka, S., Bunya, S., Westerink, J. J., Dawson, C., and Luettich, R. A.:
Scalability of an Unstructured Grid Continuous Galerkin Based Hurricane Storm
Surge Model, J. Sci. Comput., 46, 329–358,
<a href="https://doi.org/10.1007/s10915-010-9402-1" target="_blank">https://doi.org/10.1007/s10915-010-9402-1</a>, 2010.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib84"><label>Titov et al.(2016)Titov, Kânoğlu, and Synolakis</label><mixed-citation>
      
Titov, V., Kânoğlu, U., and Synolakis, C.: Development of MOST for Real-Time
Tsunami Forecasting, J. Waterw. Port C., 142, <a href="https://doi.org/10.1061/(asce)ww.1943-5460.0000357" target="_blank">https://doi.org/10.1061/(asce)ww.1943-5460.0000357</a>, 2016.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib85"><label>Toro(2001)</label><mixed-citation>
      
Toro, E. F.: Shock-capturing methods for free-surface shallow flows, John
Wiley, Chichester, New York, ISBN 978-0-471-98766-6, 2001.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib86"><label>Toro et al.(1994)Toro, Spruce, and Speares</label><mixed-citation>
      
Toro, E. F., Spruce, M., and Speares, W.: Restoration of the contact surface in
the HLL-Riemann solver, Shock Waves, 4, 25–34, <a href="https://doi.org/10.1007/bf01414629" target="_blank">https://doi.org/10.1007/bf01414629</a>,
1994.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib87"><label>Turner and Wouters(2024)</label><mixed-citation>
      
Turner, A. and Wouters, T.: What’s new in python 3.13, Python Software Foundation,
<a href="https://docs.python.org/3/whatsnew/3.13.html" target="_blank"/> (last access: 15 April 2026), 2024.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib88"><label>United Nations(2019)</label><mixed-citation>
      
United Nations: World Urbanization Prospects: The 2018 Revision,
ST/ESA/SER.A/420, United Nations, New York, United Nations Publication,  ISBN 978-92-1-148319-2, <a href="https://population.un.org/wup/assets/WUP2018-Report.pdf" target="_blank"/> (last access: 15 April 2026), 2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib89"><label>Vacondio et al.(2014)Vacondio, Dal Palù, and Mignosa</label><mixed-citation>
      
Vacondio, R., Dal Palù, A., and Mignosa, P.: GPU-enhanced Finite Volume
Shallow Water solver for fast flood simulations, Environ. Modell. Softw., 57, 60–75, <a href="https://doi.org/10.1016/j.envsoft.2014.02.003" target="_blank">https://doi.org/10.1016/j.envsoft.2014.02.003</a>, 2014.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib90"><label>Van Leer(1997)</label><mixed-citation>
      
Van Leer, B.: Towards the ultimate conservative difference scheme, J.
Comput. Phys., 135, 229–248, 1997.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib91"><label>Vreugdenhil(1994)</label><mixed-citation>
      
Vreugdenhil, C. B.: Numerical Methods for Shallow-Water Flow, Springer
Netherlands, ISBN 9789401583541, <a href="https://doi.org/10.1007/978-94-015-8354-1" target="_blank">https://doi.org/10.1007/978-94-015-8354-1</a>, 1994.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib92"><label>Wang and Power(2011)</label><mixed-citation>
      
Wang, X. and Power, W.: COMCOT: a Tsunami Generation Propagation and Run-up
Model, GNS Science Report 2011/43, GNS Science,  <a href="https://shop.gns.cri.nz/sr_2011-043-pdf/" target="_blank"/> (last access: 15 April 2026), 2011.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib93"><label>Xia et al.(2019)Xia, Liang, and Ming</label><mixed-citation>
      
Xia, X., Liang, Q., and Ming, X.: A full-scale fluvial flood modelling
framework based on a high-performance integrated hydrodynamic modelling
system (HiPIMS), Adv. Water Resour., 132, 103392,
<a href="https://doi.org/10.1016/j.advwatres.2019.103392" target="_blank">https://doi.org/10.1016/j.advwatres.2019.103392</a>, 2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib94"><label>Xie et al.(2005)Xie, Cai, Feng, and Xu</label><mixed-citation>
      
Xie, W.-X., Cai, L., Feng, J.-H., and Xu, W.: Computations of shallow water
equations with high-order central-upwind schemes on triangular meshes,
Appl. Math. Comput., 170, 296–313, 2005.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib95"><label>Zhang and Shu(2016)</label><mixed-citation>
      
Zhang, Y.-T. and Shu, C.-W.: ENO and WENO Schemes, Elsevier, 103–122,
<a href="https://doi.org/10.1016/bs.hna.2016.09.009" target="_blank">https://doi.org/10.1016/bs.hna.2016.09.009</a>, 2016.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib96"><label>Zhou et al.(2022)Zhou, Wu, Nathan, and Wang</label><mixed-citation>
      
Zhou, Y., Wu, W., Nathan, R., and Wang, Q. J.: Deep Learning‐Based Rapid
Flood Inundation Modeling for Flat Floodplains With Complex Flow Paths, Water
Resour. Res., 58, <a href="https://doi.org/10.1029/2022wr033214" target="_blank">https://doi.org/10.1029/2022wr033214</a>, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib97"><label>Zhu and Qiu(2018)</label><mixed-citation>
      
Zhu, J. and Qiu, J.: New Finite Volume Weighted Essentially Nonoscillatory
Schemes on Triangular Meshes, SIAM J. Sci. Comput., 40,
A903–A928, <a href="https://doi.org/10.1137/17M1112790" target="_blank">https://doi.org/10.1137/17M1112790</a>, 2018.

    </mixed-citation></ref-html>--></article>
