<?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-18-6541-2025</article-id><title-group><article-title>Implementation of implicit filters for spatial spectra extraction</article-title><alt-title>Implementation of implicit filters for spatial spectra extraction</alt-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author" corresp="yes" rid="aff1">
          <name><surname>Nowak</surname><given-names>Kacper</given-names></name>
          <email>kacper.nowak@awi.de</email>
        <ext-link>https://orcid.org/0000-0001-7083-8114</ext-link></contrib>
        <contrib contrib-type="author" corresp="no" rid="aff1">
          <name><surname>Danilov</surname><given-names>Sergey</given-names></name>
          
        <ext-link>https://orcid.org/0000-0001-8098-182X</ext-link></contrib>
        <contrib contrib-type="author" corresp="no" rid="aff1">
          <name><surname>Müller</surname><given-names>Vasco</given-names></name>
          
        <ext-link>https://orcid.org/0000-0002-8019-2852</ext-link></contrib>
        <contrib contrib-type="author" corresp="no" rid="aff1 aff2">
          <name><surname>Liu</surname><given-names>Caili</given-names></name>
          
        </contrib>
        <aff id="aff1"><label>1</label><institution>Alfred Wegener Institute, Helmholtz Center for Polar and Marine Research, Bremerhaven, Germany</institution>
        </aff>
        <aff id="aff2"><label>2</label><institution>College of Oceanic and Atmospheric Sciences, Ocean University of China, Qingdao, China</institution>
        </aff>
      </contrib-group>
      <author-notes><corresp id="corr1">Kacper Nowak (kacper.nowak@awi.de)</corresp></author-notes><pub-date><day>29</day><month>September</month><year>2025</year></pub-date>
      
      <volume>18</volume>
      <issue>18</issue>
      <fpage>6541</fpage><lpage>6551</lpage>
      <history>
        <date date-type="received"><day>12</day><month>April</month><year>2024</year></date>
           <date date-type="rev-request"><day>25</day><month>July</month><year>2024</year></date>
           <date date-type="rev-recd"><day>27</day><month>May</month><year>2025</year></date>
           <date date-type="accepted"><day>23</day><month>June</month><year>2025</year></date>
      </history>
      <permissions>
        <copyright-statement>Copyright: © 2025 Kacper Nowak et al.</copyright-statement>
        <copyright-year>2025</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/gmd-18-6541-2025.html">This article is available from https://gmd.copernicus.org/articles/gmd-18-6541-2025.html</self-uri><self-uri xlink:href="https://gmd.copernicus.org/articles/gmd-18-6541-2025.pdf">The full text article is available as a PDF file from https://gmd.copernicus.org/articles/gmd-18-6541-2025.pdf</self-uri>
      <abstract><title>Abstract</title>

      <p id="d2e114">Scale analysis based on coarse graining has been proposed recently as an alternative to Fourier analysis. It is now broadly used to analyze energy spectra and energy transfers in eddy-resolving ocean simulations. However, for data from unstructured-mesh models it requires interpolation to a regular grid. We present a high-performance Python implementation of an alternative coarse-graining method which relies on implicit filters using discrete Laplacians. This method can work on arbitrary (structured or unstructured) meshes and is applicable to the direct output of unstructured-mesh ocean circulation atmosphere models. The computation is split into two phases: preparation and solving. The first one is specific only to the mesh. This allows for auxiliary arrays that are then computed to be reused, significantly reducing the computation time. The second part consists of sparse matrix algebra and solving the linear system. Our implementation is accelerated by GPUs to achieve excellent performance and scalability. This results in processing data based on meshes with more than 10 million surface vertices in a matter of seconds. As an illustration, the method is applied to compute spatial spectra of ocean currents from high-resolution FESOM2 simulations.</p>
  </abstract>
    
<funding-group>
<award-group id="gs1">
<funding-source>European Commission</funding-source>
<award-id>101081383</award-id>
</award-group>
<award-group id="gs2">
<funding-source>UK Research and Innovation</funding-source>
<award-id>10057890</award-id>
<award-id>10049639</award-id>
<award-id>10040510</award-id>
<award-id>10040984</award-id>
</award-group>
<award-group id="gs3">
<funding-source>Staatssekretariat für Bildung, Forschung und Innovation</funding-source>
<award-id>22.00366</award-id>
</award-group>
<award-group id="gs4">
<funding-source>Deutsche Forschungsgemeinschaft</funding-source>
<award-id>274762653</award-id>
</award-group>
</funding-group>
</article-meta>
  </front>
<body>
      

<sec id="Ch1.S1" sec-type="intro">
  <label>1</label><title>Introduction</title>
      <p id="d2e126">Atmospheric and oceanic motions span a wide range of spatial scales, each contributing differently to kinetic and available potential energy, energy generation, dissipation, and energy transfer across scales. Key questions include understanding how energy moves between scales, such as gyres, mesoscale and submesoscale motions in ocean dynamics. These processes are often described using the concept of an energy spectrum or cross-spectrum.</p>
      <p id="d2e129">The most common technique to extract a spatial spectrum is the Fourier transform. However, when working with the output of ocean general circulation models (OGCMs), direct application of the Fourier transform is rarely possible as it requires data (samples) to be equally spaced as well as the domain to be in a rectangular shape (in global atmospheric configurations spherical harmonics are generally used). New convolution (coarsening)-based approaches to this problem have been proposed <xref ref-type="bibr" rid="bib1.bibx2 bib1.bibx13 bib1.bibx1 bib1.bibx17" id="paren.1"/>, and there already are multiple practical contributions showing the utility and significance of the proposed approach (see, for example, <xref ref-type="bibr" rid="bib1.bibx14 bib1.bibx11 bib1.bibx16 bib1.bibx3" id="altparen.2"/>). While they solve some of the problems, like domain shape, they require data to be on a regular longitude–latitude grid. For vector fields in spherical geometry the procedure requires preliminary calculation of the Helmholtz decomposition.</p>
      <p id="d2e138">Several recent OGCMs such as MPAS-Ocean <xref ref-type="bibr" rid="bib1.bibx12" id="paren.3"/>, FESOM2 <xref ref-type="bibr" rid="bib1.bibx4" id="paren.4"/> and ICON-o <xref ref-type="bibr" rid="bib1.bibx8" id="paren.5"/> are based on either unstructured triangular meshes or their dual, quasi-hexagonal meshes. The use of the aforementioned coarse-graining method for the output of such models would require interpolation of the output data from native unstructured mesh to a regular mesh. This means additional computations. More importantly, the horizontal divergence of the interpolated velocities may show marked differences compared to the divergence on the original meshes.</p>
      <p id="d2e150">These issues can be avoided if coarse graining is done on the original meshes. Recently a method has been proposed by <xref ref-type="bibr" rid="bib1.bibx5" id="text.6"/> that solves this task. The method uses implicit filters based on discrete Laplacians. The discrete Laplacian operators can be constructed for arbitrary meshes and data placement on these meshes. This method can therefore work on any mesh and can be applied directly to the output of unstructured-mesh models.</p>
      <p id="d2e157">In this paper a high-performance Python implementation of the implicit filter method is presented, and practical examples of its usage are given. We use simulations performed with FESOM2 to illustrate the performance of the method. The discrete Laplacians depend on the mesh and data placement. For convenience, in Sect. <xref ref-type="sec" rid="Ch1.S2"/> we recapitulate some mathematical details of the method and discretizations. The remaining part of this section discusses implementation. The results obtained with the implicit filters are compared with those produced by convolution based methods using velocity fields from simulation performed with FESOM2 on a global mesh with the resolution of 1 km in the Arctic Ocean in Sects. <xref ref-type="sec" rid="Ch1.S3"/> and <xref ref-type="sec" rid="Ch1.S4"/>. The performance overview of the implementation is presented inSect. <xref ref-type="sec" rid="Ch1.S5"/>.</p>
</sec>
<sec id="Ch1.S2">
  <label>2</label><title>Implicit filter</title>
<sec id="Ch1.S2.SS1">
  <label>2.1</label><title>Mathematical introduction</title>
      <p id="d2e183">Let <inline-formula><mml:math id="M1" display="inline"><mml:mrow><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold">x</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> be a scalar field, with <inline-formula><mml:math id="M2" display="inline"><mml:mi mathvariant="bold">x</mml:mi></mml:math></inline-formula> lying in some domain <inline-formula><mml:math id="M3" display="inline"><mml:mi>D</mml:mi></mml:math></inline-formula>. The goal is to find the distribution of the second moment of this field over spatial scales. This can be achieved using a coarse graining, akin to the methods presented by <xref ref-type="bibr" rid="bib1.bibx2" id="text.7"/> and <xref ref-type="bibr" rid="bib1.bibx13" id="text.8"/>. However, coarse graining will rely on implicit filters, as proposed by <xref ref-type="bibr" rid="bib1.bibx5" id="text.9"/>. The coarsened field <inline-formula><mml:math id="M4" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi mathvariant="bold">x</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> is found by solving

            <disp-formula id="Ch1.E1" content-type="numbered"><label>1</label><mml:math id="M5" display="block"><mml:mrow><mml:mfenced open="(" close=")"><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>+</mml:mo><mml:mi mathvariant="italic">γ</mml:mi><mml:msup><mml:mfenced close=")" open="("><mml:mrow><mml:mo>-</mml:mo><mml:msup><mml:mi mathvariant="normal">ℓ</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mi mathvariant="normal">Δ</mml:mi></mml:mrow></mml:mfenced><mml:mi>n</mml:mi></mml:msup></mml:mrow></mml:mfenced><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          where <inline-formula><mml:math id="M6" display="inline"><mml:mi mathvariant="normal">Δ</mml:mi></mml:math></inline-formula> is the Laplacian, the smoothing scale is  parameterized by <inline-formula><mml:math id="M7" display="inline"><mml:mi mathvariant="normal">ℓ</mml:mi></mml:math></inline-formula> and <inline-formula><mml:math id="M8" display="inline"><mml:mi mathvariant="italic">γ</mml:mi></mml:math></inline-formula> is a parameter that tunes the relation of <inline-formula><mml:math id="M9" display="inline"><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>/</mml:mo><mml:mi mathvariant="normal">ℓ</mml:mi></mml:mrow></mml:math></inline-formula> to wavenumbers. Spectra can be computed using low-pass solutions as

            <disp-formula id="Ch1.Ex1"><mml:math id="M10" display="block"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi>E</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mi>d</mml:mi><mml:mrow><mml:msub><mml:mi>k</mml:mi><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>〈</mml:mo><mml:mo>|</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub><mml:msup><mml:mo>|</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>〉</mml:mo><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

          where the angular brackets denote spatial averaging and <inline-formula><mml:math id="M11" display="inline"><mml:mrow><mml:msub><mml:mi>k</mml:mi><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>/</mml:mo><mml:mi mathvariant="normal">ℓ</mml:mi></mml:mrow></mml:math></inline-formula>. An alternative method has been proposed recently by <xref ref-type="bibr" rid="bib1.bibx17" id="text.10"/> which relies on high-pass filtering:

            <disp-formula id="Ch1.Ex2"><mml:math id="M12" display="block"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi>E</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mo>-</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mi>d</mml:mi><mml:mrow><mml:msub><mml:mi>k</mml:mi><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>〈</mml:mo><mml:mo>|</mml:mo><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo>-</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub><mml:msup><mml:mo>|</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>〉</mml:mo><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

          Below we will take <inline-formula><mml:math id="M13" display="inline"><mml:mrow><mml:mi mathvariant="italic">γ</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:mrow></mml:math></inline-formula> for the low-pass method and <inline-formula><mml:math id="M14" display="inline"><mml:mrow><mml:mi mathvariant="italic">γ</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:math></inline-formula> for the high-pass method. As explained in <xref ref-type="bibr" rid="bib1.bibx5" id="text.11"/>, for the low-pass method <inline-formula><mml:math id="M15" display="inline"><mml:mrow><mml:msub><mml:mi>k</mml:mi><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>/</mml:mo><mml:mi mathvariant="normal">ℓ</mml:mi></mml:mrow></mml:math></inline-formula> has the sense of wavenumber for <inline-formula><mml:math id="M16" display="inline"><mml:mrow><mml:mi mathvariant="italic">γ</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:mrow></mml:math></inline-formula>, and the wavelength is <inline-formula><mml:math id="M17" display="inline"><mml:mrow><mml:mi mathvariant="italic">λ</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:mi mathvariant="italic">π</mml:mi><mml:mi mathvariant="normal">ℓ</mml:mi></mml:mrow></mml:math></inline-formula>. Such <inline-formula><mml:math id="M18" display="inline"><mml:mi mathvariant="normal">ℓ</mml:mi></mml:math></inline-formula> is related to the scale of box filter <inline-formula><mml:math id="M19" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">ℓ</mml:mi><mml:mi mathvariant="normal">box</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> approximately as <inline-formula><mml:math id="M20" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">ℓ</mml:mi><mml:mi mathvariant="normal">box</mml:mi></mml:msub><mml:mo>/</mml:mo><mml:mi mathvariant="normal">ℓ</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">3.5</mml:mn></mml:mrow></mml:math></inline-formula>. The integer <inline-formula><mml:math id="M21" display="inline"><mml:mi>n</mml:mi></mml:math></inline-formula> defines the order of the implicit filter, as discussed in  <xref ref-type="bibr" rid="bib1.bibx6" id="text.12"/>. For the high-pass method, analysis similar to that in <xref ref-type="bibr" rid="bib1.bibx5" id="text.13"/> shows that the same interpretation of <inline-formula><mml:math id="M22" display="inline"><mml:mrow><mml:msub><mml:mi>k</mml:mi><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M23" display="inline"><mml:mi mathvariant="normal">ℓ</mml:mi></mml:math></inline-formula> is preserved if <inline-formula><mml:math id="M24" display="inline"><mml:mrow><mml:mi mathvariant="italic">γ</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:math></inline-formula>. Such <inline-formula><mml:math id="M25" display="inline"><mml:mi mathvariant="normal">ℓ</mml:mi></mml:math></inline-formula> is related to the scale of box filter used with high-pass method approximately as <inline-formula><mml:math id="M26" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">ℓ</mml:mi><mml:mi mathvariant="normal">box</mml:mi></mml:msub><mml:mo>/</mml:mo><mml:mi mathvariant="normal">ℓ</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">6.1</mml:mn></mml:mrow></mml:math></inline-formula>.</p>
      <p id="d2e634">The implicit coarsening procedure can be applied to a vector field <inline-formula><mml:math id="M27" display="inline"><mml:mi mathvariant="bold-italic">u</mml:mi></mml:math></inline-formula> as

            <disp-formula id="Ch1.E2" content-type="numbered"><label>2</label><mml:math id="M28" display="block"><mml:mrow><mml:mfenced close=")" open="("><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>+</mml:mo><mml:mi mathvariant="italic">γ</mml:mi><mml:msup><mml:mfenced open="(" close=")"><mml:mrow><mml:mo>-</mml:mo><mml:msup><mml:mi mathvariant="normal">ℓ</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mi mathvariant="bold">Δ</mml:mi></mml:mrow></mml:mfenced><mml:mi>n</mml:mi></mml:msup></mml:mrow></mml:mfenced><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">u</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mi mathvariant="bold-italic">u</mml:mi><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

          In this case <inline-formula><mml:math id="M29" display="inline"><mml:mi mathvariant="bold">Δ</mml:mi></mml:math></inline-formula> is the vector Laplacian, which includes metric terms in spherical geometry. In both cases of scalar and vector fields, Eqs. (<xref ref-type="disp-formula" rid="Ch1.E1"/>) and (<xref ref-type="disp-formula" rid="Ch1.E2"/>) are complemented by the boundary conditions of no normal flux (for <inline-formula><mml:math id="M30" display="inline"><mml:mrow><mml:mi>n</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:math></inline-formula>) and additional conditions of no higher-order normal fluxes for <inline-formula><mml:math id="M31" display="inline"><mml:mrow><mml:mi>n</mml:mi><mml:mo>&gt;</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:math></inline-formula>.</p>
      <p id="d2e722">The discrete Laplacian operator, used in this coarsening method, can be formulated for any computational mesh, whether it is structured or unstructured, or mesh geometry, whether it is flat or spherical. For unstructured meshes, Laplacians can be discretized through finite-volume or finite-element methods. Although mathematical details and discretizations were presented in <xref ref-type="bibr" rid="bib1.bibx5" id="text.14"/>, we briefly overview them here for convenience. Since discretizations of Laplacians on structured meshes are generally known, we focus below in this section on unstructured meshes.</p>
      <p id="d2e728">Figure <xref ref-type="fig" rid="F1"/> presents schematics of several unstructured-grid discretizations in 2D view. In FESOM2, scalar degrees of freedom are placed at vertices, and median dual control volumes are used. They are obtained by connecting centroids of triangles with mid-edge points, as shown in panel Fig. <xref ref-type="fig" rid="F1"/>a. The discrete horizontal velocities are placed on centroids of triangles (Fig. <xref ref-type="fig" rid="F1"/>c). The placement of scalars in MPAS-Ocean differs by using the control volumes obtained by connecting circumcenters of triangles (Fig. <xref ref-type="fig" rid="F1"/>b). These control volumes are Voronoi quasi-hexagonal polygons of the dual mesh (and vice versa, a triangular mesh can be considered the dual of the hexagonal one). The vector degrees of freedom are in this case the components of velocity normal to the edges of the scalar cells. In ICON-o, scalar degrees of freedom are placed at the circumcenters of triangles, and normal velocities are at mid-edges (Fig. <xref ref-type="fig" rid="F1"/>d). The discretization of Laplacians depends on the placement of the degrees of freedom.</p>

      <fig id="F1" specific-use="star"><label>Figure 1</label><caption><p id="d2e744">Schematics of several unstructured-grid discretizations: <bold>(a)</bold> median-dual control volumes around vertices are obtained by connecting centroids with mid-edge points (gray lines) and <bold>(b)</bold> a dual quasi-hexagonal mesh is obtained by connecting the circumcenters of triangles (on orthogonal meshes). The gray lines are perpendicular to edges, <bold>(c)</bold> centroids of triangles are used and <bold>(d)</bold> circumcenters of triangles are used.</p></caption>
          <graphic xlink:href="https://gmd.copernicus.org/articles/18/6541/2025/gmd-18-6541-2025-f01.png"/>

        </fig>

<sec id="Ch1.S2.SS1.SSS1">
  <label>2.1.1</label><title>Scalar Laplacians</title>
      <p id="d2e772">For median dual control volumes, we use the finite-element method, assuming first <inline-formula><mml:math id="M32" display="inline"><mml:mrow><mml:mi>n</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:math></inline-formula>. The weak formulation of Eq. (<xref ref-type="disp-formula" rid="Ch1.E1"/>) is obtained by multiplying Eq. (<xref ref-type="disp-formula" rid="Ch1.E1"/>) by a sufficiently smooth function <inline-formula><mml:math id="M33" display="inline"><mml:mrow><mml:mi>w</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold">x</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> and integrating over the domain <inline-formula><mml:math id="M34" display="inline"><mml:mi>D</mml:mi></mml:math></inline-formula>. This leads to

              <disp-formula id="Ch1.Ex3"><mml:math id="M35" display="block"><mml:mrow><mml:munder><mml:mo movablelimits="false">∫</mml:mo><mml:mi>D</mml:mi></mml:munder><mml:mfenced close=")" open="("><mml:mrow><mml:mi>w</mml:mi><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:mi mathvariant="italic">γ</mml:mi><mml:msup><mml:mi mathvariant="normal">ℓ</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mi mathvariant="normal">∇</mml:mi><mml:mi>w</mml:mi><mml:mo>⋅</mml:mo><mml:mi mathvariant="normal">∇</mml:mi><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub></mml:mrow></mml:mfenced><mml:mi mathvariant="normal">d</mml:mi><mml:mi>S</mml:mi><mml:mo>=</mml:mo><mml:munder><mml:mo movablelimits="false">∫</mml:mo><mml:mi>D</mml:mi></mml:munder><mml:mi>w</mml:mi><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mi mathvariant="normal">d</mml:mi><mml:mi>S</mml:mi><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

            The boundary term appearing after in the integration is zero by virtue of the boundary conditions. The discrete fields are expanded in series <inline-formula><mml:math id="M36" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:munder><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:munder><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:msub><mml:mi>N</mml:mi><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>(</mml:mo><mml:mi mathvariant="bold">x</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M37" display="inline"><mml:mrow><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo>=</mml:mo><mml:munder><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:munder><mml:msub><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:msub><mml:mi>N</mml:mi><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>(</mml:mo><mml:mi mathvariant="bold">x</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula>, where <inline-formula><mml:math id="M38" display="inline"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi>v</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi mathvariant="bold">x</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> is a <inline-formula><mml:math id="M39" display="inline"><mml:mrow><mml:msub><mml:mi>P</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> piecewise linear basis function. This function equals 1 at the position of vertex <inline-formula><mml:math id="M40" display="inline"><mml:mi>v</mml:mi></mml:math></inline-formula> (see Fig. <xref ref-type="fig" rid="F1"/>), decays to 0 at vertices connected to <inline-formula><mml:math id="M41" display="inline"><mml:mi>v</mml:mi></mml:math></inline-formula> by edges (like <inline-formula><mml:math id="M42" display="inline"><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M43" display="inline"><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mrow><mml:mo>′</mml:mo><mml:mo>′</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>) and is zero outside the stencil of nearest triangles. The continuous Galerkin approximation is obtained by requiring the weak equation above be valid for <inline-formula><mml:math id="M44" display="inline"><mml:mrow><mml:mi>w</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi>v</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> for any <inline-formula><mml:math id="M45" display="inline"><mml:mi>v</mml:mi></mml:math></inline-formula>. This results in

              <disp-formula id="Ch1.Ex4"><mml:math id="M46" display="block"><mml:mrow><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi mathvariant="bold">M</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>+</mml:mo><mml:mi mathvariant="italic">γ</mml:mi><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold">D</mml:mi><mml:mo mathvariant="normal" stretchy="false">̃</mml:mo></mml:mover><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub></mml:mrow></mml:mfenced><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="bold">M</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:msub><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

            Here, the summation over repeating <inline-formula><mml:math id="M47" display="inline"><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula> is implied; <inline-formula><mml:math id="M48" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold">M</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mo>∫</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi>v</mml:mi></mml:msub><mml:msub><mml:mi>N</mml:mi><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mi mathvariant="normal">d</mml:mi><mml:mi>S</mml:mi></mml:mrow></mml:math></inline-formula> is the mass matrix and <inline-formula><mml:math id="M49" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold">D</mml:mi><mml:mo stretchy="false" mathvariant="normal">̃</mml:mo></mml:mover><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mo>∫</mml:mo><mml:msup><mml:mi mathvariant="normal">ℓ</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mi mathvariant="normal">∇</mml:mi><mml:msub><mml:mi>N</mml:mi><mml:mi>v</mml:mi></mml:msub><mml:mo>⋅</mml:mo><mml:mi mathvariant="normal">∇</mml:mi><mml:msub><mml:mi>N</mml:mi><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mi mathvariant="normal">d</mml:mi><mml:mi>S</mml:mi></mml:mrow></mml:math></inline-formula>. Keeping the full mass matrix in this case does not improve the accuracy, and it can be replaced by its diagonally lumped approximation <inline-formula><mml:math id="M50" display="inline"><mml:mrow><mml:msubsup><mml:mi mathvariant="bold">M</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow><mml:mi>L</mml:mi></mml:msubsup><mml:mo>=</mml:mo><mml:msub><mml:mi>A</mml:mi><mml:mi mathvariant="normal">v</mml:mi></mml:msub><mml:msub><mml:mi mathvariant="bold">I</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>, where <inline-formula><mml:math id="M51" display="inline"><mml:mrow><mml:msub><mml:mi>A</mml:mi><mml:mi mathvariant="normal">v</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the area of control volume associated with <inline-formula><mml:math id="M52" display="inline"><mml:mi>v</mml:mi></mml:math></inline-formula>. Note that the system matrix <inline-formula><mml:math id="M53" display="inline"><mml:mrow><mml:mi mathvariant="bold">S</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mi mathvariant="bold">M</mml:mi><mml:mi>L</mml:mi></mml:msup><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:mover accent="true"><mml:mi mathvariant="bold">D</mml:mi><mml:mo mathvariant="normal" stretchy="false">̃</mml:mo></mml:mover></mml:mrow></mml:math></inline-formula> is symmetric and positive definite.</p>
      <p id="d2e1334">In the biharmonic case, <inline-formula><mml:math id="M54" display="inline"><mml:mrow><mml:mi mathvariant="bold">S</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mi mathvariant="bold">M</mml:mi><mml:mi>L</mml:mi></mml:msup><mml:mo>+</mml:mo><mml:mi mathvariant="italic">γ</mml:mi><mml:mover accent="true"><mml:mi mathvariant="bold">D</mml:mi><mml:mo stretchy="false" mathvariant="normal">̃</mml:mo></mml:mover><mml:mo>(</mml:mo><mml:msup><mml:mi mathvariant="bold">M</mml:mi><mml:mi>L</mml:mi></mml:msup><mml:msup><mml:mo>)</mml:mo><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup><mml:mover accent="true"><mml:mi mathvariant="bold">D</mml:mi><mml:mo stretchy="false" mathvariant="normal">̃</mml:mo></mml:mover></mml:mrow></mml:math></inline-formula>. The derivation procedure consists of two steps. One writes <inline-formula><mml:math id="M55" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi mathvariant="normal">Δ</mml:mi><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mi mathvariant="normal">Δ</mml:mi><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ψ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, with <inline-formula><mml:math id="M56" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ψ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mi mathvariant="normal">Δ</mml:mi><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>. Using the weak form of the last equality and expanding <inline-formula><mml:math id="M57" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ψ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> in the same set of basis functions, one gets <inline-formula><mml:math id="M58" display="inline"><mml:mrow><mml:msubsup><mml:mi mathvariant="bold">M</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow><mml:mi>L</mml:mi></mml:msubsup><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ψ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold">D</mml:mi><mml:mo stretchy="false" mathvariant="normal">̃</mml:mo></mml:mover><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>. In the second step one applies the finite-element method to <inline-formula><mml:math id="M59" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:mi mathvariant="italic">γ</mml:mi><mml:mi mathvariant="normal">Δ</mml:mi><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ψ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mi mathvariant="italic">ϕ</mml:mi></mml:mrow></mml:math></inline-formula>. The flux terms that would appear in the weak equations are omitted by virtue of boundary conditions. The procedure can be generalized to higher-order filters.</p>
      <p id="d2e1543">The procedure above can be given a finite-volume treatment. Turning to Fig. <xref ref-type="fig" rid="F1"/>a, we first compute <inline-formula><mml:math id="M60" display="inline"><mml:mrow><mml:mi mathvariant="normal">∇</mml:mi><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> on triangles using three vertex values (<inline-formula><mml:math id="M61" display="inline"><mml:mi>v</mml:mi></mml:math></inline-formula>, <inline-formula><mml:math id="M62" display="inline"><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M63" display="inline"><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mrow><mml:mo>′</mml:mo><mml:mo>′</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> for triangle <inline-formula><mml:math id="M64" display="inline"><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula>) and then combine fluxes through the segments of boundary (for edge <inline-formula><mml:math id="M65" display="inline"><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula> there are two segments with area vectors <inline-formula><mml:math id="M66" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold">s</mml:mi><mml:mi>l</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M67" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold">s</mml:mi><mml:mi>r</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> taken with gradients at <inline-formula><mml:math id="M68" display="inline"><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M69" display="inline"><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> respectively). Such treatment will lead to the same result.</p>
      <p id="d2e1665">For the quasi-hexagonal control volumes the <inline-formula><mml:math id="M70" display="inline"><mml:mrow><mml:mo>-</mml:mo><mml:msup><mml:mi mathvariant="normal">ℓ</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mi mathvariant="normal">Δ</mml:mi></mml:mrow></mml:math></inline-formula> operator is expressed in a finite-volume way as

              <disp-formula id="Ch1.E3" content-type="numbered"><label>3</label><mml:math id="M71" display="block"><mml:mrow><mml:msub><mml:mi>A</mml:mi><mml:mi mathvariant="normal">v</mml:mi></mml:msub><mml:mfenced close=")" open="("><mml:mrow><mml:mi mathvariant="bold">D</mml:mi><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub></mml:mrow></mml:mfenced><mml:mi>v</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mi mathvariant="normal">ℓ</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:munder><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup><mml:mo>∈</mml:mo><mml:mi>N</mml:mi><mml:mo>(</mml:mo><mml:mi>v</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:munder><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>v</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub></mml:mrow><mml:mrow><mml:msub><mml:mi>d</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub></mml:mrow></mml:mfrac></mml:mstyle><mml:msub><mml:mi>l</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

            where <inline-formula><mml:math id="M72" display="inline"><mml:mrow><mml:msub><mml:mi>d</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> is the length of edge <inline-formula><mml:math id="M73" display="inline"><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula>, and <inline-formula><mml:math id="M74" display="inline"><mml:mrow><mml:msub><mml:mi>l</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> is the distance between circumcenters <inline-formula><mml:math id="M75" display="inline"><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M76" display="inline"><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> on both sides of edge <inline-formula><mml:math id="M77" display="inline"><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula> (see Fig. <xref ref-type="fig" rid="F1"/>b). The system matrix is

              <disp-formula id="Ch1.E4" content-type="numbered"><label>4</label><mml:math id="M78" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="bold">S</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi>A</mml:mi><mml:mi mathvariant="normal">v</mml:mi></mml:msub><mml:msub><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mi>v</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mspace width="0.25em" linebreak="nobreak"/><mml:msub><mml:mi mathvariant="bold">S</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi>A</mml:mi><mml:mi mathvariant="normal">v</mml:mi></mml:msub><mml:msub><mml:mi mathvariant="bold">I</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>+</mml:mo><mml:mi mathvariant="italic">γ</mml:mi><mml:msub><mml:mi>A</mml:mi><mml:mi mathvariant="normal">v</mml:mi></mml:msub><mml:msub><mml:mi mathvariant="bold">D</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

            with <inline-formula><mml:math id="M79" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold">I</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> being the identity matrix. The summation over repeating index <inline-formula><mml:math id="M80" display="inline"><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula> is implied. On uniform meshes, <inline-formula><mml:math id="M81" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:msup><mml:mi mathvariant="bold">M</mml:mi><mml:mi>L</mml:mi></mml:msup><mml:msup><mml:mo>)</mml:mo><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup><mml:mover accent="true"><mml:mi mathvariant="bold">D</mml:mi><mml:mo stretchy="false" mathvariant="normal">̃</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mi mathvariant="bold">D</mml:mi></mml:mrow></mml:math></inline-formula>. The matrix of the biharmonic operator can be obtained by applying the procedure used for <inline-formula><mml:math id="M82" display="inline"><mml:mi mathvariant="bold">D</mml:mi></mml:math></inline-formula> twice,

              <disp-formula id="Ch1.E5" content-type="numbered"><label>5</label><mml:math id="M83" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="bold">S</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mrow><mml:mo>′</mml:mo><mml:mo>′</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi>A</mml:mi><mml:mi mathvariant="normal">v</mml:mi></mml:msub><mml:msub><mml:mi mathvariant="bold">I</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mrow><mml:mo>′</mml:mo><mml:mo>′</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:msub><mml:mo>+</mml:mo><mml:mi mathvariant="italic">γ</mml:mi><mml:msub><mml:mi>A</mml:mi><mml:mi mathvariant="normal">v</mml:mi></mml:msub><mml:msub><mml:mi mathvariant="bold">D</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:msub><mml:mi mathvariant="bold">D</mml:mi><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup><mml:msup><mml:mi>v</mml:mi><mml:mrow><mml:mo>′</mml:mo><mml:mo>′</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:msub><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
      <p id="d2e2113">For scalars at triangle circumcenters, the expression is similar to Eq. (<xref ref-type="disp-formula" rid="Ch1.E3"/>)

              <disp-formula id="Ch1.E6" content-type="numbered"><label>6</label><mml:math id="M84" display="block"><mml:mrow><mml:msub><mml:mi>A</mml:mi><mml:mi>c</mml:mi></mml:msub><mml:mfenced close=")" open="("><mml:mrow><mml:mi mathvariant="bold">D</mml:mi><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub></mml:mrow></mml:mfenced><mml:mi>c</mml:mi><mml:mo>=</mml:mo><mml:msup><mml:mi mathvariant="normal">ℓ</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:munder><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:msup><mml:mi>c</mml:mi><mml:mo>′</mml:mo></mml:msup><mml:mo>∈</mml:mo><mml:mi>N</mml:mi><mml:mo>(</mml:mo><mml:mi>c</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:munder><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>c</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mrow><mml:msup><mml:mi>c</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub></mml:mrow><mml:mrow><mml:msub><mml:mi>d</mml:mi><mml:mrow><mml:mi>c</mml:mi><mml:msup><mml:mi>c</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub></mml:mrow></mml:mfrac></mml:mstyle><mml:msub><mml:mi>l</mml:mi><mml:mrow><mml:mi>c</mml:mi><mml:msup><mml:mi>c</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

            where <inline-formula><mml:math id="M85" display="inline"><mml:mrow><mml:msub><mml:mi>A</mml:mi><mml:mi>c</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the area of triangle <inline-formula><mml:math id="M86" display="inline"><mml:mi>c</mml:mi></mml:math></inline-formula>, <inline-formula><mml:math id="M87" display="inline"><mml:mrow><mml:mi>N</mml:mi><mml:mo>(</mml:mo><mml:mi>c</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> is the set of neighboring triangles, <inline-formula><mml:math id="M88" display="inline"><mml:mrow><mml:msub><mml:mi>l</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> is the length of edge <inline-formula><mml:math id="M89" display="inline"><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M90" display="inline"><mml:mrow><mml:msub><mml:mi>d</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> is the distance between the circumcenters of triangles with common edge <inline-formula><mml:math id="M91" display="inline"><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula> (see Fig. <xref ref-type="fig" rid="F1"/>d). The biharmonic case is similar to the previous case. In the last two cases the expressions for Laplacians are simplified because of the orthogonality of the lines connecting centroids to edges.</p>
</sec>
<sec id="Ch1.S2.SS1.SSS2">
  <label>2.1.2</label><title>Vector Laplacians</title>
      <p id="d2e2322">For the discretization of FESOM2 the easiest method is to seek for <inline-formula><mml:math id="M92" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">u</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> at vertices even though the discrete <inline-formula><mml:math id="M93" display="inline"><mml:mi mathvariant="bold-italic">u</mml:mi></mml:math></inline-formula> values are at centroids. One reason is that the number of vertices is half as small, leading to a matrix problem of smaller dimensions. Due to the appearance of metric terms, equations for both components of <inline-formula><mml:math id="M94" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">u</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> are coupled, as explained in <xref ref-type="bibr" rid="bib1.bibx5" id="text.15"/>. The resulting matrix problem is <inline-formula><mml:math id="M95" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold">S</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="bold">M</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>+</mml:mo><mml:mi mathvariant="italic">γ</mml:mi><mml:msub><mml:mi mathvariant="bold">D</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> for the Laplacian filter and <inline-formula><mml:math id="M96" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold">S</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="bold">M</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>+</mml:mo><mml:mi mathvariant="italic">γ</mml:mi><mml:msub><mml:mi mathvariant="bold">D</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>(</mml:mo><mml:msubsup><mml:mi mathvariant="bold">M</mml:mi><mml:mn mathvariant="normal">2</mml:mn><mml:mi>L</mml:mi></mml:msubsup><mml:msup><mml:mo>)</mml:mo><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup><mml:msub><mml:mi mathvariant="bold">D</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> for the biharmonic filter. It acts on the vector <inline-formula><mml:math id="M97" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:mo mathvariant="italic">{</mml:mo><mml:msub><mml:mover accent="true"><mml:mi>u</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>v</mml:mi></mml:msub><mml:mo mathvariant="italic">}</mml:mo><mml:mo>,</mml:mo><mml:mo mathvariant="italic">{</mml:mo><mml:msub><mml:mover accent="true"><mml:mi>v</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi>v</mml:mi></mml:msub><mml:mo mathvariant="italic">}</mml:mo><mml:msup><mml:mo>)</mml:mo><mml:mi>T</mml:mi></mml:msup></mml:mrow></mml:math></inline-formula>. Here

              <disp-formula id="Ch1.Ex5"><mml:math id="M98" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="bold">D</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:mfenced open="(" close=")"><mml:mtable class="matrix" columnalign="center center" framespacing="0em"><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mi mathvariant="bold">D</mml:mi><mml:mo stretchy="false" mathvariant="normal">̃</mml:mo></mml:mover></mml:mtd><mml:mtd><mml:mi mathvariant="bold">R</mml:mi></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mo>-</mml:mo><mml:mi mathvariant="bold">R</mml:mi></mml:mrow></mml:mtd><mml:mtd><mml:mover accent="true"><mml:mi mathvariant="bold">D</mml:mi><mml:mo mathvariant="normal" stretchy="false">̃</mml:mo></mml:mover></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mo>,</mml:mo><mml:mspace linebreak="nobreak" width="0.25em"/><mml:msub><mml:mi mathvariant="bold">M</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:mfenced open="(" close=")"><mml:mtable class="matrix" columnalign="center center" framespacing="0em"><mml:mtr><mml:mtd><mml:mi mathvariant="bold">M</mml:mi></mml:mtd><mml:mtd><mml:mn mathvariant="normal">0</mml:mn></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mn mathvariant="normal">0</mml:mn></mml:mtd><mml:mtd><mml:mi mathvariant="bold">M</mml:mi></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

            The entries of matrix <inline-formula><mml:math id="M99" display="inline"><mml:mi mathvariant="bold">R</mml:mi></mml:math></inline-formula> are computed as <inline-formula><mml:math id="M100" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold">R</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:msup><mml:mi mathvariant="normal">ℓ</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>∫</mml:mo><mml:mi>m</mml:mi><mml:mo>(</mml:mo><mml:mo>-</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:msub><mml:mo>∂</mml:mo><mml:mi>x</mml:mi></mml:msub><mml:msub><mml:mi>N</mml:mi><mml:mi>v</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi>v</mml:mi></mml:msub><mml:msub><mml:mo>∂</mml:mo><mml:mi>x</mml:mi></mml:msub><mml:msub><mml:mi>N</mml:mi><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>)</mml:mo><mml:mi mathvariant="normal">d</mml:mi><mml:mi>S</mml:mi></mml:mrow></mml:math></inline-formula>. It is the operator accounting for metric terms linear in the metric factor <inline-formula><mml:math id="M101" display="inline"><mml:mrow><mml:mi>m</mml:mi><mml:mo>=</mml:mo><mml:msubsup><mml:mi>R</mml:mi><mml:mi mathvariant="normal">e</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msubsup><mml:mi>tan⁡</mml:mi><mml:mi mathvariant="italic">θ</mml:mi></mml:mrow></mml:math></inline-formula>, where <inline-formula><mml:math id="M102" display="inline"><mml:mrow><mml:msub><mml:mi>R</mml:mi><mml:mi mathvariant="normal">e</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is Earth radius, which is taken constant on triangles, and <inline-formula><mml:math id="M103" display="inline"><mml:mi mathvariant="italic">θ</mml:mi></mml:math></inline-formula> is the latitude. Compared to the scalar case, the entries of <inline-formula><mml:math id="M104" display="inline"><mml:mover accent="true"><mml:mi mathvariant="bold">D</mml:mi><mml:mo mathvariant="normal" stretchy="false">̃</mml:mo></mml:mover></mml:math></inline-formula> are also modified by the metric terms as <inline-formula><mml:math id="M105" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold">D</mml:mi><mml:mo mathvariant="normal" stretchy="false">̃</mml:mo></mml:mover><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:msup><mml:mi mathvariant="normal">ℓ</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>∫</mml:mo><mml:mo>(</mml:mo><mml:mi mathvariant="normal">∇</mml:mi><mml:msub><mml:mi>N</mml:mi><mml:mi>v</mml:mi></mml:msub><mml:mo>⋅</mml:mo><mml:mi mathvariant="normal">∇</mml:mi><mml:msub><mml:mi>N</mml:mi><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>+</mml:mo><mml:mo>(</mml:mo><mml:msubsup><mml:mi>R</mml:mi><mml:mi mathvariant="normal">e</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msubsup><mml:mo>+</mml:mo><mml:msup><mml:mi>m</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>)</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi>v</mml:mi></mml:msub><mml:msub><mml:mi>N</mml:mi><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>)</mml:mo><mml:mi mathvariant="normal">d</mml:mi><mml:mi>S</mml:mi></mml:mrow></mml:math></inline-formula>. Finally, the right-hand side is obtained by projecting from cell to vertices: <inline-formula><mml:math id="M106" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">u</mml:mi><mml:mi>v</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="bold">R</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:mi>c</mml:mi></mml:mrow></mml:msub><mml:msub><mml:mi mathvariant="bold-italic">u</mml:mi><mml:mi>c</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, where <inline-formula><mml:math id="M107" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold">R</mml:mi><mml:mrow><mml:mi>v</mml:mi><mml:mi>c</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mo>∫</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi>v</mml:mi></mml:msub><mml:msub><mml:mi>M</mml:mi><mml:mi>c</mml:mi></mml:msub><mml:mi mathvariant="normal">d</mml:mi><mml:mi>S</mml:mi></mml:mrow></mml:math></inline-formula>, and <inline-formula><mml:math id="M108" display="inline"><mml:mrow><mml:msub><mml:mi>M</mml:mi><mml:mi>c</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the indicator function on triangle <inline-formula><mml:math id="M109" display="inline"><mml:mi>c</mml:mi></mml:math></inline-formula>. Summation is implied over repeating indices in matrix–vector products.</p>
      <p id="d2e2856">There are several options to do the filtering keeping <inline-formula><mml:math id="M110" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">u</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> at cells. For the stencil of nearest triangles (see Fig. <xref ref-type="fig" rid="F1"/>c) the lines connecting the centroids on general meshes are not perpendicular to edges. For this stencil, there is no universally valid discretization for Laplacian. We use a simplified expression instead of true <inline-formula><mml:math id="M111" display="inline"><mml:mrow><mml:mo>-</mml:mo><mml:msup><mml:mi mathvariant="normal">ℓ</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mi mathvariant="normal">Δ</mml:mi></mml:mrow></mml:math></inline-formula>,

              <disp-formula id="Ch1.E7" content-type="numbered"><label>7</label><mml:math id="M112" display="block"><mml:mrow><mml:msub><mml:mi>A</mml:mi><mml:mi>c</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi mathvariant="bold">D</mml:mi><mml:mi mathvariant="bold-italic">u</mml:mi><mml:msub><mml:mo>)</mml:mo><mml:mi>c</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mi>A</mml:mi><mml:msup><mml:mi mathvariant="normal">ℓ</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:munder><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:msup><mml:mi>c</mml:mi><mml:mo>′</mml:mo></mml:msup><mml:mo>∈</mml:mo><mml:mi>C</mml:mi><mml:mo>(</mml:mo><mml:mi>c</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:munder><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">u</mml:mi><mml:mi>c</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">u</mml:mi><mml:mrow><mml:msup><mml:mi>c</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:msub></mml:mrow></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

            which works stable in practice. One gets a valid discretization for <inline-formula><mml:math id="M113" display="inline"><mml:mrow><mml:mo>-</mml:mo><mml:msup><mml:mi mathvariant="normal">ℓ</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mi mathvariant="normal">Δ</mml:mi></mml:mrow></mml:math></inline-formula> taking <inline-formula><mml:math id="M114" display="inline"><mml:mrow><mml:mi>A</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:math></inline-formula> on uniform quadrilateral meshes and <inline-formula><mml:math id="M115" display="inline"><mml:mrow><mml:mi>A</mml:mi><mml:mo>=</mml:mo><mml:msqrt><mml:mn mathvariant="normal">3</mml:mn></mml:msqrt></mml:mrow></mml:math></inline-formula> on uniform triangular meshes composed of equilateral triangles. On a triangular mesh obtained by splitting regular squares it corresponds to <inline-formula><mml:math id="M116" display="inline"><mml:mrow><mml:mo>-</mml:mo><mml:msub><mml:mo>∂</mml:mo><mml:mrow><mml:mi>x</mml:mi><mml:mi>x</mml:mi></mml:mrow></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mo>∂</mml:mo><mml:mrow><mml:mi>y</mml:mi><mml:mi>y</mml:mi></mml:mrow></mml:msub><mml:mo>±</mml:mo><mml:msub><mml:mo>∂</mml:mo><mml:mrow><mml:mi>x</mml:mi><mml:mi>y</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> for <inline-formula><mml:math id="M117" display="inline"><mml:mrow><mml:mi>A</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">3</mml:mn><mml:mo>/</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:math></inline-formula>, with the sign dependent on the direction the quadrilateral cells are split. The appearance of mixed derivatives is caused by the low symmetry of the mesh (only to rotations by 180°). Such meshes will make scale analysis essentially anisotropic; however all operators on such meshes have a similar mesh imprint. The operator (Eq. <xref ref-type="disp-formula" rid="Ch1.E7"/>) is symmetric and positive semidefinite. In spherical geometry, the unit zonal and meridional vectors are different at <inline-formula><mml:math id="M118" display="inline"><mml:mi>c</mml:mi></mml:math></inline-formula> and <inline-formula><mml:math id="M119" display="inline"><mml:mrow><mml:msup><mml:mi>c</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula> locations. The account for this difference leads to metric terms that include the derivatives of unit directional vectors.</p>
      <p id="d2e3074">Other options for cell-based filtering of velocities will rely on a much larger stencil. Based on triangles <inline-formula><mml:math id="M120" display="inline"><mml:mrow><mml:msup><mml:mi>c</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M121" display="inline"><mml:mrow><mml:msup><mml:mi>c</mml:mi><mml:mrow><mml:mo>′</mml:mo><mml:mo>′</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M122" display="inline"><mml:mrow><mml:msup><mml:mi>c</mml:mi><mml:mrow><mml:mo>′</mml:mo><mml:mo>′</mml:mo><mml:mo>′</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> (see Fig. <xref ref-type="fig" rid="F1"/>c) one can estimate <inline-formula><mml:math id="M123" display="inline"><mml:mrow><mml:mi mathvariant="normal">∇</mml:mi><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">u</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> on triangle <inline-formula><mml:math id="M124" display="inline"><mml:mi>c</mml:mi></mml:math></inline-formula>. Combining such estimates on <inline-formula><mml:math id="M125" display="inline"><mml:mi>c</mml:mi></mml:math></inline-formula> and <inline-formula><mml:math id="M126" display="inline"><mml:mrow><mml:msup><mml:mi>c</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula>, the gradient will be estimated on edge <inline-formula><mml:math id="M127" display="inline"><mml:mrow><mml:mi>v</mml:mi><mml:msup><mml:mi>v</mml:mi><mml:mrow><mml:mo>′</mml:mo><mml:mo>′</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> and similarly on other edges, and then the divergence of such gradients will be computed at <inline-formula><mml:math id="M128" display="inline"><mml:mi>c</mml:mi></mml:math></inline-formula>. On uniform meshes this will involve a stencil of 10 triangles. Yet another method is to use the vector invariant form <inline-formula><mml:math id="M129" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mo>=</mml:mo><mml:mi mathvariant="normal">∇</mml:mi><mml:mi mathvariant="normal">∇</mml:mi><mml:mo>⋅</mml:mo><mml:mo>-</mml:mo></mml:mrow></mml:math></inline-formula> <inline-formula><mml:math id="M130" display="inline"><mml:mrow><mml:mtext mathvariant="monospace">curl</mml:mtext><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mtext mathvariant="monospace">curl</mml:mtext></mml:mrow></mml:math></inline-formula>. For centroidal velocities both the discrete divergence and vorticity are naturally computed on vertices, through the cycle over the boundary of median-dual control volumes. The operation of gradient and second curl will involve three vertex values and return the result to cells. In this case the stencil will occupy 13 triangles on uniform meshes. In can be shown that such Laplacians are not more accurate than the vertex-based Laplacian but will lead to more expensive matrix vector multiplications in the solver procedure. We therefore have not tried these Laplacians thus far.</p>
      <p id="d2e3215">For the C-grid type of discretization of MPAS-Ocean and ICON-o the vector invariant form of Laplacians presents the main interest. The locations of normal velocities are given by small red circles in Fig. <xref ref-type="fig" rid="F1"/>b and d. The divergence will be computed at vertices for the hex-C grid and at triangles for triangular C-grid, and vice versa for relative vortices. On uniform meshes 11 normal velocities will be involved in computations. These operators have not been implemented yet, but this might be done in future.</p>
</sec>
</sec>
<sec id="Ch1.S2.SS2">
  <label>2.2</label><title>Implementation</title>
      <p id="d2e3229">The computational process is divided into two phases: initialization and solution. The initialization stage is independent of the filtering scale and involves precomputing auxiliary arrays that are reused during the solution phase. This optimization strategy significantly reduces the overall computational time, particularly for large-scale problems. Python 3 was chosen as the primary programming language due to its widespread adoption in the Earth sciences community and its extensive ecosystem of libraries. The implementation is publicly available as open-source software on GitHub.</p>
<sec id="Ch1.S2.SS2.SSS1">
  <label>2.2.1</label><title>Initialization</title>
      <p id="d2e3239">The implementation of the implicit filter method involves precomputing several auxiliary arrays based on the mesh connectivity matrix. These arrays are independent of the filtering scale and can be reused for multiple filter applications. The non-zero coefficients of the <inline-formula><mml:math id="M131" display="inline"><mml:mi mathvariant="bold">D</mml:mi></mml:math></inline-formula> operator are determined using Eq. (<xref ref-type="disp-formula" rid="Ch1.E3"/>) and can be efficiently computed using sparse matrix algebra. To further enhance the computational performance, JAX's just-in-time compilation and vectorization capabilities were employed, resulting in a speedup of approximately <inline-formula><mml:math id="M132" display="inline"><mml:mrow><mml:mn mathvariant="normal">100</mml:mn><mml:mo>×</mml:mo></mml:mrow></mml:math></inline-formula> compared to a pure NumPy implementation. The precomputed auxiliary arrays can be saved to disk to reduce the computational overhead for subsequent filter applications. This approach leverages NumPy's file I/O capabilities and promotes efficient reuse of precomputed data across multiple filter scales. The time required for precomputation is  approximately several minutes. In the case of high-resolution data (see Sect. <xref ref-type="sec" rid="Ch1.S3"/>) it took 15 m 40 s.</p>
</sec>
<sec id="Ch1.S2.SS2.SSS2">
  <label>2.2.2</label><title>Solving linear system</title>
      <p id="d2e3271">After computing the coefficients of the <inline-formula><mml:math id="M133" display="inline"><mml:mi mathvariant="bold">D</mml:mi></mml:math></inline-formula> operator, they are assembled into a sparse matrix using SciPy's implementation of compressed sparse column (CSC) matrices. The <inline-formula><mml:math id="M134" display="inline"><mml:mi mathvariant="bold">S</mml:mi></mml:math></inline-formula> operator is then calculated based on either Eqs. (<xref ref-type="disp-formula" rid="Ch1.E4"/>) or (<xref ref-type="disp-formula" rid="Ch1.E5"/>). Following the suggestion of <xref ref-type="bibr" rid="bib1.bibx6" id="text.16"/>, the product of <inline-formula><mml:math id="M135" display="inline"><mml:mi mathvariant="bold">S</mml:mi></mml:math></inline-formula> and <inline-formula><mml:math id="M136" display="inline"><mml:mi mathvariant="italic">ϕ</mml:mi></mml:math></inline-formula> is subtracted from <inline-formula><mml:math id="M137" display="inline"><mml:mi mathvariant="italic">ϕ</mml:mi></mml:math></inline-formula> to simplify the solution of the linear system (Eq. <xref ref-type="disp-formula" rid="Ch1.E1"/>). The resulting modified <inline-formula><mml:math id="M138" display="inline"><mml:mi mathvariant="italic">ϕ</mml:mi></mml:math></inline-formula> is then used by the conjugate gradient solver along with <inline-formula><mml:math id="M139" display="inline"><mml:mi mathvariant="bold">S</mml:mi></mml:math></inline-formula>. A solver tolerance of 10<sup>−9</sup> was used for convergence.</p>
      <p id="d2e3346">Several alternative solvers, including the generalized minimal residual method (GMRES), were tested, but the conjugate gradient method consistently exhibited the best performance. The use of a preconditioner (incomplete LU factorization) was also investigated, but it did not lead to significant performance improvements.</p>
      <p id="d2e3349">To harness the parallel processing capabilities offered by GPUs, the CuPy library was employed. CuPy provides an identical interface to SciPy and requires minimal modifications to the method implementation. This library is optimized for NVIDIA GPUs but also supports graphics cards from other vendors, such as AMD. By utilizing CuPy, the algorithm maintains independence from both the operating system and hardware vendors.</p>
</sec>
</sec>
<sec id="Ch1.S2.SS3">
  <label>2.3</label><title>Convolution filter</title>
      <p id="d2e3361">To make a comparison with the explicit filter, it is necessary to implement the box filter method proposed by <xref ref-type="bibr" rid="bib1.bibx2" id="text.17"/>. The crucial aspect involves defining the convolution kernel. The following formula was used for the low-pass method:

            <disp-formula id="Ch1.E8" content-type="numbered"><label>8</label><mml:math id="M141" display="block"><mml:mrow><mml:mi>G</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold">x</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mi>A</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>-</mml:mo><mml:mi>tanh⁡</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:mi>c</mml:mi><mml:mfenced open="(" close=")"><mml:mrow><mml:mo>|</mml:mo><mml:mi mathvariant="bold">x</mml:mi><mml:mo>|</mml:mo><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1.75</mml:mn><mml:mo>/</mml:mo><mml:msub><mml:mi>k</mml:mi><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub></mml:mrow></mml:mfenced><mml:mo>/</mml:mo><mml:mi>a</mml:mi></mml:mrow></mml:mfenced></mml:mrow></mml:mfenced><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>

          Here, <inline-formula><mml:math id="M142" display="inline"><mml:mi>A</mml:mi></mml:math></inline-formula> is a normalizing factor, ensuring that <inline-formula><mml:math id="M143" display="inline"><mml:mrow><mml:mo>∫</mml:mo><mml:mi>G</mml:mi><mml:mi>d</mml:mi><mml:mi mathvariant="bold">x</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:math></inline-formula>; <inline-formula><mml:math id="M144" display="inline"><mml:mi>c</mml:mi></mml:math></inline-formula> is the filter sharpness factor set to 1.5; and <inline-formula><mml:math id="M145" display="inline"><mml:mi>a</mml:mi></mml:math></inline-formula> is a mesh resolution. The combination <inline-formula><mml:math id="M146" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.75</mml:mn><mml:mo>/</mml:mo><mml:msub><mml:mi>k</mml:mi><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> corresponds to <inline-formula><mml:math id="M147" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">ℓ</mml:mi><mml:mi mathvariant="normal">box</mml:mi></mml:msub><mml:mo>/</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:math></inline-formula>. It is replaced by <inline-formula><mml:math id="M148" display="inline"><mml:mrow><mml:mn mathvariant="normal">3.05</mml:mn><mml:mo>/</mml:mo><mml:msub><mml:mi>k</mml:mi><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> for the high-pass method.</p>
      <p id="d2e3507">To implement this method, JAX was used to create the kernel matrix, while SciPy (in the case of CPU) and CuPy (in the case of GPU) were employed to apply the matrix to the data.</p>
</sec>
</sec>
<sec id="Ch1.S3">
  <label>3</label><title>Data</title>
      <p id="d2e3519">The model data used were generated by the Finite-Element/volumE Sea ice-Ocean Model version 2 (FESOM2) simulation. FESOM2 is a multi-resolution sea ice–ocean model that solves the ocean primitive equations on unstructured meshes <xref ref-type="bibr" rid="bib1.bibx4" id="paren.18"/>. The sea ice module, that is part of the model, is formulated on the same meshes as the ocean module. Configuration of the model has horizontal resolution of 1 km in the entire Arctic Ocean, which smoothly coarsens to 30 km in the rest of the global ocean. There are 70 <inline-formula><mml:math id="M149" display="inline"><mml:mi>z</mml:mi></mml:math></inline-formula> levels in the vertical direction, with 5 m spacing within the upper 100 m. ERA5 atmospheric reanalysis fields <xref ref-type="bibr" rid="bib1.bibx7" id="paren.19"/> were used to force the model. The model was initialized from the PHC3 climatology <xref ref-type="bibr" rid="bib1.bibx15" id="paren.20"/> and run for 11 years starting from 2010. The first 4 years was considered a spinup. The realizations of velocity field from the last 7 years (2014–2020) were used in this work.</p>
      <p id="d2e3538">In order to be able to directly use the box filter on this dataset it was interpolated to a regular rectangular grid with 0.01° resolution. Prior to interpolation, the coordinate transform was performed such that the Arctic Ocean corresponds to the equatorial region in new coordinates. Using this rotation minimizes the error caused by using a regular longitude/latitude grid, since it ensures that the grid cells are very close to squares. Linear interpolation was used. As this is a very costly process, the domain was restricted to areas north of 73° latitude on the original mesh. The final mesh had dimension of 3200 by 3200 cells, resulting in 10 240 000 cell mesh.</p>
</sec>
<sec id="Ch1.S4">
  <label>4</label><title>Results</title>
      <p id="d2e3549">Figure <xref ref-type="fig" rid="F2"/> illustrates the application of the implicit filter for high-pass filtering of the velocity field. The left panel shows a snapshot of the absolute value of velocity at 70 m depth. Together with eddies and jet flows it shows a region with smoothed velocities, presumably caused by the sea ice drift. The velocity field in the right panel is obtained by subtracting the velocity field coarse grained with the scale of 100 km, which only leaves the small scales. Using the implicit filter allows one to perform this operation on the native mesh and on the spherical Earth surface, without the need of regridding the data. The continental-break currents are rather strong and carry a significant part of kinetic energy. As is seen comparing the panels of Fig. <xref ref-type="fig" rid="F2"/>, they contribute very substantially to a large-scale part of the flow. One can expect therefore that energy spectra computed for the entire Arctic Ocean will have an elevated spectral density at large scales.</p>

      <fig id="F2" specific-use="star"><label>Figure 2</label><caption><p id="d2e3558">A snapshot of ocean currents at 70 m depth (logarithmic scale). Panel <bold>(a)</bold> shows the simulated results, while panel <bold>(b)</bold> shows the results of high-pass filtering with the scale of 100 km. The implicit Laplacian filter has been used over data on a native unstructured grid, taking into account spherical geometry.</p></caption>
        <graphic xlink:href="https://gmd.copernicus.org/articles/18/6541/2025/gmd-18-6541-2025-f02.png"/>

      </fig>

      <fig id="F3" specific-use="star"><label>Figure 3</label><caption><p id="d2e3575">Wavenumber spectra for the entire Arctic Ocean. The red line corresponds to the implicit harmonic filter applied to the data on the original grid. The blue and green lines correspond to the implicit harmonic and explicit box filter applied to the interpolated data. The highest wavenumber is <inline-formula><mml:math id="M150" display="inline"><mml:mrow><mml:mi mathvariant="italic">π</mml:mi><mml:mo>/</mml:mo><mml:mi>h</mml:mi></mml:mrow></mml:math></inline-formula>, where <inline-formula><mml:math id="M151" display="inline"><mml:mi>h</mml:mi></mml:math></inline-formula> is the height of triangles of the original grid.</p></caption>
        <graphic xlink:href="https://gmd.copernicus.org/articles/18/6541/2025/gmd-18-6541-2025-f03.png"/>

      </fig>

      <p id="d2e3604">Figure <xref ref-type="fig" rid="F3"/> presents kinetic energy spectra obtained with the implicit Laplacian filter using the original data (on the original triangular mesh) (red line) and interpolated data (blue). They are compared with the spectrum obtained by coarse graining with the explicit box filter (green). The latter is computed ignoring the Earth curvature (the cosine of latitude is replaced with 1), enabling the convolution via the Fourier transform. The implicit filter allows us to compute the spectra of the interpolated data on both the longitude–latitude mesh and on its flat geometry approximation. Although the coarse-grained velocities show some small differences (25 % at the largest scale) in these two cases, the energy spectra turn out to be almost identical, which substantiates the approach taken for the box filter.</p>

      <fig id="F4" specific-use="star"><label>Figure 4</label><caption><p id="d2e3612">Comparison between the spectra computed with the box filter and the implicit harmonic filter applied to data on native grid and interpolated to regular grid.</p></caption>
        <graphic xlink:href="https://gmd.copernicus.org/articles/18/6541/2025/gmd-18-6541-2025-f04.png"/>

      </fig>

      <p id="d2e3621">As seen in Fig. <xref ref-type="fig" rid="F3"/>, the implicit Laplacian filter and the explicit box filter provide matching results (1 % difference at the largest scale). The largest wavenumber is <inline-formula><mml:math id="M152" display="inline"><mml:mrow><mml:mi mathvariant="italic">π</mml:mi><mml:mo>/</mml:mo><mml:mi>h</mml:mi><mml:mo>≈</mml:mo><mml:mo>=</mml:mo><mml:mn mathvariant="normal">4</mml:mn></mml:mrow></mml:math></inline-formula> cycle per kilometer, where <inline-formula><mml:math id="M153" display="inline"><mml:mi>h</mml:mi></mml:math></inline-formula> is the height of triangles of the original mesh. One can note that for larger scales there is a small shift between the results computed on original and regular meshes. We guess that this is related to the effect of no-flux boundary conditions <xref ref-type="bibr" rid="bib1.bibx5" id="paren.21"/>, which are applied along the boundary between water and land on the original mesh but along the boundary of interpolation mesh in the other case. Interestingly, for the interpolated data, the spectra for the implicit and box filter are very close despite the difference in boundary conditions. Note that the spectra obtained using the implicit Laplacian filter are smoother than spectra based on the box filter. This correlates with better spectral sensitivity of the latter, which is, however, worse than the sensitivity of the biharmonic filter.</p>
      <p id="d2e3654">In Fig. <xref ref-type="fig" rid="F4"/> we compare the spectra computed with harmonic and biharmonic filters. For the biharmonic filters, the conjugate gradient algorithm requires more iterations to achieve required tolerance. This results in longer computation, and on large scales it might not converge, so we stopped on the wavenumber <inline-formula><mml:math id="M154" display="inline"><mml:mrow><mml:msub><mml:mi>k</mml:mi><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub><mml:mo>≈</mml:mo><mml:mn mathvariant="normal">0.025</mml:mn></mml:mrow></mml:math></inline-formula> cycle per km, which corresponds to the wavelength of 250 km. While the spectra are close on the wavelength larger than approximately 12 km, they start to deviate at smaller wavelengths. This could have a numerical explanation at wavelengths that correspond to grid scales, as discrete Laplacians deviate from their continuous counterpart at grid scales, and this deviation is larger in biharmonic operators. However, the spectra in Fig. <xref ref-type="fig" rid="F4"/> also disagree at larger scales, which is an indication that the real spectra have a slope steeper than <inline-formula><mml:math id="M155" display="inline"><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:math></inline-formula> at these scales. We give elementary illustrations in Sect. <xref ref-type="sec" rid="Ch1.S6"/>.</p>
</sec>
<sec id="Ch1.S5">
  <label>5</label><title>Performance benchmarks</title>
      <p id="d2e3697">To facilitate the computational demands of this study, extensive computational resources were generously provided by the Jülich Supercomputing Centre (JSC). As the primary computing environment, a single node from the JUWELS Booster Module was used. This node was made of two AMD EPYC Rome 7402 CPUs, 512 GB of DDR4 RAM and four NVIDIA A100 GPUs, each equipped with 40 GB of HBM2e memory. To optimize computational efficiency and resource utilization, only a single GPU was employed for the duration of this study.</p>
      <p id="d2e3700">The performance evaluation of the implicit filter method focuses on its computational efficiency, assessed by measuring the execution time required to process data. However, data access from disk can introduce substantial overhead, potentially influencing the overall execution time. To isolate the computational efficiency of the method, IO time, representing the duration spent reading and writing data to disk, is excluded from the execution time measurements. To ensure the accuracy and consistency of time measurements, each configuration is executed 10 times, and the mean value is taken.</p>
      <p id="d2e3703">As evident from Fig. <xref ref-type="fig" rid="F5"/>, the performance of the implicit filter method exhibits a linear relationship with mesh size above 10<sup>6</sup> nodes. Furthermore, the method effectively handles meshes with over 11 million nodes, achieving processing times of approximately 5 s for a 100 km filter scale. Such remarkable efficiency is attributed to the method's inherent scalability, enabling it to process data efficiently on increasingly large meshes without performance degradation.</p>

      <fig id="F5" specific-use="star"><label>Figure 5</label><caption><p id="d2e3720">Execution time of implicit filter on synthetic data. Presenting data on both a Cartesian and a spherical mesh. Filter size of 100 km was used at all cases. Dashed lines illustrate fitted linear functions.</p></caption>
        <graphic xlink:href="https://gmd.copernicus.org/articles/18/6541/2025/gmd-18-6541-2025-f05.png"/>

      </fig>

      <p id="d2e3729">This capability to handle large meshes is essential for analyzing real-world datasets, which often cover vast areas and demand high-resolution meshes for accurate representation. The implicit filter's scalability ensures its effectiveness in processing these large datasets, making it suitable not only for current state-of-the-art meshes but also for future generations of increasingly high-resolution meshes.</p>

      <fig id="F6" specific-use="star"><label>Figure 6</label><caption><p id="d2e3734">Execution time of implicit filter on FESOM2 output. Results show computation time of both vector and scalar data on a mesh with 11 million nodes (see Sect. <xref ref-type="sec" rid="Ch1.S3"/>). Dashed lines illustrate fitted linear functions.</p></caption>
        <graphic xlink:href="https://gmd.copernicus.org/articles/18/6541/2025/gmd-18-6541-2025-f06.png"/>

      </fig>

      <p id="d2e3745">For the benchmarks, a fully unstructured mesh was used, which has 11 538 465 surface nodes. The measured results of the execution time, as shown in Fig. <xref ref-type="fig" rid="F6"/>, exhibit a close-to-linear dependency with filter scale for those larger than 50 km. In particular, computation for a filter scale up to approximately 100 km is done within 6 s, even for a mesh with more than 10 million nodes and a resolution of about 1 km in the focus area. As this is the range of scales that is of the most interest, it shows remarkable performance. Convergence becomes more challenging for larger scales, and results diverge from a linear dependency. The scales where those issues arise depend on specific data, but the scale is typically larger than 1000 km.</p>
</sec>
<sec id="Ch1.S6">
  <label>6</label><title>Some comments</title>
      <p id="d2e3758">The present implementation supports triangular meshes of FESOM2 and produces coarse-grained fields at mesh vertices. Since the original discrete horizontal velocities in FESOM2 are at the centers of triangles, computation of coarse-grained velocities at triangles was also attempted and found to lead to very close results regarding the kinetic energy spectra. Vertex computations should therefore be preferred, as they require smaller matrices. Nevertheless, triangle-based computations might be required if dissipation is studied, as the dissipation tendency is noisy. They are under implementation and are based on the simplified Laplacian (Eq. <xref ref-type="disp-formula" rid="Ch1.E7"/>). The support of C-grid type discretization for ICON-o discretization (scalar Laplacians for data on circumcenters of triangles and vector-invariant Laplacians for velocities normal to edges) and the support of regular quadrilateral C-grids will be added in the near future. Our aim is a tool that supports different meshes.</p>
      <p id="d2e3763">The calculation of spectra can be based on the low-pass method, as proposed by <xref ref-type="bibr" rid="bib1.bibx13" id="text.22"/> and used in <xref ref-type="bibr" rid="bib1.bibx5" id="text.23"/>. A new method, based on high-pass filtering, was proposed recently by <xref ref-type="bibr" rid="bib1.bibx17" id="text.24"/>, after this paper was submitted. The method only modifies the calculations of spectra but relies on the same coarse-grained fields as the low-pass method. We added it to our implementation, which required minor updates. According to the analysis by <xref ref-type="bibr" rid="bib1.bibx17" id="text.25"/>, the new method can handle much steeper spectra than the low-pass method, and we illustrate some points here. As discussed in <xref ref-type="bibr" rid="bib1.bibx5" id="text.26"/>, the low-pass method based on implicit Laplacian filter can handle spectra which are not steeper than <inline-formula><mml:math id="M157" display="inline"><mml:mrow><mml:msup><mml:mi>k</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>. The use of implicit biharmonic filter extends this range to <inline-formula><mml:math id="M158" display="inline"><mml:mrow><mml:msup><mml:mi>k</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">5</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>. Based on the analysis of <xref ref-type="bibr" rid="bib1.bibx17" id="text.27"/>, these ranges extend to <inline-formula><mml:math id="M159" display="inline"><mml:mrow><mml:msup><mml:mi>k</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">5</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M160" display="inline"><mml:mrow><mml:msup><mml:mi>k</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">7</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> respectively with the high-pass method.</p>
      <p id="d2e3841">In Fig. <xref ref-type="fig" rid="F7"/> we present the spectra computed using the implicit filters of different order given the Fourier spectrum <inline-formula><mml:math id="M161" display="inline"><mml:mrow><mml:msub><mml:mi>E</mml:mi><mml:mi>k</mml:mi></mml:msub><mml:mo>∼</mml:mo><mml:msup><mml:mi>k</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msup><mml:mo>/</mml:mo><mml:mo>(</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>+</mml:mo><mml:mo>(</mml:mo><mml:mi>k</mml:mi><mml:mo>/</mml:mo><mml:msup><mml:mi>k</mml:mi><mml:mo>*</mml:mo></mml:msup><mml:msup><mml:mo>)</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula>, with <inline-formula><mml:math id="M162" display="inline"><mml:mrow><mml:msup><mml:mi>k</mml:mi><mml:mo>*</mml:mo></mml:msup><mml:mo>=</mml:mo><mml:mn mathvariant="normal">30</mml:mn></mml:mrow></mml:math></inline-formula> <inline-formula><mml:math id="M163" display="inline"><mml:mrow><mml:msub><mml:mi>k</mml:mi><mml:mi mathvariant="normal">min</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, where <inline-formula><mml:math id="M164" display="inline"><mml:mrow><mml:msub><mml:mi>k</mml:mi><mml:mi mathvariant="normal">min</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> corresponds to the domain wavelength taken as 2048 km. The spectra were computed using the analytical expression for the form factor and the Fourier symbol of one-dimensional discrete Laplacian given in <xref ref-type="bibr" rid="bib1.bibx5" id="text.28"/>. The dark- and light-blue (thick black and gray) curves correspond, respectively, to the Laplacian and biharmonic filters used with the low-pass (high-pass) method.</p>

      <fig id="F7"><label>Figure 7</label><caption><p id="d2e3938">Theoretical energy spectra obtained using Laplacian (dark blue) and bi-Laplacian (light blue) implicit filters with low-pass method. The thick black and gray curves show the same but for the high-pass method. The Fourier spectrum is shown by the thin red line, and the straight black line corresponds to a slope of <inline-formula><mml:math id="M165" display="inline"><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:math></inline-formula>.</p></caption>
        <graphic xlink:href="https://gmd.copernicus.org/articles/18/6541/2025/gmd-18-6541-2025-f07.png"/>

      </fig>

      <p id="d2e3957">While one expects that the Laplacian filter will fail for large <inline-formula><mml:math id="M166" display="inline"><mml:mi>k</mml:mi></mml:math></inline-formula> in the case of low-pass method, the dark-blue line has a slope flatter than <inline-formula><mml:math id="M167" display="inline"><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:math></inline-formula> over a range of wavenumbers where the real slope is <inline-formula><mml:math id="M168" display="inline"><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">4</mml:mn></mml:mrow></mml:math></inline-formula>. One can erroneously interpret this interval as a true spectrum (since it is flatter than <inline-formula><mml:math id="M169" display="inline"><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:math></inline-formula>). This behavior is caused by aliasing from the side of small wavenumbers where the spectral energy density is much larger. With the high-pass method the spectrum is much closer to the Fourier spectrum even for the Laplacian filter (thick black line) and is only slightly worse than the result with biharmonic filter for the low-pass method. Increasing the order of filter leads to very accurate behavior (gray curve). Thus, while the high-pass method should be a preferred one, there are also arguments in favor of higher-order filters.</p>
      <p id="d2e3998">The illustration in Fig. <xref ref-type="fig" rid="F7"/> stresses the fact that one generally needs to test the results obtained by sequential filtering if they show spectral slopes approaching their critical limits. In any case, as mentioned by <xref ref-type="bibr" rid="bib1.bibx17" id="text.29"/>, this is a strong argument in favor of the high-pass method or higher-order filters. Guided by this fact, the behavior shown in Fig. <xref ref-type="fig" rid="F4"/>, and the possibility to compute the Fourier spectrum for the interpolated data, we compare the spectra obtained with implicit harmonic and biharmonic filters with the Fourier spectrum in Fig. <xref ref-type="fig" rid="F8"/>. The spectrum obtained with the harmonic filter deviates from the Fourier spectrum, but the biharmonic filter follows the Fourier spectrum very closely. This issue with the harmonic filter can be eased using the high-pass filter method, resulting in spectra with a slope steeper than <inline-formula><mml:math id="M170" display="inline"><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:math></inline-formula>, without the need for the additional compute required by the biharmonic filter.</p>

      <fig id="F8" specific-use="star"><label>Figure 8</label><caption><p id="d2e4022">Fourier energy spectrum compared to the spectra obtained with implicit harmonic and biharmonic filters for the data interpolated to a regular grid. For the harmonic filter, both low-pass and high-pass methods were used.</p></caption>
        <graphic xlink:href="https://gmd.copernicus.org/articles/18/6541/2025/gmd-18-6541-2025-f08.png"/>

      </fig>

      <p id="d2e4031">The use of the biharmonic filter is computationally more expensive, and even worse, the convergence can be lost for large <inline-formula><mml:math id="M171" display="inline"><mml:mi mathvariant="normal">ℓ</mml:mi></mml:math></inline-formula>, which correspond to wavelengths of domain size in the case of very fine meshes if the conjugate gradient solver is used. At present, we rely on the conjugate gradient solver available in Python, and we work on preconditioners and solution methods that will remove these difficulties. The improved convergence for biharmonic filter is important, as it opens up perspectives of using filters of higher order, as explained in <xref ref-type="bibr" rid="bib1.bibx6" id="text.30"/> and <xref ref-type="bibr" rid="bib1.bibx5" id="text.31"/>.</p>
      <p id="d2e4048">It is reminded that the wavenumber scale <inline-formula><mml:math id="M172" display="inline"><mml:mrow><mml:msub><mml:mi>k</mml:mi><mml:mi mathvariant="normal">ℓ</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>/</mml:mo><mml:mi mathvariant="normal">ℓ</mml:mi></mml:mrow></mml:math></inline-formula> used by us corresponds to the wavenumber of the Fourier spectrum. This means that <inline-formula><mml:math id="M173" display="inline"><mml:mi mathvariant="normal">ℓ</mml:mi></mml:math></inline-formula> corresponds to <inline-formula><mml:math id="M174" display="inline"><mml:mrow><mml:mi mathvariant="italic">λ</mml:mi><mml:mo>/</mml:mo><mml:mo>(</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:mi mathvariant="italic">π</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula>, with <inline-formula><mml:math id="M175" display="inline"><mml:mi mathvariant="italic">λ</mml:mi></mml:math></inline-formula> the wavelength. This requires care when comparing our approach to that based on other filters, as their meaning of <inline-formula><mml:math id="M176" display="inline"><mml:mi mathvariant="normal">ℓ</mml:mi></mml:math></inline-formula> might be different. For the box-type filter, <inline-formula><mml:math id="M177" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="normal">ℓ</mml:mi><mml:mi mathvariant="normal">box</mml:mi></mml:msub><mml:mo>≈</mml:mo><mml:mn mathvariant="normal">3.5</mml:mn><mml:mi mathvariant="normal">ℓ</mml:mi></mml:mrow></mml:math></inline-formula> or <inline-formula><mml:math id="M178" display="inline"><mml:mrow><mml:mn mathvariant="normal">6.1</mml:mn><mml:mi mathvariant="normal">ℓ</mml:mi></mml:mrow></mml:math></inline-formula> for the low-pass and high-pass method.</p>
</sec>
<sec id="Ch1.S7" sec-type="conclusions">
  <label>7</label><title>Conclusions</title>
      <p id="d2e4145">This work presents a high-performance implementation of a novel method for extracting spatial spectra from unstructured mesh data, offering a compelling alternative to conventional methods. The open-access code and elementary documentation can be found at GitHub (<uri>https://github.com/FESOM/implicit_filter</uri>, last access: 25 August 2025) and Zenodo <xref ref-type="bibr" rid="bib1.bibx9" id="paren.32"/>. Unlike its predecessors, the implicit filter method directly operates on unstructured meshes, such as triangular and quasi-hexagonal meshes, eliminating the need for computationally expensive interpolation to regular grids. This capability makes the implicit filter directly applicable to the output of unstructured-mesh ocean circulation models, surpassing the limitations of traditional methods.</p>
      <p id="d2e4154">To enhance practical applicability, the implicit filter method is implemented in Python using a high-performance algorithm that employs a two-phase approach to optimize computational efficiency. The first phase involves precomputing mesh-specific data, significantly reducing the computational load during the actual filtering process. This optimization strategy ensures efficient resource utilization and minimizes overall execution time. The second phase can use GPU-accelerated sparse matrix algebra. Depending on the conditions, use of the GPU reduces computation time by up to 2 orders of magnitude. This computational prowess enables the processing of high-resolution data from meshes with millions of surface vertices within seconds.</p>
      <p id="d2e4157">The efficacy of the implicit filter method is demonstrated by applying it to compute spatial spectra of ocean currents from high-resolution general circulation model output. The results obtained from the proposed method exhibit agreement with those obtained using traditional methods, such as a box filter, validating its accuracy and robustness. Furthermore, the method's ability to handle unstructured meshes directly provides a more comprehensive analysis compared to traditional methods that require interpolation to a regular grid. However one needs to note that for spectra with slopes steeper than <inline-formula><mml:math id="M179" display="inline"><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:math></inline-formula>, a biharmonic filter needs to be used.</p>
</sec>

      
      </body>
    <back><notes notes-type="codedataavailability"><title>Code and data availability</title>

      <p id="d2e4174">Source code, along with documentation and examples, is available at <uri>https://github.com/FESOM/implicit_filter</uri> and Zenodo (<ext-link xlink:href="https://doi.org/10.5281/zenodo.10907365" ext-link-type="DOI">10.5281/zenodo.10907365</ext-link>, <xref ref-type="bibr" rid="bib1.bibx9" id="altparen.33"/>). All scripts used for making figures presented in this work are available on Zenodo (<ext-link xlink:href="https://doi.org/10.5281/zenodo.10957614" ext-link-type="DOI">10.5281/zenodo.10957614</ext-link>, <xref ref-type="bibr" rid="bib1.bibx10" id="altparen.34"/>).</p>

      <p id="d2e4192">Data used for Fig. <xref ref-type="fig" rid="F3"/> are not included as they would require files with size exceeding the capacity of the Zenodo repository. As this figure is only for illustrative purposes, a similar figure can be obtained using any data and included example scripts (<ext-link xlink:href="https://doi.org/10.5281/zenodo.10907365" ext-link-type="DOI">10.5281/zenodo.10907365</ext-link>, <xref ref-type="bibr" rid="bib1.bibx9" id="altparen.35"/>).</p>
  </notes><notes notes-type="authorcontribution"><title>Author contributions</title>

      <p id="d2e4206">KN: software development, manuscript writing, data analysis, SD: manuscript writing, supervision, VM: running simulation, software testing, CL: processing data, software development</p>
  </notes><notes notes-type="competinginterests"><title>Competing interests</title>

      <p id="d2e4212">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="d2e4218">This publication is part of the EERIE project funded by the European Union. Views and opinions expressed are however those of the author(s) only and do not necessarily reflect those of the European Union or the European Climate Infrastructure and Environment Executive Agency (CINEA). Neither the European Union nor the granting authority can be held responsible for them.  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. While Copernicus Publications makes every effort to include appropriate place names, the final responsibility lies with the authors.</p>
  </notes><ack><title>Acknowledgements</title><p id="d2e4227">This work has received funding from the Swiss State Secretariat for Education, Research and Innovation (SERI) under contract 22.00366. This work was funded by UK Research and Innovation (UKRI) under the UK government's Horizon Europe funding guarantee (grant number 10057890, 10049639, 10040510, 10040984). It was also funded by the European Commission, HORIZON EUROPE Framework Programme (grant no. 101081383).</p><p id="d2e4229">This work is also a contribution to projects M3 and S2 of the Collaborative Research Centre TRR181 “Energy Transfer in Atmosphere and Ocean”, funded by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) – project no. 274762653.</p><p id="d2e4231">This publication is part of the EERIE project (grant agreement no. 101081383) funded by the European Union. Views and opinions expressed are however those of the author only and do not necessarily reflect those of the European Union or the European Climate Infrastructure and Environment Executive Agency (CINEA). Neither the European Union nor the granting authority can be held responsible for them.</p><p id="d2e4233">Authors acknowledge usage of ChatGPT by OpenAI version 3.5 in preparation of the manuscript. It was used for linguistic and editorial purposes in an earlier draft.</p></ack><notes notes-type="financialsupport"><title>Financial support</title>

      <p id="d2e4239">This research has been supported by the European Commission, HORIZON EUROPE Framework Programme (grant no. 101081383); the UK Research and Innovation (grant nos. 10057890, 10049639, 10040510 and 10040984); the Staatssekretariat für Bildung, Forschung und Innovation (grant no. 22.00366); and the Deutsche Forschungsgemeinschaft (grant no. 274762653).  The article processing charges for this open-access publication were covered by the Alfred-Wegener-Institut  Helmholtz-Zentrum für Polar- und Meeresforschung.</p>
  </notes><notes notes-type="reviewstatement"><title>Review statement</title>

      <p id="d2e4252">This paper was edited by Olivier Marti and reviewed by Ian Grooms and one anonymous referee.</p>
  </notes><ref-list>
    <title>References</title>

      <ref id="bib1.bibx1"><label>Aluie(2019)</label><mixed-citation>Aluie, H.: Convolutions on the sphere: Commutation with differential operators, GEM-Int. J. Geomath., 10, 9, <ext-link xlink:href="https://doi.org/10.1007/s13137-019-0123-9" ext-link-type="DOI">10.1007/s13137-019-0123-9</ext-link>, 2019.</mixed-citation></ref>
      <ref id="bib1.bibx2"><label>Aluie et al.(2018)Aluie, Hecht, and Vallis</label><mixed-citation>Aluie, H., Hecht, M., and Vallis, G. K.: Mapping the energy cascade in the North Atlantic Ocean: The coarse-graining approach, J. Phys. Oceanogr., 48, 225–244, <ext-link xlink:href="https://doi.org/10.1175/jpo-d-17-0100.1" ext-link-type="DOI">10.1175/jpo-d-17-0100.1</ext-link>, 2018. </mixed-citation></ref>
      <ref id="bib1.bibx3"><label>Buzzicotti et al.(2023)Buzzicotti, Storer, Khatri, Griffies, and Aluie</label><mixed-citation>Buzzicotti, M., Storer, B. A., Khatri, H., Griffies, S. M., and Aluie, H.: Spatio-temporal coarse-graining decomposition of the global ocean geostrophic kinetic energy, J. Adv. Model. Earth Syst., 15, e2023MS003693, <ext-link xlink:href="https://doi.org/10.1029/2023MS003693" ext-link-type="DOI">10.1029/2023MS003693</ext-link>, 2023.</mixed-citation></ref>
      <ref id="bib1.bibx4"><label>Danilov et al.(2017)Danilov, Sidorenko, Wang, and Jung</label><mixed-citation>Danilov, S., Sidorenko, D., Wang, Q., and Jung, T.: The Finite-volumE Sea ice–Ocean Model (FESOM2), Geosci. Model Dev., 10, 765–789, <ext-link xlink:href="https://doi.org/10.5194/gmd-10-765-2017" ext-link-type="DOI">10.5194/gmd-10-765-2017</ext-link>, 2017.</mixed-citation></ref>
      <ref id="bib1.bibx5"><label>Danilov et al.(2023)Danilov, Juricke, Nowak, Sidorenko, and Wang</label><mixed-citation>Danilov, S., Juricke, S., Nowak, K., Sidorenko, D., and Wang, Q.: Computing spatial spectra using implicit filters, Zenodo [data set], <ext-link xlink:href="https://doi.org/10.5281/zenodo.8171835" ext-link-type="DOI">10.5281/zenodo.8171835</ext-link>, 2023.</mixed-citation></ref>
      <ref id="bib1.bibx6"><label>Guedot et al.(2015)Guedot, Lartigue, and Moureau</label><mixed-citation>Guedot, L., Lartigue, G., and Moureau, V.: Design of implicit high-order filters on unstructured grids for the identification of large-scale features in large-eddy simulation and application to a swirl burner, Phys. Fluids, 27, 045107, <ext-link xlink:href="https://doi.org/10.1063/1.4917280" ext-link-type="DOI">10.1063/1.4917280</ext-link>, 2015.</mixed-citation></ref>
      <ref id="bib1.bibx7"><label>Hersbach et al.(2020)Hersbach, Bell, Berrisford, Hirahara, Hornyi, Muoz Sabater, Nicolas, Peubey, Radu, Schepers, Simmons, Soci, Abdalla, Abellan, Balsamo, Bechtold, Biavati, Bidlot, Bonavita, and Thpaut</label><mixed-citation>Hersbach, H., Bell, B., Berrisford, P., Hirahara, S., Horányi, A., Muñoz Sabater, J., Nicolas, J., Peubey, C., Radu, R., Schepers, D., Simmons, A., Soci, C., Abdalla, S., Abellan, X., Balsamo, G., Bechtold, P., Biavati, G., Bidlot, J., Bonavita, M., and Thépaut, J.-N.: The ERA5 global reanalysis, Q. J. Roy. Meteorol. Soc.,  <ext-link xlink:href="https://doi.org/10.1002/qj.3803" ext-link-type="DOI">10.1002/qj.3803</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx8"><label>Korn(2017)</label><mixed-citation> Korn, P.: Formulation of an unstructured grid model for global ocean dynamics, J. Comput. Phys., 339, 525–552, 2017.</mixed-citation></ref>
      <ref id="bib1.bibx9"><label>Nowak and Danilov(2024)</label><mixed-citation>Nowak, K. and Danilov, S.: Implicit filter: v1.0.0, Zenodo [data set and code], <ext-link xlink:href="https://doi.org/10.5281/zenodo.10907365" ext-link-type="DOI">10.5281/zenodo.10907365</ext-link>, 2024 (code also available at: <uri>https://github.com/FESOM/implicit_filter</uri>, last access: 25 August 2025).</mixed-citation></ref>
      <ref id="bib1.bibx10"><label>Nowak et al.(2024)Nowak, Danilov, Mller, and Liu</label><mixed-citation>Nowak, K., Danilov, S., Müller, V., and Liu, C.: Implementation of implicit filter for spatial spectra extraction, Zenodo [data set], <ext-link xlink:href="https://doi.org/10.5281/zenodo.10957614" ext-link-type="DOI">10.5281/zenodo.10957614</ext-link>, 2024.</mixed-citation></ref>
      <ref id="bib1.bibx11"><label>Rai et al.(2021)Rai, Hecht, Maltrud, and Aluie</label><mixed-citation>Rai, S., Hecht, M., Maltrud, M., and Aluie, H.: Scale of oceanic eddy killing by wind from global satellite observations, Sci. Adv., 7, eabf4920, <ext-link xlink:href="https://doi.org/10.1126/sciadv.abf4920" ext-link-type="DOI">10.1126/sciadv.abf4920</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx12"><label>Ringler et al.(2013)Ringler, Petersen, Higdon, Jacobsen, Maltrud, and Jones</label><mixed-citation> Ringler, T., Petersen, M., Higdon, R., Jacobsen, D., Maltrud, M., and Jones, P.: A multi-resolution approach to global ocean modelling, Ocean Model., 69, 211–232, 2013.</mixed-citation></ref>
      <ref id="bib1.bibx13"><label>Sadek and Aluie(2018)</label><mixed-citation>Sadek, M. and Aluie, H.: Extracting the spectrum of a flow by spatial filtering, Phys. Rev. Fluids, 3, 124610, <ext-link xlink:href="https://doi.org/10.1103/physrevfluids.3.124610" ext-link-type="DOI">10.1103/physrevfluids.3.124610</ext-link>, 2018.</mixed-citation></ref>
      <ref id="bib1.bibx14"><label>Schubert et al.(2020)Schubert, Gula, Greatbatch, Baschek, and Biastoch</label><mixed-citation>Schubert, R., Gula, J., Greatbatch, R. J., Baschek, B., and Biastoch, A.: The Submesoscale Kinetic Energy Cascade: Mesoscale Absorption of Submesoscale Mixed Layer Eddies and Frontal Downscale Fluxes, J. Phys. Oceanogr., 50, 2573–2589, <ext-link xlink:href="https://doi.org/10.1175/JPO-D-19-0311.1" ext-link-type="DOI">10.1175/JPO-D-19-0311.1</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx15"><label>Steele et al.(2001)Steele, Morley, and Ermold</label><mixed-citation>Steele, M., Morley, R., and Ermold, W.: PHC: A Global Ocean Hydrography with a High-Quality Arctic Ocean, J. Climate, 14, 2079–2087, <ext-link xlink:href="https://doi.org/10.1175/1520-0442(2001)014&lt;2079:PAGOHW&gt;2.0.CO;2" ext-link-type="DOI">10.1175/1520-0442(2001)014&lt;2079:PAGOHW&gt;2.0.CO;2</ext-link>, 2001.</mixed-citation></ref>
      <ref id="bib1.bibx16"><label>Storer et al.(2023)Storer, Buzzicotti, Khatri, Griffies, and Aluie</label><mixed-citation>Storer, B. A., Buzzicotti, M., Khatri, H., Griffies, S. M., and Aluie, H.: Global cascade of kinetic energy in the ocean and the atmospheric imprint, Sci. Adv., 9, eadi7420, <ext-link xlink:href="https://doi.org/10.1126/sciadv.adi7420" ext-link-type="DOI">10.1126/sciadv.adi7420</ext-link>, 2023.</mixed-citation></ref>
      <ref id="bib1.bibx17"><label>Zhao and Aluie(2025)</label><mixed-citation>Zhao, D. and Aluie, H.: Calculating spectra by sequential filtering, J. Renew. Sustain. Energ., 17, 013303, <ext-link xlink:href="https://doi.org/10.1063/5.0244909" ext-link-type="DOI">10.1063/5.0244909</ext-link>, 2025.</mixed-citation></ref>

  </ref-list></back>
    <!--<article-title-html>Implementation of implicit filters for spatial spectra extraction</article-title-html>
<abstract-html/>
<ref-html id="bib1.bib1"><label>Aluie(2019)</label><mixed-citation>
      
Aluie, H.: Convolutions on the sphere: Commutation with differential
operators, GEM-Int. J. Geomath., 10, 9, <a href="https://doi.org/10.1007/s13137-019-0123-9" target="_blank">https://doi.org/10.1007/s13137-019-0123-9</a>, 2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib2"><label>Aluie et al.(2018)Aluie, Hecht, and Vallis</label><mixed-citation>
      
Aluie, H., Hecht, M., and Vallis, G. K.: Mapping the energy cascade in the
North Atlantic Ocean: The coarse-graining approach, J. Phys. Oceanogr., 48, 225–244, <a href="https://doi.org/10.1175/jpo-d-17-0100.1" target="_blank">https://doi.org/10.1175/jpo-d-17-0100.1</a>, 2018.


    </mixed-citation></ref-html>
<ref-html id="bib1.bib3"><label>Buzzicotti et al.(2023)Buzzicotti, Storer, Khatri, Griffies, and
Aluie</label><mixed-citation>
      
Buzzicotti, M., Storer, B. A., Khatri, H., Griffies, S. M., and Aluie, H.:
Spatio-temporal coarse-graining decomposition of the global ocean geostrophic
kinetic energy, J. Adv. Model. Earth Syst., 15, e2023MS003693, <a href="https://doi.org/10.1029/2023MS003693" target="_blank">https://doi.org/10.1029/2023MS003693</a>, 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib4"><label>Danilov et al.(2017)Danilov, Sidorenko, Wang, and Jung</label><mixed-citation>
      
Danilov, S., Sidorenko, D., Wang, Q., and Jung, T.: The Finite-volumE Sea ice–Ocean Model (FESOM2), Geosci. Model Dev., 10, 765–789, <a href="https://doi.org/10.5194/gmd-10-765-2017" target="_blank">https://doi.org/10.5194/gmd-10-765-2017</a>, 2017.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib5"><label>Danilov et al.(2023)Danilov, Juricke, Nowak, Sidorenko, and
Wang</label><mixed-citation>
      
Danilov, S., Juricke, S., Nowak, K., Sidorenko, D., and Wang, Q.: Computing
spatial spectra using implicit filters, Zenodo [data set], <a href="https://doi.org/10.5281/zenodo.8171835" target="_blank">https://doi.org/10.5281/zenodo.8171835</a>, 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib6"><label>Guedot et al.(2015)Guedot, Lartigue, and Moureau</label><mixed-citation>
      
Guedot, L., Lartigue, G., and Moureau, V.: Design of implicit high-order
filters on unstructured grids for the identification of large-scale features
in large-eddy simulation and application to a swirl burner, Phys. Fluids, 27, 045107, <a href="https://doi.org/10.1063/1.4917280" target="_blank">https://doi.org/10.1063/1.4917280</a>, 2015.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib7"><label>Hersbach et al.(2020)Hersbach, Bell, Berrisford, Hirahara, Hornyi,
Muoz Sabater, Nicolas, Peubey, Radu, Schepers, Simmons, Soci, Abdalla,
Abellan, Balsamo, Bechtold, Biavati, Bidlot, Bonavita, and Thpaut</label><mixed-citation>
      
Hersbach, H., Bell, B., Berrisford, P., Hirahara, S., Horányi, A.,
Muñoz Sabater, J., Nicolas, J., Peubey, C., Radu, R., Schepers, D., Simmons, A., Soci, C., Abdalla, S., Abellan, X., Balsamo, G., Bechtold, P., Biavati, G., Bidlot, J., Bonavita, M., and Thépaut, J.-N.: The ERA5 global reanalysis, Q. J. Roy. Meteorol. Soc.,  <a href="https://doi.org/10.1002/qj.3803" target="_blank">https://doi.org/10.1002/qj.3803</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib8"><label>Korn(2017)</label><mixed-citation>
      
Korn, P.: Formulation of an unstructured grid model for global ocean dynamics, J. Comput. Phys., 339, 525–552, 2017.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib9"><label>Nowak and Danilov(2024)</label><mixed-citation>
      
Nowak, K. and Danilov, S.: Implicit filter: v1.0.0, Zenodo [data set and code], <a href="https://doi.org/10.5281/zenodo.10907365" target="_blank">https://doi.org/10.5281/zenodo.10907365</a>, 2024 (code also available at: <a href="https://github.com/FESOM/implicit_filter" target="_blank"/>, last access: 25 August 2025).

    </mixed-citation></ref-html>
<ref-html id="bib1.bib10"><label>Nowak et al.(2024)Nowak, Danilov, Mller, and Liu</label><mixed-citation>
      
Nowak, K., Danilov, S., Müller, V., and Liu, C.: Implementation of implicit filter for spatial spectra extraction, Zenodo [data set], <a href="https://doi.org/10.5281/zenodo.10957614" target="_blank">https://doi.org/10.5281/zenodo.10957614</a>, 2024.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib11"><label>Rai et al.(2021)Rai, Hecht, Maltrud, and Aluie</label><mixed-citation>
      
Rai, S., Hecht, M., Maltrud, M., and Aluie, H.: Scale of oceanic eddy killing
by wind from global satellite observations, Sci. Adv., 7, eabf4920,
<a href="https://doi.org/10.1126/sciadv.abf4920" target="_blank">https://doi.org/10.1126/sciadv.abf4920</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib12"><label>Ringler et al.(2013)Ringler, Petersen, Higdon, Jacobsen, Maltrud, and Jones</label><mixed-citation>
      
Ringler, T., Petersen, M., Higdon, R., Jacobsen, D., Maltrud, M., and Jones,
P.: A multi-resolution approach to global ocean modelling, Ocean Model., 69,
211–232, 2013.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib13"><label>Sadek and Aluie(2018)</label><mixed-citation>
      
Sadek, M. and Aluie, H.: Extracting the spectrum of a flow by spatial
filtering, Phys. Rev. Fluids, 3, 124610, <a href="https://doi.org/10.1103/physrevfluids.3.124610" target="_blank">https://doi.org/10.1103/physrevfluids.3.124610</a>, 2018.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib14"><label>Schubert et al.(2020)Schubert, Gula, Greatbatch, Baschek, and
Biastoch</label><mixed-citation>
      
Schubert, R., Gula, J., Greatbatch, R. J., Baschek, B., and Biastoch, A.: The
Submesoscale Kinetic Energy Cascade: Mesoscale Absorption of Submesoscale
Mixed Layer Eddies and Frontal Downscale Fluxes, J. Phys. Oceanogr., 50, 2573–2589, <a href="https://doi.org/10.1175/JPO-D-19-0311.1" target="_blank">https://doi.org/10.1175/JPO-D-19-0311.1</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib15"><label>Steele et al.(2001)Steele, Morley, and Ermold</label><mixed-citation>
      
Steele, M., Morley, R., and Ermold, W.: PHC: A Global Ocean Hydrography with a High-Quality Arctic Ocean, J. Climate, 14, 2079–2087,
<a href="https://doi.org/10.1175/1520-0442(2001)014&lt;2079:PAGOHW&gt;2.0.CO;2" target="_blank">https://doi.org/10.1175/1520-0442(2001)014&lt;2079:PAGOHW&gt;2.0.CO;2</a>, 2001.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib16"><label>Storer et al.(2023)Storer, Buzzicotti, Khatri, Griffies, and
Aluie</label><mixed-citation>
      
Storer, B. A., Buzzicotti, M., Khatri, H., Griffies, S. M., and Aluie, H.:
Global cascade of kinetic energy in the ocean and the atmospheric imprint,
Sci. Adv., 9, eadi7420, <a href="https://doi.org/10.1126/sciadv.adi7420" target="_blank">https://doi.org/10.1126/sciadv.adi7420</a>, 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib17"><label>Zhao and Aluie(2025)</label><mixed-citation>
      
Zhao, D. and Aluie, H.: Calculating spectra by sequential filtering, J. Renew. Sustain. Energ., 17, 013303, <a href="https://doi.org/10.1063/5.0244909" target="_blank">https://doi.org/10.1063/5.0244909</a>, 2025.

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