<?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">WES</journal-id><journal-title-group>
    <journal-title>Wind Energy Science</journal-title>
    <abbrev-journal-title abbrev-type="publisher">WES</abbrev-journal-title><abbrev-journal-title abbrev-type="nlm-ta">Wind Energ. Sci.</abbrev-journal-title>
  </journal-title-group><issn pub-type="epub">2366-7451</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/wes-11-2229-2026</article-id><title-group><article-title>Graph neural operator for wind farm wake flow</article-title><alt-title>Graph neural operator for wind farm wake flow</alt-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author" corresp="yes" rid="aff1">
          <name><surname>Schøler</surname><given-names>Jens Peter</given-names></name>
          <email>jpsch@dtu.dk</email>
        <ext-link>https://orcid.org/0000-0001-7927-2639</ext-link></contrib>
        <contrib contrib-type="author" corresp="no" rid="aff1">
          <name><surname>Peder Weilmann Rasmussen</surname><given-names>Frederik</given-names></name>
          
        <ext-link>https://orcid.org/0009-0005-2147-4541</ext-link></contrib>
        <contrib contrib-type="author" corresp="no" rid="aff1">
          <name><surname>Quick</surname><given-names>Julian</given-names></name>
          
        <ext-link>https://orcid.org/0000-0002-1460-9808</ext-link></contrib>
        <contrib contrib-type="author" corresp="no" rid="aff1">
          <name><surname>Réthoré</surname><given-names>Pierre-Elouan</given-names></name>
          
        <ext-link>https://orcid.org/0000-0002-2300-5440</ext-link></contrib>
        <aff id="aff1"><label>1</label><institution>DTU Wind and Energy Systems, Frederiksborgvej 399, 4000 Roskilde, Denmark</institution>
        </aff>
      </contrib-group>
      <author-notes><corresp id="corr1">Jens Peter Schøler (jpsch@dtu.dk)</corresp></author-notes><pub-date><day>22</day><month>June</month><year>2026</year></pub-date>
      
      <volume>11</volume>
      <issue>6</issue>
      <fpage>2229</fpage><lpage>2256</lpage>
      <history>
        <date date-type="received"><day>1</day><month>December</month><year>2025</year></date>
           <date date-type="rev-request"><day>4</day><month>December</month><year>2025</year></date>
           <date date-type="rev-recd"><day>25</day><month>March</month><year>2026</year></date>
           <date date-type="accepted"><day>1</day><month>April</month><year>2026</year></date>
      </history>
      <permissions>
        <copyright-statement>Copyright: © 2026 Jens Peter Schøler et al.</copyright-statement>
        <copyright-year>2026</copyright-year>
      <license license-type="open-access"><license-p>This work is licensed under the Creative Commons Attribution 4.0 International License. To view a copy of this licence, visit <ext-link ext-link-type="uri" xlink:href="https://creativecommons.org/licenses/by/4.0/">https://creativecommons.org/licenses/by/4.0/</ext-link></license-p></license></permissions><self-uri xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026.html">This article is available from https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026.html</self-uri><self-uri xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026.pdf">The full text article is available as a PDF file from https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026.pdf</self-uri>
      <abstract><title>Abstract</title>

      <p id="d2e104">Wind farm flow simulations are computationally expensive. However, numerous simulations are often required to account for wake effects from multiple neighboring farms, which motivates the development of data-driven surrogate models. Such surrogates may also enable the consideration of neighboring farm wakes during layout optimization.</p>

      <p id="d2e107">Most existing data-driven surrogate approaches rely on fixed algebraic superposition principles, which may limit flexibility when extending to higher-fidelity data sources that capture nonlinear wake interactions. We propose a novel method that embeds a trainable and scalable superposition principle within a graph neural operator (GNO) architecture, enabling the model to learn complex wake combinations directly from data.</p>

      <p id="d2e110">The model consists of two sequential graph neural network (GNN) layers: the first encodes turbine–turbine interactions into a latent representation, while the second combines these latent turbine states to predict the wind speed at a desired location. The GNO is trained on a large dataset generated with PyWake, a steady-state engineering wake model. More than 2000 unique layouts were procedurally generated for training, with an additional 998 for testing.</p>

      <p id="d2e113">The GNO accurately identifies regions of strong wake interaction, although the spatial extent of wakes is slightly underestimated compared to the simulated values in cases with pronounced wake effects. Overall, the proposed GNO represents a methodological advancement in data-driven wind farm flow surrogates, introducing a new conceptual framework inspired by established engineering wake modeling principles.</p>
  </abstract>
    </article-meta>
  </front>
<body>
      

<sec id="Ch1.S1" sec-type="intro">
  <label>1</label><title>Introduction</title>
      <p id="d2e125">Wind farm flow has been studied rigorously since engineers placed multiple turbines together on farms. The phenomenon of wind-turbine-induced wakes is one of the most extensively studied subjects in wind energy; see, e.g., <xref ref-type="bibr" rid="bib1.bibx19 bib1.bibx41" id="text.1"/>. Nevertheless, accurately representing the complex interactions among multiple wakes remains an active research challenge. In classical engineering wind farm flow models, the total flow field is obtained by calculating the operating state of each turbine and determining its corresponding wake contribution. The combined wind farm flow is then found through wake superposition. This step forms the core of most engineering models and significantly contributes to their overall performance.</p>
      <p id="d2e131">Traditionally, wake superposition is performed using simple algebraic formulations based on the velocity deficit, either linearly <xref ref-type="bibr" rid="bib1.bibx33 bib1.bibx36" id="paren.2"/> or quadratically <xref ref-type="bibr" rid="bib1.bibx26 bib1.bibx51" id="paren.3"/>. While these formulations are computationally efficient, they rely on strong simplifying assumptions, in particular that wake interactions can be represented as additive. This means that critical physical processes such as wake mixing, entrainment, and interactions with the atmospheric boundary layer <xref ref-type="bibr" rid="bib1.bibx41" id="paren.4"/> are not adequately captured, which can lead to significant errors in the predicted farm flow.  Recent studies have proposed modified superposition methods designed to enhance the physical realism of these models. The momentum-conserving superposition model by <xref ref-type="bibr" rid="bib1.bibx54" id="text.5"/> introduces a weighted sum based on convective wind speeds, while the cumulative wake summation method by <xref ref-type="bibr" rid="bib1.bibx4" id="text.6"/> enforces approximate mass and momentum conservation using an altered method of wake addition. These developments represent progress toward more consistent formulations, but they remain limited by their algebraic structure and cannot fully capture the nonlinear nature of wake interactions.</p>
      <p id="d2e149">To overcome these limitations, more flexible and expressive operator formulations are needed, ones that can represent the inherently nonlinear and spatially coupled flow interactions occurring within wind farms. Machine learning offers a promising framework for this. Data-driven models can learn such complex wake interactions directly from data, without relying on restrictive analytical assumptions.  In this context, graph learning provides a particularly suitable approach. By representing turbines as nodes and their aerodynamic couplings as edges, message-passing graph neural networks (GNNs) can learn to propagate and combine wake information across the wind farm. This effectively generalizes the traditional wake superposition step into a learned nonlinear operator that can capture the complex flow physics governing wind farm behavior.  The graph-based formulation offers distinct advantages over alternative neural network architectures for this application. Convolutional neural networks (CNNs) require fixed grid structures and, therefore, struggle to accommodate varying turbine layouts across farms with different sizes and densities. Simultaneously, CNNs' need for a fixed grid imposes an upper resolution limit, whereas a GNN-based approach enables inference at the exact positions of interest. Multilayer perceptron (MLP)-based surrogate models for single-wake prediction have been proposed, but these still require a classical superposition scheme to reconstruct the full farm flow, inheriting the limitations of algebraic wake summation. In contrast, the message-passing framework inherent to GNNs naturally represents turbine–turbine interactions through graph connectivity, enabling the model to learn meaningful turbine interactions, including nonlinear interactions, that generalize across diverse layouts without relying on explicit superposition. For a review on data-driven methods in wind farms fluid flow, see, e.g., <xref ref-type="bibr" rid="bib1.bibx53" id="text.7"/>.</p>
      <p id="d2e155">GNNs have been successfully applied to similar problems in the past. <xref ref-type="bibr" rid="bib1.bibx39" id="text.8"/> demonstrated a physics-induced graph neural network (PGNN) as an accurate and generalizable surrogate model for wind farm power estimation. Their method embeds engineering models into the network to learn physically plausible interactions, which they validated by applying it to a wind farm layout optimization (WFLO) problem. <xref ref-type="bibr" rid="bib1.bibx6" id="text.9"/> presented a GNN trained on simulated Reynolds-averaged Navier–Stokes (RANS) data capable of accounting for wake losses within a wind farm. <xref ref-type="bibr" rid="bib1.bibx52" id="text.10"/> trained a GNN using measurement data to superpose temporal states, although its applicability was limited to a single wind farm at a time. <xref ref-type="bibr" rid="bib1.bibx38" id="text.11"/> employed a graph attention network (GAT) to predict individual turbine power production based on engineering-model data.</p>
      <p id="d2e171"><xref ref-type="bibr" rid="bib1.bibx12 bib1.bibx9" id="text.12"/> trained GNNs on data generated from engineering models capable of predicting loads and power. <xref ref-type="bibr" rid="bib1.bibx13" id="text.13"/> further developed this model and employed transfer learning to enhance data fidelity using a limited amount of mid-fidelity data from Dynamiks, a further development of HAWC2Farm <xref ref-type="bibr" rid="bib1.bibx32" id="paren.14"/> which implements the dynamic wake meandering approach. <xref ref-type="bibr" rid="bib1.bibx30" id="text.15"/> trained a graph transformer model to predict farm-level power and applied it to a static yaw optimization task.</p>
      <p id="d2e185"><xref ref-type="bibr" rid="bib1.bibx29" id="text.16"/> proposed a unique type of GNN for wake flow prediction, leveraging the GNN framework to predict the flow behind a single turbine. Their configuration resembles that of convolutional neural networks (CNNs) but uses the flexibility of graphs to operate on the unevenly distributed RANS mesh. They employed layered Graph SAmple and aggreGatE (GraphSAGE) blocks to sample neighborhoods and propagate information efficiently throughout the domain. The model by <xref ref-type="bibr" rid="bib1.bibx29" id="text.17"/> stands out as the only one that attempts to predict the flow field within the domain, rather than solely at the turbine locations. However, since their model predicts the flow only behind a single turbine, it still relies on classical wake superposition methods to reconstruct the overall flow of the wind farm.</p>
      <p id="d2e193">In this work, a new graph neural operator (GNO) model is proposed, capable of predicting the flow over an entire wind farm, not only at the individual turbines. The GNO is a special variation of a GNN that utilizes two sequential GNNs: the first processes turbine interactions, while the second enables flow predictions at arbitrary locations throughout the domain.  For now, the GNO performs best in the far wake, which is relevant during WFLO when neighbors are present and have not finalized their layouts, as the uncertainty associated with the unknown layouts must be accounted for, requiring numerous simulations to evaluate multiple possible neighbor configurations.</p>
      <p id="d2e196">The model is formulated based on the theoretical foundation introduced by <xref ref-type="bibr" rid="bib1.bibx45" id="text.18"/> within the Nonlinear Manifold Decoders (NOMAD) framework. This approach allows the model to learn continuous flow representations in a physics-consistent manner while retaining the flexibility of graph-based learning. The development of the proposed GNO constitutes the main contribution of this paper. The GNO implementation is inspired by classical engineering models of wind farms, designed to predict spatially continuous flow fields across the entire domain. This extends the predictive capability beyond turbine-level quantities, enabling direct inference of flow fields from graph representations.</p>
      <p id="d2e202">Additionally, the GNO is rigorously tested to assess its capability.</p>

      <fig id="F1" specific-use="star"><label>Figure 1</label><caption><p id="d2e208">Procedurally generated data, <bold>(a–d)</bold> wind farm layouts using PlayGen. <bold>(e)</bold> Quasi-random samples generated with the Sobol sequence. <bold>(f)</bold> <inline-formula><mml:math id="M1" display="inline"><mml:mi>U</mml:mi></mml:math></inline-formula> distribution. <bold>(g)</bold> Ambient turbulence intensity (TI) distribution. <bold>(h)</bold> Generated <inline-formula><mml:math id="M2" display="inline"><mml:mi>U</mml:mi></mml:math></inline-formula> and <inline-formula><mml:math id="M3" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> with boundary.</p></caption>
        <graphic xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026-f01.png"/>

      </fig>

      <p id="d2e258">Furthermore, a secondary contribution is the development of a data generation pipeline that combines state-of-the-art engineering models with stochastic sampling to produce physically realistic and diverse training data.</p>
      <p id="d2e261">The article is structured as follows: Sect. <xref ref-type="sec" rid="Ch1.S2"/> introduces the employed methods and is divided into four subsections: data generation, graphs, the GNO, and performance metrics. Section <xref ref-type="sec" rid="Ch1.S3"/> consists of two parts: in Sect. <xref ref-type="sec" rid="Ch1.S3.SS1"/>, a summary of the results of a grid search to determine suitable hyperparameters is introduced; and in Sect. <xref ref-type="sec" rid="Ch1.S3.SS2"/>, the best-performing model is rigorously tested and discussed. Finally, in Sect. <xref ref-type="sec" rid="Ch1.S4"/>, conclusions and suggestions for future work are summarized.</p>
</sec>
<sec id="Ch1.S2">
  <label>2</label><title>Methodology</title>
      <p id="d2e282">This section introduces the methods used to construct the GNO, create training data, and evaluate the model. In Sect. <xref ref-type="sec" rid="Ch1.S2.SS1"/>, the data generation process is described, covering random layout generation, inflow generation, and wind farm flow simulation. A general introduction to graphs is provided in Sect. <xref ref-type="sec" rid="Ch1.S2.SS2"/>, and subsequently, the proposed GNO is introduced in Sect. <xref ref-type="sec" rid="Ch1.S2.SS3"/>, including an overview of the neural network methods used to construct it. Finally, in Sect. <xref ref-type="sec" rid="Ch1.S2.SS4"/>, the methods for training and evaluation are described, along with the introduction of the performance metrics used.</p>
<sec id="Ch1.S2.SS1">
  <label>2.1</label><title>Data generation</title>
      <p id="d2e300">To ensure the dataset includes a representative subset of wind farm layouts and inflow conditions, these scenarios are procedurally generated.  In total, 3570 unique layouts are generated. Ten inflow conditions per layout were selected to improve the neural network's ability to learn the correlation between inflow conditions and the wind farm wake deficit. A total of 2072 of the generated layouts are used for training, 500 are used for validation during training, and 998 layouts are set aside for testing.  That means that for training, 20 720 data points are considered – 5000 for validation and 9980 for testing.</p>
<sec id="Ch1.S2.SS1.SSS1">
  <label>2.1.1</label><title>Layout generation</title>
      <p id="d2e310">Plant Layout Generator (<monospace>PlayGen</monospace>) by <xref ref-type="bibr" rid="bib1.bibx20" id="text.19"/> is used to generate wind farm layouts. <monospace>PlayGen</monospace> creates four types of layouts: <italic>Cluster</italic>, which uses Poisson disk sampling to iteratively generate the wind farms by selecting an existing turbine, generating a random angle and distance, and placing the new turbine if it satisfies the spacing constraints. <italic>Single string</italic> creates linear turbine arrays with inserted breaks, applies cumulative correlated noise to <inline-formula><mml:math id="M4" display="inline"><mml:mi>y</mml:mi></mml:math></inline-formula> coordinates, and rotates the entire string. <italic>Parallel string</italic> makes multiple linear strings with the same orientation and vertically offsets each string by 1 to 3.5 rotor diameters (<inline-formula><mml:math id="M5" display="inline"><mml:mi>D</mml:mi></mml:math></inline-formula>). Then it applies random horizontal shifts and rotates the full layout. <italic>Multi string</italic> distributes turbines across strings, each with a quasi-random independent orientation, and places them in a domain while checking for string spacing. Examples of these are plotted in Fig. <xref ref-type="fig" rid="F1"/>a–d.</p>
      <p id="d2e351">The layout type, number of wind turbines (<inline-formula><mml:math id="M6" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>) and turbine separation factors (<inline-formula><mml:math id="M7" display="inline"><mml:mrow><mml:msub><mml:mi>s</mml:mi><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>) are sampled according to the probabilities and distributions listed below: 
<list list-type="bullet"><list-item>
      <p id="d2e380">Farm type: categorical distribution sampled with probabilities <inline-formula><mml:math id="M8" display="inline"><mml:mrow><mml:msub><mml:mi>P</mml:mi><mml:mtext>farm</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula><disp-formula id="Ch1.Ex1"><mml:math id="M9" display="block"><mml:mrow><mml:msub><mml:mi>P</mml:mi><mml:mtext>farm</mml:mtext></mml:msub><mml:mo>=</mml:mo><mml:mfenced close="]" open="["><mml:mtable class="array" columnalign="center"><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi>P</mml:mi><mml:mtext>cluster</mml:mtext></mml:msub></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi>P</mml:mi><mml:mtext>single  string</mml:mtext></mml:msub></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi>P</mml:mi><mml:mtext>parallel  string</mml:mtext></mml:msub></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi>P</mml:mi><mml:mtext>multiple  string</mml:mtext></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mo>=</mml:mo><mml:mfenced close="]" open="["><mml:mtable class="array" columnalign="center"><mml:mtr><mml:mtd><mml:mn mathvariant="normal">0.40</mml:mn></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mn mathvariant="normal">0.20</mml:mn></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mn mathvariant="normal">0.20</mml:mn></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mn mathvariant="normal">0.20</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mfenced><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p></list-item><list-item>
      <p id="d2e462">Number of wind turbines <inline-formula><mml:math id="M10" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mtext>wt</mml:mtext></mml:msub><mml:mo>∈</mml:mo><mml:mi mathvariant="double-struck">Z</mml:mi></mml:mrow></mml:math></inline-formula> sampled with a truncated normal distribution TN<disp-formula id="Ch1.Ex2"><mml:math id="M11" display="block"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mtext>wt</mml:mtext></mml:msub><mml:mo>∼</mml:mo><mml:mtext>TN</mml:mtext><mml:mo>(</mml:mo><mml:mi mathvariant="italic">μ</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">60</mml:mn><mml:mo>,</mml:mo><mml:mi mathvariant="italic">σ</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">60</mml:mn><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">δ</mml:mi><mml:mtext>low</mml:mtext></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">20</mml:mn><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">δ</mml:mi><mml:mtext>high</mml:mtext></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">100</mml:mn><mml:mo>)</mml:mo><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p></list-item><list-item>
      <p id="d2e538">Wind turbine separation factor <inline-formula><mml:math id="M12" display="inline"><mml:mrow><mml:msub><mml:mi>s</mml:mi><mml:mtext>wt</mml:mtext></mml:msub><mml:mo>∈</mml:mo><mml:msubsup><mml:mi mathvariant="double-struck">R</mml:mi><mml:mn mathvariant="normal">0</mml:mn><mml:mo>+</mml:mo></mml:msubsup></mml:mrow></mml:math></inline-formula> sampled with a truncated normal distribution TN<disp-formula id="Ch1.Ex3"><mml:math id="M13" display="block"><mml:mrow><mml:msub><mml:mi>s</mml:mi><mml:mtext>wt</mml:mtext></mml:msub><mml:mo>∼</mml:mo><mml:mtext>TN</mml:mtext><mml:mo>(</mml:mo><mml:mi mathvariant="italic">μ</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">5</mml:mn><mml:mi>D</mml:mi><mml:mo>,</mml:mo><mml:mi mathvariant="italic">σ</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">3</mml:mn><mml:mi>D</mml:mi><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">δ</mml:mi><mml:mtext>low</mml:mtext></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:mi>D</mml:mi><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">δ</mml:mi><mml:mtext>high</mml:mtext></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">8</mml:mn><mml:mi>D</mml:mi><mml:mo>)</mml:mo><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p></list-item></list> where <inline-formula><mml:math id="M14" display="inline"><mml:mi>P</mml:mi></mml:math></inline-formula> are probabilities and subscripts indicate the layout type considered, <inline-formula><mml:math id="M15" display="inline"><mml:mi mathvariant="italic">μ</mml:mi></mml:math></inline-formula> is the mean, <inline-formula><mml:math id="M16" display="inline"><mml:mi mathvariant="italic">σ</mml:mi></mml:math></inline-formula> the standard deviation, <inline-formula><mml:math id="M17" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">δ</mml:mi><mml:mtext>low</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> the lower cut-off, and <inline-formula><mml:math id="M18" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">δ</mml:mi><mml:mtext>high</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> the upper cut-off for the truncated normal distribution TN.</p>
</sec>
<sec id="Ch1.S2.SS1.SSS2">
  <label>2.1.2</label><title>Inflow generation</title>
      <p id="d2e680">The inflow conditions required for the wind farm simulation are the free-stream velocity and ambient turbulence intensity, respectively, in the variables <inline-formula><mml:math id="M19" display="inline"><mml:mi>U</mml:mi></mml:math></inline-formula> and <inline-formula><mml:math id="M20" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula>. As these are naturally highly correlated, it is necessary to consider this when generating the flow cases.  The methods of <xref ref-type="bibr" rid="bib1.bibx11" id="text.20"/> are used to generate correlated inflow conditions. After <xref ref-type="bibr" rid="bib1.bibx11" id="text.21"/> was initially published, <xref ref-type="bibr" rid="bib1.bibx22" id="text.22"/> has been updated with a slight change to the classifications of turbulence characteristics. Therefore, the new <inline-formula><mml:math id="M21" display="inline"><mml:mrow><mml:msup><mml:mi mathvariant="normal">A</mml:mi><mml:mo>+</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula> class is used with reference turbulence intensity (<inline-formula><mml:math id="M22" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mrow><mml:mtext>ref</mml:mtext><mml:mo>,</mml:mo><mml:msup><mml:mi mathvariant="normal">A</mml:mi><mml:mo>+</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.18</mml:mn></mml:mrow></mml:math></inline-formula>).  Ranges of the free-stream velocity are based on the DTU-10-MW reference wind turbine <xref ref-type="bibr" rid="bib1.bibx2" id="paren.23"/> with rotor diameter (<inline-formula><mml:math id="M23" display="inline"><mml:mi>D</mml:mi></mml:math></inline-formula> <inline-formula><mml:math id="M24" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 178.3 <inline-formula><mml:math id="M25" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi></mml:mrow></mml:math></inline-formula>), cut-in (<inline-formula><mml:math id="M26" display="inline"><mml:mrow><mml:msub><mml:mi>U</mml:mi><mml:mrow><mml:mi mathvariant="normal">c</mml:mi><mml:mo>,</mml:mo><mml:mtext>in</mml:mtext></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> <inline-formula><mml:math id="M27" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 4 <inline-formula><mml:math id="M28" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace width="0.125em" linebreak="nobreak"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>), rated (<inline-formula><mml:math id="M29" display="inline"><mml:mrow><mml:msub><mml:mi>U</mml:mi><mml:mtext>rated</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> <inline-formula><mml:math id="M30" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 11.4 <inline-formula><mml:math id="M31" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace linebreak="nobreak" width="0.125em"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>), and cut-out (<inline-formula><mml:math id="M32" display="inline"><mml:mrow><mml:msub><mml:mi>U</mml:mi><mml:mrow><mml:mi mathvariant="normal">c</mml:mi><mml:mo>,</mml:mo><mml:mtext>out</mml:mtext></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> <inline-formula><mml:math id="M33" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 25 <inline-formula><mml:math id="M34" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace linebreak="nobreak" width="0.125em"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>) wind speeds. The power curve and coefficient of thrust (<inline-formula><mml:math id="M35" display="inline"><mml:mrow><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>) curves of the DTU-10-MW are displayed in Fig. <xref ref-type="fig" rid="F2"/>. The velocity standard deviation (<inline-formula><mml:math id="M36" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">σ</mml:mi><mml:mi>u</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>) lower and upper bounds follow the expressions in <xref ref-type="bibr" rid="bib1.bibx11" id="author.24"/> (2018; Table 1). The expressions for the inflow bounds are given in Eq. (<xref ref-type="disp-formula" rid="Ch1.E1"/>).
            

                  <disp-formula id="Ch1.E1" specific-use="gather" content-type="subnumberedsingle"><mml:math id="M37" display="block"><mml:mtable displaystyle="true"><mml:mlabeledtr id="Ch1.E1.2"><mml:mtd><mml:mtext>1a</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mn mathvariant="normal">4</mml:mn><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace width="0.125em" linebreak="nobreak"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow><mml:mo>≤</mml:mo><mml:mi>U</mml:mi><mml:mo>≤</mml:mo><mml:mn mathvariant="normal">25</mml:mn><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace width="0.125em" linebreak="nobreak"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="Ch1.E1.3"><mml:mtd><mml:mtext>1b</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mtable class="split" rowspacing="0.2ex" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:mn mathvariant="normal">0.0025</mml:mn><mml:mo>⋅</mml:mo><mml:mi>U</mml:mi><mml:mo>≤</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:msub><mml:mi mathvariant="italic">σ</mml:mi><mml:mi mathvariant="normal">u</mml:mi></mml:msub><mml:mo>≤</mml:mo><mml:msub><mml:mi>I</mml:mi><mml:mrow><mml:mtext>ref</mml:mtext><mml:mo>,</mml:mo><mml:msup><mml:mi mathvariant="normal">A</mml:mi><mml:mo>+</mml:mo></mml:msup></mml:mrow></mml:msub><mml:mfenced open="(" close=")"><mml:mrow><mml:mn mathvariant="normal">6.8</mml:mn><mml:mo>+</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mn mathvariant="normal">3</mml:mn><mml:mi>U</mml:mi></mml:mrow><mml:mn mathvariant="normal">4</mml:mn></mml:mfrac></mml:mstyle><mml:mo>+</mml:mo><mml:mn mathvariant="normal">3</mml:mn><mml:msup><mml:mfenced close=")" open="("><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">10</mml:mn><mml:mi>U</mml:mi></mml:mfrac></mml:mstyle></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:mfenced></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mo>[</mml:mo><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace linebreak="nobreak" width="0.125em"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow><mml:mo>]</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mtd></mml:mlabeledtr></mml:mtable></mml:math></disp-formula></p>

      <fig id="F2"><label>Figure 2</label><caption><p id="d2e1059">DTU-10-MW reference wind turbine <bold>(a)</bold> power curve and <bold>(b)</bold> <inline-formula><mml:math id="M38" display="inline"><mml:mrow><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> curve as implemented in <monospace>PyWake</monospace>. Operational stages I–IV are indicated with colors. I: below cut-in, II: below rated power, III: rated power, and IV: above cut-out.</p></caption>
            <graphic xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026-f02.png"/>

          </fig>

      <p id="d2e1088">Correlated inflow conditions are generated using quasi-Monte-Carlo sampling with the improved Sobol sequence <xref ref-type="bibr" rid="bib1.bibx23" id="paren.25"/>. While <xref ref-type="bibr" rid="bib1.bibx11" id="text.26"/> employed the Halton sequence for similar purposes, we tested both approaches and found that the Sobol sequence, also used by <xref ref-type="bibr" rid="bib1.bibx9" id="text.27"/>, better captures extreme values in the distribution tails.</p>
      <p id="d2e1101">Figure <xref ref-type="fig" rid="F1"/>e illustrates the two-dimensional quasi-random samples from the Sobol sequence before transformation. The sampled component used to generate the free-stream velocity <inline-formula><mml:math id="M39" display="inline"><mml:mi>U</mml:mi></mml:math></inline-formula> is denoted as <inline-formula><mml:math id="M40" display="inline"><mml:mrow><mml:msub><mml:mi>p</mml:mi><mml:mi mathvariant="normal">U</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, and <inline-formula><mml:math id="M41" display="inline"><mml:mrow><mml:msub><mml:mi>p</mml:mi><mml:mtext>TI</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> denotes the component used to generate the ambient TI.  In Fig. <xref ref-type="fig" rid="F1"/>f, the resultant wind speed distribution is shown.  The distribution was obtained by projecting the wind speed sample onto a Rayleigh distribution following <xref ref-type="bibr" rid="bib1.bibx22" id="text.28"/> and scaled with the range in Eq. (<xref ref-type="disp-formula" rid="Ch1.E1.2"/>). To obtain the resultant TI distribution, Eq. (<xref ref-type="disp-formula" rid="Ch1.E1.3"/>) is applied, and the turbulence standard deviation is converted to TI by the relation <inline-formula><mml:math id="M42" display="inline"><mml:mrow><mml:mi>I</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="italic">σ</mml:mi><mml:mi mathvariant="normal">u</mml:mi></mml:msub><mml:mo>/</mml:mo><mml:mi>U</mml:mi></mml:mrow></mml:math></inline-formula> (the TI distribution is shown in Fig. <xref ref-type="fig" rid="F1"/>g as a histogram).</p>
</sec>
<sec id="Ch1.S2.SS1.SSS3">
  <label>2.1.3</label><title>Wind farm simulation</title>
      <p id="d2e1174">The dataset is generated with the wind farm simulation tool <monospace>PyWake</monospace> <xref ref-type="bibr" rid="bib1.bibx40" id="paren.29"/>.  PyWake is an open-source steady-state engineering wake modeling framework that computes wake deficits and turbine interactions. The framework supports spatially varying inflow conditions, multiple turbine types, and yaw misalignment via wake deflection models. However, to establish a baseline dataset, several simplifications were adopted: (i) homogeneous inflow with uniform free-stream velocity and turbulence intensity, (ii) a single turbine type (DTU-10-MW) with a fixed <inline-formula><mml:math id="M43" display="inline"><mml:mrow><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> curve, and (iii) all turbines aligned with the inflow direction. These choices reduce the input parameter space but may limit applicability to scenarios involving heterogeneous inflows, mixed turbine fleets, or active wake control.</p>
      <p id="d2e1194">The wakes are modeled with the updated self-similar Gaussian single-wake deficit model <monospace>NiayifarGaussianDeficit</monospace> by <xref ref-type="bibr" rid="bib1.bibx36" id="text.30"/>, which is a further development of the Gaussian wake model by <xref ref-type="bibr" rid="bib1.bibx3" id="text.31"/>. This model was chosen for its TI-dependent wake expansion, which ensures coupling between TI and velocity deficits.  The model uses an adaptive wake growth rate (<inline-formula><mml:math id="M44" display="inline"><mml:mrow><mml:msup><mml:mi>k</mml:mi><mml:mo>∗</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula>) that is linearly fit to the wind turbine inflow TI (<inline-formula><mml:math id="M45" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>) immediately upstream of each turbine. Therefore, it requires an added TI (<inline-formula><mml:math id="M46" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mi mathvariant="normal">a</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>) model; here, the <monospace>CrespoHernandez</monospace> model by <xref ref-type="bibr" rid="bib1.bibx8" id="text.32"/> was chosen. Additionally, to account for the effects of turbine induction, the updated self-similarity blockage model <monospace>SelfSimilarityDeficit2020</monospace> by <xref ref-type="bibr" rid="bib1.bibx49" id="text.33"/> and <xref ref-type="bibr" rid="bib1.bibx16" id="text.34"/> is used. Finally, to superpose wakes and induction together, a linear sum is used.  The effective velocity (<inline-formula><mml:math id="M47" display="inline"><mml:mi>u</mml:mi></mml:math></inline-formula>) at turbine number <inline-formula><mml:math id="M48" display="inline"><mml:mi>i</mml:mi></mml:math></inline-formula> is computed as

              <disp-formula id="Ch1.E4" content-type="numbered"><label>2</label><mml:math id="M49" display="block"><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">i</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mi>U</mml:mi><mml:mo>-</mml:mo><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>j</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mtext>up</mml:mtext></mml:msub></mml:mrow></mml:munderover><mml:mi mathvariant="normal">Δ</mml:mi><mml:msub><mml:mi>u</mml:mi><mml:mi>j</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mtext>down</mml:mtext></mml:msub></mml:mrow></mml:munderover><mml:mi mathvariant="normal">Δ</mml:mi><mml:msub><mml:mi>u</mml:mi><mml:mrow><mml:mi>b</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

            where <inline-formula><mml:math id="M50" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>u</mml:mi></mml:mrow></mml:math></inline-formula> is the velocity deficit caused by wake effects, <inline-formula><mml:math id="M51" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the wake deficit caused by blockage, <inline-formula><mml:math id="M52" display="inline"><mml:mi>j</mml:mi></mml:math></inline-formula> sums across all turbines upstream of turbine <inline-formula><mml:math id="M53" display="inline"><mml:mi>i</mml:mi></mml:math></inline-formula>, and <inline-formula><mml:math id="M54" display="inline"><mml:mi>k</mml:mi></mml:math></inline-formula> sums across all turbines downstream of turbine <inline-formula><mml:math id="M55" display="inline"><mml:mi>i</mml:mi></mml:math></inline-formula>.  For the interested reader, the velocity deficit model, TI model, and blockage model are presented in detail in Appendix <xref ref-type="sec" rid="App1.Ch1.S1"/>.</p>
      <p id="d2e1397">To obtain the state of the wind farm, the <monospace>All2AllIterative</monospace> wind farm model is used, in which a local reference wind speed <inline-formula><mml:math id="M56" display="inline"><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mtext>ref</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> is calculated per wind turbine. The inter-turbine effects are iteratively evaluated using fixed-point iteration until a convergence criterion is met. Using <monospace>All2AllIterative</monospace> is necessary when a blockage model is included, as the turbines interact in both upstream and downstream directions. After the dataset for this work was generated, a computationally lighter alternative wind farm model, the <monospace>PropagateUpDownIterative</monospace> model, was implemented in PyWake. This model can significantly accelerate dataset generation, and the authors encourage its adoption in future studies.</p>
      <p id="d2e1420">However, the use of <monospace>All2AllIterative</monospace> also benefits the GNO application: because turbine interactions are resolved iteratively in both directions, the resulting input–output mapping constitutes a nonlinear operator, providing a more challenging and representative test case for the GNO than a simple <monospace>PropagateDownwind</monospace> scheme. Although PyWake employs linear wake superposition (Eq. <xref ref-type="disp-formula" rid="Ch1.E4"/>), the coupled iterative solution introduces nonlinearity that the GNO must learn to approximate. More broadly, the dataset was designed to capture diverse physical effects, including blockage, turbulence-dependent wake expansion, and bidirectional interactions, rather than to maximize fidelity to any single high-accuracy model. Such diversity ensures that the GNO learns a sufficiently complex operator, demonstrating its capacity to generalize across varied flow physics. Future work should investigate the impact of both different superposition methodologies and higher-fidelity training data on GNO performance.</p>
      <p id="d2e1432">One of the strengths of the GNO is its grid invariance: once the turbine operating states are determined, flow predictions can be queried at arbitrary locations. This allows the simulated area to be strategically chosen to capture wake dynamics while avoiding redundant data from unwaked regions. Therefore, a bounding box is constructed to fit each farm. For each farm layout, the wind turbines with the minimum and maximum downstream <inline-formula><mml:math id="M57" display="inline"><mml:mi>x</mml:mi></mml:math></inline-formula> and cross-stream <inline-formula><mml:math id="M58" display="inline"><mml:mi>y</mml:mi></mml:math></inline-formula> coordinates are found and padded as follows: <list list-type="bullet"><list-item>
      <p id="d2e1451"><italic>Downstream:</italic> (<inline-formula><mml:math id="M59" display="inline"><mml:mi>x</mml:mi></mml:math></inline-formula> direction) an extension of <inline-formula><mml:math id="M60" display="inline"><mml:mrow><mml:mn mathvariant="normal">100</mml:mn><mml:mi>D</mml:mi></mml:mrow></mml:math></inline-formula> behind the most downstream turbine,</p></list-item><list-item>
      <p id="d2e1474"><italic>Upstream:</italic> (<inline-formula><mml:math id="M61" display="inline"><mml:mi>x</mml:mi></mml:math></inline-formula> direction) an extension of <inline-formula><mml:math id="M62" display="inline"><mml:mrow><mml:mn mathvariant="normal">10</mml:mn><mml:mi>D</mml:mi></mml:mrow></mml:math></inline-formula> in front of the most upstream turbine,</p></list-item><list-item>
      <p id="d2e1497"><italic>Cross-stream:</italic> (<inline-formula><mml:math id="M63" display="inline"><mml:mi>y</mml:mi></mml:math></inline-formula> direction) an extension of <inline-formula><mml:math id="M64" display="inline"><mml:mrow><mml:mn mathvariant="normal">5</mml:mn><mml:mi>D</mml:mi></mml:mrow></mml:math></inline-formula> on each side.</p></list-item></list></p>
      <p id="d2e1519">Figure <xref ref-type="fig" rid="F3"/> illustrates the bounding box of a wind farm. A farm downstream axis <inline-formula><mml:math id="M65" display="inline"><mml:mover accent="true"><mml:mi>x</mml:mi><mml:mo mathvariant="normal" stretchy="true">̃</mml:mo></mml:mover></mml:math></inline-formula> is introduced to measure the distance behind the most downstream turbine, making it easier to compare results across different wind farm layouts.  The flow map is constructed to remain within the bounding box, at a single height – the turbine hub height (<inline-formula><mml:math id="M66" display="inline"><mml:mrow><mml:msub><mml:mi>z</mml:mi><mml:mtext>hub</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> <inline-formula><mml:math id="M67" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 119 <inline-formula><mml:math id="M68" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi></mml:mrow></mml:math></inline-formula>). The flow map uses an isotropic grid resolution of 3 points per <inline-formula><mml:math id="M69" display="inline"><mml:mi>D</mml:mi></mml:math></inline-formula>. For each layout and sampled inflow case, the computed effective turbine velocities and the velocities at the pre-determined grid locations are recorded. As an artifact of the PlayGen generation methods, the wind farm center and coordinate center do not always coincide. Because the GNO uses relative internal coordinates, this does not affect its performance; more details are given in Sect. <xref ref-type="sec" rid="Ch1.S2.SS2"/>.</p>

      <fig id="F3"><label>Figure 3</label><caption><p id="d2e1572">Adaptive computational grid for generating flow maps with <monospace>PyWake</monospace>.</p></caption>
            <graphic xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026-f03.png"/>

          </fig>

</sec>
</sec>
<sec id="Ch1.S2.SS2">
  <label>2.2</label><title>Graphs</title>
      <p id="d2e1593">Graph theory was introduced by <xref ref-type="bibr" rid="bib1.bibx14" id="text.35"/> to address the Königsberg bridge problem. Euler modeled land masses as nodes (<inline-formula><mml:math id="M70" display="inline"><mml:mi>v</mml:mi></mml:math></inline-formula>) and bridges as edges (<inline-formula><mml:math id="M71" display="inline"><mml:mi>e</mml:mi></mml:math></inline-formula>) in a graph. Although simple compared to modern graphs, this representation enabled Euler to mathematically prove the impossibility of solving the Königsberg bridge problem.</p>
      <p id="d2e1613">Graphs are powerful tools for representing data. They consist of nodes (or vertices), edges, and optionally global features. Nodes hold values representing information such as positions and states, while edges represent relationships or interactions between nodes and may also carry additional attributes, referred to as edge features. Global features, in turn, apply to the entire graph and are often used in graph classification tasks. In this work, global features are not included directly; instead, following the approach of <xref ref-type="bibr" rid="bib1.bibx12" id="text.36"/>, they are copied to each node as node features.</p>
      <p id="d2e1619">The notation in this work uses both set theory and vector  notation, depending on which is more appropriate in a given context. In set notation, the nodes are represented by <inline-formula><mml:math id="M72" display="inline"><mml:mi>V</mml:mi></mml:math></inline-formula> and the edges by <inline-formula><mml:math id="M73" display="inline"><mml:mi>E</mml:mi></mml:math></inline-formula>, with the graph represented as <inline-formula><mml:math id="M74" display="inline"><mml:mrow><mml:mi>G</mml:mi><mml:mo>=</mml:mo><mml:mo>(</mml:mo><mml:mi>V</mml:mi><mml:mo>,</mml:mo><mml:mi>E</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula>. In vector notation, the nodes are denoted by <inline-formula><mml:math id="M75" display="inline"><mml:mi mathvariant="bold-italic">v</mml:mi></mml:math></inline-formula>, with individual vector elements represented as <inline-formula><mml:math id="M76" display="inline"><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mi mathvariant="normal">i</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>; similarly, the edges are denoted by <inline-formula><mml:math id="M77" display="inline"><mml:mi mathvariant="bold-italic">e</mml:mi></mml:math></inline-formula>, with individual elements represented as <inline-formula><mml:math id="M78" display="inline"><mml:mrow><mml:msub><mml:mi>e</mml:mi><mml:mi mathvariant="normal">i</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>. Set theory is primarily used to express the cardinality of these sets – that is, the number of elements they contain, written as <inline-formula><mml:math id="M79" display="inline"><mml:mrow><mml:mo>|</mml:mo><mml:mi>V</mml:mi><mml:mo>|</mml:mo></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M80" display="inline"><mml:mrow><mml:mo>|</mml:mo><mml:mi>E</mml:mi><mml:mo>|</mml:mo></mml:mrow></mml:math></inline-formula>. The use of cardinality highlights the fact that the numbers of nodes and edges are not fixed, which is a strength of graphs but also makes the notation more complicated.</p>
      <p id="d2e1717">In our implementation, two types of nodes are considered: wind turbine nodes (<inline-formula><mml:math id="M81" display="inline"><mml:mrow><mml:msub><mml:mi>V</mml:mi><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>) and probe nodes (<inline-formula><mml:math id="M82" display="inline"><mml:mrow><mml:msub><mml:mi>V</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>), where

            <disp-formula id="Ch1.E5" content-type="numbered"><label>3</label><mml:math id="M83" display="block"><mml:mrow><mml:mi>V</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mi>V</mml:mi><mml:mtext>wt</mml:mtext></mml:msub><mml:mo>∪</mml:mo><mml:msub><mml:mi>V</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
      <p id="d2e1766">Wind turbine nodes coincide with the physical turbine positions in the farm, while probe nodes correspond to locations where flow predictions are desired, i.e., points in space at which the flow is evaluated.  Similarly, the edges are separated into two inter-turbine edges (<inline-formula><mml:math id="M84" display="inline"><mml:mrow><mml:msub><mml:mi>E</mml:mi><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>) and those connecting wind turbines and nodes (<inline-formula><mml:math id="M85" display="inline"><mml:mrow><mml:msub><mml:mi>E</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>), both a subset of <inline-formula><mml:math id="M86" display="inline"><mml:mi>E</mml:mi></mml:math></inline-formula>.

            <disp-formula id="Ch1.E6" content-type="numbered"><label>4</label><mml:math id="M87" display="block"><mml:mrow><mml:mi>E</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mi>E</mml:mi><mml:mtext>wt</mml:mtext></mml:msub><mml:mo>∪</mml:mo><mml:msub><mml:mi>E</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></disp-formula></p>
      <p id="d2e1819">The edges store the relative node positions (<inline-formula><mml:math id="M88" display="inline"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M89" display="inline"><mml:mrow><mml:msub><mml:mi>y</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>) and Euclidean distance (<inline-formula><mml:math id="M90" display="inline"><mml:mrow><mml:msub><mml:mi>d</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>) between connected nodes:

            <disp-formula id="Ch1.E7" content-type="numbered"><label>5</label><mml:math id="M91" display="block"><mml:mrow><mml:mo>(</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>d</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="normal">j</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="normal">i</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mi mathvariant="normal">j</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mi mathvariant="normal">i</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msqrt><mml:mrow><mml:msubsup><mml:mi>x</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow><mml:mn mathvariant="normal">2</mml:mn></mml:msubsup><mml:mo>+</mml:mo><mml:msubsup><mml:mi>y</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow><mml:mn mathvariant="normal">2</mml:mn></mml:msubsup></mml:mrow></mml:msqrt></mml:mrow></mml:mfenced><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
      <p id="d2e1959">The inter-turbine edges are bidirectional, enabling message passing in both directions. This corresponds to solving for turbine thrust coefficients in traditional wake modeling, and the resulting latent space can be thought of as a high-dimensional representation of the turbine thrust states.</p>
      <p id="d2e1962">By contrast, edges connecting to probe nodes are unidirectional, with each probe node connected to and receiving from all wind turbine nodes. This corresponds to using a wake simulation result to predict a resulting flow map when the turbine thrust states are already set.</p>
      <p id="d2e1965">Probe node connectivity is straightforward because each probe connects to all wind turbines. Inter-turbine connectivity is more complex because it requires an algorithmic approach to determine which turbines should be connected.  Several algorithms exist for constructing the connectivity of the turbine nodes. <xref ref-type="bibr" rid="bib1.bibx12" id="text.37"/> investigated four graph connectivity schemes: Delaunay triangulation <xref ref-type="bibr" rid="bib1.bibx10 bib1.bibx37 bib1.bibx15" id="paren.38"/>, K-nearest neighbors (KNN), a radius-based method, and a fully connected scheme. They concluded that Delaunay triangulation provides the best balance between accuracy and computational performance. Accordingly, we also adopt Delaunay triangulation in this work to derive inter-turbine connections.</p>

      <fig id="F4" specific-use="star"><label>Figure 4</label><caption><p id="d2e1977">An example of constructing graph connectivity with three wind turbines and two probes, given a layout and inflow.</p></caption>
          <graphic xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026-f04.png"/>

        </fig>

      <p id="d2e1986">An example of the graph construction process is illustrated in Fig. <xref ref-type="fig" rid="F4"/>, where the process of establishing the connectivity of the wind farm graph and the probe graph is separated into two stages.  In our formulation, the edges include three features (<inline-formula><mml:math id="M92" display="inline"><mml:mrow><mml:msub><mml:mi>f</mml:mi><mml:mi mathvariant="normal">e</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:math></inline-formula>) as described in Eq. (<xref ref-type="disp-formula" rid="Ch1.E7"/>). Initially, wind turbine nodes store two features (<inline-formula><mml:math id="M93" display="inline"><mml:mrow><mml:msub><mml:mi>f</mml:mi><mml:mi mathvariant="normal">v</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:math></inline-formula>): the global wind speed <inline-formula><mml:math id="M94" display="inline"><mml:mi>U</mml:mi></mml:math></inline-formula> and the ambient <inline-formula><mml:math id="M95" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula>. No unique information is stored directly on the nodes; instead, global features are initially seeded and replicated across the nodes as part of the processing. Since the desired output is the wind speed at probe nodes, this constitutes a node task.</p>
</sec>
<sec id="Ch1.S2.SS3">
  <label>2.3</label><title>Graph neural operator (GNO)</title>
      <p id="d2e2050">The graph neural operator (GNO) is a special case of a GNN designed for learning mappings between function spaces. <xref ref-type="bibr" rid="bib1.bibx31" id="text.39"/> first introduced GNOs for this purpose. Building on this foundation, <xref ref-type="bibr" rid="bib1.bibx47" id="text.40"/> developed the deep graph operator network (DeepGraphONet), which integrates the deep operator network (DeepONet) architecture of <xref ref-type="bibr" rid="bib1.bibx34" id="text.41"/> with message-passing GNNs <xref ref-type="bibr" rid="bib1.bibx42 bib1.bibx17" id="paren.42"/>. The present work adopts the DeepGraphONet framework and extends it using the Nonlinear Manifold Decoder (NOMAD) formulation proposed by <xref ref-type="bibr" rid="bib1.bibx45" id="text.43"/>. NOMAD generalizes neural operators to fit into the encoder-processor-decoder abstraction.</p>
      <p id="d2e2068"><xref ref-type="bibr" rid="bib1.bibx45" id="text.44"/> propose that an operator <inline-formula><mml:math id="M96" display="inline"><mml:mi mathvariant="script">G</mml:mi></mml:math></inline-formula> can be approximated as <inline-formula><mml:math id="M97" display="inline"><mml:mi mathvariant="script">F</mml:mi></mml:math></inline-formula> using an encoder <inline-formula><mml:math id="M98" display="inline"><mml:mi mathvariant="script">E</mml:mi></mml:math></inline-formula>, an approximator <inline-formula><mml:math id="M99" display="inline"><mml:mi mathvariant="script">A</mml:mi></mml:math></inline-formula>, and a decoder <inline-formula><mml:math id="M100" display="inline"><mml:mi mathvariant="script">D</mml:mi></mml:math></inline-formula>. The approximation <inline-formula><mml:math id="M101" display="inline"><mml:mi mathvariant="script">F</mml:mi></mml:math></inline-formula> can be written as a composition of the model components using the composition operator <inline-formula><mml:math id="M102" display="inline"><mml:mo>∘</mml:mo></mml:math></inline-formula>, where the rightmost function is applied first.

            <disp-formula id="Ch1.E8" content-type="numbered"><label>6</label><mml:math id="M103" display="block"><mml:mrow><mml:mi mathvariant="script">G</mml:mi><mml:mo>≈</mml:mo><mml:mi mathvariant="script">F</mml:mi><mml:mo>=</mml:mo><mml:mi mathvariant="script">D</mml:mi><mml:mo>∘</mml:mo><mml:mi mathvariant="script">A</mml:mi><mml:mo>∘</mml:mo><mml:mi mathvariant="script">E</mml:mi></mml:mrow></mml:math></disp-formula></p>

      <fig id="F5" specific-use="star"><label>Figure 5</label><caption><p id="d2e2148">GNO network overview of its three main components: encoder, approximator, and decoder.</p></caption>
          <graphic xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026-f05.png"/>

        </fig>

      <p id="d2e2158">The encoder–approximator–decoder configuration is a widely adopted architectural pattern in GNNs, providing a modular framework for transforming input graphs into predictions <xref ref-type="bibr" rid="bib1.bibx5" id="paren.45"/>.  In Fig. <xref ref-type="fig" rid="F5"/>, an overview of the considered model is shown, while the encoder and approximator stages conceptually are equivalent to most GNNs. The final decoder stage stands out as the decoder includes a variation of a readout that uses a separate set of featured probe edges <inline-formula><mml:math id="M104" display="inline"><mml:mrow><mml:msub><mml:mi>E</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>. By including <inline-formula><mml:math id="M105" display="inline"><mml:mrow><mml:msub><mml:mi>E</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, the relative position of the turbines to the probe location is included during the readout. Additionally, due to the separation of probe node processing and the simplicity of establishing probe connectivity, probes can be created on the fly without re-establishing wind turbine connections, i.e., <inline-formula><mml:math id="M106" display="inline"><mml:mrow><mml:msub><mml:mi>E</mml:mi><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>, or reprocessing the wind turbine nodes. This means that predicting in a flow field incurs lower computational cost than a fully integrated prediction scenario.</p>
      <p id="d2e2199">As previously discussed, the structure of the GNO mirrors the modeling flow of engineering-based wind farm models. In such models, a connectivity matrix is established based on the spatial layout of the turbines and the chosen wake interaction scheme. For instance, in fully coupled formulations, all turbines influence one another, and the initial state is defined by the undisturbed inflow conditions.  Analogously, the GNO constructs a graph representation of the wind farm, which is then encoded into an initial higher-order thrust state. The approximator within the GNO can be interpreted as analogous to the iterative update process used in conventional wake models to adjust individual turbine states. However, in the GNO framework, this computation is performed in a latent space rather than directly in the physical domain.  Finally, the decoder evaluates the aggregated flow response of the wind farm, corresponding to the reconstruction of a flow field or flow map in traditional engineering approaches. These parallels are made explicit in Eq. (<xref ref-type="disp-formula" rid="Ch1.E8"/>), where the constitutive components of the GNO reflect the sequential structure of conventional wind farm modeling frameworks.</p>
<sec id="Ch1.S2.SS3.SSS1">
  <label>2.3.1</label><title>Encoding</title>
      <p id="d2e2211">The graph encoder layer <inline-formula><mml:math id="M107" display="inline"><mml:mi mathvariant="script">E</mml:mi></mml:math></inline-formula> consists of parallel encoders for nodes and edges. The nodes are encoded with an MLP, and the edges are encoded in two steps: first, they are pre-processed with radial basis functions (RBFs) and then encoded to the target latent space with an MLP. It is well known that there are different flow regimes at various downstream distances from a turbine. RBFs are used to encourage the network to view different downstream distances as distinct regimes. In initial experimentation, it was found to improve training.  The input edge and node data are projected into latent spaces of the same dimensionality, denoted as <inline-formula><mml:math id="M108" display="inline"><mml:mi>Q</mml:mi></mml:math></inline-formula>, ensuring dimensional consistency as the chosen approximator core – GEneralized Aggregation Network (GEN) – requires equal latent-space dimensions for nodes and edges. This is because the node and edge features are added together in the latent space.</p>
      <p id="d2e2228">The structure of an MLP is described in three stages: the input layer in Eq. (<xref ref-type="disp-formula" rid="Ch1.E9.10"/>), the hidden layers in Eq. (<xref ref-type="disp-formula" rid="Ch1.E9.11"/>), and the output layer in Eq. (<xref ref-type="disp-formula" rid="Ch1.E9.12"/>).
            

                  <disp-formula id="Ch1.E9" specific-use="align" content-type="subnumberedsingle"><mml:math id="M109" display="block"><mml:mtable displaystyle="true"><mml:mlabeledtr id="Ch1.E9.10"><mml:mtd><mml:mtext>7a</mml:mtext></mml:mtd><mml:mtd><mml:mstyle class="stylechange" displaystyle="true"/></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msup><mml:mi mathvariant="bold-italic">ξ</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:msup><mml:mo>=</mml:mo><mml:mi mathvariant="italic">ψ</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:msup><mml:mi mathvariant="bold">W</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>)</mml:mo><mml:mo>⊤</mml:mo></mml:mrow></mml:msup><mml:mi mathvariant="bold-italic">x</mml:mi><mml:mo>+</mml:mo><mml:msup><mml:mi mathvariant="bold-italic">b</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:mfenced></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="Ch1.E9.11"><mml:mtd><mml:mtext>7b</mml:mtext></mml:mtd><mml:mtd><mml:mstyle displaystyle="true" class="stylechange"/></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msup><mml:mi mathvariant="bold-italic">ξ</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>l</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup><mml:mo>=</mml:mo><mml:mi mathvariant="italic">ψ</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:msup><mml:mi mathvariant="bold">W</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>l</mml:mi><mml:mo>)</mml:mo><mml:mo>⊤</mml:mo></mml:mrow></mml:msup><mml:msup><mml:mi mathvariant="bold-italic">ξ</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>l</mml:mi><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:msup><mml:mo>+</mml:mo><mml:msup><mml:mi mathvariant="bold-italic">b</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>l</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:mfenced><mml:mo>,</mml:mo><mml:mtext>     </mml:mtext><mml:mi>l</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:mo>,</mml:mo><mml:mi mathvariant="normal">…</mml:mi><mml:mo>,</mml:mo><mml:mi>L</mml:mi><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="Ch1.E9.12"><mml:mtd><mml:mtext>7c</mml:mtext></mml:mtd><mml:mtd><mml:mstyle class="stylechange" displaystyle="true"/></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">x</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:msup><mml:mi mathvariant="bold">W</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>L</mml:mi><mml:mo>)</mml:mo><mml:mo>⊤</mml:mo></mml:mrow></mml:msup><mml:msup><mml:mi mathvariant="bold-italic">ξ</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>L</mml:mi><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:msup><mml:mo>+</mml:mo><mml:msup><mml:mi mathvariant="bold-italic">b</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>L</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr></mml:mtable></mml:math></disp-formula>

            where <inline-formula><mml:math id="M110" display="inline"><mml:mrow><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">x</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> represents the overall MLP mapping for input vector <inline-formula><mml:math id="M111" display="inline"><mml:mi mathvariant="bold-italic">x</mml:mi></mml:math></inline-formula>; <inline-formula><mml:math id="M112" display="inline"><mml:mrow><mml:msup><mml:mi mathvariant="bold-italic">ξ</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>l</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> denotes the hidden units at layer <inline-formula><mml:math id="M113" display="inline"><mml:mi>l</mml:mi></mml:math></inline-formula>; <inline-formula><mml:math id="M114" display="inline"><mml:mrow><mml:msup><mml:mi mathvariant="bold">W</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>l</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M115" display="inline"><mml:mrow><mml:msup><mml:mi mathvariant="bold-italic">b</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>l</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> are the weights and biases of the network, respectively; and <inline-formula><mml:math id="M116" display="inline"><mml:mi mathvariant="italic">ψ</mml:mi></mml:math></inline-formula> is the activation function. In this work, the activation function is the Rectified Linear Unit (ReLU). The MLPs considered in this work operate in real space and are used to map between different dimensions in both the latent and observational spaces, i.e., <inline-formula><mml:math id="M117" display="inline"><mml:mrow><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mo>:</mml:mo><mml:msup><mml:mi mathvariant="double-struck">R</mml:mi><mml:mrow><mml:mi>N</mml:mi><mml:mo>×</mml:mo><mml:mi>C</mml:mi></mml:mrow></mml:msup><mml:mo>→</mml:mo><mml:msup><mml:mi mathvariant="double-struck">R</mml:mi><mml:mrow><mml:mi>N</mml:mi><mml:mo>×</mml:mo><mml:mi>Q</mml:mi></mml:mrow></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:mi>Q</mml:mi><mml:mo>∈</mml:mo><mml:mi mathvariant="double-struck">N</mml:mi></mml:mrow></mml:math></inline-formula>.</p>
      <p id="d2e2579">RBFs are used to map the initial edge features, here distances between wind turbines <inline-formula><mml:math id="M118" display="inline"><mml:mi>i</mml:mi></mml:math></inline-formula> and <inline-formula><mml:math id="M119" display="inline"><mml:mi>j</mml:mi></mml:math></inline-formula> (<inline-formula><mml:math id="M120" display="inline"><mml:mrow><mml:msub><mml:mi>d</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>), into a higher-dimensional space. We employ <inline-formula><mml:math id="M121" display="inline"><mml:mrow><mml:mi>K</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">9</mml:mn></mml:mrow></mml:math></inline-formula> Gaussian basis functions to transform distances such that <inline-formula><mml:math id="M122" display="inline"><mml:mrow><mml:mi mathvariant="italic">φ</mml:mi><mml:mo>:</mml:mo><mml:msup><mml:mi mathvariant="double-struck">R</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msup><mml:mo>→</mml:mo><mml:msup><mml:mi mathvariant="double-struck">R</mml:mi><mml:mi>K</mml:mi></mml:msup></mml:mrow></mml:math></inline-formula>. The formulation of the RBF is shown in Eq. (<xref ref-type="disp-formula" rid="Ch1.E13"/>):
            

                  <disp-formula id="Ch1.E13" specific-use="gather" content-type="subnumberedsingle"><mml:math id="M123" display="block"><mml:mtable displaystyle="true"><mml:mlabeledtr id="Ch1.E13.14"><mml:mtd><mml:mtext>8a</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mtable rowspacing="0.2ex" class="split" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:mi mathvariant="italic">φ</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mi>d</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mi>exp⁡</mml:mi><mml:mfenced open="(" close=")"><mml:mrow><mml:mo>-</mml:mo><mml:msubsup><mml:mi mathvariant="italic">β</mml:mi><mml:mtext>RBF</mml:mtext><mml:mrow><mml:mo>(</mml:mo><mml:mi>k</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:msup><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi>d</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>-</mml:mo><mml:msubsup><mml:mi mathvariant="italic">μ</mml:mi><mml:mtext>RBF</mml:mtext><mml:mrow><mml:mo>(</mml:mo><mml:mi>k</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:mfenced></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mo>⋅</mml:mo><mml:msub><mml:mi mathvariant="italic">δ</mml:mi><mml:mi mathvariant="normal">c</mml:mi></mml:msub><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi>d</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>,</mml:mo><mml:mi mathvariant="normal">…</mml:mi><mml:mo>,</mml:mo><mml:mi>K</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="Ch1.E13.15"><mml:mtd><mml:mtext>8b</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi mathvariant="italic">δ</mml:mi><mml:mi mathvariant="normal">c</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:msub><mml:mi>d</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mfenced open="{" close=""><mml:mtable columnspacing="1em" class="cases" rowspacing="0.2ex" columnalign="left left" framespacing="0em"><mml:mtr><mml:mtd><mml:mrow><mml:mn mathvariant="normal">0.5</mml:mn><mml:mo>⋅</mml:mo><mml:mfenced close="]" open="["><mml:mrow><mml:mi>cos⁡</mml:mi><mml:mfenced close=")" open="("><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mi mathvariant="italic">π</mml:mi><mml:msub><mml:mi>d</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:mrow><mml:mrow><mml:msub><mml:mi>d</mml:mi><mml:mi>c</mml:mi></mml:msub></mml:mrow></mml:mfrac></mml:mstyle></mml:mfenced><mml:mo>+</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mtext>for </mml:mtext><mml:msub><mml:mi>d</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>≤</mml:mo><mml:msub><mml:mi>d</mml:mi><mml:mi>c</mml:mi></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mn mathvariant="normal">0</mml:mn><mml:mo>,</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mtext>for </mml:mtext><mml:msub><mml:mi>d</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>&gt;</mml:mo><mml:msub><mml:mi>d</mml:mi><mml:mi>c</mml:mi></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced></mml:mrow></mml:mtd></mml:mlabeledtr></mml:mtable></mml:math></disp-formula>

            where <inline-formula><mml:math id="M124" display="inline"><mml:mrow><mml:msubsup><mml:mi mathvariant="italic">β</mml:mi><mml:mtext>RBF</mml:mtext><mml:mrow><mml:mo>(</mml:mo><mml:mi>k</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M125" display="inline"><mml:mrow><mml:msubsup><mml:mi mathvariant="italic">μ</mml:mi><mml:mtext>RBF</mml:mtext><mml:mrow><mml:mo>(</mml:mo><mml:mi>k</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup></mml:mrow></mml:math></inline-formula> are trainable parameters defining the <inline-formula><mml:math id="M126" display="inline"><mml:mi>k</mml:mi></mml:math></inline-formula>th basis function, and <inline-formula><mml:math id="M127" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">δ</mml:mi><mml:mi mathvariant="normal">c</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:msub><mml:mi>d</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> is a cosine cut-off function with cut-off distance <inline-formula><mml:math id="M128" display="inline"><mml:mrow><mml:msub><mml:mi>d</mml:mi><mml:mi mathvariant="normal">c</mml:mi></mml:msub><mml:mo>≈</mml:mo><mml:mn mathvariant="normal">695</mml:mn><mml:mspace linebreak="nobreak" width="0.125em"/><mml:mi>D</mml:mi></mml:mrow></mml:math></inline-formula>, chosen as the diagonal of the largest flow map to ensure that no edge is fully ignored. A more aggressive cut-off could be adopted in the future but would require a dedicated study to determine an appropriate value.  The initial <inline-formula><mml:math id="M129" display="inline"><mml:mrow><mml:msubsup><mml:mi mathvariant="italic">μ</mml:mi><mml:mtext>RBF</mml:mtext><mml:mrow><mml:mo>(</mml:mo><mml:mi>k</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup></mml:mrow></mml:math></inline-formula> are linearly spaced between <inline-formula><mml:math id="M130" display="inline"><mml:mo>-</mml:mo></mml:math></inline-formula>1 and 1, while <inline-formula><mml:math id="M131" display="inline"><mml:mrow><mml:msubsup><mml:mi mathvariant="italic">β</mml:mi><mml:mtext>RBF</mml:mtext><mml:mrow><mml:mo>(</mml:mo><mml:mi>k</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup></mml:mrow></mml:math></inline-formula> all are initialized based on the maximum range and number of basis functions <inline-formula><mml:math id="M132" display="inline"><mml:mrow><mml:msubsup><mml:mi mathvariant="italic">β</mml:mi><mml:mtext>RBF</mml:mtext><mml:mrow><mml:mo>(</mml:mo><mml:mi>k</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mo>=</mml:mo><mml:mstyle displaystyle="false"><mml:mfrac style="text"><mml:mi>K</mml:mi><mml:mrow><mml:mo>max⁡</mml:mo><mml:mo>(</mml:mo><mml:msub><mml:mi>d</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>)</mml:mo><mml:mo>-</mml:mo><mml:mo>min⁡</mml:mo><mml:mo>(</mml:mo><mml:msub><mml:mi>d</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:mfrac></mml:mstyle></mml:mrow></mml:math></inline-formula>. The addition of RBF functions to encode the distances is inspired by the work of <xref ref-type="bibr" rid="bib1.bibx24" id="text.46"/>, who used it in their GNN for electron density estimation.</p>
      <p id="d2e3069">Combined, the encoding steps are summarized in Eq. (<xref ref-type="disp-formula" rid="Ch1.E16"/>):
            

                  <disp-formula id="Ch1.E16" specific-use="align" content-type="subnumberedsingle"><mml:math id="M133" display="block"><mml:mtable displaystyle="true"><mml:mlabeledtr id="Ch1.E16.17"><mml:mtd><mml:mtext>9a</mml:mtext></mml:mtd><mml:mtd><mml:mstyle class="stylechange" displaystyle="true"/></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mi mathvariant="bold-italic">h</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mi mathvariant="normal">v</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">v</mml:mi><mml:mo>)</mml:mo><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="Ch1.E16.18"><mml:mtd><mml:mtext>9b</mml:mtext></mml:mtd><mml:mtd><mml:mstyle displaystyle="true" class="stylechange"/></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mi mathvariant="bold-italic">a</mml:mi><mml:mo>=</mml:mo><mml:mo mathsize="1.1em">(</mml:mo><mml:msub><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mi mathvariant="normal">e</mml:mi></mml:msub><mml:mo>∘</mml:mo><mml:msub><mml:mi mathvariant="italic">φ</mml:mi><mml:mi mathvariant="normal">e</mml:mi></mml:msub><mml:mo mathsize="1.1em">)</mml:mo><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">e</mml:mi><mml:mo>)</mml:mo><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr></mml:mtable></mml:math></disp-formula>

            where <inline-formula><mml:math id="M134" display="inline"><mml:mi mathvariant="bold-italic">h</mml:mi></mml:math></inline-formula> and <inline-formula><mml:math id="M135" display="inline"><mml:mi mathvariant="bold-italic">a</mml:mi></mml:math></inline-formula> denote the latent-space representations of nodes and edges, respectively. <inline-formula><mml:math id="M136" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">φ</mml:mi><mml:mi>e</mml:mi></mml:msub><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mo>:</mml:mo><mml:mspace width="0.25em" linebreak="nobreak"/><mml:msup><mml:mi mathvariant="double-struck">R</mml:mi><mml:mrow><mml:mo>|</mml:mo><mml:mi>E</mml:mi><mml:mo>|</mml:mo><mml:mo>×</mml:mo><mml:msub><mml:mi>f</mml:mi><mml:mi mathvariant="normal">e</mml:mi></mml:msub></mml:mrow></mml:msup><mml:mo>→</mml:mo><mml:msup><mml:mi mathvariant="double-struck">R</mml:mi><mml:mrow><mml:mo>|</mml:mo><mml:mi>V</mml:mi><mml:mo>|</mml:mo><mml:mo>×</mml:mo><mml:msub><mml:mi>f</mml:mi><mml:mi mathvariant="normal">e</mml:mi></mml:msub><mml:mo>⋅</mml:mo><mml:mi>K</mml:mi></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> is the RBF function mapping each edge feature from the initial observational space to a <inline-formula><mml:math id="M137" display="inline"><mml:mi>K</mml:mi></mml:math></inline-formula> dimensional RBF space, and <inline-formula><mml:math id="M138" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mi>v</mml:mi></mml:msub><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mo>:</mml:mo><mml:mspace linebreak="nobreak" width="0.25em"/><mml:msup><mml:mi mathvariant="double-struck">R</mml:mi><mml:mrow><mml:mo>|</mml:mo><mml:mi>V</mml:mi><mml:mo>|</mml:mo><mml:mo>×</mml:mo><mml:msub><mml:mi>f</mml:mi><mml:mi mathvariant="normal">v</mml:mi></mml:msub></mml:mrow></mml:msup><mml:mo>→</mml:mo><mml:msup><mml:mi mathvariant="double-struck">R</mml:mi><mml:mrow><mml:mo>|</mml:mo><mml:mi>V</mml:mi><mml:mo>|</mml:mo><mml:mo>×</mml:mo><mml:mi>Q</mml:mi></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M139" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mi>e</mml:mi></mml:msub><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mo>:</mml:mo><mml:mspace linebreak="nobreak" width="0.25em"/><mml:msup><mml:mi mathvariant="double-struck">R</mml:mi><mml:mrow><mml:mo>|</mml:mo><mml:mi>E</mml:mi><mml:mo>|</mml:mo><mml:mo>×</mml:mo><mml:msub><mml:mi>f</mml:mi><mml:mi mathvariant="normal">e</mml:mi></mml:msub><mml:mi>K</mml:mi></mml:mrow></mml:msup><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mo>→</mml:mo><mml:mspace linebreak="nobreak" width="0.25em"/><mml:msup><mml:mi mathvariant="double-struck">R</mml:mi><mml:mrow><mml:mo>|</mml:mo><mml:mi>E</mml:mi><mml:mo>|</mml:mo><mml:mo>×</mml:mo><mml:mi>Q</mml:mi></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> are the node and edge encoding MLPs. For convenience, the key dimensions are restated here: the cardinalities <inline-formula><mml:math id="M140" display="inline"><mml:mrow><mml:mo>|</mml:mo><mml:mi>V</mml:mi><mml:mo>|</mml:mo></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M141" display="inline"><mml:mrow><mml:mo>|</mml:mo><mml:mi>E</mml:mi><mml:mo>|</mml:mo></mml:mrow></mml:math></inline-formula> vary with the wind farm configuration; <inline-formula><mml:math id="M142" display="inline"><mml:mrow><mml:msub><mml:mi>f</mml:mi><mml:mi mathvariant="normal">v</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M143" display="inline"><mml:mrow><mml:msub><mml:mi>f</mml:mi><mml:mi mathvariant="normal">e</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:math></inline-formula> are the initial node and edge feature dimensions; <inline-formula><mml:math id="M144" display="inline"><mml:mrow><mml:mi>K</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">9</mml:mn></mml:mrow></mml:math></inline-formula> is the number of RBF kernels; and <inline-formula><mml:math id="M145" display="inline"><mml:mi>Q</mml:mi></mml:math></inline-formula> is the latent-space dimension.</p>
</sec>
<sec id="Ch1.S2.SS3.SSS2">
  <label>2.3.2</label><title>Approximator: GEneralized Aggregation Network (GEN)</title>
      <p id="d2e3405">The central component of the GNO is the approximator <inline-formula><mml:math id="M146" display="inline"><mml:mi mathvariant="script">A</mml:mi></mml:math></inline-formula>. It applies the GEN message-passing algorithm by <xref ref-type="bibr" rid="bib1.bibx28" id="text.47"/>, with three message-passing steps (<inline-formula><mml:math id="M147" display="inline"><mml:mrow><mml:mi>M</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:math></inline-formula>) sequentially applied on the encoded latent-space wind turbine nodes (<inline-formula><mml:math id="M148" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">h</mml:mi><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>) using the latent-space inter-turbine edges (<inline-formula><mml:math id="M149" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">a</mml:mi><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>) to obtain the processed wind turbine nodes (<inline-formula><mml:math id="M150" display="inline"><mml:mrow><mml:msub><mml:msup><mml:mi mathvariant="bold-italic">h</mml:mi><mml:mo mathvariant="bold">′</mml:mo></mml:msup><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>).</p>
      <p id="d2e3467">The GEN methodology consists of the construction of the messages (<inline-formula><mml:math id="M151" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">m</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>), the application of the edge-to-node aggregation function (<inline-formula><mml:math id="M152" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">ρ</mml:mi><mml:mrow><mml:mi>e</mml:mi><mml:mo>→</mml:mo><mml:mi>v</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>), and the node update MLP (<inline-formula><mml:math id="M153" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mi mathvariant="normal">v</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>):
            

                  <disp-formula id="Ch1.E19" specific-use="gather" content-type="subnumberedsingle"><mml:math id="M154" display="block"><mml:mtable displaystyle="true"><mml:mlabeledtr id="Ch1.E19.20"><mml:mtd><mml:mtext>10a</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:msubsup><mml:mi mathvariant="bold-italic">m</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mi>m</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mo>=</mml:mo><mml:mtext>ReLU</mml:mtext><mml:mfenced close=")" open="("><mml:mrow><mml:msubsup><mml:mi mathvariant="bold-italic">h</mml:mi><mml:mi>j</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>m</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mo>+</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">a</mml:mi><mml:mtext>ji</mml:mtext></mml:msub></mml:mrow></mml:mfenced><mml:mo>+</mml:mo><mml:mi mathvariant="italic">ε</mml:mi><mml:mo>,</mml:mo><mml:mtext>     </mml:mtext><mml:mi>j</mml:mi><mml:mo>∈</mml:mo><mml:mi mathvariant="script">N</mml:mi><mml:mo>(</mml:mo><mml:mi>i</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="Ch1.E19.21"><mml:mtd><mml:mtext>10b</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mtable rowspacing="0.2ex" class="split" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:msubsup><mml:mi mathvariant="bold-italic">h</mml:mi><mml:mi>i</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>m</mml:mi><mml:mo>+</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mo>=</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mspace width="0.25em" linebreak="nobreak"/><mml:msubsup><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mrow><mml:msup><mml:mi>h</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mi>m</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mfenced open="(" close=")"><mml:mrow><mml:msubsup><mml:mi mathvariant="bold-italic">h</mml:mi><mml:mi>i</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>m</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mo>+</mml:mo><mml:msub><mml:mi mathvariant="italic">ρ</mml:mi><mml:mrow><mml:mi>e</mml:mi><mml:mo>→</mml:mo><mml:mi>v</mml:mi></mml:mrow></mml:msub><mml:mfenced open="(" close=")"><mml:mrow><mml:msubsup><mml:mi mathvariant="bold-italic">m</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mi>m</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup></mml:mrow></mml:mfenced></mml:mrow></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mtext>     </mml:mtext><mml:mi>m</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:mi mathvariant="normal">…</mml:mi><mml:mi>M</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mtd></mml:mlabeledtr></mml:mtable></mml:math></disp-formula>

            where <inline-formula><mml:math id="M155" display="inline"><mml:mi>m</mml:mi></mml:math></inline-formula> is the current message-passing step, and <inline-formula><mml:math id="M156" display="inline"><mml:mrow><mml:mi>i</mml:mi><mml:mo>∈</mml:mo><mml:mi mathvariant="script">I</mml:mi></mml:mrow></mml:math></inline-formula> is the index of a receiving node, with <inline-formula><mml:math id="M157" display="inline"><mml:mi mathvariant="script">I</mml:mi></mml:math></inline-formula> being an index set relating to all receiving nodes. Correspondingly, <inline-formula><mml:math id="M158" display="inline"><mml:mi>j</mml:mi></mml:math></inline-formula> indicates a sending node, <inline-formula><mml:math id="M159" display="inline"><mml:mrow><mml:mi mathvariant="script">N</mml:mi><mml:mo>(</mml:mo><mml:mi>i</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> is a set of the nodes neighboring the node with index <inline-formula><mml:math id="M160" display="inline"><mml:mi>i</mml:mi></mml:math></inline-formula>, and <inline-formula><mml:math id="M161" 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:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">6</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> is a small positive value added for numerical stability. In Fig. <xref ref-type="fig" rid="F5"/>, the GEN core is visualized schematically. In this work, Softmax aggregation is used as <inline-formula><mml:math id="M162" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">ρ</mml:mi><mml:mrow><mml:mi>e</mml:mi><mml:mo>→</mml:mo><mml:mi>v</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>; it uses Softmax to scale the latent space of each feature dimension independently. The incoming messages to node <inline-formula><mml:math id="M163" display="inline"><mml:mi>i</mml:mi></mml:math></inline-formula> from its <inline-formula><mml:math id="M164" display="inline"><mml:mrow><mml:mo>|</mml:mo><mml:mi mathvariant="script">N</mml:mi><mml:mo>(</mml:mo><mml:mi>i</mml:mi><mml:mo>)</mml:mo><mml:mo>|</mml:mo></mml:mrow></mml:math></inline-formula> neighbors form a matrix of shape <inline-formula><mml:math id="M165" display="inline"><mml:mrow><mml:mo>|</mml:mo><mml:mi mathvariant="script">N</mml:mi><mml:mo>(</mml:mo><mml:mi>i</mml:mi><mml:mo>)</mml:mo><mml:mo>|</mml:mo><mml:mo>×</mml:mo><mml:mi>Q</mml:mi></mml:mrow></mml:math></inline-formula>. For each feature dimension, let <inline-formula><mml:math id="M166" display="inline"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">x</mml:mi><mml:mo stretchy="true" mathvariant="normal">^</mml:mo></mml:mover><mml:mi mathvariant="normal">q</mml:mi></mml:msub><mml:mo>∈</mml:mo><mml:msup><mml:mi mathvariant="double-struck">R</mml:mi><mml:mrow><mml:mo>|</mml:mo><mml:mi mathvariant="script">N</mml:mi><mml:mo>(</mml:mo><mml:mi>i</mml:mi><mml:mo>)</mml:mo><mml:mo>|</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> denote the vector containing the <inline-formula><mml:math id="M167" display="inline"><mml:mi>q</mml:mi></mml:math></inline-formula>th feature value across all neighbors.

              <disp-formula id="Ch1.E22" content-type="numbered"><label>11</label><mml:math id="M168" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="italic">ρ</mml:mi><mml:mrow><mml:mi>e</mml:mi><mml:mo>→</mml:mo><mml:mi>v</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:munder><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">x</mml:mi><mml:mo mathvariant="normal" stretchy="true">^</mml:mo></mml:mover><mml:mi mathvariant="normal">q</mml:mi></mml:msub><mml:mo>∈</mml:mo><mml:mi mathvariant="script">X</mml:mi></mml:mrow></mml:munder><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mi>exp⁡</mml:mi><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">x</mml:mi><mml:mo mathvariant="normal" stretchy="true">^</mml:mo></mml:mover><mml:mi mathvariant="normal">q</mml:mi></mml:msub></mml:mrow></mml:mfenced></mml:mrow><mml:mrow><mml:msub><mml:mo>∑</mml:mo><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">x</mml:mi><mml:mo stretchy="true" mathvariant="normal">^</mml:mo></mml:mover><mml:mi mathvariant="normal">r</mml:mi></mml:msub><mml:mo>∈</mml:mo><mml:mi mathvariant="script">X</mml:mi></mml:mrow></mml:msub><mml:mi>exp⁡</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">x</mml:mi><mml:mo stretchy="true" mathvariant="normal">^</mml:mo></mml:mover><mml:mi mathvariant="normal">r</mml:mi></mml:msub></mml:mrow></mml:mfenced></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>⋅</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">x</mml:mi><mml:mo mathvariant="normal" stretchy="true">^</mml:mo></mml:mover><mml:mi mathvariant="normal">q</mml:mi></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

            where <inline-formula><mml:math id="M169" display="inline"><mml:mrow><mml:mi mathvariant="script">X</mml:mi><mml:mo>=</mml:mo><mml:mo mathvariant="italic">{</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">x</mml:mi><mml:mo mathvariant="normal" stretchy="true">^</mml:mo></mml:mover><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:mi mathvariant="normal">…</mml:mi><mml:mo>,</mml:mo><mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">x</mml:mi><mml:mo stretchy="true" mathvariant="normal">^</mml:mo></mml:mover><mml:mi mathvariant="normal">Q</mml:mi></mml:msub><mml:mo mathvariant="italic">}</mml:mo></mml:mrow></mml:math></inline-formula> is a collection of neighborhood features to be aggregated independently.</p>

      <fig id="F6" specific-use="star"><label>Figure 6</label><caption><p id="d2e4012">GNO Probe input, processing and output with model data flow from left to right.</p></caption>
            <graphic xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026-f06.png"/>

          </fig>

</sec>
<sec id="Ch1.S2.SS3.SSS3">
  <label>2.3.3</label><title>Decoder</title>
      <p id="d2e4029">In the first part of the decoder stage (<inline-formula><mml:math id="M170" display="inline"><mml:mi mathvariant="script">D</mml:mi></mml:math></inline-formula>), an additional message-passing step is performed using the processed wind turbine nodes <inline-formula><mml:math id="M171" display="inline"><mml:mrow><mml:msub><mml:msup><mml:mi mathvariant="bold-italic">h</mml:mi><mml:mo mathvariant="bold">′</mml:mo></mml:msup><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> with the latent-space probe edges <inline-formula><mml:math id="M172" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">a</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> to obtain processed probe nodes <inline-formula><mml:math id="M173" display="inline"><mml:mrow><mml:msub><mml:msup><mml:mi mathvariant="bold-italic">h</mml:mi><mml:mo mathvariant="bold">′</mml:mo></mml:msup><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, consisting of aggregated information from all the wind turbine nodes. In the final part of the decoder stage, two separate MLPs map the latent variables back to the observational space. A residual-network (ResNet) formulation is adopted, in which the free-stream velocity <inline-formula><mml:math id="M174" display="inline"><mml:mi>U</mml:mi></mml:math></inline-formula> is added to the decoded node values as the final step during inference. Consequently, this residual connection is also taken into account during the evaluation of the loss function during training.
            

                  <disp-formula id="Ch1.E23" specific-use="align" content-type="subnumberedsingle"><mml:math id="M175" display="block"><mml:mtable displaystyle="true"><mml:mlabeledtr id="Ch1.E23.24"><mml:mtd><mml:mtext>12a</mml:mtext></mml:mtd><mml:mtd><mml:mstyle displaystyle="true" class="stylechange"/></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:msup><mml:mi mathvariant="bold-italic">v</mml:mi><mml:mo mathvariant="bold">′</mml:mo></mml:msup><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msubsup><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:msup><mml:mi mathvariant="bold-italic">h</mml:mi><mml:mo mathvariant="bold">′</mml:mo></mml:msup><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:mfenced><mml:mo>+</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">v</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="Ch1.E23.25"><mml:mtd><mml:mtext>12b</mml:mtext></mml:mtd><mml:mtd><mml:mstyle displaystyle="true" class="stylechange"/></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:msup><mml:mi mathvariant="bold-italic">v</mml:mi><mml:mo mathvariant="bold">′</mml:mo></mml:msup><mml:mtext>wt</mml:mtext></mml:msub><mml:mo>=</mml:mo><mml:msubsup><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:msup><mml:mi mathvariant="bold-italic">h</mml:mi><mml:mo mathvariant="bold">′</mml:mo></mml:msup><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:mfenced><mml:mo>+</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">v</mml:mi><mml:mtext>wt</mml:mtext></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr></mml:mtable></mml:math></disp-formula>

            where <inline-formula><mml:math id="M176" display="inline"><mml:mrow><mml:msubsup><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:msubsup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M177" display="inline"><mml:mrow><mml:msubsup><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:msubsup></mml:mrow></mml:math></inline-formula> are the decoding MLPs, both mapping from the latent space to the output space:<inline-formula><mml:math id="M178" display="inline"><mml:mrow><mml:msubsup><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mo>,</mml:mo><mml:mspace linebreak="nobreak" width="0.25em"/><mml:msubsup><mml:mi mathvariant="italic">ϕ</mml:mi><mml:mrow><mml:msup><mml:mi>v</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mo>:</mml:mo><mml:mspace linebreak="nobreak" width="0.25em"/><mml:msup><mml:mi mathvariant="double-struck">R</mml:mi><mml:mrow><mml:mo>|</mml:mo><mml:msub><mml:mi>V</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mo>|</mml:mo><mml:mo>×</mml:mo><mml:mi>Q</mml:mi></mml:mrow></mml:msup><mml:mo>,</mml:mo><mml:msup><mml:mi mathvariant="double-struck">R</mml:mi><mml:mrow><mml:mo>|</mml:mo><mml:msub><mml:mi>V</mml:mi><mml:mtext>wt</mml:mtext></mml:msub><mml:mo>|</mml:mo><mml:mo>×</mml:mo><mml:mi>Q</mml:mi></mml:mrow></mml:msup><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mo>→</mml:mo><mml:mspace linebreak="nobreak" width="0.25em"/><mml:msup><mml:mi mathvariant="double-struck">R</mml:mi><mml:mrow><mml:mo>|</mml:mo><mml:msub><mml:mi>V</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mo>|</mml:mo><mml:mo>×</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup><mml:mo>,</mml:mo><mml:msup><mml:mi mathvariant="double-struck">R</mml:mi><mml:mrow><mml:mo>|</mml:mo><mml:msub><mml:mi>V</mml:mi><mml:mtext>wt</mml:mtext></mml:msub><mml:mo>|</mml:mo><mml:mo>×</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>.  Here, <inline-formula><mml:math id="M179" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">v</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M180" display="inline"><mml:mrow><mml:msub><mml:msup><mml:mi mathvariant="bold-italic">h</mml:mi><mml:mo mathvariant="bold">′</mml:mo></mml:msup><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, and <inline-formula><mml:math id="M181" display="inline"><mml:mrow><mml:msub><mml:msup><mml:mi mathvariant="bold-italic">v</mml:mi><mml:mo mathvariant="bold">′</mml:mo></mml:msup><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> denote the probe input nodes, hidden-state nodes, and predictions, respectively. Likewise, <inline-formula><mml:math id="M182" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">v</mml:mi><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M183" display="inline"><mml:mrow><mml:msub><mml:msup><mml:mi mathvariant="bold-italic">h</mml:mi><mml:mo mathvariant="bold">′</mml:mo></mml:msup><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>, and <inline-formula><mml:math id="M184" display="inline"><mml:mrow><mml:msub><mml:msup><mml:mi mathvariant="bold-italic">v</mml:mi><mml:mo mathvariant="bold">′</mml:mo></mml:msup><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> correspond to the wind turbine input nodes, hidden-state nodes, and predictions.</p>
      <p id="d2e4448">The data flow through the GNO is shown in Fig. <xref ref-type="fig" rid="F6"/>, where the components defined in Eq. (<xref ref-type="disp-formula" rid="Ch1.E8"/>) and described in this subsection are represented as boxes. The partially processed graph states are distinguished by color, providing a visual overview of the GNO architecture and its internal data transformations.</p>
</sec>
<sec id="Ch1.S2.SS3.SSS4">
  <label>2.3.4</label><title>Regularization and normalization</title>
      <p id="d2e4463">With the layered nature of the GNO model, the total number of layers grows fast; with deep models, it is advisable to include regularization and normalization to avoid overfitting. In this work, both the node and edge features are scaled, meaning wind speeds, TI, and positional information. Additionally, layer normalization and dropout regularization are used inside the GNO. For feature scaling, range normalization is used.

              <disp-formula id="Ch1.E26" content-type="numbered"><label>13</label><mml:math id="M185" display="block"><mml:mrow><mml:msup><mml:mi mathvariant="italic">ϑ</mml:mi><mml:mo>′</mml:mo></mml:msup><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mi mathvariant="italic">ϑ</mml:mi><mml:mrow><mml:mo>max⁡</mml:mo><mml:mo>(</mml:mo><mml:mi mathvariant="italic">ϑ</mml:mi><mml:mo>)</mml:mo><mml:mo>-</mml:mo><mml:mo>min⁡</mml:mo><mml:mo>(</mml:mo><mml:mi mathvariant="italic">ϑ</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

            where <inline-formula><mml:math id="M186" display="inline"><mml:mi mathvariant="italic">ϑ</mml:mi></mml:math></inline-formula> is an unscaled feature and <inline-formula><mml:math id="M187" display="inline"><mml:mrow><mml:msup><mml:mi mathvariant="italic">ϑ</mml:mi><mml:mo>′</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula> is the respective scaled feature. The features are only scaled by the feature range as it allows ResNet application inside the scaled feature space, which makes model implementation easier.</p>
      <p id="d2e4522">To counter overfitting, dropout regularization, as implemented by <xref ref-type="bibr" rid="bib1.bibx46" id="text.48"/>, has been incorporated into our MLP formulation. Dropout works by randomly omitting the output of some neurons during training, making the network more robust and reducing the risk of over-reliance on single neurons. A dropout probability of <inline-formula><mml:math id="M188" display="inline"><mml:mrow><mml:msub><mml:mi>P</mml:mi><mml:mi mathvariant="normal">D</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.1</mml:mn></mml:mrow></mml:math></inline-formula> has been used in this study; further implementation details can be found in Appendix <xref ref-type="sec" rid="App1.Ch1.S2"/>.</p>
      <p id="d2e4545">A common technique to improve training stability and speed up training is batch normalization. However, as the trained GNO can handle graphs of any size, there is no fixed batch size, which makes batch statistics unreliable. Additionally, during training, graphs are batched together, and statistics across graphs are not desirable. For additional information about graph batching with GNOs, see Appendix <xref ref-type="sec" rid="App1.Ch1.S3"/>. Instead, layer normalization, as proposed by <xref ref-type="bibr" rid="bib1.bibx1" id="text.49"/>, can be used. While often considered less effective than batch normalization, layer normalization is fully compatible with GNNs. <xref ref-type="bibr" rid="bib1.bibx1" id="text.50"/> originally introduced it for MLPs and recurrent neural networks, applying it between hidden layers. In this work, since GNNs can be interpreted as compositions of MLP layers, layer normalization is applied only to the final layer of each MLP within the encoder <inline-formula><mml:math id="M189" display="inline"><mml:mi mathvariant="script">E</mml:mi></mml:math></inline-formula> and approximator <inline-formula><mml:math id="M190" display="inline"><mml:mi mathvariant="script">A</mml:mi></mml:math></inline-formula> stages, as well as during the message-passing step of the decoder <inline-formula><mml:math id="M191" display="inline"><mml:mi mathvariant="script">D</mml:mi></mml:math></inline-formula> stage. It is not applied to the final node-decoder MLPs, where full expressive power at the output is desired. Implementation details can be found in Appendix <xref ref-type="sec" rid="App1.Ch1.S2"/>.</p>
</sec>
</sec>
<sec id="Ch1.S2.SS4">
  <label>2.4</label><title>Training and evaluation</title>
      <p id="d2e4590">The GNO is intended as a surrogate model for a regression-type task. Since a true model exists to learn from, the most straightforward training method is offline supervised training. To train the GNO, the high-performance computing (HPC) cluster Sophia <xref ref-type="bibr" rid="bib1.bibx48" id="paren.51"/> at DTU has been used. Nodes with <monospace>Quadro RTX 4000</monospace> GPU acceleration were employed.</p>
      <p id="d2e4599">The optimization algorithm employed during training is <monospace>Adam</monospace> <xref ref-type="bibr" rid="bib1.bibx27" id="paren.52"/>. Adam is a variant of stochastic gradient descent (SGD) that incorporates past gradients and a momentum term to compute parameter updates. Consequently, multiple hyperparameters control the relative weighting of these terms. In this work, the default momentum parameters are used.  During training, the dataset is shuffled and passed through the training algorithm multiple times; one such pass is termed an epoch. During an epoch, when a graph is sampled, the probes are sub-sampled from the flow domain; in practice, a flattened list is sampled uniformly. The probe node sample size (<inline-formula><mml:math id="M192" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>) can be considered to be a hyperparameter that has been the subject of investigation during a hyperparameter search.  In our implementation, a maximum of 3000 epochs has been considered, although this limit has not been reached at any point.</p>
      <p id="d2e4619">During training, the model is continuously evaluated using the validation dataset. If the validation performance surpasses previous results at any time, the saved model weights and biases are updated. The validation evaluation is performed every fifth epoch to save computational resources. Unlike during training, the graphs are not shuffled, and the probe nodes remain the same across epochs.</p>
<sec id="Ch1.S2.SS4.SSS1">
  <label>2.4.1</label><title>Machine learning framework</title>
      <p id="d2e4629">To train the GNO, a combination of different Python-based frameworks is used. The GNN components are constructed with the libraries based on Jax <xref ref-type="bibr" rid="bib1.bibx7" id="paren.53"/>; Jraph is used for <xref ref-type="bibr" rid="bib1.bibx18" id="paren.54"/> for GNN abstractions, and Flax <xref ref-type="bibr" rid="bib1.bibx21" id="paren.55"/> for neural networks. Additionally, as the Jax ecosystem does not yet have a dedicated data pipeline, graph construction and subsequent data loading are handled using PyTorch Geometric (PyG) <xref ref-type="bibr" rid="bib1.bibx15" id="paren.56"/>. For additional details on the data pipeline, see Appendix <xref ref-type="sec" rid="App1.Ch1.S3"/>.</p>
</sec>
<sec id="Ch1.S2.SS4.SSS2">
  <label>2.4.2</label><title>Performance metrics</title>
      <p id="d2e4655">Once a set of GNO weights are obtained through training, the resultant GNO model has to be tested.  To accurately assess performance, various performance metrics are considered. Four statistical measures are considered: the mean absolute error (MAE), the mean absolute normalized error (MANE), the mean square error (MSE), and the root mean square error (RMSE). They differ in the first two using an <inline-formula><mml:math id="M193" display="inline"><mml:mrow><mml:msup><mml:mi>l</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> norm and the last two using an <inline-formula><mml:math id="M194" display="inline"><mml:mrow><mml:msup><mml:mi>l</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula> norm. MSE and MAE are used to compare models, while MANE and RMSE is chosen to evaluate the best model as they are more easily interpreted. While most metrics are standard, MANE is a custom variation of mean absolute percentage error (MAPE). Standard MAPE normalizes by the target value, which becomes problematic when targets approach zero, as can occur near heavily waked turbines where wake superposition overestimates the deficit. Normalizing by the wake deficit instead would cause similar issues in unwaked regions. To avoid this, MANE normalizes by the free-stream velocity, providing a more robust metric that still enables comparison across different inflow conditions.  The primary reason for including multiple metrics is to facilitate cross-comparison with other works in the field, as there is no consensus on which metrics to use. The metrics considered here are shown in Eq. (<xref ref-type="disp-formula" rid="Ch1.E27"/>):
            

                  <disp-formula id="Ch1.E27" specific-use="align" content-type="subnumberedsingle"><mml:math id="M195" display="block"><mml:mtable displaystyle="true"><mml:mlabeledtr id="Ch1.E27.28"><mml:mtd><mml:mtext>14a</mml:mtext></mml:mtd><mml:mtd><mml:mstyle class="stylechange" displaystyle="true"/></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mtext>MAE</mml:mtext><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mi>N</mml:mi></mml:mfrac></mml:mstyle><mml:msub><mml:mfenced open="∥" close="∥"><mml:mrow><mml:mi mathvariant="bold-italic">u</mml:mi><mml:mo>-</mml:mo><mml:mover accent="true"><mml:mi mathvariant="bold-italic">u</mml:mi><mml:mo stretchy="true" mathvariant="normal">^</mml:mo></mml:mover></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="Ch1.E27.29"><mml:mtd><mml:mtext>14b</mml:mtext></mml:mtd><mml:mtd><mml:mstyle class="stylechange" displaystyle="true"/></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mtext>MANE</mml:mtext><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mi>N</mml:mi></mml:mfrac></mml:mstyle><mml:msub><mml:mfenced close="∥" open="∥"><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mi mathvariant="bold-italic">u</mml:mi><mml:mo>-</mml:mo><mml:mover accent="true"><mml:mi mathvariant="bold-italic">u</mml:mi><mml:mo mathvariant="normal" stretchy="true">^</mml:mo></mml:mover></mml:mrow><mml:mi mathvariant="bold-italic">U</mml:mi></mml:mfrac></mml:mstyle></mml:mfenced><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:mo>⋅</mml:mo><mml:mn mathvariant="normal">100</mml:mn><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mi mathvariant="italic">%</mml:mi></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="Ch1.E27.30"><mml:mtd><mml:mtext>14c</mml:mtext></mml:mtd><mml:mtd><mml:mstyle displaystyle="true" class="stylechange"/></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mi mathvariant="script">L</mml:mi><mml:mo>=</mml:mo><mml:mtext>MSE</mml:mtext><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mi>N</mml:mi></mml:mfrac></mml:mstyle><mml:msubsup><mml:mfenced open="∥" close="∥"><mml:mrow><mml:mi mathvariant="bold-italic">u</mml:mi><mml:mo>-</mml:mo><mml:mover accent="true"><mml:mi mathvariant="bold-italic">u</mml:mi><mml:mo stretchy="true" mathvariant="normal">^</mml:mo></mml:mover></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn><mml:mn mathvariant="normal">2</mml:mn></mml:msubsup><mml:mo>,</mml:mo><mml:mtext>     </mml:mtext><mml:mrow class="chem"><mml:mi mathvariant="normal">RMSE</mml:mi></mml:mrow><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:msqrt><mml:mi>N</mml:mi></mml:msqrt></mml:mfrac></mml:mstyle><mml:msub><mml:mfenced open="∥" close="∥"><mml:mrow><mml:mi mathvariant="bold-italic">u</mml:mi><mml:mo>-</mml:mo><mml:mover accent="true"><mml:mi mathvariant="bold-italic">u</mml:mi><mml:mo mathvariant="normal" stretchy="true">^</mml:mo></mml:mover></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr></mml:mtable></mml:math></disp-formula>

            where <inline-formula><mml:math id="M196" display="inline"><mml:mi mathvariant="bold-italic">u</mml:mi></mml:math></inline-formula> represents the target velocities, <inline-formula><mml:math id="M197" display="inline"><mml:mover accent="true"><mml:mi mathvariant="bold-italic">u</mml:mi><mml:mo stretchy="true" mathvariant="normal">^</mml:mo></mml:mover></mml:math></inline-formula> indicates the predicted velocities, <inline-formula><mml:math id="M198" display="inline"><mml:mi mathvariant="bold-italic">U</mml:mi></mml:math></inline-formula> is the corresponding inflow velocities, and <inline-formula><mml:math id="M199" display="inline"><mml:mi>N</mml:mi></mml:math></inline-formula> is the number of observations. MSE is used as the loss function (<inline-formula><mml:math id="M200" display="inline"><mml:mi mathvariant="script">L</mml:mi></mml:math></inline-formula>) during training, as shown in Eq. <xref ref-type="disp-formula" rid="Ch1.E27.30"/>.</p>
      <p id="d2e4882">In some cases, it is practical to compare graphs by their relative size; a common approach to do this is to add up the size of their constituent parts. This can be done with different scaling factors and norms; however, the most straightforward and common approach is a linear sum accounting for feature sizes. The cardinality of the graph tuple <inline-formula><mml:math id="M201" display="inline"><mml:mrow><mml:mo>|</mml:mo><mml:mi>G</mml:mi><mml:mo>|</mml:mo></mml:mrow></mml:math></inline-formula> is therefore defined as

              <disp-formula id="Ch1.E31" content-type="numbered"><label>15</label><mml:math id="M202" display="block"><mml:mrow><mml:mo>|</mml:mo><mml:mi>G</mml:mi><mml:mo>|</mml:mo><mml:mo>≡</mml:mo><mml:mo>(</mml:mo><mml:mo>|</mml:mo><mml:msub><mml:mi>V</mml:mi><mml:mtext>wt</mml:mtext></mml:msub><mml:mo>|</mml:mo><mml:mo>+</mml:mo><mml:mo>|</mml:mo><mml:msub><mml:mi>V</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mo>|</mml:mo><mml:mo>)</mml:mo><mml:mo>⋅</mml:mo><mml:msub><mml:mi>f</mml:mi><mml:mi mathvariant="normal">v</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:mo>(</mml:mo><mml:mo>|</mml:mo><mml:msub><mml:mi>E</mml:mi><mml:mtext>wt</mml:mtext></mml:msub><mml:mo>|</mml:mo><mml:mo>+</mml:mo><mml:mo>|</mml:mo><mml:msub><mml:mi>E</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mo>|</mml:mo><mml:mo>)</mml:mo><mml:mo>⋅</mml:mo><mml:mo>(</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>+</mml:mo><mml:msub><mml:mi>f</mml:mi><mml:mi mathvariant="normal">e</mml:mi></mml:msub><mml:mo>)</mml:mo><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>

            where the term <inline-formula><mml:math id="M203" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>+</mml:mo><mml:msub><mml:mi>f</mml:mi><mml:mi mathvariant="normal">e</mml:mi></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> accounts for the fact that each edge stores both its <inline-formula><mml:math id="M204" display="inline"><mml:mrow><mml:msub><mml:mi>f</mml:mi><mml:mi mathvariant="normal">e</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> features and an index pair identifying the connected nodes in the adjacency list representation.</p>
</sec>
<sec id="Ch1.S2.SS4.SSS3">
  <label>2.4.3</label><title>IEA Wind 740-10-MW reference wind farm</title>
      <p id="d2e5025">To evaluate the model on an established benchmark, the IEA Wind 740-10-MW reference wind farm is employed. This site features both a regular and an irregular wind farm layout, corresponding respectively to a simple grid configuration and an optimized configuration designed to improve overall farm performance. Both layouts are tested under the same wind speed conditions as reported in the technical documentation by <xref ref-type="bibr" rid="bib1.bibx25" id="text.57"/>. The two layouts are shown in Fig. <xref ref-type="fig" rid="F7"/>.  As the GNO predicts wind speeds, not power, it is necessary to calculate power using the power curve of the DTU-10-MW, illustrated in Fig. <xref ref-type="fig" rid="F2"/>a; as this is a static simulation, it is a simple operation.</p>

      <fig id="F7"><label>Figure 7</label><caption><p id="d2e5037">IEA Wind 740-10-MW reference wind farm <xref ref-type="bibr" rid="bib1.bibx25" id="paren.58"/>. <bold>(a)</bold> Regular layout pre-optimization and <bold>(b)</bold> irregular optimized layout.</p></caption>
            <graphic xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026-f07.png"/>

          </fig>

</sec>
</sec>
</sec>
<sec id="Ch1.S3">
  <label>3</label><title>Results and discussion</title>
      <p id="d2e5065">In this section, the results are presented and discussed concurrently. Initially, a summary of our hyperparameter grid search study is presented, followed by the selection of the best model, based on the validation data and its subsequent testing. The best-performing model is investigated separately, and a series of predictions are made using random layouts of each considered layout type. Both the probe node predictions and the wind turbine node predictions are investigated. Thereafter, a performance analysis is conducted, examining how errors are distributed across different input variables. Finally, the computational cost of the model is investigated and compared to the cost of PyWake.</p>
<sec id="Ch1.S3.SS1">
  <label>3.1</label><title>Grid search</title>
      <p id="d2e5075">Neural network models consist of trainable parameters that are updated during training. In addition to these trainable parameters, preset parameters known as <italic>hyperparameters</italic> also define the model. The hyperparameters can be divided into two groups: the ones defining the model architecture and those specifying the optimization configuration. In this work, five consecutive grid searches were performed, with the results from each used to guide the subsequent search.</p>
      <p id="d2e5081">For the model configuration, the encoder, wind turbine processor, and probe processor MLPs are collectively referred to as the internal MLPs. The tested hyperparameters are the size of the latent dimension (<inline-formula><mml:math id="M205" display="inline"><mml:mi>Q</mml:mi></mml:math></inline-formula>), the number of layers in the internal MLPs (<inline-formula><mml:math id="M206" display="inline"><mml:mrow><mml:msub><mml:mi>L</mml:mi><mml:mtext>int</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>), the number of neurons per layer in the internal MLPs (<inline-formula><mml:math id="M207" display="inline"><mml:mrow><mml:msub><mml:mi>q</mml:mi><mml:mtext>int</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>), the number of hidden layers in the decoder MLP (<inline-formula><mml:math id="M208" display="inline"><mml:mrow><mml:msub><mml:mi>L</mml:mi><mml:mtext>dec</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>), and the number of neurons per layer in the decoder (<inline-formula><mml:math id="M209" display="inline"><mml:mrow><mml:msub><mml:mi>q</mml:mi><mml:mtext>dec</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>).</p>
      <p id="d2e5135">The considered optimization hyperparameters are the learning rate (LR) schedule, which falls into two main categories: <italic>constant</italic> and <italic>piecewise constant</italic>. An additional category, <italic>untriggered piecewise constant</italic>, indicates that the LR remained at its initial value throughout optimization. This occurs because the maximum wall time has been reached, and the training is stopped. This occurs in configurations with large input sizes because each training step takes longer and processes more data, requiring fewer epochs to converge.</p>
      <p id="d2e5147">In the piecewise constant schedule, the current LR is divided by 10 when a trigger step is reached. The trigger steps themselves constitute another hyperparameter investigated in the grid search. Finally, two additional hyperparameters are considered: the number of probes per graph (<inline-formula><mml:math id="M210" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>) and the number of graphs per batch (<inline-formula><mml:math id="M211" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mi mathvariant="normal">G</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>). The batch includes an additional padding graph consisting entirely of zeros; see Appendix <xref ref-type="sec" rid="App1.Ch1.S3"/> for further details on batching and padding graphs.</p>

<table-wrap id="T1" specific-use="star"><label>Table 1</label><caption><p id="d2e5178">Top five models from grid search with full configuration parameters and training/validation metrics. Bold notations are the best metrics in each category.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="15">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="left"/>
     <oasis:colspec colnum="3" colname="col3" align="right" colsep="1"/>
     <oasis:colspec colnum="4" colname="col4" align="right"/>
     <oasis:colspec colnum="5" colname="col5" align="right"/>
     <oasis:colspec colnum="6" colname="col6" align="right"/>
     <oasis:colspec colnum="7" colname="col7" align="right"/>
     <oasis:colspec colnum="8" colname="col8" align="right" colsep="1"/>
     <oasis:colspec colnum="9" colname="col9" align="left"/>
     <oasis:colspec colnum="10" colname="col10" align="left"/>
     <oasis:colspec colnum="11" colname="col11" align="right"/>
     <oasis:colspec colnum="12" colname="col12" align="right" colsep="1"/>
     <oasis:colspec colnum="13" colname="col13" align="right"/>
     <oasis:colspec colnum="14" colname="col14" align="right"/>
     <oasis:colspec colnum="15" colname="col15" align="right"/>
     <oasis:thead>
       <oasis:row rowsep="1">
         <oasis:entry namest="col1" nameend="col3" align="center" colsep="1">IDs </oasis:entry>
         <oasis:entry namest="col4" nameend="col8" align="center" colsep="1">Model </oasis:entry>
         <oasis:entry namest="col9" nameend="col12" align="center" colsep="1">Optimizer </oasis:entry>
         <oasis:entry namest="col13" nameend="col15" align="center">Metrics </oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">Grid</oasis:entry>
         <oasis:entry colname="col2">Model</oasis:entry>
         <oasis:entry colname="col3">Opt.</oasis:entry>
         <oasis:entry colname="col4"><inline-formula><mml:math id="M213" display="inline"><mml:mi>Q</mml:mi></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col5"><inline-formula><mml:math id="M214" display="inline"><mml:mrow><mml:msub><mml:mi>L</mml:mi><mml:mtext>int</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col6"><inline-formula><mml:math id="M215" display="inline"><mml:mrow><mml:msub><mml:mi>q</mml:mi><mml:mtext>int</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col7"><inline-formula><mml:math id="M216" display="inline"><mml:mrow><mml:msub><mml:mi>L</mml:mi><mml:mtext>dec</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col8"><inline-formula><mml:math id="M217" display="inline"><mml:mrow><mml:msub><mml:mi>q</mml:mi><mml:mtext>dec</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col9">LR</oasis:entry>
         <oasis:entry colname="col10">LR</oasis:entry>
         <oasis:entry colname="col11"><inline-formula><mml:math id="M218" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col12"><inline-formula><mml:math id="M219" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mi mathvariant="normal">G</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col13"><inline-formula><mml:math id="M220" display="inline"><mml:mrow class="chem"><mml:msub><mml:mi mathvariant="normal">MSE</mml:mi><mml:mi mathvariant="normal">trn</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col14"><inline-formula><mml:math id="M221" display="inline"><mml:mrow class="chem"><mml:msub><mml:mi mathvariant="normal">MSE</mml:mi><mml:mi mathvariant="normal">val</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col15"><inline-formula><mml:math id="M222" display="inline"><mml:mrow class="chem"><mml:msub><mml:mi mathvariant="normal">MAE</mml:mi><mml:mi mathvariant="normal">val</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">search</oasis:entry>
         <oasis:entry colname="col2">ID</oasis:entry>
         <oasis:entry colname="col3">ID</oasis:entry>
         <oasis:entry colname="col4"/>
         <oasis:entry colname="col5"/>
         <oasis:entry colname="col6"/>
         <oasis:entry colname="col7"/>
         <oasis:entry colname="col8"/>
         <oasis:entry colname="col9">type</oasis:entry>
         <oasis:entry colname="col10"/>
         <oasis:entry colname="col11"/>
         <oasis:entry colname="col12"/>
         <oasis:entry colname="col13">[<inline-formula><mml:math id="M223" display="inline"><mml:mrow class="unit"><mml:msup><mml:mi mathvariant="normal">m</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mspace linebreak="nobreak" width="0.125em"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>]</oasis:entry>
         <oasis:entry colname="col14">[<inline-formula><mml:math id="M224" display="inline"><mml:mrow class="unit"><mml:msup><mml:mi mathvariant="normal">m</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mspace width="0.125em" linebreak="nobreak"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>]</oasis:entry>
         <oasis:entry colname="col15">[<inline-formula><mml:math id="M225" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace linebreak="nobreak" width="0.125em"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>]</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">–</oasis:entry>
         <oasis:entry colname="col2">–</oasis:entry>
         <oasis:entry colname="col3">–</oasis:entry>
         <oasis:entry colname="col4">Latent</oasis:entry>
         <oasis:entry colname="col5">Int.</oasis:entry>
         <oasis:entry colname="col6">Int.</oasis:entry>
         <oasis:entry colname="col7">Dec.</oasis:entry>
         <oasis:entry colname="col8">Dec.</oasis:entry>
         <oasis:entry colname="col9">–</oasis:entry>
         <oasis:entry colname="col10">–</oasis:entry>
         <oasis:entry colname="col11">Probes/</oasis:entry>
         <oasis:entry colname="col12">Graphs/</oasis:entry>
         <oasis:entry colname="col13">–</oasis:entry>
         <oasis:entry colname="col14">–</oasis:entry>
         <oasis:entry colname="col15">–</oasis:entry>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1"/>
         <oasis:entry colname="col2"/>
         <oasis:entry colname="col3"/>
         <oasis:entry colname="col4">dim.</oasis:entry>
         <oasis:entry colname="col5">layers</oasis:entry>
         <oasis:entry colname="col6">width</oasis:entry>
         <oasis:entry colname="col7">layers</oasis:entry>
         <oasis:entry colname="col8">width</oasis:entry>
         <oasis:entry colname="col9"/>
         <oasis:entry colname="col10"/>
         <oasis:entry colname="col11">batch</oasis:entry>
         <oasis:entry colname="col12">batch</oasis:entry>
         <oasis:entry colname="col13"/>
         <oasis:entry colname="col14"/>
         <oasis:entry colname="col15"/>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">V</oasis:entry>
         <oasis:entry colname="col2">j</oasis:entry>
         <oasis:entry colname="col3">8</oasis:entry>
         <oasis:entry colname="col4">100</oasis:entry>
         <oasis:entry colname="col5">2</oasis:entry>
         <oasis:entry colname="col6">250</oasis:entry>
         <oasis:entry colname="col7">3</oasis:entry>
         <oasis:entry colname="col8">350</oasis:entry>
         <oasis:entry colname="col9">PC<sup>∗</sup></oasis:entry>
         <oasis:entry colname="col10">5 <inline-formula><mml:math id="M227" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−3</sup></oasis:entry>
         <oasis:entry colname="col11">500</oasis:entry>
         <oasis:entry colname="col12">2</oasis:entry>
         <oasis:entry colname="col13">0.015</oasis:entry>
         <oasis:entry colname="col14"><bold>0.016</bold></oasis:entry>
         <oasis:entry colname="col15"><bold>0.037</bold></oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">IV</oasis:entry>
         <oasis:entry colname="col2">k</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">50</oasis:entry>
         <oasis:entry colname="col5">3</oasis:entry>
         <oasis:entry colname="col6">350</oasis:entry>
         <oasis:entry colname="col7">4</oasis:entry>
         <oasis:entry colname="col8">350</oasis:entry>
         <oasis:entry colname="col9">PC</oasis:entry>
         <oasis:entry colname="col10">5 <inline-formula><mml:math id="M229" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−3</sup></oasis:entry>
         <oasis:entry colname="col11">200</oasis:entry>
         <oasis:entry colname="col12">5</oasis:entry>
         <oasis:entry colname="col13">0.015</oasis:entry>
         <oasis:entry colname="col14">0.016</oasis:entry>
         <oasis:entry colname="col15">0.038</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">IV</oasis:entry>
         <oasis:entry colname="col2">j</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">100</oasis:entry>
         <oasis:entry colname="col5">2</oasis:entry>
         <oasis:entry colname="col6">250</oasis:entry>
         <oasis:entry colname="col7">3</oasis:entry>
         <oasis:entry colname="col8">350</oasis:entry>
         <oasis:entry colname="col9">PC</oasis:entry>
         <oasis:entry colname="col10">5 <inline-formula><mml:math id="M231" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−3</sup></oasis:entry>
         <oasis:entry colname="col11">200</oasis:entry>
         <oasis:entry colname="col12">5</oasis:entry>
         <oasis:entry colname="col13"><bold>0.014</bold></oasis:entry>
         <oasis:entry colname="col14">0.018</oasis:entry>
         <oasis:entry colname="col15">0.041</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">I</oasis:entry>
         <oasis:entry colname="col2">d</oasis:entry>
         <oasis:entry colname="col3">1</oasis:entry>
         <oasis:entry colname="col4">150</oasis:entry>
         <oasis:entry colname="col5">2</oasis:entry>
         <oasis:entry colname="col6">200</oasis:entry>
         <oasis:entry colname="col7">3</oasis:entry>
         <oasis:entry colname="col8">250</oasis:entry>
         <oasis:entry colname="col9">PC<sup>∗</sup></oasis:entry>
         <oasis:entry colname="col10">5 <inline-formula><mml:math id="M234" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−3</sup></oasis:entry>
         <oasis:entry colname="col11">200</oasis:entry>
         <oasis:entry colname="col12">5</oasis:entry>
         <oasis:entry colname="col13">0.018</oasis:entry>
         <oasis:entry colname="col14">0.02</oasis:entry>
         <oasis:entry colname="col15">0.045</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">III</oasis:entry>
         <oasis:entry colname="col2">a</oasis:entry>
         <oasis:entry colname="col3">6</oasis:entry>
         <oasis:entry colname="col4">150</oasis:entry>
         <oasis:entry colname="col5">2</oasis:entry>
         <oasis:entry colname="col6">100</oasis:entry>
         <oasis:entry colname="col7">3</oasis:entry>
         <oasis:entry colname="col8">150</oasis:entry>
         <oasis:entry colname="col9">PC</oasis:entry>
         <oasis:entry colname="col10">1 <inline-formula><mml:math id="M236" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> 10<sup>−3</sup></oasis:entry>
         <oasis:entry colname="col11">300</oasis:entry>
         <oasis:entry colname="col12">4</oasis:entry>
         <oasis:entry colname="col13">0.017</oasis:entry>
         <oasis:entry colname="col14">0.022</oasis:entry>
         <oasis:entry colname="col15">0.058</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table><table-wrap-foot><p id="d2e5181">(PC) Piecewise constant. <sup>†</sup> LR schedule not triggered during training.</p></table-wrap-foot></table-wrap>

      <p id="d2e5940">For the interested reader, details of the parameters considered during the grid search are reported in Appendix <xref ref-type="sec" rid="App1.Ch1.S4"/>. Table <xref ref-type="table" rid="TD1"/> lists the considered model and optimizer configurations; each model configuration is assigned a letter ID, and each optimizer configuration is assigned a numeric ID. The different combinations were trained, and the results are presented in Table <xref ref-type="table" rid="TD2"/>. This includes the model and optimizer IDs, a grid search number in roman numerals, the training loss (<inline-formula><mml:math id="M238" display="inline"><mml:mrow><mml:msub><mml:mtext>MSE</mml:mtext><mml:mtext>trn</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>), and two validation metrics (<inline-formula><mml:math id="M239" display="inline"><mml:mrow><mml:msub><mml:mtext>MSE</mml:mtext><mml:mtext>val</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M240" display="inline"><mml:mrow><mml:msub><mml:mtext>MAE</mml:mtext><mml:mtext>val</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>). Entries are ranked by <inline-formula><mml:math id="M241" display="inline"><mml:mrow><mml:msub><mml:mtext>MSE</mml:mtext><mml:mtext>val</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>, as this serves as the selection criterion for the best overall model.</p>
      <p id="d2e5994">The best five models from the hyperparameter search are presented in Table <xref ref-type="table" rid="T1"/>; the best combination was Vj8, which featured the largest considered decoder, with the remaining parameters in the middle of the explored ranges.</p>
      <p id="d2e5999">The best-performing models in Table <xref ref-type="table" rid="T1"/> show a high correlation between <inline-formula><mml:math id="M242" display="inline"><mml:mrow><mml:msub><mml:mtext>MSE</mml:mtext><mml:mtext>val</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M243" display="inline"><mml:mrow><mml:msub><mml:mtext>MAE</mml:mtext><mml:mtext>val</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>. Since these metrics weigh errors differently, this increases confidence that the model selection is robust and not overly sensitive to the choice of metric.</p>

<table-wrap id="T2" specific-use="star"><label>Table 2</label><caption><p id="d2e6029">Test set error metrics for the five best-performing models based on the grid search and a no-wake baseline, with the best metrics marked in bold. The naive baseline predicts that the flow everywhere is equal to the free-stream velocity (i.e., <inline-formula><mml:math id="M244" display="inline"><mml:mrow><mml:msup><mml:mi>u</mml:mi><mml:mo>′</mml:mo></mml:msup><mml:mo>=</mml:mo><mml:mi>U</mml:mi></mml:mrow></mml:math></inline-formula>).</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="7">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="left"/>
     <oasis:colspec colnum="3" colname="col3" align="right"/>
     <oasis:colspec colnum="4" colname="col4" align="right"/>
     <oasis:colspec colnum="5" colname="col5" align="right"/>
     <oasis:colspec colnum="6" colname="col6" align="right"/>
     <oasis:colspec colnum="7" colname="col7" align="right"/>
     <oasis:thead>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Grid search</oasis:entry>
         <oasis:entry colname="col2">Model ID</oasis:entry>
         <oasis:entry colname="col3">Opt. ID</oasis:entry>
         <oasis:entry colname="col4">MSE [<inline-formula><mml:math id="M245" display="inline"><mml:mrow class="unit"><mml:msup><mml:mi mathvariant="normal">m</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mspace width="0.125em" linebreak="nobreak"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>]</oasis:entry>
         <oasis:entry colname="col5">MAE [<inline-formula><mml:math id="M246" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace linebreak="nobreak" width="0.125em"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>]</oasis:entry>
         <oasis:entry colname="col6">RMSE [<inline-formula><mml:math id="M247" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace linebreak="nobreak" width="0.125em"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>]</oasis:entry>
         <oasis:entry colname="col7">MANE [%]</oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">V</oasis:entry>
         <oasis:entry colname="col2">j</oasis:entry>
         <oasis:entry colname="col3">8</oasis:entry>
         <oasis:entry colname="col4"><bold>0.124</bold></oasis:entry>
         <oasis:entry colname="col5">0.105</oasis:entry>
         <oasis:entry colname="col6"><bold>0.353</bold></oasis:entry>
         <oasis:entry colname="col7">0.938</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">IV</oasis:entry>
         <oasis:entry colname="col2">k</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">0.127</oasis:entry>
         <oasis:entry colname="col5">0.106</oasis:entry>
         <oasis:entry colname="col6">0.356</oasis:entry>
         <oasis:entry colname="col7">0.957</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">IV</oasis:entry>
         <oasis:entry colname="col2">j</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">0.127</oasis:entry>
         <oasis:entry colname="col5"><bold>0.105</bold></oasis:entry>
         <oasis:entry colname="col6">0.357</oasis:entry>
         <oasis:entry colname="col7"><bold>0.937</bold></oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">I</oasis:entry>
         <oasis:entry colname="col2">d</oasis:entry>
         <oasis:entry colname="col3">1</oasis:entry>
         <oasis:entry colname="col4">0.133</oasis:entry>
         <oasis:entry colname="col5">0.112</oasis:entry>
         <oasis:entry colname="col6">0.365</oasis:entry>
         <oasis:entry colname="col7">1.010</oasis:entry>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">III</oasis:entry>
         <oasis:entry colname="col2">a</oasis:entry>
         <oasis:entry colname="col3">6</oasis:entry>
         <oasis:entry colname="col4">0.130</oasis:entry>
         <oasis:entry colname="col5">0.106</oasis:entry>
         <oasis:entry colname="col6">0.361</oasis:entry>
         <oasis:entry colname="col7">0.959</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry namest="col1" nameend="col3">Naive free-stream baseline </oasis:entry>
         <oasis:entry colname="col4">0.393</oasis:entry>
         <oasis:entry colname="col5">0.218</oasis:entry>
         <oasis:entry colname="col6">0.627</oasis:entry>
         <oasis:entry colname="col7">2.191</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>

      <p id="d2e6301">Based on the grid search, the five best-performing models by <inline-formula><mml:math id="M248" display="inline"><mml:mrow class="chem"><mml:msub><mml:mi mathvariant="normal">MSE</mml:mi><mml:mi mathvariant="normal">val</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> have been evaluated on the unseen and unscaled test set using the metrics in Eq. (<xref ref-type="disp-formula" rid="Ch1.E27"/>); the results are reported in Table <xref ref-type="table" rid="T2"/>. Unlike the training and validation metrics used to compare models, the test metrics also include the more interpretable RMSE and MANE. Additionally, a naive baseline has been created, assuming no wake losses.</p>
      <p id="d2e6319">All five models perform similarly, indicating that, for the considered parameters, a minimum has been reached and that more substantial model changes are necessary to further improve performance. While the top model Vj8 from the grid search maintains the best score in terms of MSE and RMSE, it is the third-best model that achieves the best MAE and MANE. Interestingly, these two models share the same model configuration <inline-formula><mml:math id="M249" display="inline"><mml:mi>j</mml:mi></mml:math></inline-formula> but differ in the optimizer configuration, with the variation arising from the input configurations of <inline-formula><mml:math id="M250" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M251" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mi mathvariant="normal">G</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>. This could indicate that the input configuration is less important than the model configuration.  The number of message-passing steps (<inline-formula><mml:math id="M252" display="inline"><mml:mi>M</mml:mi></mml:math></inline-formula>) was fixed at 3 throughout the grid search, rather than treated as a tunable hyperparameter. Initial testing on a simpler model showed low sensitivity to additional message-passing steps, suggesting diminishing returns beyond <inline-formula><mml:math id="M253" display="inline"><mml:mrow><mml:mi>M</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:math></inline-formula>. While increasing <inline-formula><mml:math id="M254" display="inline"><mml:mi>M</mml:mi></mml:math></inline-formula> could theoretically improve performance in densely clustered farm configurations by propagating wake interactions across more neighbors, preliminary experiments did not support this hypothesis. However, the optimal value of <inline-formula><mml:math id="M255" display="inline"><mml:mi>M</mml:mi></mml:math></inline-formula> is suspected to be data dependent; higher-fidelity datasets capturing more complex wake dynamics or turbulence interactions may benefit from additional message-passing steps to fully resolve inter-turbine dependencies. A systematic sensitivity study on <inline-formula><mml:math id="M256" display="inline"><mml:mi>M</mml:mi></mml:math></inline-formula> across diverse farm configurations and data fidelities should be considered for future work.</p>
</sec>
<sec id="Ch1.S3.SS2">
  <label>3.2</label><title>Model performance</title>
      <p id="d2e6400">In this section, the performance of the best model from Table <xref ref-type="table" rid="TD2"/> is investigated. The testing is conducted in steps initially, where a random selection of each layout type is used to illustrate the model capabilities in the far wake at different downstream distances <inline-formula><mml:math id="M257" display="inline"><mml:mover accent="true"><mml:mi>x</mml:mi><mml:mo mathvariant="normal" stretchy="true">̃</mml:mo></mml:mover></mml:math></inline-formula> (see Fig. <xref ref-type="fig" rid="F3"/> for the definition of <inline-formula><mml:math id="M258" display="inline"><mml:mover accent="true"><mml:mi>x</mml:mi><mml:mo stretchy="true" mathvariant="normal">̃</mml:mo></mml:mover></mml:math></inline-formula>). In the second step, a more data-centric approach is taken by illustrating the error statistics using the test set and analyzing the error with relation to different input types. Then, the model computational cost in terms of speed and memory is assessed, while varying the number of probe nodes to see the impact of graph size on computational cost.</p>

      <fig id="F8" specific-use="star"><label>Figure 8</label><caption><p id="d2e6429">Normalized velocity deficit predictions and targets at different wind farm downstream distances <inline-formula><mml:math id="M259" display="inline"><mml:mrow><mml:mover accent="true"><mml:mi>x</mml:mi><mml:mo mathvariant="normal" stretchy="true">̃</mml:mo></mml:mover><mml:mo>∈</mml:mo><mml:mo mathvariant="italic">{</mml:mo><mml:mn mathvariant="normal">25</mml:mn><mml:mi>D</mml:mi><mml:mo>,</mml:mo><mml:mn mathvariant="normal">50</mml:mn><mml:mi>D</mml:mi><mml:mo>,</mml:mo><mml:mn mathvariant="normal">100</mml:mn><mml:mi>D</mml:mi><mml:mo mathvariant="italic">}</mml:mo></mml:mrow></mml:math></inline-formula> at <inline-formula><mml:math id="M260" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> <inline-formula><mml:math id="M261" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 5 %. <bold>(a)</bold> Cluster, <bold>(b)</bold> single string, <bold>(c)</bold> multiple string, and <bold>(d)</bold> parallel string.</p></caption>
          <graphic xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026-f08.png"/>

        </fig>

<sec id="Ch1.S3.SS2.SSS1">
  <label>3.2.1</label><title>Predictions</title>
      <p id="d2e6510">In Fig. <xref ref-type="fig" rid="F8"/>a–d, velocity deficit (<inline-formula><mml:math id="M262" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>u</mml:mi></mml:mrow></mml:math></inline-formula>) predictions made with the GNO are compared to the PyWake test data for a random layout of each layout type. The predictions are illustrated for three downstream distances <inline-formula><mml:math id="M263" display="inline"><mml:mrow><mml:mover accent="true"><mml:mi>x</mml:mi><mml:mo mathvariant="normal" stretchy="true">̃</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mo mathvariant="italic">{</mml:mo><mml:mn mathvariant="normal">25</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">50</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">100</mml:mn><mml:mo mathvariant="italic">}</mml:mo><mml:mi>D</mml:mi></mml:mrow></mml:math></inline-formula>, at three free-stream wind speeds <inline-formula><mml:math id="M264" display="inline"><mml:mrow><mml:mi>U</mml:mi><mml:mo>=</mml:mo><mml:mo mathvariant="italic">{</mml:mo><mml:mn mathvariant="normal">6</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">12</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">18</mml:mn><mml:mo mathvariant="italic">}</mml:mo></mml:mrow></mml:math></inline-formula> <inline-formula><mml:math id="M265" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace width="0.125em" linebreak="nobreak"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M266" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> <inline-formula><mml:math id="M267" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 5 %. Unsurprisingly, the cluster farm with a number of wind turbines, <inline-formula><mml:math id="M268" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mtext>wt</mml:mtext></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">100</mml:mn></mml:mrow></mml:math></inline-formula>, has the most significant wake effect but also the most smeared wake deficit, especially visible for the <inline-formula><mml:math id="M269" display="inline"><mml:mi>U</mml:mi></mml:math></inline-formula> <inline-formula><mml:math id="M270" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 6 <inline-formula><mml:math id="M271" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace width="0.125em" linebreak="nobreak"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> scenario. The remaining layouts have fewer wind turbines but also more structured layouts. They show clearer peaks and valleys, especially the single-string layout. While the performance at <inline-formula><mml:math id="M272" display="inline"><mml:mi>U</mml:mi></mml:math></inline-formula> <inline-formula><mml:math id="M273" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 6 <inline-formula><mml:math id="M274" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace width="0.125em" linebreak="nobreak"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> is satisfactory for all layouts, it becomes less accurate at higher wind speeds. At <inline-formula><mml:math id="M275" display="inline"><mml:mi>U</mml:mi></mml:math></inline-formula> <inline-formula><mml:math id="M276" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 12 <inline-formula><mml:math id="M277" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace width="0.125em" linebreak="nobreak"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>, the model performs the worst, although it captures the shape of the velocity deficit; the scale could be improved. In Fig. <xref ref-type="fig" rid="F8"/>, the maximum velocity deficit error relative to <inline-formula><mml:math id="M278" display="inline"><mml:mover accent="true"><mml:mi>u</mml:mi><mml:mo mathvariant="normal" stretchy="true">^</mml:mo></mml:mover></mml:math></inline-formula> ranges from 0.23 % to 6.13 % across the different inflow velocities and layouts.</p>

      <fig id="F9" specific-use="star"><label>Figure 9</label><caption><p id="d2e6738">Maximum absolute errors at each wind turbine for <inline-formula><mml:math id="M279" display="inline"><mml:mrow><mml:mi mathvariant="bold-italic">U</mml:mi><mml:mo>=</mml:mo><mml:mo>[</mml:mo><mml:mn mathvariant="normal">6</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">12</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">18</mml:mn><mml:msup><mml:mo>]</mml:mo><mml:mo>⊤</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula> <inline-formula><mml:math id="M280" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace linebreak="nobreak" width="0.125em"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M281" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> <inline-formula><mml:math id="M282" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 5 %.</p></caption>
            <graphic xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026-f09.png"/>

          </fig>

      <p id="d2e6809">As a secondary output, the model can predict the velocity at individual turbines. To illustrate this capability, Fig. <xref ref-type="fig" rid="F9"/> shows the maximum error observed at each turbine for the same layouts and inflow velocities as those presented in Fig. <xref ref-type="fig" rid="F8"/>, and the inflow direction is from left to right along the downstream direction <inline-formula><mml:math id="M283" display="inline"><mml:mi>x</mml:mi></mml:math></inline-formula>. In Fig. <xref ref-type="fig" rid="F9"/>, it can be seen that waked turbines tend to have the largest errors. In Fig. <xref ref-type="fig" rid="F9"/>c, the most significant error occurs where the density is high and the wake effect is substantial, while in Fig. <xref ref-type="fig" rid="F9"/>a and d it can be seen that the turbines downstream of multiple others produce high errors, although the highest error occurs in the middle of a row. Figure <xref ref-type="fig" rid="F9"/>b is of the type multiple string and happens to be a good example of the impact of string alignment with respect to the incoming wind having a significant effect on the errors. Here, the largest error occurs at the second turbine in a string aligned with the flow; this is most likely due to the induction effects playing a larger role. In general, where the wake effects are not as pronounced, the errors are smaller. For the interested reader, the relative absolute errors are also reported for individual wind speeds in Appendix <xref ref-type="sec" rid="App1.Ch1.S5"/>.</p>
      <p id="d2e6835">While several GNN-based models have been proposed for predicting quantities at turbine locations, a direct quantitative comparison is not feasible due to fundamental differences in farm configurations, prediction targets, training data sources, and evaluation metrics across studies. This is further complicated by the fact that detailed turbine-level error analysis has not been a primary focus in these works. For instance, <xref ref-type="bibr" rid="bib1.bibx39" id="text.59"/> and <xref ref-type="bibr" rid="bib1.bibx30" id="text.60"/> predict farm-level power, <xref ref-type="bibr" rid="bib1.bibx38" id="text.61"/> predict individual turbine power using a GAT, and <xref ref-type="bibr" rid="bib1.bibx13" id="text.62"/> and <xref ref-type="bibr" rid="bib1.bibx9" id="text.63"/> predict both loads and power. Furthermore, these models are specifically designed and optimized for turbine-level quantities, whereas predicting at turbine locations is not the primary objective of the GNO. Consequently, error characteristics should be viewed in the context of a model whose main purpose is to predict a spatially continuous flow field. Despite this, the GNO captures overall trends in turbine velocities well, suggesting that the learned flow representation encodes physically meaningful turbine interactions.</p>
</sec>
<sec id="Ch1.S3.SS2.SSS2">
  <label>3.2.2</label><title>IEA Wind 740-10-MW reference wind farm</title>
      <p id="d2e6862">The reference wind farm consists of two layouts: a regular and an irregular layout as described in Sect. <xref ref-type="sec" rid="Ch1.S2.SS4"/>. For each layout, the total farm power output at each wind direction is computed and visualized using a polar grid. As the GNO does not inherently account for wind direction, this is achieved by translating and rotating the wind farm layout. In this way, each wind direction is represented as an equivalent new configuration. Repeating this process across all directions enables the calculation of wind-direction-dependent farm power, without requiring the model to explicitly encode directional information.  This approach is feasible because the GNO has been trained on a large and diverse dataset comprising numerous wind farm configurations. Consequently, it generalizes well across a wide range of geometric arrangements and inflow conditions. The wind-direction-dependent farm power for a turbulence intensity of <inline-formula><mml:math id="M284" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> <inline-formula><mml:math id="M285" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 5 % is presented in Fig. <xref ref-type="fig" rid="F10"/>.</p>

      <fig id="F10"><label>Figure 10</label><caption><p id="d2e6889">Normalized power production at different wind speeds and <inline-formula><mml:math id="M286" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> <inline-formula><mml:math id="M287" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 5 %, illustrated as power roses for the IEA Wind 740–10 <inline-formula><mml:math id="M288" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">MW</mml:mi></mml:mrow></mml:math></inline-formula> reference wind farm <xref ref-type="bibr" rid="bib1.bibx25" id="paren.64"/>. <bold>(a)</bold> Regular layout pre-optimization and <bold>(b)</bold> irregular optimized layout.</p></caption>
            <graphic xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026-f10.png"/>

          </fig>

      <p id="d2e6934">As shown in Fig. <xref ref-type="fig" rid="F10"/>a, the regular grid layout being non-optimized exhibits more pronounced internal wake effects and therefore produces lower overall power. In contrast, the irregular layout in Fig. <xref ref-type="fig" rid="F10"/>b shows reduced wake interactions and higher power production across most wind directions. This result reflects the optimized nature of the irregular layout, which minimizes wake losses and enhances overall farm performance.  In Fig. <xref ref-type="fig" rid="F10"/>, an annual energy production (AEP) measure has been provided for each layout. It was found that the GNO consistently overestimates AEP by approximately 3.4 % and 3.9 % for the regular and irregular layouts, respectively. This is attributed to the tendency of the GNO to slightly underpredict wake deficits, leading to higher predicted turbine wind speeds and, consequently, inflated power estimates. Notably, the relative difference in AEP between the two layouts is well captured (the GNO predicts a 1.2 % increase from the regular to the irregular layout, compared to 0.8 % for PyWake), suggesting that the model can distinguish between layouts despite the absolute bias. Reducing this systematic offset, for instance, through improved training strategies or architectural refinements, should be considered for applications that require accurate absolute AEP estimates.</p>
      <p id="d2e6944">The GNO reproduces the overall power trends well for both layouts, with slightly improved accuracy for the irregular configuration. This behavior is consistent with previous observations that data-driven models tend to perform best under conditions similar to their training data and where variability is lower. The procedurally generated training layouts do not include simple regular grid configurations, which may explain the slightly lower accuracy on the regular IEA layout. Including such layouts in future datasets could improve generalization to such farms.</p>

      <fig id="F11" specific-use="star"><label>Figure 11</label><caption><p id="d2e6949">Contour plots depicting the flow around the IEA740 reference wind farm with columns depicting the GNO predicted output, the engineering model target output, and the error between the predictions for <inline-formula><mml:math id="M289" display="inline"><mml:mrow><mml:mi mathvariant="bold-italic">U</mml:mi><mml:mo>=</mml:mo><mml:mo>[</mml:mo><mml:mn mathvariant="normal">6</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">12</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">18</mml:mn><mml:msup><mml:mo>]</mml:mo><mml:mo>⊤</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula> <inline-formula><mml:math id="M290" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace linebreak="nobreak" width="0.125em"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M291" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> <inline-formula><mml:math id="M292" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 5 %, rotated to the equivalency of incoming wind from the west.</p></caption>
            <graphic xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026-f11.png"/>

          </fig>

      <p id="d2e7020">At a wind speed of 14 <inline-formula><mml:math id="M293" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace width="0.125em" linebreak="nobreak"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>, both farms operate close to rated power, leading to small differences in predicted output.  Some discrepancies remain at lower wind speeds and for specific wind directions where wake effects are more pronounced. The GNO successfully identifies the regions of strongest wake interaction, although the scale of the effects is not reproduced exactly.  The model has been trained on data from within the farm and the far wake, but it does not perform well near the turbines. To demonstrate this model limitation, Fig. <xref ref-type="fig" rid="F11"/> shows predictions made with the GNO model, the PyWake targets, and their relative errors. Similar to the previous errors, we have seen that the largest errors are observed for <inline-formula><mml:math id="M294" display="inline"><mml:mi>U</mml:mi></mml:math></inline-formula> <inline-formula><mml:math id="M295" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 12 <inline-formula><mml:math id="M296" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace linebreak="nobreak" width="0.125em"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>, while errors are significantly smaller for both <inline-formula><mml:math id="M297" display="inline"><mml:mi>U</mml:mi></mml:math></inline-formula> <inline-formula><mml:math id="M298" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 6 <inline-formula><mml:math id="M299" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace width="0.125em" linebreak="nobreak"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M300" display="inline"><mml:mi>U</mml:mi></mml:math></inline-formula> <inline-formula><mml:math id="M301" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 18 <inline-formula><mml:math id="M302" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace linebreak="nobreak" width="0.125em"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>. The largest errors are consequently observed almost on top of the turbines, which is also where the largest and sometimes non-physical deficits are found.</p>
      <p id="d2e7136">The predictions made in Fig. <xref ref-type="fig" rid="F11"/> show promise but demonstrate that the model will need further improvements before it is ready for inter-farm flow simulations.</p>

      <fig id="F12" specific-use="star"><label>Figure 12</label><caption><p id="d2e7143">RMSE metrics for different layout types. <bold>(a)</bold> RMSE binned error counts. Binned RMSE <bold>(b)</bold> with respect to the separation factor <inline-formula><mml:math id="M303" display="inline"><mml:mrow><mml:msub><mml:mi>s</mml:mi><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>, <bold>(c)</bold> at different free-stream velocities <inline-formula><mml:math id="M304" display="inline"><mml:mi>U</mml:mi></mml:math></inline-formula>, <bold>(d)</bold> across different TI, and <bold>(e)</bold> against the number of wind turbines <inline-formula><mml:math id="M305" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>.</p></caption>
            <graphic xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026-f12.png"/>

          </fig>

</sec>
<sec id="Ch1.S3.SS2.SSS3">
  <label>3.2.3</label><title>Performance analysis</title>
      <p id="d2e7205">To evaluate the performance of the model under different scenarios, predictions are made for all combinations of layouts and inflows in the test dataset. For each layout, 10 000 probes are selected at equal spacings, and an RMSE is calculated for each flow case. The resultant metrics are displayed in Fig. <xref ref-type="fig" rid="F12"/>, with separate visualizations for each layout type.</p>
      <p id="d2e7210">In Fig. <xref ref-type="fig" rid="F12"/>a, binned counts of the RMSE metrics are illustrated for each layout type. The distributions show that the single- and multiple-string layouts have comparable distributions as the two lines lie almost on top of each other; they are simultaneously the best-performing layouts. The worst-performing layout type is the cluster, followed by the parallel string. To further investigate why that is the case, in Fig. <xref ref-type="fig" rid="F12"/>b–e, bar plots of the errors are provided to investigate the effect of different aspects of the model inputs. Figure <xref ref-type="fig" rid="F12"/>c shows a bar plot of the mean RMSE for different inflow wind speeds <inline-formula><mml:math id="M306" display="inline"><mml:mi>U</mml:mi></mml:math></inline-formula>. The four layouts share similar distributions with regard to <inline-formula><mml:math id="M307" display="inline"><mml:mi>U</mml:mi></mml:math></inline-formula>, all of them exhibiting the largest mean RMSE at <inline-formula><mml:math id="M308" display="inline"><mml:mi>U</mml:mi></mml:math></inline-formula> <inline-formula><mml:math id="M309" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 12 <inline-formula><mml:math id="M310" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace width="0.125em" linebreak="nobreak"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>. The largest error occurring at <inline-formula><mml:math id="M311" display="inline"><mml:mi>U</mml:mi></mml:math></inline-formula> <inline-formula><mml:math id="M312" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 12 <inline-formula><mml:math id="M313" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace width="0.125em" linebreak="nobreak"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> is most likely related to the wind turbine <inline-formula><mml:math id="M314" display="inline"><mml:mrow><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> curve, as 12 <inline-formula><mml:math id="M315" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace width="0.125em" linebreak="nobreak"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> is just past the steepest part of the curve in region III (see Fig. <xref ref-type="fig" rid="F2"/>). This means that as turbines are affected by wakes inside the farm, the highest variability of <inline-formula><mml:math id="M316" display="inline"><mml:mrow><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> occurs at 12 <inline-formula><mml:math id="M317" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace linebreak="nobreak" width="0.125em"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>. Additionally, it is near the discontinuity of <inline-formula><mml:math id="M318" display="inline"><mml:mrow><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> when the rated wind speed is reached. To alleviate this, it is suggested that future implementations should rebalance the training dataset to proportionally include more flow cases right above the rated wind speed.</p>
      <p id="d2e7366">Figure <xref ref-type="fig" rid="F12"/>d shows a bar plot of the mean RMSE as a function of ambient TI. As expected, there is an inverse correlation between RMSE and <inline-formula><mml:math id="M319" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula>. Lower <inline-formula><mml:math id="M320" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> indicates stronger wake effects, as the wake structure persists for longer, leading to a more complex farm flow and, consequently, higher errors. This occurs because turbulence breaks down wake structures and re-energizes the wind. At higher <inline-formula><mml:math id="M321" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> values, the RMSE increases again but so do the associated error bars. At the highest <inline-formula><mml:math id="M322" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> levels, a few extreme cases have no error bars, as there is only a single sample and therefore no spread.  The sparsity of high <inline-formula><mml:math id="M323" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> values arises because the inflow cases were sampled to reflect realistic operating conditions rather than an even distribution of inflows. This is evident in Fig. <xref ref-type="fig" rid="F1"/>g and h, where these extreme <inline-formula><mml:math id="M324" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> values are shown to be rare. Consequently, the limited number of samples for extreme <inline-formula><mml:math id="M325" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> values leads to the model being insufficiently trained for such scenarios, resulting in rising RMSE at the highest <inline-formula><mml:math id="M326" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> values. However, it is worth noting that these high TIs only occur at very low wind speeds and are extremely rare in the real world.</p>
      <p id="d2e7462">In Fig. <xref ref-type="fig" rid="F12"/>b and e, the impact of the variables that govern the layout are investigated. These are the separation factor (<inline-formula><mml:math id="M327" display="inline"><mml:mrow><mml:msub><mml:mi>s</mml:mi><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>) and the number of wind turbines (<inline-formula><mml:math id="M328" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>). All the layouts are strongly inversely correlated with <inline-formula><mml:math id="M329" display="inline"><mml:mrow><mml:msub><mml:mi>s</mml:mi><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>. The cluster and the parallel string layouts do show a slight correlation to <inline-formula><mml:math id="M330" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mtext>wt</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula>, but that is not the case for either the single-string or the multiple-string layout types.</p>
      <p id="d2e7512">In summary, there is a strong correlation between the model accuracy, the inflow condition and the separation of the turbines. Farms with fewer turbines and simpler wake interactions exhibit higher model accuracy, whereas larger dense farms show greater errors due to increasingly complex and nonlinear inter-turbine interactions. The configuration of the farm influences this behavior: layouts with wider turbine spacings promote simpler flow patterns, while denser configurations, such as cluster and parallel string layouts, intensify wake interactions and adversely affect the GNO predictive capability.</p>
</sec>
<sec id="Ch1.S3.SS2.SSS4">
  <label>3.2.4</label><title>RBF kernels</title>
      <p id="d2e7523">One of the more interpretable trained parameters is the RBF kernels used to encode distances. While they do not tell the whole story – because MLPs are also used to encode features further – they do offer an indication of what is important. Figure <xref ref-type="fig" rid="F13"/>a and b shows both the initial and final RBF kernels for the Vj8 model. Details of the kernel centers and widths are displayed in Fig. <xref ref-type="fig" rid="F13"/>c and d. Overall, we can see that the widths are almost kept constant, while the centers have been shifted. The RBF kernels have moved closer together in two clusters, and the kernel originally in the middle has joined the cluster to the left of the center. In our formulation, the distance between a turbine receiving from an upstream-sending turbine becomes negative, as shown in Eq. (<xref ref-type="disp-formula" rid="Ch1.E7"/>). Since the wake effect is generally more important than the blockage, it makes sense that the training has prioritized five kernels in the negative direction and four in the positive.</p>

      <fig id="F13"><label>Figure 13</label><caption><p id="d2e7534">RBF kernels <bold>(a)</bold> before and <bold>(b)</bold> after training, with <bold>(c)</bold> kernel centers <inline-formula><mml:math id="M331" display="inline"><mml:mi mathvariant="italic">μ</mml:mi></mml:math></inline-formula> and <bold>(d)</bold> kernel widths <inline-formula><mml:math id="M332" display="inline"><mml:mi mathvariant="italic">β</mml:mi></mml:math></inline-formula> shown before and after training.</p></caption>
            <graphic xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026-f13.png"/>

          </fig>

</sec>
</sec>
<sec id="Ch1.S3.SSx1" specific-use="unnumbered">
  <title>Computational cost and memory consumption</title>
      <p id="d2e7577">For a surrogate model, it is important to understand the computational cost associated with its execution, as it should be faster than the actual model it replaces. As previously mentioned, the implementation is based on Jax, which enables Just-In-Time (JIT) compilation, making the GNO suitable for scenarios requiring multiple evaluations. For completeness, the GNO is evaluated in three configurations: (i) a pre-JIT-compiled state, which most closely reflects the intended real-world application; (ii) without JIT compilation; and (iii) with JIT compilation but performing only a single prediction. To encompass a wide range of graph sizes, the whole test set is used with a variable number of probe nodes: <inline-formula><mml:math id="M333" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mo>∈</mml:mo><mml:mo mathvariant="italic">{</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">10</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">100</mml:mn><mml:mo mathvariant="italic">}</mml:mo><mml:mo>∪</mml:mo><mml:mo mathvariant="italic">{</mml:mo><mml:mn mathvariant="normal">1000</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">2000</mml:mn><mml:mo>,</mml:mo><mml:mi mathvariant="normal">…</mml:mi><mml:mo>,</mml:mo><mml:mn mathvariant="normal">10</mml:mn><mml:mspace width="0.125em" linebreak="nobreak"/><mml:mn mathvariant="normal">000</mml:mn><mml:mo mathvariant="italic">}</mml:mo></mml:mrow></mml:math></inline-formula>.</p>
      <p id="d2e7631">The timings are compared against PyWake, where the number of probes is interpreted as the number of grid points in a flow map. All experiments are conducted using CPU resources for comparability, as PyWake does not currently support GPU acceleration. Timing results are reported in CPU hours (CPUh), as PyWake can be executed on a single CPU core, whereas the surrogate model defaults to utilizing all available 32 cores. The CPU is not saturated for small and moderate graph sizes, putting the surrogate at a slight disadvantage. The results of this analysis are presented in Fig. <xref ref-type="fig" rid="F14"/>. Figure <xref ref-type="fig" rid="F14"/>a shows the overall timings, illustrating how costly it is to run the model without compilation and highlighting the significant upfront cost associated with compiling it. Once compiled, the results indicate that the computational cost of running the model increases with the graph size <inline-formula><mml:math id="M334" display="inline"><mml:mrow><mml:mo>|</mml:mo><mml:mi>G</mml:mi><mml:mo>|</mml:mo></mml:mrow></mml:math></inline-formula> and that a performance improvement of approximately <inline-formula><mml:math id="M335" display="inline"><mml:mo>∼</mml:mo></mml:math></inline-formula> 10<inline-formula><mml:math id="M336" display="inline"><mml:mo>×</mml:mo></mml:math></inline-formula> can be expected compared to PyWake.</p>

      <fig id="F14"><label>Figure 14</label><caption><p id="d2e7666">Model computational cost in terms of CPU hours. <bold>(a)</bold> Model cost of GNO in different JIT states compared to PyWake for varying graph sizes <inline-formula><mml:math id="M337" display="inline"><mml:mrow><mml:mo>|</mml:mo><mml:mi>G</mml:mi><mml:mo>|</mml:mo></mml:mrow></mml:math></inline-formula>. <bold>(b)</bold> Model computational cost in JIT-compiled state shown with different numbers of probes compared to PyWake for an increasing number of wind turbines.</p></caption>
          <graphic xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026-f14.png"/>

        </fig>

      <p id="d2e7693">To further investigate the GNO, each component described in Sect. <xref ref-type="sec" rid="Ch1.S2.SS3"/> was timed independently. The timings were measured both (i) in a pre-JIT-compiled state and (ii) after JIT compilation. The results are shown in Fig. <xref ref-type="fig" rid="F15"/>. The results show that, at larger graph sizes, prediction time is dominated by the encoding stage. In Fig. <xref ref-type="fig" rid="F15"/>a, the computational cost increases almost linearly on the logarithmic axis, implying exponential growth in computational cost. This behavior is partly due to how the graphs were scaled by simply adding a large number of probes, which causes <inline-formula><mml:math id="M338" display="inline"><mml:mrow><mml:mo>|</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mo>|</mml:mo></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M339" display="inline"><mml:mrow><mml:mo>|</mml:mo><mml:msub><mml:mi>E</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub><mml:mo>|</mml:mo></mml:mrow></mml:math></inline-formula> to grow rapidly, while <inline-formula><mml:math id="M340" display="inline"><mml:mrow><mml:mo>|</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mtext>wt</mml:mtext></mml:msub><mml:mo>|</mml:mo></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M341" display="inline"><mml:mrow><mml:mo>|</mml:mo><mml:msub><mml:mi>E</mml:mi><mml:mtext>wt</mml:mtext></mml:msub><mml:mo>|</mml:mo></mml:mrow></mml:math></inline-formula> remain unchanged. Consequently, the wind turbine interactions at the approximator stage are unaffected. Batching graphs is proposed for a more comprehensive analysis but has not been investigated further.</p>

      <fig id="F15"><label>Figure 15</label><caption><p id="d2e7766">Timings of the GNO components. <bold>(a)</bold> Encoder <inline-formula><mml:math id="M342" display="inline"><mml:mi mathvariant="script">E</mml:mi></mml:math></inline-formula>, <bold>(b)</bold> approximator <inline-formula><mml:math id="M343" display="inline"><mml:mi mathvariant="script">A</mml:mi></mml:math></inline-formula>, <bold>(c)</bold> decoder <inline-formula><mml:math id="M344" display="inline"><mml:mi mathvariant="script">D</mml:mi></mml:math></inline-formula> part 1: probe processing, and <bold>(d)</bold> decoder <inline-formula><mml:math id="M345" display="inline"><mml:mi mathvariant="script">D</mml:mi></mml:math></inline-formula> part 2: node decoding.</p></caption>
          <graphic xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026-f15.png"/>

        </fig>

      <p id="d2e7816">In Fig. <xref ref-type="fig" rid="F16"/>, the memory consumption of the GNO is compared to the PyWake examples. As can be seen, there is no significant difference in consumed memory. However, at larger graph sizes, the memory consumption of the GNO starts growing more rapidly and, in some cases, overtakes the memory consumption of PyWake.</p>

      <fig id="F16"><label>Figure 16</label><caption><p id="d2e7823">Memory consumption.</p></caption>
          <graphic xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026-f16.png"/>

        </fig>

      <p id="d2e7832">In summary, the GNO produces meaningful results that reflect the behavior of the flow around a given wind farm. As seen in Fig. <xref ref-type="fig" rid="F8"/>, the accuracy increases with the distance behind the farm (<inline-formula><mml:math id="M346" display="inline"><mml:mover accent="true"><mml:mi>x</mml:mi><mml:mo stretchy="true" mathvariant="normal">̃</mml:mo></mml:mover></mml:math></inline-formula>). Therefore, a suitable application could be the assessment of long-distance wakes from neighboring farms, e.g., during WFLO. The GNO is particularly well-suited for this purpose, as the model is highly adaptable with respect to layout configurations. The two-stage structure of the GNO means a neighboring farm only needs to be encoded once, and the resulting latent turbine states can then be reused to evaluate wake deficits at any query location. In practice, this allows candidate turbine positions to be assessed without reprocessing the neighboring wind farm each time, saving computation when exploring many layout alternatives.</p>
      <p id="d2e7847">As a surrogate for engineering models, the GNO was found to predict <inline-formula><mml:math id="M347" display="inline"><mml:mo>∼</mml:mo></mml:math></inline-formula> 10 times faster than PyWake. While this is an acceptable improvement, the speed-up would increase significantly if a higher-fidelity model were to be used as the basis. For example, if RANS were considered, a speed-up between 10<sup>4</sup> and 10<sup>5</sup> seems realistic given the relative cost difference between RANS and engineering models <xref ref-type="bibr" rid="bib1.bibx50" id="paren.65"/>.</p>
</sec>
</sec>
<sec id="Ch1.S4" sec-type="conclusions">
  <label>4</label><title>Conclusions</title>
      <p id="d2e7887">The GNO offers a new perspective on data-driven wind farm flow modeling.  It has been established as a novel approach inspired by classic engineering models, demonstrating how the superposition principle can be integrated directly into the learning process, rather than relying on algebraic wake superposition as single-wake surrogate models require.  Furthermore, the scalability and versatility of the graph-based approach have been shown to hold across highly varied layouts and inflow conditions, indicating that the model can perform well in a general sense.</p>
      <p id="d2e7890">The GNO was evaluated, and the results show that the model compares favorably in terms of computational cost and performs on par with PyWake for memory consumption.  The model was found to evaluate with a computational cost of between 10<sup>−6</sup> and 10<sup>−5</sup> <inline-formula><mml:math id="M352" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">CPUh</mml:mi></mml:mrow></mml:math></inline-formula>, equivalent to 3.6–36 <inline-formula><mml:math id="M353" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">ms</mml:mi></mml:mrow></mml:math></inline-formula> on a single core, which is well within an acceptable range for practical applications.  The GNO does not fully reproduce the PyWake data, which is unsurprising given that a surrogate will inevitably introduce some approximation error relative to its source model. Nevertheless, the accuracy of the GNO remains reasonably high when evaluated on a previously unseen test dataset. An overall RMSE of 0.353 <inline-formula><mml:math id="M354" display="inline"><mml:mrow class="unit"><mml:msup><mml:mi mathvariant="normal">ms</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> and a MANE of 0.938 % were obtained. While these values constitute an acceptable error level, they do not provide the complete picture.</p>
      <p id="d2e7947">To gain deeper insight into the model performance, a more fine-grained assessment was conducted. First, the prediction error for representative cases was examined. This analysis demonstrated that the model accurately captures the wake shape, although some deviations persist in the predicted magnitude at medium wind speeds.  A more comprehensive performance analysis revealed that the GNO performs best in scenarios with limited wake interactions. This trend is observed under inflow conditions with high TI, as well as at both low and high wind speeds. In contrast, performance deteriorates at medium wind speeds in the early part of turbine region III, where the high variability of <inline-formula><mml:math id="M355" display="inline"><mml:mrow><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> introduces additional complexity. Similarly, layouts with high turbine density, corresponding to a low separation factor, also result in reduced model accuracy. The impact of the total number of turbines was less pronounced, but a slight preference for smaller farms was observed for the <italic>cluster</italic> and <italic>parallel string</italic> layout types.</p>
      <p id="d2e7967">The GNO presented in this work represents a methodological contribution to data-driven wind farm modeling. Nonetheless, several areas for improvement remain. Therefore, some suggestions are made for further work. The current dataset was created using engineering models, which, by design, apply a linear summation of wakes. Even though the <monospace>All2AllIterative</monospace> scheme introduces nonlinear interactions between turbines, it still merges wakes linearly. The next logical step is to utilize higher-fidelity training data that incorporates turbine interactions directly into the model. The most suitable choice would likely be RANS, as its computational cost is significantly lower than that of other computational fluid dynamics (CFD) methods. To further reduce costs, a transfer-learning scheme could be introduced that combines engineering models with RANS, similar to the approach of <xref ref-type="bibr" rid="bib1.bibx13" id="text.66"/>. The current GNO exclusively uses a GEN core, which, combined with Softmax aggregation, provides only a rudimentary attention mechanism. However, more powerful attention mechanisms exist in both GAT and full transformer-based attention layers. Incorporating either of these into the wind turbine processing or probe processing steps could allow the model to approximate a more complex operator. A mixed-modeling approach could also be developed, incorporating PyWake as an additional approximator alongside the GNO to predict a higher-fidelity flow field, thereby forming a multi-fidelity upscaling framework. Integrating this with a more advanced attention mechanism could enable the formation of more physically meaningful graph connections. Although such an approach would likely be more computationally expensive than the model proposed in this work, it would serve as a CFD surrogate and thus remain comparatively affordable.  Furthermore, the current decoder architecture processes probe nodes in a single step without probe-to-probe communication. Introducing multiple message-passing steps between probe nodes could enable the model to capture finer spatial correlations in the flow field. However, to be meaningful, this extension would require higher-fidelity training data.</p>
      <p id="d2e7977">Overall, the GNO presented in this work provides a baseline for efficient data-driven flow prediction in complex wind farm environments. Further improvements can be achieved by incorporating higher-fidelity training data, enhanced attention mechanisms, and multi-fidelity coupling strategies, thereby improving its predictive performance. As these developments are implemented, the GNO model is well positioned to become a valuable tool for both research and industrial applications.</p>
</sec>

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

<app id="App1.Ch1.S1">
  <label>Appendix A</label><title>Wind farm simulation implementation details</title>
      <p id="d2e7992">Additional details about the wind farm modeling set-up using PyWake are given in this appendix for interested readers.</p>
      <p id="d2e7995">For estimating the velocity deficit, the <monospace>NiayifarGaussianDeficit</monospace> by <xref ref-type="bibr" rid="bib1.bibx36" id="text.67"/> is shown in Eq. (<xref ref-type="disp-formula" rid="App1.Ch1.S1.E32"/>):
        

              <disp-formula id="App1.Ch1.S1.E32" specific-use="gather" content-type="subnumberedsingle"><mml:math id="M356" display="block"><mml:mtable displaystyle="true"><mml:mlabeledtr id="App1.Ch1.S1.E32.33"><mml:mtd><mml:mtext>A1a</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mtable class="split" rowspacing="0.2ex" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd><mml:mrow><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>u</mml:mi></mml:mrow><mml:mi>U</mml:mi></mml:mfrac></mml:mstyle><mml:mo>=</mml:mo></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mfenced close=")" open="("><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>-</mml:mo><mml:msqrt><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>-</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub></mml:mrow><mml:mrow><mml:mn mathvariant="normal">8</mml:mn><mml:msup><mml:mfenced open="(" close=")"><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msup><mml:mi>k</mml:mi><mml:mo>∗</mml:mo></mml:msup><mml:mi>x</mml:mi></mml:mrow><mml:mrow><mml:mi>D</mml:mi><mml:mo>+</mml:mo><mml:msub><mml:mi mathvariant="italic">ε</mml:mi><mml:mi mathvariant="normal">d</mml:mi></mml:msub></mml:mrow></mml:mfrac></mml:mstyle></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:mfrac></mml:mstyle></mml:mrow></mml:msqrt></mml:mrow></mml:mfenced></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mo>×</mml:mo><mml:mi>exp⁡</mml:mi><mml:mfenced open="(" close=")"><mml:mrow><mml:mo>-</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mrow><mml:mn mathvariant="normal">2</mml:mn><mml:msup><mml:mfenced open="(" close=")"><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msup><mml:mi>k</mml:mi><mml:mo>∗</mml:mo></mml:msup><mml:mi>x</mml:mi></mml:mrow><mml:mrow><mml:mi>D</mml:mi><mml:mo>+</mml:mo><mml:msub><mml:mi mathvariant="italic">ε</mml:mi><mml:mi mathvariant="normal">d</mml:mi></mml:msub></mml:mrow></mml:mfrac></mml:mstyle></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:mfrac></mml:mstyle><mml:msup><mml:mfenced close=")" open="("><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mi>y</mml:mi><mml:mi>D</mml:mi></mml:mfrac></mml:mstyle></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:mfenced></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="App1.Ch1.S1.E32.34"><mml:mtd><mml:mtext>A1b</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi mathvariant="italic">ε</mml:mi><mml:mi mathvariant="normal">d</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.2</mml:mn><mml:msqrt><mml:mrow><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mi mathvariant="normal">d</mml:mi></mml:msub></mml:mrow></mml:msqrt><mml:mo>,</mml:mo><mml:mtext>     </mml:mtext><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mi mathvariant="normal">d</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mn mathvariant="normal">2</mml:mn></mml:mfrac></mml:mstyle><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>+</mml:mo><mml:msqrt><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>-</mml:mo><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub></mml:mrow></mml:msqrt></mml:mrow><mml:msqrt><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>-</mml:mo><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub></mml:mrow></mml:msqrt></mml:mfrac></mml:mstyle><mml:mo>,</mml:mo><mml:mtext>     </mml:mtext><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub><mml:mo>&lt;</mml:mo><mml:mn mathvariant="normal">0.9</mml:mn></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="App1.Ch1.S1.E32.35"><mml:mtd><mml:mtext>A1c</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:msup><mml:mi>k</mml:mi><mml:mo>∗</mml:mo></mml:msup><mml:mo>=</mml:mo><mml:msub><mml:mi>a</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:msub><mml:mi>I</mml:mi><mml:mtext>wt</mml:mtext></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mi>a</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:mtext>     </mml:mtext><mml:msub><mml:mi>a</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.3837</mml:mn><mml:mo>,</mml:mo><mml:mtext>     </mml:mtext><mml:msub><mml:mi>a</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.003678</mml:mn><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr></mml:mtable></mml:math></disp-formula>

        where <inline-formula><mml:math id="M357" display="inline"><mml:mi>x</mml:mi></mml:math></inline-formula> is the streamwise direction, <inline-formula><mml:math id="M358" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mi>u</mml:mi></mml:mrow></mml:math></inline-formula> is the velocity deficit in the <inline-formula><mml:math id="M359" display="inline"><mml:mi>x</mml:mi></mml:math></inline-formula> direction, <inline-formula><mml:math id="M360" display="inline"><mml:mrow><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the coefficient of thrust, <inline-formula><mml:math id="M361" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">ε</mml:mi><mml:mi mathvariant="normal">d</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is a shape parameter offset dependent on <inline-formula><mml:math id="M362" display="inline"><mml:mrow><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> defined in Eq. (<xref ref-type="disp-formula" rid="App1.Ch1.S1.E32.34"/>), and <inline-formula><mml:math id="M363" display="inline"><mml:mrow><mml:msub><mml:mi>a</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M364" display="inline"><mml:mrow><mml:msub><mml:mi>a</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> are experimentally fitted parameters derived with large-eddy simulation (LES) data.</p>
      <p id="d2e8365">The <monospace>CrespoHernandez</monospace>-added TI model by <xref ref-type="bibr" rid="bib1.bibx8" id="text.68"/> depends on the induced velocity factor and the distance behind the turbine, as shown in Eq. (<xref ref-type="disp-formula" rid="App1.Ch1.S1.E36"/>):
        

              <disp-formula id="App1.Ch1.S1.E36" specific-use="align" content-type="subnumberedsingle"><mml:math id="M365" display="block"><mml:mtable displaystyle="true"><mml:mlabeledtr id="App1.Ch1.S1.E36.37"><mml:mtd><mml:mtext>A2a</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi>I</mml:mi><mml:mi mathvariant="normal">a</mml:mi></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.73</mml:mn><mml:mspace width="0.33em" linebreak="nobreak"/><mml:msubsup><mml:mi>a</mml:mi><mml:mi mathvariant="normal">m</mml:mi><mml:mn mathvariant="normal">0.8325</mml:mn></mml:msubsup><mml:mspace width="0.33em" linebreak="nobreak"/><mml:msubsup><mml:mi>I</mml:mi><mml:mn mathvariant="normal">0</mml:mn><mml:mn mathvariant="normal">0.0325</mml:mn></mml:msubsup><mml:msup><mml:mfenced close=")" open="("><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mi>x</mml:mi><mml:mi>D</mml:mi></mml:mfrac></mml:mstyle></mml:mfenced><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">0.32</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="App1.Ch1.S1.E36.38"><mml:mtd><mml:mtext>A2b</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi>a</mml:mi><mml:mi mathvariant="normal">m</mml:mi></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.083</mml:mn><mml:mspace width="0.33em" linebreak="nobreak"/><mml:msubsup><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi><mml:mn mathvariant="normal">3</mml:mn></mml:msubsup><mml:mo>+</mml:mo><mml:mn mathvariant="normal">0.0586</mml:mn><mml:mspace width="0.33em" linebreak="nobreak"/><mml:msubsup><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msubsup><mml:mo>+</mml:mo><mml:mn mathvariant="normal">0.2460</mml:mn><mml:mspace linebreak="nobreak" width="0.33em"/><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr></mml:mtable></mml:math></disp-formula>

        where <inline-formula><mml:math id="M366" display="inline"><mml:mrow><mml:msub><mml:mi>a</mml:mi><mml:mi mathvariant="normal">m</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the induced velocity factor estimated with an empirical polynomial fit of <inline-formula><mml:math id="M367" display="inline"><mml:mrow><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> to address cases with <inline-formula><mml:math id="M368" display="inline"><mml:mrow><mml:msub><mml:mi>a</mml:mi><mml:mi mathvariant="normal">m</mml:mi></mml:msub><mml:mo>≥</mml:mo><mml:mn mathvariant="normal">0.5</mml:mn></mml:mrow></mml:math></inline-formula>, as described by <xref ref-type="bibr" rid="bib1.bibx35" id="text.69"/>.</p>
      <p id="d2e8525"><monospace>SelfSimilarityDeficit2020</monospace> by <xref ref-type="bibr" rid="bib1.bibx49" id="text.70"/> and <xref ref-type="bibr" rid="bib1.bibx16" id="text.71"/> calculates the blockage deficit produced by individual wind turbines (<inline-formula><mml:math id="M369" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>). It is based on the observation that inductions are radially self-similar for upstream distances greater than 1 rotor radius (<inline-formula><mml:math id="M370" display="inline"><mml:mi>R</mml:mi></mml:math></inline-formula>). It consists of an axial- and a radial-shaped function. The newer version of the model includes an updated linear induction zone half-radius (<inline-formula><mml:math id="M371" display="inline"><mml:mrow><mml:msub><mml:mi>r</mml:mi><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>/</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:math></inline-formula>), which corrects the behavior of turbine induction in wind farm contexts.
        

              <disp-formula id="App1.Ch1.S1.E39" specific-use="align" content-type="subnumberedsingle"><mml:math id="M372" display="block"><mml:mtable displaystyle="true"><mml:mlabeledtr id="App1.Ch1.S1.E39.40"><mml:mtd><mml:mtext>A3a</mml:mtext></mml:mtd><mml:mtd><mml:mstyle class="stylechange" displaystyle="true"/></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub></mml:mrow><mml:mi>U</mml:mi></mml:mfrac></mml:mstyle><mml:mo>=</mml:mo><mml:msub><mml:mi>a</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub><mml:mo>)</mml:mo><mml:mi mathvariant="italic">ν</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>)</mml:mo><mml:msup><mml:mtext>sech</mml:mtext><mml:mi mathvariant="italic">α</mml:mi></mml:msup><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mi>r</mml:mi><mml:mrow><mml:msub><mml:mi>r</mml:mi><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>/</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msub><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mfrac></mml:mstyle></mml:mrow></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="App1.Ch1.S1.E39.41"><mml:mtd><mml:mtext>A3b</mml:mtext></mml:mtd><mml:mtd><mml:mstyle class="stylechange" displaystyle="true"/></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mi mathvariant="italic">ν</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mfenced close=")" open="("><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>+</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mi>x</mml:mi><mml:mo>/</mml:mo><mml:mi>R</mml:mi></mml:mrow><mml:msqrt><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>+</mml:mo><mml:msup><mml:mfenced close=")" open="("><mml:mrow><mml:mi>x</mml:mi><mml:mo>/</mml:mo><mml:mi>R</mml:mi></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:msqrt></mml:mfrac></mml:mstyle></mml:mrow></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="App1.Ch1.S1.E39.42"><mml:mtd><mml:mtext>A3c</mml:mtext></mml:mtd><mml:mtd><mml:mstyle class="stylechange" displaystyle="true"/></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msub><mml:mi>a</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mn mathvariant="normal">2</mml:mn></mml:mfrac></mml:mstyle><mml:mfenced open="(" close=")"><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>-</mml:mo><mml:msqrt><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>-</mml:mo><mml:mi mathvariant="italic">γ</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub></mml:mrow></mml:mfenced><mml:mo>⋅</mml:mo><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub></mml:mrow></mml:msqrt></mml:mrow></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="App1.Ch1.S1.E39.43"><mml:mtd><mml:mtext>A3d</mml:mtext></mml:mtd><mml:mtd><mml:mstyle displaystyle="true" class="stylechange"/></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msub><mml:mi>r</mml:mi><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>/</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msub><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>)</mml:mo></mml:mrow><mml:mi>R</mml:mi></mml:mfrac></mml:mstyle><mml:mo>=</mml:mo><mml:mi mathvariant="italic">λ</mml:mi><mml:mo>⋅</mml:mo><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>/</mml:mo><mml:mi>R</mml:mi><mml:mo>)</mml:mo><mml:mo>+</mml:mo><mml:mi mathvariant="italic">η</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mtr><mml:mtd><mml:mstyle class="stylechange" displaystyle="true"/></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mi mathvariant="italic">α</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">8</mml:mn><mml:mo>/</mml:mo><mml:mn mathvariant="normal">9</mml:mn><mml:mtext>     </mml:mtext><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msqrt><mml:mn mathvariant="normal">2</mml:mn></mml:msqrt><mml:mtext>     </mml:mtext><mml:mi mathvariant="italic">λ</mml:mi><mml:mo>=</mml:mo><mml:mo>-</mml:mo><mml:mn mathvariant="normal">0.672</mml:mn><mml:mo>,</mml:mo><mml:mtext>     </mml:mtext><mml:mi mathvariant="italic">η</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.4897</mml:mn><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>

        where <inline-formula><mml:math id="M373" display="inline"><mml:mi mathvariant="italic">ν</mml:mi></mml:math></inline-formula> is the centerline induction and <inline-formula><mml:math id="M374" display="inline"><mml:mrow><mml:msub><mml:mi>a</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> is the axial induction factor.  The <monospace>SelfSimilarityDeficit2020</monospace> model introduced a <inline-formula><mml:math id="M375" display="inline"><mml:mrow><mml:mi mathvariant="italic">γ</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> function that gradually changes from a far-field expression to a near-field expression. Here, this is formulated as a function <inline-formula><mml:math id="M376" display="inline"><mml:mrow><mml:mi mathvariant="italic">δ</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula>. The near- and far-field <inline-formula><mml:math id="M377" display="inline"><mml:mi mathvariant="italic">γ</mml:mi></mml:math></inline-formula> functions are parameterized with <inline-formula><mml:math id="M378" display="inline"><mml:mover><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mtext>nf</mml:mtext></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mi>i</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mover></mml:math></inline-formula> for the near-field <inline-formula><mml:math id="M379" display="inline"><mml:mi mathvariant="italic">γ</mml:mi></mml:math></inline-formula> and <inline-formula><mml:math id="M380" display="inline"><mml:mover><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mtext>ff</mml:mtext></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mi>i</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mover></mml:math></inline-formula> for the far-field <inline-formula><mml:math id="M381" display="inline"><mml:mi mathvariant="italic">γ</mml:mi></mml:math></inline-formula>. 

              <disp-formula id="App1.Ch1.S1.E44" specific-use="gather" content-type="subnumberedsingle"><mml:math id="M382" display="block"><mml:mtable displaystyle="true"><mml:mlabeledtr id="App1.Ch1.S1.E44.45"><mml:mtd><mml:mtext>A4a</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mtable rowspacing="0.2ex" class="split" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mi mathvariant="italic">γ</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:mi>x</mml:mi><mml:mo>,</mml:mo><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub></mml:mrow></mml:mfenced><mml:mo>=</mml:mo><mml:mrow/><mml:mo mathvariant="italic">{</mml:mo><mml:mi mathvariant="italic">δ</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>)</mml:mo><mml:mo>⋅</mml:mo><mml:mfenced open="(" close=")"><mml:mrow><mml:mover><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mtext>nf</mml:mtext></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:mover><mml:mo>⋅</mml:mo><mml:mi>sin⁡</mml:mi><mml:mfenced open="(" close=")"><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub><mml:mo>+</mml:mo><mml:mover><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mtext>nf</mml:mtext></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:mover></mml:mrow><mml:mover><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mtext>nf</mml:mtext></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">3</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:mover></mml:mfrac></mml:mstyle></mml:mfenced><mml:mo>+</mml:mo><mml:mover><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mtext>nf</mml:mtext></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">4</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:mover></mml:mrow></mml:mfenced></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mtext>     </mml:mtext><mml:mo>+</mml:mo><mml:mo>(</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>-</mml:mo><mml:mi mathvariant="italic">δ</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>)</mml:mo><mml:mo>)</mml:mo><mml:mo>⋅</mml:mo><mml:mfenced close=")" open="("><mml:mrow><mml:msubsup><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi><mml:mn mathvariant="normal">3</mml:mn></mml:msubsup><mml:mover><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mtext>ff</mml:mtext></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:mover><mml:mo>+</mml:mo><mml:msubsup><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msubsup><mml:mover><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mtext>ff</mml:mtext></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:mover><mml:mo>+</mml:mo><mml:msub><mml:mi>C</mml:mi><mml:mi mathvariant="normal">T</mml:mi></mml:msub><mml:mover><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mtext>ff</mml:mtext></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">3</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:mover><mml:mo>+</mml:mo><mml:mover><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mtext>ff</mml:mtext></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">4</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:mover></mml:mrow></mml:mfenced><mml:mrow/><mml:mo mathvariant="italic">}</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="App1.Ch1.S1.E44.46"><mml:mtd><mml:mtext>A4b</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mtable class="split" rowspacing="0.2ex" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mover><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mtext>nf</mml:mtext></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:mover><mml:mo>=</mml:mo><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1.381</mml:mn><mml:mo>,</mml:mo><mml:mtext>     </mml:mtext><mml:mover><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mtext>nf</mml:mtext></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:mover><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2.627</mml:mn><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mover><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mtext>nf</mml:mtext></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">3</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:mover><mml:mo>=</mml:mo><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1.524</mml:mn><mml:mo>,</mml:mo><mml:mtext>     </mml:mtext><mml:mover><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mtext>nf</mml:mtext></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">4</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:mover><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1.336</mml:mn><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mover><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mtext>ff</mml:mtext></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:mover><mml:mo>=</mml:mo><mml:mo>-</mml:mo><mml:mn mathvariant="normal">0.06489</mml:mn><mml:mo>,</mml:mo><mml:mtext>     </mml:mtext><mml:mover><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mtext>ff</mml:mtext></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:mover><mml:mo>=</mml:mo><mml:mo>-</mml:mo><mml:mn mathvariant="normal">0.4911</mml:mn><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mover><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mtext>ff</mml:mtext></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">3</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:mover><mml:mo>=</mml:mo><mml:mo>-</mml:mo><mml:mn mathvariant="normal">0.1577</mml:mn><mml:mo>,</mml:mo><mml:mtext>     </mml:mtext><mml:mover><mml:mrow><mml:msub><mml:mi>c</mml:mi><mml:mtext>ff</mml:mtext></mml:msub></mml:mrow><mml:mrow><mml:mo>(</mml:mo><mml:mn mathvariant="normal">4</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:mover><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1.116</mml:mn><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="App1.Ch1.S1.E44.47"><mml:mtd><mml:mtext>A4c</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mi mathvariant="italic">δ</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mfenced open="{" close=""><mml:mtable rowspacing="0.2ex" columnspacing="1em" class="cases" columnalign="left left" framespacing="0em"><mml:mtr><mml:mtd><mml:mn mathvariant="normal">1</mml:mn></mml:mtd><mml:mtd><mml:mrow><mml:mtext>for </mml:mtext><mml:mi>x</mml:mi><mml:mo>/</mml:mo><mml:mi>R</mml:mi><mml:mo>&lt;</mml:mo><mml:mo>-</mml:mo><mml:mn mathvariant="normal">6</mml:mn></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mfenced open="|" close="|"><mml:mrow><mml:mi mathvariant="italic">ν</mml:mi><mml:mo>(</mml:mo><mml:mi>x</mml:mi><mml:mo>)</mml:mo><mml:mo>-</mml:mo><mml:mi mathvariant="italic">ν</mml:mi></mml:mrow></mml:mfenced></mml:mrow><mml:mrow><mml:mi mathvariant="italic">ν</mml:mi><mml:mo>(</mml:mo><mml:mo>-</mml:mo><mml:mn mathvariant="normal">6</mml:mn><mml:mo>)</mml:mo><mml:mo>-</mml:mo><mml:mi mathvariant="italic">ν</mml:mi><mml:mo>(</mml:mo><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>)</mml:mo></mml:mrow></mml:mfrac></mml:mstyle></mml:mtd><mml:mtd><mml:mrow><mml:mtext>for </mml:mtext><mml:mo>-</mml:mo><mml:mn mathvariant="normal">6</mml:mn><mml:mo>≤</mml:mo><mml:mi>x</mml:mi><mml:mo>/</mml:mo><mml:mi>R</mml:mi><mml:mo>≤</mml:mo><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mn mathvariant="normal">0</mml:mn></mml:mtd><mml:mtd><mml:mrow><mml:mtext>for </mml:mtext><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>&lt;</mml:mo><mml:mi>x</mml:mi><mml:mo>/</mml:mo><mml:mi>R</mml:mi></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mfenced></mml:mrow></mml:mtd></mml:mlabeledtr></mml:mtable></mml:math></disp-formula></p>
</app>

<app id="App1.Ch1.S2">
  <label>Appendix B</label><title>Neural network components</title>
<sec id="App1.Ch1.S2.SSx1" specific-use="unnumbered">
  <title>Dropout</title>
      <p id="d2e9581">Our version of dropout uses inverse probability scaling, so the entire dropout layer can be ignored during inference. During training, dropout is applied after both  Eqs. (<xref ref-type="disp-formula" rid="Ch1.E9.10"/>) and (<xref ref-type="disp-formula" rid="Ch1.E9.11"/>):
          

                <disp-formula id="App1.Ch1.S2.E48" specific-use="align" content-type="subnumberedsingle"><mml:math id="M383" display="block"><mml:mtable displaystyle="true"><mml:mlabeledtr id="App1.Ch1.S2.E48.49"><mml:mtd><mml:mtext>B1a</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msubsup><mml:mi>z</mml:mi><mml:mi mathvariant="normal">j</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>l</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mo>∼</mml:mo><mml:mtext>Bernoulli</mml:mtext><mml:mo>(</mml:mo><mml:msub><mml:mi>P</mml:mi><mml:mi mathvariant="normal">D</mml:mi></mml:msub><mml:mo>)</mml:mo><mml:mo>,</mml:mo><mml:mtext>     </mml:mtext><mml:mi>j</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:mo>,</mml:mo><mml:mi mathvariant="normal">…</mml:mi><mml:mo>,</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">a</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="App1.Ch1.S2.E48.50"><mml:mtd><mml:mtext>B1b</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msup><mml:mover accent="true"><mml:mi mathvariant="bold-italic">ξ</mml:mi><mml:mo mathvariant="normal" stretchy="false">̃</mml:mo></mml:mover><mml:mrow><mml:mo>(</mml:mo><mml:mi>l</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mo>=</mml:mo><mml:msup><mml:mi mathvariant="bold-italic">z</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>l</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup><mml:mo>⊙</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>-</mml:mo><mml:msub><mml:mi>P</mml:mi><mml:mi mathvariant="normal">D</mml:mi></mml:msub></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>⋅</mml:mo><mml:msup><mml:mi mathvariant="bold-italic">ξ</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>l</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup><mml:mo>,</mml:mo><mml:mtext>     </mml:mtext><mml:mi>l</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">2</mml:mn><mml:mo>,</mml:mo><mml:mi mathvariant="normal">…</mml:mi><mml:mo>,</mml:mo><mml:mi>L</mml:mi><mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr></mml:mtable></mml:math></disp-formula>

          Here, <inline-formula><mml:math id="M384" display="inline"><mml:mrow><mml:msup><mml:mi mathvariant="bold-italic">z</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>l</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> is a dropout mask consisting of zeros and ones, created with <inline-formula><mml:math id="M385" display="inline"><mml:mrow><mml:mtext>Bernoulli</mml:mtext><mml:mo>(</mml:mo><mml:msub><mml:mi>P</mml:mi><mml:mi mathvariant="normal">D</mml:mi></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> (the Bernoulli distribution given the dropout probability (<inline-formula><mml:math id="M386" display="inline"><mml:mrow><mml:msub><mml:mi>P</mml:mi><mml:mi mathvariant="normal">D</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>)), <inline-formula><mml:math id="M387" display="inline"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">a</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the number of activations in layer <inline-formula><mml:math id="M388" display="inline"><mml:mi>l</mml:mi></mml:math></inline-formula>, the operator <inline-formula><mml:math id="M389" display="inline"><mml:mo>⊙</mml:mo></mml:math></inline-formula> denotes the Hadamard element-wise product, and <inline-formula><mml:math id="M390" display="inline"><mml:mrow><mml:msup><mml:mover accent="true"><mml:mi mathvariant="bold-italic">ξ</mml:mi><mml:mo stretchy="false" mathvariant="normal">̃</mml:mo></mml:mover><mml:mrow><mml:mo>(</mml:mo><mml:mi>l</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> is the resultant hidden state with dropout applied.</p>
</sec>
<sec id="App1.Ch1.S2.SSx2" specific-use="unnumbered">
  <title>Layer normalization</title>
      <p id="d2e9840">The formulation of layer normalization used is shown in Eq. (<xref ref-type="disp-formula" rid="App1.Ch1.S2.E51"/>):
          

                <disp-formula id="App1.Ch1.S2.E51" specific-use="gather" content-type="subnumberedsingle"><mml:math id="M391" display="block"><mml:mtable displaystyle="true"><mml:mlabeledtr id="App1.Ch1.S2.E51.52"><mml:mtd><mml:mtext>B2a</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:msubsup><mml:mi mathvariant="italic">μ</mml:mi><mml:mtext>LN</mml:mtext><mml:mrow><mml:mo>(</mml:mo><mml:mi>L</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mi>H</mml:mi></mml:mfrac></mml:mstyle><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>i</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mi>H</mml:mi></mml:munderover><mml:msubsup><mml:mi mathvariant="italic">ξ</mml:mi><mml:mi mathvariant="normal">i</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>L</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mo>,</mml:mo><mml:mtext>     </mml:mtext><mml:msubsup><mml:mi mathvariant="italic">σ</mml:mi><mml:mtext>LN</mml:mtext><mml:mrow><mml:mo>(</mml:mo><mml:mi>L</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mo>=</mml:mo><mml:msqrt><mml:mrow><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mi>H</mml:mi></mml:mfrac></mml:mstyle><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>i</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mi>H</mml:mi></mml:munderover><mml:msup><mml:mfenced close=")" open="("><mml:mrow><mml:msubsup><mml:mi mathvariant="italic">ξ</mml:mi><mml:mi mathvariant="normal">i</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>L</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mo>-</mml:mo><mml:msubsup><mml:mi mathvariant="italic">μ</mml:mi><mml:mtext>LN</mml:mtext><mml:mrow><mml:mo>(</mml:mo><mml:mi>L</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:msqrt><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr><mml:mlabeledtr id="App1.Ch1.S2.E51.53"><mml:mtd><mml:mtext>B2b</mml:mtext></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:msup><mml:mover accent="true"><mml:mi mathvariant="bold-italic">ξ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mrow><mml:mo>(</mml:mo><mml:mi>L</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mtext>LN</mml:mtext></mml:msub><mml:mo>⊙</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msup><mml:mi mathvariant="bold-italic">ξ</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>L</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup><mml:mo>-</mml:mo><mml:msubsup><mml:mi mathvariant="italic">μ</mml:mi><mml:mtext>LN</mml:mtext><mml:mrow><mml:mo>(</mml:mo><mml:mi>L</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup></mml:mrow><mml:mrow><mml:msubsup><mml:mi mathvariant="italic">σ</mml:mi><mml:mtext>LN</mml:mtext><mml:mrow><mml:mo>(</mml:mo><mml:mi>L</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mo>+</mml:mo><mml:mi mathvariant="italic">ε</mml:mi></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>+</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">b</mml:mi><mml:mtext>LN</mml:mtext></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mlabeledtr></mml:mtable></mml:math></disp-formula>

          where <inline-formula><mml:math id="M392" display="inline"><mml:mrow><mml:msubsup><mml:mi mathvariant="italic">μ</mml:mi><mml:mtext>LN</mml:mtext><mml:mrow><mml:mo>(</mml:mo><mml:mi>L</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M393" display="inline"><mml:mrow><mml:msubsup><mml:mi mathvariant="italic">σ</mml:mi><mml:mtext>LN</mml:mtext><mml:mrow><mml:mo>(</mml:mo><mml:mi>L</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup></mml:mrow></mml:math></inline-formula> denote the layer mean and standard deviation, <inline-formula><mml:math id="M394" display="inline"><mml:mrow><mml:msubsup><mml:mi mathvariant="italic">ξ</mml:mi><mml:mi mathvariant="normal">i</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>L</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup></mml:mrow></mml:math></inline-formula> is the <inline-formula><mml:math id="M395" display="inline"><mml:mi>i</mml:mi></mml:math></inline-formula>th activation at the last MLP layer <inline-formula><mml:math id="M396" display="inline"><mml:mi>L</mml:mi></mml:math></inline-formula>, and <inline-formula><mml:math id="M397" display="inline"><mml:mrow><mml:msup><mml:mover accent="true"><mml:mi mathvariant="bold-italic">ξ</mml:mi><mml:mo mathvariant="normal">‾</mml:mo></mml:mover><mml:mrow><mml:mo>(</mml:mo><mml:mi>L</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> represents the layer-normalized hidden states, while <inline-formula><mml:math id="M398" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mtext>LN</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M399" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">b</mml:mi><mml:mtext>LN</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula> are trainable scale and bias parameters, and <inline-formula><mml:math id="M400" 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:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">6</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> is added for numerical stability.</p>
</sec>
</app>

<app id="App1.Ch1.S3">
  <label>Appendix C</label><title>GNO data loading</title>
      <p id="d2e10203">As with other neural operators, the data comes in triplets: branch input (the wind farm graph encoding turbine positions and inflow conditions), trunk input (the probe graph encoding query locations), and target output. For a broader context, see, e.g., <xref ref-type="bibr" rid="bib1.bibx34 bib1.bibx45" id="paren.72"/>. Because both the GNO branch and trunk are GNNs, the branch input is a graph, and the trunk is a second graph with a separate edge configuration.  One of the core strengths of GNNs is the ability to process graphs of different sizes. However, to leverage the efficiency of the Jax framework, it is necessary to use JIT compilation, which requires inputs to have fixed sizes and shapes.  To create graphs of fixed sizes and shapes, graphs are dynamically batched together until they reach a maximum size, defined by the number of graphs, total nodes, and total edges.</p>
      <p id="d2e10209">Batching graphs differ from conventional batching. In traditional batching, inputs share identical dimensions, and batching is performed along a new dimension. However, because the number of nodes and edges vary for each graph, batching is achieved by combining multiple graphs into a single larger graph. This approach preserves the sub-graph individual characteristics by ensuring no edges between sub-graphs, thus preventing interactions during training and inference.  Dynamic batching involves adjusting the number of graphs in each batch to fit within the size constraints rather than using a fixed batch size as in conventional batching. When dynamic batching is employed, adding another graph to the batch is prohibited once any maximum size limit is reached, as doing so would violate the constraints. Instead, padding with empty graphs, edges, and nodes is used to meet the target size.</p>
      <p id="d2e10212">An additional challenge arises because Jax does not currently offer a native data loader. At the time of writing, the most popular and mature Python framework for GNNs is PyG. Consequently, the PyG data loader has been used to load data in parallel from the file system into memory. Afterward, the graphs are converted to the Jraph format. Finally, dynamic batching and padding are performed sequentially on the CPU before the data are transferred to the GPU for processing.  The current performance bottleneck lies in the sequential dynamic batching process. Parallelizing this step is challenging due to the variable sizes of the graphs. However, this method is still significantly more efficient than loading data from the file system sequentially. The process is visualized in Fig. <xref ref-type="fig" rid="FC1"/>.</p>

      <fig id="FC1"><label>Figure C1</label><caption><p id="d2e10220">Flowchart diagram illustrating the steps from on-disk memory, constructing the Jraph compatible probe graph in parallel, batching, padding, and moving the resultant batched and padded probe graph to video memory.</p></caption>
        <graphic xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026-f17.png"/>

      </fig>


</app>

<app id="App1.Ch1.S4">
  <label>Appendix D</label><title>Hyperparameter search detail</title>

<table-wrap id="TD1"><label>Table D1</label><caption><p id="d2e10242">Model and optimizer configurations used in the grid search.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="6">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="right"/>
     <oasis:colspec colnum="3" colname="col3" align="right"/>
     <oasis:colspec colnum="4" colname="col4" align="right"/>
     <oasis:colspec colnum="5" colname="col5" align="right"/>
     <oasis:colspec colnum="6" colname="col6" align="right"/>
     <oasis:thead>
       <oasis:row>
         <oasis:entry namest="col1" nameend="col6"><italic>Model configurations</italic></oasis:entry>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">ID</oasis:entry>
         <oasis:entry colname="col2">Latent dim. <inline-formula><mml:math id="M402" display="inline"><mml:mi>Q</mml:mi></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col3"><inline-formula><mml:math id="M403" display="inline"><mml:mrow><mml:msub><mml:mi>L</mml:mi><mml:mtext>int</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col4"><inline-formula><mml:math id="M404" display="inline"><mml:mrow><mml:msub><mml:mi>q</mml:mi><mml:mtext>int</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col5"><inline-formula><mml:math id="M405" display="inline"><mml:mrow><mml:msub><mml:mi>L</mml:mi><mml:mtext>dec</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col6"><inline-formula><mml:math id="M406" display="inline"><mml:mrow><mml:msub><mml:mi>q</mml:mi><mml:mtext>dec</mml:mtext></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">a</oasis:entry>
         <oasis:entry colname="col2">150</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">100</oasis:entry>
         <oasis:entry colname="col5">3</oasis:entry>
         <oasis:entry colname="col6">150</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">b</oasis:entry>
         <oasis:entry colname="col2">150</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">100</oasis:entry>
         <oasis:entry colname="col5">3</oasis:entry>
         <oasis:entry colname="col6">250</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">c</oasis:entry>
         <oasis:entry colname="col2">150</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">200</oasis:entry>
         <oasis:entry colname="col5">3</oasis:entry>
         <oasis:entry colname="col6">150</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">d</oasis:entry>
         <oasis:entry colname="col2">150</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">200</oasis:entry>
         <oasis:entry colname="col5">3</oasis:entry>
         <oasis:entry colname="col6">250</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">e</oasis:entry>
         <oasis:entry colname="col2">250</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">100</oasis:entry>
         <oasis:entry colname="col5">3</oasis:entry>
         <oasis:entry colname="col6">150</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">f</oasis:entry>
         <oasis:entry colname="col2">250</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">100</oasis:entry>
         <oasis:entry colname="col5">3</oasis:entry>
         <oasis:entry colname="col6">250</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">g</oasis:entry>
         <oasis:entry colname="col2">250</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">200</oasis:entry>
         <oasis:entry colname="col5">3</oasis:entry>
         <oasis:entry colname="col6">150</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">h</oasis:entry>
         <oasis:entry colname="col2">250</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">200</oasis:entry>
         <oasis:entry colname="col5">3</oasis:entry>
         <oasis:entry colname="col6">250</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">i</oasis:entry>
         <oasis:entry colname="col2">100</oasis:entry>
         <oasis:entry colname="col3">3</oasis:entry>
         <oasis:entry colname="col4">75</oasis:entry>
         <oasis:entry colname="col5">3</oasis:entry>
         <oasis:entry colname="col6">250</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">j</oasis:entry>
         <oasis:entry colname="col2">100</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">250</oasis:entry>
         <oasis:entry colname="col5">3</oasis:entry>
         <oasis:entry colname="col6">350</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">k</oasis:entry>
         <oasis:entry colname="col2">50</oasis:entry>
         <oasis:entry colname="col3">3</oasis:entry>
         <oasis:entry colname="col4">350</oasis:entry>
         <oasis:entry colname="col5">4</oasis:entry>
         <oasis:entry colname="col6">350</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup>

  <oasis:tgroup cols="6">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="left"/>
     <oasis:colspec colnum="3" colname="col3" align="right"/>
     <oasis:colspec colnum="4" colname="col4" align="right"/>
     <oasis:colspec colnum="5" colname="col5" align="right"/>
     <oasis:colspec colnum="6" colname="col6" align="right"/>
     <oasis:thead>
       <oasis:row>
         <oasis:entry namest="col1" nameend="col6"><italic>Optimizer configurations</italic></oasis:entry>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">ID</oasis:entry>
         <oasis:entry colname="col2">LR type</oasis:entry>
         <oasis:entry colname="col3">LR</oasis:entry>
         <oasis:entry colname="col4">Triggers</oasis:entry>
         <oasis:entry colname="col5"><inline-formula><mml:math id="M407" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mi mathvariant="normal">p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
         <oasis:entry colname="col6"><inline-formula><mml:math id="M408" display="inline"><mml:mrow><mml:msub><mml:mi>n</mml:mi><mml:mi mathvariant="normal">G</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">e 1</oasis:entry>
         <oasis:entry colname="col2">Piecewise constant<sup>∗</sup></oasis:entry>
         <oasis:entry colname="col3">0.005</oasis:entry>
         <oasis:entry colname="col4">[500, 1000]</oasis:entry>
         <oasis:entry colname="col5">200</oasis:entry>
         <oasis:entry colname="col6">5</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">2</oasis:entry>
         <oasis:entry colname="col2">Piecewise constant</oasis:entry>
         <oasis:entry colname="col3">0.005</oasis:entry>
         <oasis:entry colname="col4">[75, 150]</oasis:entry>
         <oasis:entry colname="col5">200</oasis:entry>
         <oasis:entry colname="col6">5</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">3</oasis:entry>
         <oasis:entry colname="col2">Constant</oasis:entry>
         <oasis:entry colname="col3">0.001</oasis:entry>
         <oasis:entry colname="col4">–</oasis:entry>
         <oasis:entry colname="col5">200</oasis:entry>
         <oasis:entry colname="col6">5</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">4</oasis:entry>
         <oasis:entry colname="col2">Piecewise constant</oasis:entry>
         <oasis:entry colname="col3">0.001</oasis:entry>
         <oasis:entry colname="col4">[75, 150]</oasis:entry>
         <oasis:entry colname="col5">200</oasis:entry>
         <oasis:entry colname="col6">5</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">5</oasis:entry>
         <oasis:entry colname="col2">Piecewise constant</oasis:entry>
         <oasis:entry colname="col3">0.005</oasis:entry>
         <oasis:entry colname="col4">[75, 150]</oasis:entry>
         <oasis:entry colname="col5">300</oasis:entry>
         <oasis:entry colname="col6">4</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">6</oasis:entry>
         <oasis:entry colname="col2">Piecewise constant</oasis:entry>
         <oasis:entry colname="col3">0.001</oasis:entry>
         <oasis:entry colname="col4">[75, 150]</oasis:entry>
         <oasis:entry colname="col5">300</oasis:entry>
         <oasis:entry colname="col6">4</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">7</oasis:entry>
         <oasis:entry colname="col2">Piecewise constant</oasis:entry>
         <oasis:entry colname="col3">0.010</oasis:entry>
         <oasis:entry colname="col4">[75, 150]</oasis:entry>
         <oasis:entry colname="col5">200</oasis:entry>
         <oasis:entry colname="col6">5</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">8</oasis:entry>
         <oasis:entry colname="col2">Piecewise constant<sup>∗</sup></oasis:entry>
         <oasis:entry colname="col3">0.005</oasis:entry>
         <oasis:entry colname="col4">[75, 150]</oasis:entry>
         <oasis:entry colname="col5">500</oasis:entry>
         <oasis:entry colname="col6">2</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">9</oasis:entry>
         <oasis:entry colname="col2">Piecewise constant<sup>∗</sup></oasis:entry>
         <oasis:entry colname="col3">0.010</oasis:entry>
         <oasis:entry colname="col4">[75, 150]</oasis:entry>
         <oasis:entry colname="col5">500</oasis:entry>
         <oasis:entry colname="col6">2</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table><table-wrap-foot><p id="d2e10245"><sup>∗</sup> Learning rate schedule was not triggered during training.</p></table-wrap-foot></table-wrap>

<table-wrap id="TD2" specific-use="star"><label>Table D2</label><caption><p id="d2e10890">Trained models from the grid search, ranked by validation <inline-formula><mml:math id="M412" display="inline"><mml:mrow class="chem"><mml:msub><mml:mi mathvariant="normal">MSE</mml:mi><mml:mi mathvariant="normal">val</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>. The best metric is marked in bold.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="6">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="left"/>
     <oasis:colspec colnum="3" colname="col3" align="right" colsep="1"/>
     <oasis:colspec colnum="4" colname="col4" align="right"/>
     <oasis:colspec colnum="5" colname="col5" align="right"/>
     <oasis:colspec colnum="6" colname="col6" align="right"/>
     <oasis:thead>
       <oasis:row>
         <oasis:entry namest="col1" nameend="col3" colsep="1"><italic>Configuration</italic></oasis:entry>
         <oasis:entry namest="col4" nameend="col6" align="left"><italic>Metrics</italic></oasis:entry>
       </oasis:row>
       <oasis:row rowsep="1">
         <oasis:entry colname="col1">Grid search</oasis:entry>
         <oasis:entry colname="col2">Model ID</oasis:entry>
         <oasis:entry colname="col3">Opt. ID</oasis:entry>
         <oasis:entry colname="col4"><inline-formula><mml:math id="M413" display="inline"><mml:mrow class="chem"><mml:msub><mml:mi mathvariant="normal">MSE</mml:mi><mml:mi mathvariant="normal">trn</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> [<inline-formula><mml:math id="M414" display="inline"><mml:mrow class="unit"><mml:msup><mml:mi mathvariant="normal">m</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mspace width="0.125em" linebreak="nobreak"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>]</oasis:entry>
         <oasis:entry colname="col5"><inline-formula><mml:math id="M415" display="inline"><mml:mrow class="chem"><mml:msub><mml:mi mathvariant="normal">MSE</mml:mi><mml:mi mathvariant="normal">val</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> [<inline-formula><mml:math id="M416" display="inline"><mml:mrow class="unit"><mml:msup><mml:mi mathvariant="normal">m</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mspace linebreak="nobreak" width="0.125em"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>]</oasis:entry>
         <oasis:entry colname="col6"><inline-formula><mml:math id="M417" display="inline"><mml:mrow class="chem"><mml:msub><mml:mi mathvariant="normal">MAE</mml:mi><mml:mi mathvariant="normal">val</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> [<inline-formula><mml:math id="M418" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace linebreak="nobreak" width="0.125em"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>]</oasis:entry>
       </oasis:row>
     </oasis:thead>
     <oasis:tbody>
       <oasis:row>
         <oasis:entry colname="col1">V</oasis:entry>
         <oasis:entry colname="col2">j</oasis:entry>
         <oasis:entry colname="col3">8</oasis:entry>
         <oasis:entry colname="col4">0.015</oasis:entry>
         <oasis:entry colname="col5"><bold>0.016</bold></oasis:entry>
         <oasis:entry colname="col6"><bold>0.037</bold></oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">IV</oasis:entry>
         <oasis:entry colname="col2">k</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">0.015</oasis:entry>
         <oasis:entry colname="col5"><bold>0.016</bold></oasis:entry>
         <oasis:entry colname="col6">0.038</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">IV</oasis:entry>
         <oasis:entry colname="col2">j</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4"><bold>0.014</bold></oasis:entry>
         <oasis:entry colname="col5">0.018</oasis:entry>
         <oasis:entry colname="col6">0.041</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">I</oasis:entry>
         <oasis:entry colname="col2">d</oasis:entry>
         <oasis:entry colname="col3">1</oasis:entry>
         <oasis:entry colname="col4">0.018</oasis:entry>
         <oasis:entry colname="col5">0.020</oasis:entry>
         <oasis:entry colname="col6">0.045</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">III</oasis:entry>
         <oasis:entry colname="col2">a</oasis:entry>
         <oasis:entry colname="col3">6</oasis:entry>
         <oasis:entry colname="col4">0.017</oasis:entry>
         <oasis:entry colname="col5">0.022</oasis:entry>
         <oasis:entry colname="col6">0.058</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">I</oasis:entry>
         <oasis:entry colname="col2">h</oasis:entry>
         <oasis:entry colname="col3">1</oasis:entry>
         <oasis:entry colname="col4">0.016</oasis:entry>
         <oasis:entry colname="col5">0.022</oasis:entry>
         <oasis:entry colname="col6">0.043</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">I</oasis:entry>
         <oasis:entry colname="col2">a</oasis:entry>
         <oasis:entry colname="col3">1</oasis:entry>
         <oasis:entry colname="col4">0.021</oasis:entry>
         <oasis:entry colname="col5">0.022</oasis:entry>
         <oasis:entry colname="col6">0.052</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">I</oasis:entry>
         <oasis:entry colname="col2">g</oasis:entry>
         <oasis:entry colname="col3">1</oasis:entry>
         <oasis:entry colname="col4">0.018</oasis:entry>
         <oasis:entry colname="col5">0.023</oasis:entry>
         <oasis:entry colname="col6">0.049</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">I</oasis:entry>
         <oasis:entry colname="col2">e</oasis:entry>
         <oasis:entry colname="col3">1</oasis:entry>
         <oasis:entry colname="col4">0.023</oasis:entry>
         <oasis:entry colname="col5">0.023</oasis:entry>
         <oasis:entry colname="col6">0.060</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">III</oasis:entry>
         <oasis:entry colname="col2">a</oasis:entry>
         <oasis:entry colname="col3">5</oasis:entry>
         <oasis:entry colname="col4">0.024</oasis:entry>
         <oasis:entry colname="col5">0.023</oasis:entry>
         <oasis:entry colname="col6">0.056</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">II</oasis:entry>
         <oasis:entry colname="col2">h</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">0.016</oasis:entry>
         <oasis:entry colname="col5">0.024</oasis:entry>
         <oasis:entry colname="col6">0.050</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">III</oasis:entry>
         <oasis:entry colname="col2">a</oasis:entry>
         <oasis:entry colname="col3">4</oasis:entry>
         <oasis:entry colname="col4">0.017</oasis:entry>
         <oasis:entry colname="col5">0.026</oasis:entry>
         <oasis:entry colname="col6">0.064</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">III</oasis:entry>
         <oasis:entry colname="col2">i</oasis:entry>
         <oasis:entry colname="col3">6</oasis:entry>
         <oasis:entry colname="col4">0.018</oasis:entry>
         <oasis:entry colname="col5">0.027</oasis:entry>
         <oasis:entry colname="col6">0.060</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">I</oasis:entry>
         <oasis:entry colname="col2">f</oasis:entry>
         <oasis:entry colname="col3">1</oasis:entry>
         <oasis:entry colname="col4">0.022</oasis:entry>
         <oasis:entry colname="col5">0.027</oasis:entry>
         <oasis:entry colname="col6">0.055</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">IV</oasis:entry>
         <oasis:entry colname="col2">f</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">0.025</oasis:entry>
         <oasis:entry colname="col5">0.028</oasis:entry>
         <oasis:entry colname="col6">0.063</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">V</oasis:entry>
         <oasis:entry colname="col2">k</oasis:entry>
         <oasis:entry colname="col3">8</oasis:entry>
         <oasis:entry colname="col4">0.018</oasis:entry>
         <oasis:entry colname="col5">0.029</oasis:entry>
         <oasis:entry colname="col6">0.057</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">IV</oasis:entry>
         <oasis:entry colname="col2">j</oasis:entry>
         <oasis:entry colname="col3">7</oasis:entry>
         <oasis:entry colname="col4">0.017</oasis:entry>
         <oasis:entry colname="col5">0.030</oasis:entry>
         <oasis:entry colname="col6">0.057</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">III</oasis:entry>
         <oasis:entry colname="col2">i</oasis:entry>
         <oasis:entry colname="col3">4</oasis:entry>
         <oasis:entry colname="col4">0.019</oasis:entry>
         <oasis:entry colname="col5">0.034</oasis:entry>
         <oasis:entry colname="col6">0.082</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">V</oasis:entry>
         <oasis:entry colname="col2">f</oasis:entry>
         <oasis:entry colname="col3">9</oasis:entry>
         <oasis:entry colname="col4">0.030</oasis:entry>
         <oasis:entry colname="col5">0.039</oasis:entry>
         <oasis:entry colname="col6">0.057</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">II</oasis:entry>
         <oasis:entry colname="col2">f</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">0.021</oasis:entry>
         <oasis:entry colname="col5">0.039</oasis:entry>
         <oasis:entry colname="col6">0.068</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">I</oasis:entry>
         <oasis:entry colname="col2">b</oasis:entry>
         <oasis:entry colname="col3">1</oasis:entry>
         <oasis:entry colname="col4">0.021</oasis:entry>
         <oasis:entry colname="col5">0.049</oasis:entry>
         <oasis:entry colname="col6">0.076</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">V</oasis:entry>
         <oasis:entry colname="col2">f</oasis:entry>
         <oasis:entry colname="col3">8</oasis:entry>
         <oasis:entry colname="col4">0.024</oasis:entry>
         <oasis:entry colname="col5">0.053</oasis:entry>
         <oasis:entry colname="col6">0.064</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">III</oasis:entry>
         <oasis:entry colname="col2">i</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">0.022</oasis:entry>
         <oasis:entry colname="col5">0.053</oasis:entry>
         <oasis:entry colname="col6">0.114</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">V</oasis:entry>
         <oasis:entry colname="col2">j</oasis:entry>
         <oasis:entry colname="col3">9</oasis:entry>
         <oasis:entry colname="col4">0.020</oasis:entry>
         <oasis:entry colname="col5">0.053</oasis:entry>
         <oasis:entry colname="col6">0.064</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">I</oasis:entry>
         <oasis:entry colname="col2">c</oasis:entry>
         <oasis:entry colname="col3">1</oasis:entry>
         <oasis:entry colname="col4">0.017</oasis:entry>
         <oasis:entry colname="col5">0.064</oasis:entry>
         <oasis:entry colname="col6">0.075</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">III</oasis:entry>
         <oasis:entry colname="col2">i</oasis:entry>
         <oasis:entry colname="col3">5</oasis:entry>
         <oasis:entry colname="col4">0.019</oasis:entry>
         <oasis:entry colname="col5">0.074</oasis:entry>
         <oasis:entry colname="col6">0.140</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">IV</oasis:entry>
         <oasis:entry colname="col2">f</oasis:entry>
         <oasis:entry colname="col3">7</oasis:entry>
         <oasis:entry colname="col4">0.029</oasis:entry>
         <oasis:entry colname="col5">0.098</oasis:entry>
         <oasis:entry colname="col6">0.104</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">III</oasis:entry>
         <oasis:entry colname="col2">a</oasis:entry>
         <oasis:entry colname="col3">2</oasis:entry>
         <oasis:entry colname="col4">0.024</oasis:entry>
         <oasis:entry colname="col5">0.141</oasis:entry>
         <oasis:entry colname="col6">0.136</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">V</oasis:entry>
         <oasis:entry colname="col2">k</oasis:entry>
         <oasis:entry colname="col3">9</oasis:entry>
         <oasis:entry colname="col4">0.100</oasis:entry>
         <oasis:entry colname="col5">0.212</oasis:entry>
         <oasis:entry colname="col6">0.186</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">II</oasis:entry>
         <oasis:entry colname="col2">f</oasis:entry>
         <oasis:entry colname="col3">3</oasis:entry>
         <oasis:entry colname="col4">0.167</oasis:entry>
         <oasis:entry colname="col5">0.230</oasis:entry>
         <oasis:entry colname="col6">0.222</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">IV</oasis:entry>
         <oasis:entry colname="col2">k</oasis:entry>
         <oasis:entry colname="col3">7</oasis:entry>
         <oasis:entry colname="col4">0.165</oasis:entry>
         <oasis:entry colname="col5">0.232</oasis:entry>
         <oasis:entry colname="col6">0.227</oasis:entry>
       </oasis:row>
       <oasis:row>
         <oasis:entry colname="col1">II</oasis:entry>
         <oasis:entry colname="col2">h</oasis:entry>
         <oasis:entry colname="col3">3</oasis:entry>
         <oasis:entry colname="col4">0.167</oasis:entry>
         <oasis:entry colname="col5">0.238</oasis:entry>
         <oasis:entry colname="col6">0.207</oasis:entry>
       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table></table-wrap>


</app>

<app id="App1.Ch1.S5">
  <label>Appendix E</label><title>Wind turbine prediction visualization</title>

      <fig id="FE1"><label>Figure E1</label><caption><p id="d2e11773">Maximum absolute errors at each wind turbine for each wind speed in <inline-formula><mml:math id="M419" display="inline"><mml:mrow><mml:mi mathvariant="bold-italic">U</mml:mi><mml:mo>=</mml:mo><mml:mo>[</mml:mo><mml:mn mathvariant="normal">6</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">12</mml:mn><mml:mo>,</mml:mo><mml:mn mathvariant="normal">18</mml:mn><mml:msup><mml:mo>]</mml:mo><mml:mo>⊤</mml:mo></mml:msup></mml:mrow></mml:math></inline-formula> <inline-formula><mml:math id="M420" display="inline"><mml:mrow class="unit"><mml:mi mathvariant="normal">m</mml:mi><mml:mspace linebreak="nobreak" width="0.125em"/><mml:msup><mml:mi mathvariant="normal">s</mml:mi><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M421" display="inline"><mml:mrow><mml:msub><mml:mi>I</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> <inline-formula><mml:math id="M422" display="inline"><mml:mo>=</mml:mo></mml:math></inline-formula> 5 %.</p></caption>
        
        <graphic xlink:href="https://wes.copernicus.org/articles/11/2229/2026/wes-11-2229-2026-f18.png"/>

      </fig>


</app>
  </app-group><notes notes-type="codedataavailability"><title>Code and data availability</title>

      <p id="d2e11852">The code used to train the GNO is publicly available at <uri>https://github.com/jenspeterschoeler/Wind-Farm-GNO</uri> (last access: 15 June 2026; DOI: <ext-link xlink:href="https://doi.org/10.5281/zenodo.20698845" ext-link-type="DOI">10.5281/zenodo.20698845</ext-link>, <xref ref-type="bibr" rid="bib1.bibx43" id="altparen.73"/>). Owing to the large size of the whole dataset, only the test set is hosted on Zenodo (<ext-link xlink:href="https://doi.org/10.5281/zenodo.17671257" ext-link-type="DOI">10.5281/zenodo.17671257</ext-link>; <xref ref-type="bibr" rid="bib1.bibx44" id="altparen.74"/>). However, the data can be regenerated using the code at <uri>https://github.com/jenspeterschoeler/Wind-farm-Graph-flow-data</uri> (last access: 15 June 2026).</p>
  </notes><notes notes-type="authorcontribution"><title>Author contributions</title>

      <p id="d2e11877">JPS and PER conceived the research; JPS developed the methodology; JPS developed the code for the GNO and generated the required data; JPS performed the formal analysis; PER and JQ supervised the work; JPS, JQ, FPWR wrote the original draft; and JPS, JQ, FPWR, and PER reviewed the draft.</p>
  </notes><notes notes-type="competinginterests"><title>Competing interests</title>

      <p id="d2e11883">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="d2e11889">Publisher's note: Copernicus Publications remains neutral with regard to jurisdictional claims made in the text, published maps, institutional affiliations, or any other geographical representation in this paper. The authors bear the ultimate responsibility for providing appropriate place names. Views expressed in the text are those of the authors and do not necessarily reflect the views of the publisher.</p>
  </notes><ack><title>Acknowledgements</title><p id="d2e11895">The authors thank Mikkel N. Schmidt at DTU Compute for providing valuable feedback on graph neural networks. Model training was performed on the Sophia cluster <xref ref-type="bibr" rid="bib1.bibx48" id="paren.75"/>, without which the GNO could not have been trained. The authors also acknowledge the use of AI tools in preparing this paper and the associated code. In particular, ChatGPT, Grammarly, and GitHub Copilot were used for proofreading and code auto-completion.</p></ack><notes notes-type="financialsupport"><title>Financial support</title>

      <p id="d2e11903">This work was partially funded by TotalEnergies under the “Inter-Farm Interactions (IFI)” project.</p>
  </notes><notes notes-type="reviewstatement"><title>Review statement</title>

      <p id="d2e11909">This paper was edited by Xiaolei Yang and reviewed by three anonymous referees.</p>
  </notes><ref-list>
    <title>References</title>

      <ref id="bib1.bibx1"><label>Ba et al.(2016)Ba, Kiros, and Hinton</label><mixed-citation>Ba, J. L., Kiros, J. R., and Hinton, G. E.: Layer Normalization, arXiv [preprint], <ext-link xlink:href="https://doi.org/10.48550/arXiv.1607.06450" ext-link-type="DOI">10.48550/arXiv.1607.06450</ext-link>, 2016.</mixed-citation></ref>
      <ref id="bib1.bibx2"><label>Bak et al.(2013)Bak, Zahle, Bitsche, Kim, Yde, Henriksen, Hansen, Blasques, Gaunaa, and Natarajan</label><mixed-citation>Bak, C.., Zahle, F.., Bitsche, R.., Kim, T.., Yde, A.., Henriksen, L. C., Hansen, M. H., Blasques, J. P. A. A., Gaunaa, M.., and Natarajan, A.: The DTU 10-MW Reference Wind Turbine, in: Danish Wind Power Research, 27–28 May 2013, <uri>https://orbit.dtu.dk/en/publications/the-dtu-10-mw-reference-wind-turbine/</uri> (last access: 15 June 2026), 2013.</mixed-citation></ref>
      <ref id="bib1.bibx3"><label>Bastankhah and Porté-Agel(2014)</label><mixed-citation>Bastankhah, M. and Porté-Agel, F.: A new analytical model for wind-turbine wakes, Renew. Energy, 70, 116–123, <ext-link xlink:href="https://doi.org/10.1016/j.renene.2014.01.002" ext-link-type="DOI">10.1016/j.renene.2014.01.002</ext-link>, 2014.</mixed-citation></ref>
      <ref id="bib1.bibx4"><label>Bastankhah et al.(2021)Bastankhah, Welch, Martínez-Tossas, King, and Fleming</label><mixed-citation>Bastankhah, M., Welch, B. L., Martínez-Tossas, L. A., King, J., and Fleming, P.: Analytical solution for the cumulative wake of wind turbines in wind farms, J. Fluid Mech., 911, A53, <ext-link xlink:href="https://doi.org/10.1017/jfm.2020.1037" ext-link-type="DOI">10.1017/jfm.2020.1037</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx5"><label>Battaglia et al.(2018)Battaglia, Hamrick, Bapst, Sanchez-Gonzalez, Zambaldi, Malinowski, Tacchetti, Raposo, Santoro, Faulkner, Gulcehre, Song, Ballard, Gilmer, Dahl, Vaswani, Allen, Nash, Langston, Dyer, Heess, Wierstra, Kohli, Botvinick, Vinyals, Li, and Pascanu</label><mixed-citation>Battaglia, P. W., Hamrick, J. B., Bapst, V., Sanchez-Gonzalez, A., Zambaldi, V., Malinowski, M., Tacchetti, A., Raposo, D., Santoro, A., Faulkner, R., Gulcehre, C., Song, F., Ballard, A., Gilmer, J., Dahl, G., Vaswani, A., Allen, K., Nash, C., Langston, V., Dyer, C., Heess, N., Wierstra, D., Kohli, P., Botvinick, M., Vinyals, O., Li, Y., and Pascanu, R.: Relational inductive biases, deep learning, and graph networks, arXiv [preprint], <uri>http://arxiv.org/abs/1806.01261</uri> (last access: 15 June 2026), 2018.</mixed-citation></ref>
      <ref id="bib1.bibx6"><label>Bleeg(2020)</label><mixed-citation>Bleeg, J.: A Graph Neural Network Surrogate Model for the Prediction of Turbine Interaction Loss, J. Phys. Conf. Ser., 1618, <ext-link xlink:href="https://doi.org/10.1088/1742-6596/1618/6/062054" ext-link-type="DOI">10.1088/1742-6596/1618/6/062054</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx7"><label>Bradbury et al.(2018)Bradbury, Frostig, Hawkins, Johnson, Leary, Maclaurin, Necula, Paszke, VanderPlas, Wanderman-Milne, and Zhang</label><mixed-citation>Bradbury, J., Frostig, R., Hawkins, P., Johnson, M. J., Leary, C., Maclaurin, D., Necula, G., Paszke, A., VanderPlas, J., Wanderman-Milne, S., and Zhang, Q.: JAX: composable transformations of Python+NumPy programs, Google-Deepmind, GitHub [software], <uri>http://github.com/jax-ml/jax</uri> (last access: 15 June 2026), 2018.</mixed-citation></ref>
      <ref id="bib1.bibx8"><label>Crespo and Hernández(1996)</label><mixed-citation> Crespo, A. and Hernández, J.: Turbulence characteristics in wind-turbine wakes, J. Wind Eng. Ind. Aerod., 61, 71–85, 1996.</mixed-citation></ref>
      <ref id="bib1.bibx9"><label>de Santos et al.(2024)de Santos, Duthé, Abdallah, Élouan Réthoré, Weijtjens, Chatzi, and Devriendt</label><mixed-citation>de Santos, F. N., Duthé, G., Abdallah, I., Réthoré, P.-É., Weijtjens, W., Chatzi, E., and Devriendt, C.: Multivariate prediction on wake-affected wind turbines using graph neural networks, J. Phys. Conf. Ser., 2647, 112006, <ext-link xlink:href="https://doi.org/10.3929/ethz-b-000674010" ext-link-type="DOI">10.3929/ethz-b-000674010</ext-link>, 2024.</mixed-citation></ref>
      <ref id="bib1.bibx10"><label>Delaunay(1934)</label><mixed-citation> Delaunay, B.: Sur la sphère vide, Bulletin de l'Académie des Sciences de l'URSS, Classe des sciences mathématiques et na, pp. 793–800, 1934.</mixed-citation></ref>
      <ref id="bib1.bibx11"><label>Dimitrov et al.(2018)Dimitrov, Kelly, Vignaroli, and Berg</label><mixed-citation>Dimitrov, N., Kelly, M. C., Vignaroli, A., and Berg, J.: From wind to loads: wind turbine site-specific load estimation with surrogate models trained on high-fidelity load databases, Wind Energ. Sci., 3, 767–790, <ext-link xlink:href="https://doi.org/10.5194/wes-3-767-2018" ext-link-type="DOI">10.5194/wes-3-767-2018</ext-link>, 2018.</mixed-citation></ref>
      <ref id="bib1.bibx12"><label>Duthé et al.(2023)Duthé, de Nolasco Santos, Abdallah, Élouan Réthore, Weijtjens, Chatzi, and Devriendt</label><mixed-citation>Duthé, G., de Nolasco Santos, F., Abdallah, I., Élouan Réthore, P., Weijtjens, W., Chatzi, E., and Devriendt, C.: Local flow and loads estimation on wake-affected wind turbines using graph neural networks and PyWake, J. Phys. Conf. Ser., 2505, 012014, <ext-link xlink:href="https://doi.org/10.1088/1742-6596/2505/1/012014" ext-link-type="DOI">10.1088/1742-6596/2505/1/012014</ext-link>, 2023.</mixed-citation></ref>
      <ref id="bib1.bibx13"><label>Duthé et al.(2024)Duthé, de N Santos, Abdallah, Weijtjens, Devriendt, and Chatzi</label><mixed-citation>Duthé, G., de N Santos, F., Abdallah, I., Weijtjens, W., Devriendt, C., and Chatzi, E.: Flexible multi-fidelity framework for load estimation of wind farms through graph neural networks and transfer learning, Data-Centric Engineering, 5, e29, <ext-link xlink:href="https://doi.org/10.1017/dce.2024.35" ext-link-type="DOI">10.1017/dce.2024.35</ext-link>, 2024.</mixed-citation></ref>
      <ref id="bib1.bibx14"><label>Euler(1741)</label><mixed-citation>Euler, L.: Commentarii Academiae Scientiarum Petropolitanae, chap. Solutio problematis ad geometriam situs pertinentis, p. 128–140, Published by Michael Behrend at Cantab, English translation available at <uri>https://www.cantab.net/users/michael.behrend/repubs/maze_maths/pages/euler.html</uri> (last access: 15 June 2026), 1741.</mixed-citation></ref>
      <ref id="bib1.bibx15"><label>Fey and Lenssen(2019)</label><mixed-citation>Fey, M. and Lenssen, J. E.: Fast Graph Representation Learning with PyTorch Geometric, arXiv [preprint], <uri>http://arxiv.org/abs/1903.02428</uri> (last access: 15 June 2026), 2019.</mixed-citation></ref>
      <ref id="bib1.bibx16"><label>Forsting et al.(2023)Forsting, Diaz, Segalini, Andersen, and Ivanell</label><mixed-citation>Forsting, A. R. M., Diaz, G. P. N., Segalini, A., Andersen, S. J., and Ivanell, S.: On the accuracy of predicting wind-farm blockage, Renew. Energy, 214, 114–129, <ext-link xlink:href="https://doi.org/10.1016/j.renene.2023.05.129" ext-link-type="DOI">10.1016/j.renene.2023.05.129</ext-link>, 2023.</mixed-citation></ref>
      <ref id="bib1.bibx17"><label>Gilmer et al.(2017)Gilmer, Schoenholz, Riley, Vinyals, and Dahl</label><mixed-citation>Gilmer, J., Schoenholz, S. S., Riley, P. F., Vinyals, O., and Dahl, G. E.: Neural Message Passing for Quantum Chemistry, <uri>http://arxiv.org/abs/1704.01212</uri> (last access: 15 June 2026), 2017.</mixed-citation></ref>
      <ref id="bib1.bibx18"><label>Godwin et al.(2020)Godwin, Keck, Battaglia, Bapst, Kipf, Li, Stachenfeld, Veličković, and Sanchez-Gonzalez</label><mixed-citation>Godwin, J., Keck, T., Battaglia, P., Bapst, V., Kipf, T., Li, Y., Stachenfeld, K., Veličković, P., and Sanchez-Gonzalez, A.: Jraph: A library for graph neural networks in jax, Google-Deepmind, GitHub [software], <uri>http://github.com/deepmind/jraph</uri> (last access: 15 June 2026), 2020.</mixed-citation></ref>
      <ref id="bib1.bibx19"><label>Göçmen et al.(2016)Göçmen, van der Laan, Réthoré, Diaz, Larsen, and Ott</label><mixed-citation>Göçmen, T., van der Laan, P., Réthoré, P.-E., Diaz, A. P., Larsen, G. C., and Ott, S.: Wind turbine wake models developed at the technical university of Denmark: A review, Renewable and Sustainable Energy Reviews, 60, 752–769, <ext-link xlink:href="https://doi.org/10.1016/j.rser.2016.01.113" ext-link-type="DOI">10.1016/j.rser.2016.01.113</ext-link>, 2016.</mixed-citation></ref>
      <ref id="bib1.bibx20"><label>Harrison-Atlas et al.(2024)Harrison-Atlas, Glaws, King, and Lantz</label><mixed-citation>Harrison-Atlas, D., Glaws, A., King, R. N., and Lantz, E.: Artificial intelligence-aided wind plant optimization for nationwide evaluation of land use and economic benefits of wake steering, Nature Energy, 9, 735–749, <ext-link xlink:href="https://doi.org/10.1038/s41560-024-01516-8" ext-link-type="DOI">10.1038/s41560-024-01516-8</ext-link>, 2024.</mixed-citation></ref>
      <ref id="bib1.bibx21"><label>Heek et al.(2024)Heek, Levskaya, Oliver, Ritter, Rondepierre, Steiner, and van Zee</label><mixed-citation>Heek, J., Levskaya, A., Oliver, A., Ritter, M., Rondepierre, B., Steiner, A., and van Zee, M.: Flax: A neural network library and ecosystem for JAX, GitHub [software], <uri>http://github.com/google/flax</uri> (last access: 15 June 2026), 2024.</mixed-citation></ref>
      <ref id="bib1.bibx22"><label>IEC 61400-1:2019 ed. 4(2019)</label><mixed-citation> IEC 61400-1:2019 ed. 4: Wind energy generation systems – Part 1: Design requirements (IEC 61400-1:2019 ed. 4), 2019.</mixed-citation></ref>
      <ref id="bib1.bibx23"><label>Joe and Kuo(2008)</label><mixed-citation>Joe, S. and Kuo, F. Y.: Constructing Sobol Sequences with Better Two-Dimensional Projections, SIAM J. Sci. Comput., 30, 2635–2654, <ext-link xlink:href="https://doi.org/10.1137/070709359" ext-link-type="DOI">10.1137/070709359</ext-link>, 2008.</mixed-citation></ref>
      <ref id="bib1.bibx24"><label>Jørgensen and Bhowmik(2022)</label><mixed-citation>Jørgensen, P. B. and Bhowmik, A.: Equivariant graph neural networks for fast electron density estimation of molecules, liquids, and solids, npj Computational Materials, 8, 183, <ext-link xlink:href="https://doi.org/10.1038/s41524-022-00863-y" ext-link-type="DOI">10.1038/s41524-022-00863-y</ext-link>, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx25"><label>Kainz et al.(2024)Kainz, Quick, de Alencar, Moreno, Dykes, Bay, Zaaijer, and Bortolotti</label><mixed-citation>Kainz, S., Quick, J., de Alencar, M. S., Moreno, S. S. P., Dykes, K., Bay, C., Zaaijer, M. B., and Bortolotti, P.: The IEA Wind 740-10-MW Reference Offshore Wind Plants, Tech. rep., IEA Task 55, IEA (International Energy Agency), <uri>https://github.com/IEAWindSystems/IEA-Wind-740-10-ROWP</uri> (last access: 15 June 2026), 2024.</mixed-citation></ref>
      <ref id="bib1.bibx26"><label>Katic et al.(1987)Katic, Højstrup, and Jensen</label><mixed-citation> Katic, I. ., Højstrup, J. ., and Jensen, N. O.: A Simple Model for Cluster Efficiency, [tech. rep.], Risø National Laboratory, 1987.</mixed-citation></ref>
      <ref id="bib1.bibx27"><label>Kingma and Ba(2014)</label><mixed-citation>Kingma, D. P. and Ba, J.: Adam: A Method for Stochastic Optimization, Preprint, arXiv [preprint], <uri>http://arxiv.org/abs/1412.6980</uri> (last access: 15 June 2026), 2014.</mixed-citation></ref>
      <ref id="bib1.bibx28"><label>Li et al.(2020a)Li, Xiong, Thabet, and Ghanem</label><mixed-citation>Li, G., Xiong, C., Thabet, A., and Ghanem, B.: DeeperGCN: All You Need to Train Deeper GCNs, arXiv [preprint], <uri>http://arxiv.org/abs/2006.07739</uri> (last access: 15 June 2026), 2020a.</mixed-citation></ref>
      <ref id="bib1.bibx29"><label>Li et al.(2022)Li, Zhang, and Piggott</label><mixed-citation>Li, S., Zhang, M., and Piggott, M. D.: End-to-end Wind Turbine Wake Modelling with Deep Graph Representation Learning, Applied Energ., 339, <ext-link xlink:href="https://doi.org/10.1016/j.apenergy.2023.120928" ext-link-type="DOI">10.1016/j.apenergy.2023.120928</ext-link>, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx30"><label>Li et al.(2024)Li, Robert, Faisal, and Piggott</label><mixed-citation>Li, S., Robert, A., Faisal, A. A., and Piggott, M. D.: Learning to optimise wind farms with graph transformers, Applied Energ., 359, 122758, <ext-link xlink:href="https://doi.org/10.1016/j.apenergy.2024.122758" ext-link-type="DOI">10.1016/j.apenergy.2024.122758</ext-link>, 2024.</mixed-citation></ref>
      <ref id="bib1.bibx31"><label>Li et al.(2020b)Li, Kovachki, Azizzadenesheli, Liu, Bhattacharya, Stuart, and Anandkumar</label><mixed-citation>Li, Z., Kovachki, N., Azizzadenesheli, K., Liu, B., Bhattacharya, K., Stuart, A., and Anandkumar, A.: Neural Operator: Graph Kernel Network for Partial Differential Equations,  arXiv [preprint], <uri>http://arxiv.org/abs/2003.03485</uri> (last access: 15 June 2026), 2020b.</mixed-citation></ref>
      <ref id="bib1.bibx32"><label>Liew et al.(2023)Liew, Göçmen, Lio, and Larsen</label><mixed-citation>Liew, J., Göçmen, T., Lio, A. W. H., and Larsen, G. Chr.: Extending the dynamic wake meandering model in HAWC2Farm: a comparison with field measurements at the Lillgrund wind farm, Wind Energ. Sci., 8, 1387–1402, <ext-link xlink:href="https://doi.org/10.5194/wes-8-1387-2023" ext-link-type="DOI">10.5194/wes-8-1387-2023</ext-link>, 2023.</mixed-citation></ref>
      <ref id="bib1.bibx33"><label>Lissaman(1979)</label><mixed-citation>Lissaman, P. B. S.: Energy Effectiveness of Arbitrary Arrays of Wind Turbines, J. Energy, 3, 323–328, <ext-link xlink:href="https://doi.org/10.2514/3.62441" ext-link-type="DOI">10.2514/3.62441</ext-link>, 1979.</mixed-citation></ref>
      <ref id="bib1.bibx34"><label>Lu et al.(2021)Lu, Jin, Pang, Zhang, and Karniadakis</label><mixed-citation>Lu, L., Jin, P., Pang, G., Zhang, Z., and Karniadakis, G. E.: Learning nonlinear operators via DeepONet based on the universal approximation theorem of operators, Nature Machine Intelligence, 3, 218–229, <ext-link xlink:href="https://doi.org/10.1038/s42256-021-00302-5" ext-link-type="DOI">10.1038/s42256-021-00302-5</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx35"><label>Madsen et al.(2020)Madsen, Larsen, Pirrung, Li, and Zahle</label><mixed-citation>Madsen, H. A., Larsen, T. J., Pirrung, G. R., Li, A., and Zahle, F.: Implementation of the blade element momentum model on a polar grid and its aeroelastic load impact, Wind Energ. Sci., 5, 1–27, <ext-link xlink:href="https://doi.org/10.5194/wes-5-1-2020" ext-link-type="DOI">10.5194/wes-5-1-2020</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx36"><label>Niayifar and Porté-Agel(2016)</label><mixed-citation>Niayifar, A. and Porté-Agel, F.: Analytical modeling of wind farms: A new approach for power prediction, Energies, 9, <ext-link xlink:href="https://doi.org/10.3390/en9090741" ext-link-type="DOI">10.3390/en9090741</ext-link>, 2016.</mixed-citation></ref>
      <ref id="bib1.bibx37"><label>O'Rourke(1988)</label><mixed-citation>O'Rourke, J.: Computational Geometry, Annu. Rev. Comput. Sci., 3, 389–411, <ext-link xlink:href="https://doi.org/10.1146/annurev.cs.03.060188.002133" ext-link-type="DOI">10.1146/annurev.cs.03.060188.002133</ext-link>, 1988.</mixed-citation></ref>
      <ref id="bib1.bibx38"><label>Ødegaard Bentsen et al.(2022)Ødegaard Bentsen, Warakagoda, Stenbro, and Engelstad</label><mixed-citation>Ødegaard Bentsen, L., Warakagoda, N. D., Stenbro, R., and Engelstad, P.: Wind Park Power Prediction: Attention-Based Graph Networks and Deep Learning to Capture Wake Losses, J. Phys. Conf. Ser., 2265, 022035, <ext-link xlink:href="https://doi.org/10.1088/1742-6596/2265/2/022035" ext-link-type="DOI">10.1088/1742-6596/2265/2/022035</ext-link>, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx39"><label>Park and Park(2019)</label><mixed-citation>Park, J. and Park, J.: Physics-induced graph neural network: An application to wind-farm power estimation, Energy, 187, 115883, <ext-link xlink:href="https://doi.org/10.1016/j.energy.2019.115883" ext-link-type="DOI">10.1016/j.energy.2019.115883</ext-link>, 2019.</mixed-citation></ref>
      <ref id="bib1.bibx40"><label>Pedersen et al.(2023)Pedersen, Forsting, Paul van der Laan, Romàn, Risco, Friis-Møller, Quick, Schøler, Rodrigues, Olsen, and Réthoré</label><mixed-citation>Pedersen, M. M., Forsting, A. M., Paul van der Laan, R. R., Romàn, L. A. A., Risco, J. C., Friis-Møller, M., Quick, J., Schøler, J. P., Rodrigues, R. V., Olsen, B. T., and Réthoré, P.-E.: PyWake 2.5.0: An open-source wind farm simulation tool, Technical University of Denmark (DTU) Wind and Energy Systems, GitLab [software], <uri>https://gitlab.windenergy.dtu.dk/TOPFARM/PyWake</uri> (last access: 15 June 2026), 2023.</mixed-citation></ref>
      <ref id="bib1.bibx41"><label>Porté-Agel et al.(2020)Porté-Agel, Bastankhah, and Shamsoddin</label><mixed-citation>Porté-Agel, F., Bastankhah, M., and Shamsoddin, S.: Wind-Turbine and Wind-Farm Flows: A Review, Bound.-Lay. Meteorol., 174, 1–59, <ext-link xlink:href="https://doi.org/10.1007/s10546-019-00473-0" ext-link-type="DOI">10.1007/s10546-019-00473-0</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx42"><label>Scarselli et al.(2009)Scarselli, Gori, Tsoi, Hagenbuchner, and Monfardini</label><mixed-citation>Scarselli, F., Gori, M., Tsoi, A. C., Hagenbuchner, M., and Monfardini, G.: The Graph Neural Network Model, IEEE T. Neural Networ., 20, 61–80, <ext-link xlink:href="https://doi.org/10.1109/TNN.2008.2005605" ext-link-type="DOI">10.1109/TNN.2008.2005605</ext-link>, 2009.</mixed-citation></ref>
      <ref id="bib1.bibx43"><label>Schøler(2026)</label><mixed-citation>Schøler, J. P.: Wind-Farm-GNO-v1, Zenodo [code], <ext-link xlink:href="https://doi.org/10.5281/zenodo.20698845" ext-link-type="DOI">10.5281/zenodo.20698845</ext-link>, 2026.</mixed-citation></ref>
      <ref id="bib1.bibx44"><label>Schøler et al.(2025)Schøler, Quick, Réthoré, and Rasmussen</label><mixed-citation>Schøler, J. P., Quick, J., Réthoré, P.-E., and Rasmussen, F. P. W.: Wind farm: Graph flow test data, Zenodo [data set], <ext-link xlink:href="https://doi.org/10.5281/zenodo.17671257" ext-link-type="DOI">10.5281/zenodo.17671257</ext-link>, 2025.</mixed-citation></ref>
      <ref id="bib1.bibx45"><label>Seidman et al.(2022)Seidman, Kissas, Perdikaris, and Pappas</label><mixed-citation>Seidman, J. H., Kissas, G., Perdikaris, P., and Pappas, G. J.: NOMAD: Nonlinear Manifold Decoders for Operator Learning, arXiv [preprint], <uri>http://arxiv.org/abs/2206.03551</uri> (last access: 15 June 2026), 2022.</mixed-citation></ref>
      <ref id="bib1.bibx46"><label>Srivastava et al.(2014)Srivastava, Hinton, Krizhevsky, and Salakhutdinov</label><mixed-citation> Srivastava, N., Hinton, G., Krizhevsky, A., and Salakhutdinov, R.: Dropout: A Simple Way to Prevent Neural Networks from Overfitting, Tech. rep., Department of Computer Science University of Toronto, 2014.</mixed-citation></ref>
      <ref id="bib1.bibx47"><label>Sun et al.(2022)Sun, Moya, Lin, and Yue</label><mixed-citation>Sun, Y., Moya, C., Lin, G., and Yue, M.: DeepGraphONet: A Deep Graph Operator Network to Learn and Zero-shot Transfer the Dynamic Response of Networked Systems, arXiv [preprint], <uri>http://arxiv.org/abs/2209.10622</uri> (last access: 15 June 2026), 2022.</mixed-citation></ref>
      <ref id="bib1.bibx48"><label>Technical University of Denmark(2019)</label><mixed-citation>Technical University of Denmark: Sophia HPC Cluster, Research Computing at DTU [compute resource], <ext-link xlink:href="https://doi.org/10.57940/FAFC-6M81" ext-link-type="DOI">10.57940/FAFC-6M81</ext-link>, 2019.</mixed-citation></ref>
      <ref id="bib1.bibx49"><label>Troldborg and Meyer Forsting(2017)</label><mixed-citation>Troldborg, N. and Meyer Forsting, A. R.: A simple model of the wind turbine induction zone derived from numerical simulations, Wind Energy, 20, 2011–2020, <ext-link xlink:href="https://doi.org/10.1002/we.2137" ext-link-type="DOI">10.1002/we.2137</ext-link>, 2017.</mixed-citation></ref>
      <ref id="bib1.bibx50"><label>van der Laan et al.(2015)van der Laan, Sørensen, Réthoré, Mann, Kelly, and Troldborg</label><mixed-citation>van der Laan, M. P., Sørensen, N. N., Réthoré, P. E., Mann, J., Kelly, M. C., and Troldborg, N.: The <inline-formula><mml:math id="M423" display="inline"><mml:mi>k</mml:mi></mml:math></inline-formula>-<inline-formula><mml:math id="M424" display="inline"><mml:mi mathvariant="italic">ε</mml:mi></mml:math></inline-formula>-<inline-formula><mml:math id="M425" display="inline"><mml:mrow><mml:msub><mml:mi>f</mml:mi><mml:mi>p</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> model applied to double wind turbine wakes using different actuator disk force methods, Wind Energy, 18, 2223–2240, <ext-link xlink:href="https://doi.org/10.1002/we.1816" ext-link-type="DOI">10.1002/we.1816</ext-link>, 2015. </mixed-citation></ref>
      <ref id="bib1.bibx51"><label>Voutsinas et al.(1990)Voutsinas, Rados, and Zervos</label><mixed-citation> Voutsinas, S., Rados, K., and Zervos, A.: On the Analysis of Wake Effects in Wind Parks, [tech. report], National Technical University of Athens, Laboratory of Aerodynamics, 1990.</mixed-citation></ref>
      <ref id="bib1.bibx52"><label>Yu et al.(2020)Yu, Zhang, Li, Yu, Gao, Liu, You, Zheng, and Yu</label><mixed-citation>Yu, M., Zhang, Z., Li, X., Yu, J., Gao, J., Liu, Z., You, B., Zheng, X., and Yu, R.: Superposition Graph Neural Network for offshore wind power prediction, Future Gener. Comp. Sy., 113, 145–157, <ext-link xlink:href="https://doi.org/10.1016/j.future.2020.06.024" ext-link-type="DOI">10.1016/j.future.2020.06.024</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx53"><label>Zehtabiyan-Rezaie et al.(2022)Zehtabiyan-Rezaie, Iosifidis, and Abkar</label><mixed-citation>Zehtabiyan-Rezaie, N., Iosifidis, A., and Abkar, M.: Data-driven fluid mechanics of wind farms: A review, J. Renew. Sustai. Ener., 14, <ext-link xlink:href="https://doi.org/10.1063/5.0091980" ext-link-type="DOI">10.1063/5.0091980</ext-link>, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx54"><label>Zong and Porté-Agel(2020)</label><mixed-citation>Zong, H. and Porté-Agel, F.: A momentum-conserving wake superposition method for wind farm power prediction, J. Fluid Mech., 889, A8, <ext-link xlink:href="https://doi.org/10.1017/jfm.2020.77" ext-link-type="DOI">10.1017/jfm.2020.77</ext-link>, 2020.</mixed-citation></ref>

  </ref-list></back>
    <!--<article-title-html>Graph neural operator for wind farm wake flow</article-title-html>
<abstract-html/>
<ref-html id="bib1.bib1"><label>Ba et al.(2016)Ba, Kiros, and Hinton</label><mixed-citation>
      
Ba, J. L., Kiros, J. R., and Hinton, G. E.:
Layer Normalization, arXiv [preprint], <a href="https://doi.org/10.48550/arXiv.1607.06450" target="_blank">https://doi.org/10.48550/arXiv.1607.06450</a>, 2016.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib2"><label>Bak et al.(2013)Bak, Zahle, Bitsche, Kim, Yde, Henriksen, Hansen, Blasques, Gaunaa, and Natarajan</label><mixed-citation>
      
Bak, C.., Zahle, F.., Bitsche, R.., Kim, T.., Yde, A.., Henriksen, L. C., Hansen, M. H., Blasques, J. P. A. A., Gaunaa, M.., and Natarajan, A.:
The DTU 10-MW Reference Wind Turbine, in: Danish Wind Power Research, 27–28 May 2013, <a href="https://orbit.dtu.dk/en/publications/the-dtu-10-mw-reference-wind-turbine/" target="_blank"/> (last access: 15 June 2026), 2013.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib3"><label>Bastankhah and Porté-Agel(2014)</label><mixed-citation>
      
Bastankhah, M. and Porté-Agel, F.:
A new analytical model for wind-turbine wakes, Renew. Energy, 70, 116–123, <a href="https://doi.org/10.1016/j.renene.2014.01.002" target="_blank">https://doi.org/10.1016/j.renene.2014.01.002</a>, 2014.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib4"><label>Bastankhah et al.(2021)Bastankhah, Welch, Martínez-Tossas, King, and Fleming</label><mixed-citation>
      
Bastankhah, M., Welch, B. L., Martínez-Tossas, L. A., King, J., and Fleming, P.:
Analytical solution for the cumulative wake of wind turbines in wind farms, J. Fluid Mech., 911, A53, <a href="https://doi.org/10.1017/jfm.2020.1037" target="_blank">https://doi.org/10.1017/jfm.2020.1037</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib5"><label>Battaglia et al.(2018)Battaglia, Hamrick, Bapst, Sanchez-Gonzalez, Zambaldi, Malinowski, Tacchetti, Raposo, Santoro, Faulkner, Gulcehre, Song, Ballard, Gilmer, Dahl, Vaswani, Allen, Nash, Langston, Dyer, Heess, Wierstra, Kohli, Botvinick, Vinyals, Li, and Pascanu</label><mixed-citation>
      
Battaglia, P. W., Hamrick, J. B., Bapst, V., Sanchez-Gonzalez, A., Zambaldi, V., Malinowski, M., Tacchetti, A., Raposo, D., Santoro, A., Faulkner, R., Gulcehre, C., Song, F., Ballard, A., Gilmer, J., Dahl, G., Vaswani, A., Allen, K., Nash, C., Langston, V., Dyer, C., Heess, N., Wierstra, D., Kohli, P., Botvinick, M., Vinyals, O., Li, Y., and Pascanu, R.:
Relational inductive biases, deep learning, and graph networks, arXiv [preprint], <a href="http://arxiv.org/abs/1806.01261" target="_blank"/> (last access: 15 June 2026), 2018.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib6"><label>Bleeg(2020)</label><mixed-citation>
      
Bleeg, J.:
A Graph Neural Network Surrogate Model for the Prediction of Turbine Interaction Loss, J. Phys. Conf. Ser., 1618, <a href="https://doi.org/10.1088/1742-6596/1618/6/062054" target="_blank">https://doi.org/10.1088/1742-6596/1618/6/062054</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib7"><label>Bradbury et al.(2018)Bradbury, Frostig, Hawkins, Johnson, Leary, Maclaurin, Necula, Paszke, VanderPlas, Wanderman-Milne, and Zhang</label><mixed-citation>
      
Bradbury, J., Frostig, R., Hawkins, P., Johnson, M. J., Leary, C., Maclaurin, D., Necula, G., Paszke, A., VanderPlas, J., Wanderman-Milne, S., and Zhang, Q.:
JAX: composable transformations of Python+NumPy programs, Google-Deepmind, GitHub [software], <a href="http://github.com/jax-ml/jax" target="_blank"/> (last access: 15 June 2026), 2018.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib8"><label>Crespo and Hernández(1996)</label><mixed-citation>
      
Crespo, A. and Hernández, J.:
Turbulence characteristics in wind-turbine wakes, J. Wind Eng. Ind. Aerod., 61, 71–85, 1996.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib9"><label>de Santos et al.(2024)de Santos, Duthé, Abdallah, Élouan Réthoré, Weijtjens, Chatzi, and Devriendt</label><mixed-citation>
      
de Santos, F. N., Duthé, G., Abdallah, I., Réthoré, P.-É., Weijtjens, W., Chatzi, E., and Devriendt, C.:
Multivariate prediction on wake-affected wind turbines using graph neural networks, J. Phys. Conf. Ser., 2647, 112006, <a href="https://doi.org/10.3929/ethz-b-000674010" target="_blank">https://doi.org/10.3929/ethz-b-000674010</a>, 2024.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib10"><label>Delaunay(1934)</label><mixed-citation>
      
Delaunay, B.:
Sur la sphère vide, Bulletin de l'Académie des Sciences de l'URSS, Classe des sciences mathématiques et na, pp. 793–800, 1934.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib11"><label>Dimitrov et al.(2018)Dimitrov, Kelly, Vignaroli, and Berg</label><mixed-citation>
      
Dimitrov, N., Kelly, M. C., Vignaroli, A., and Berg, J.:
From wind to loads: wind turbine site-specific load estimation with surrogate models trained on high-fidelity load databases, Wind Energ. Sci., 3, 767–790, <a href="https://doi.org/10.5194/wes-3-767-2018" target="_blank">https://doi.org/10.5194/wes-3-767-2018</a>, 2018.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib12"><label>Duthé et al.(2023)Duthé, de Nolasco Santos, Abdallah, Élouan Réthore, Weijtjens, Chatzi, and Devriendt</label><mixed-citation>
      
Duthé, G., de Nolasco Santos, F., Abdallah, I., Élouan Réthore, P., Weijtjens, W., Chatzi, E., and Devriendt, C.:
Local flow and loads estimation on wake-affected wind turbines using graph neural networks and PyWake, J. Phys. Conf. Ser., 2505, 012014, <a href="https://doi.org/10.1088/1742-6596/2505/1/012014" target="_blank">https://doi.org/10.1088/1742-6596/2505/1/012014</a>, 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib13"><label>Duthé et al.(2024)Duthé, de N Santos, Abdallah, Weijtjens, Devriendt, and Chatzi</label><mixed-citation>
      
Duthé, G., de N Santos, F., Abdallah, I., Weijtjens, W., Devriendt, C., and Chatzi, E.:
Flexible multi-fidelity framework for load estimation of wind farms through graph neural networks and transfer learning, Data-Centric Engineering, 5, e29, <a href="https://doi.org/10.1017/dce.2024.35" target="_blank">https://doi.org/10.1017/dce.2024.35</a>, 2024.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib14"><label>Euler(1741)</label><mixed-citation>
      
Euler, L.:
Commentarii Academiae Scientiarum Petropolitanae, chap. Solutio problematis ad geometriam situs pertinentis, p. 128–140, Published by Michael Behrend at Cantab, English translation available at <a href="https://www.cantab.net/users/michael.behrend/repubs/maze_maths/pages/euler.html" target="_blank"/> (last access: 15 June 2026), 1741.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib15"><label>Fey and Lenssen(2019)</label><mixed-citation>
      
Fey, M. and Lenssen, J. E.:
Fast Graph Representation Learning with PyTorch Geometric, arXiv [preprint], <a href="http://arxiv.org/abs/1903.02428" target="_blank"/> (last access: 15 June 2026), 2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib16"><label>Forsting et al.(2023)Forsting, Diaz, Segalini, Andersen, and Ivanell</label><mixed-citation>
      
Forsting, A. R. M., Diaz, G. P. N., Segalini, A., Andersen, S. J., and Ivanell, S.:
On the accuracy of predicting wind-farm blockage, Renew. Energy, 214, 114–129, <a href="https://doi.org/10.1016/j.renene.2023.05.129" target="_blank">https://doi.org/10.1016/j.renene.2023.05.129</a>, 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib17"><label>Gilmer et al.(2017)Gilmer, Schoenholz, Riley, Vinyals, and Dahl</label><mixed-citation>
      
Gilmer, J., Schoenholz, S. S., Riley, P. F., Vinyals, O., and Dahl, G. E.:
Neural Message Passing for Quantum Chemistry, <a href="http://arxiv.org/abs/1704.01212" target="_blank"/> (last access: 15 June 2026), 2017.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib18"><label>Godwin et al.(2020)Godwin, Keck, Battaglia, Bapst, Kipf, Li, Stachenfeld, Veličković, and Sanchez-Gonzalez</label><mixed-citation>
      
Godwin, J., Keck, T., Battaglia, P., Bapst, V., Kipf, T., Li, Y., Stachenfeld, K., Veličković, P., and Sanchez-Gonzalez, A.:
Jraph: A library for graph neural networks in jax, Google-Deepmind, GitHub [software], <a href="http://github.com/deepmind/jraph" target="_blank"/> (last access: 15 June 2026), 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib19"><label>Göçmen et al.(2016)Göçmen, van der Laan, Réthoré, Diaz, Larsen, and Ott</label><mixed-citation>
      
Göçmen, T., van der Laan, P., Réthoré, P.-E., Diaz, A. P., Larsen, G. C., and Ott, S.:
Wind turbine wake models developed at the technical university of Denmark: A review, Renewable and Sustainable Energy Reviews, 60, 752–769, <a href="https://doi.org/10.1016/j.rser.2016.01.113" target="_blank">https://doi.org/10.1016/j.rser.2016.01.113</a>, 2016.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib20"><label>Harrison-Atlas et al.(2024)Harrison-Atlas, Glaws, King, and Lantz</label><mixed-citation>
      
Harrison-Atlas, D., Glaws, A., King, R. N., and Lantz, E.:
Artificial intelligence-aided wind plant optimization for nationwide evaluation of land use and economic benefits of wake steering, Nature Energy, 9, 735–749, <a href="https://doi.org/10.1038/s41560-024-01516-8" target="_blank">https://doi.org/10.1038/s41560-024-01516-8</a>, 2024.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib21"><label>Heek et al.(2024)Heek, Levskaya, Oliver, Ritter, Rondepierre, Steiner, and van Zee</label><mixed-citation>
      
Heek, J., Levskaya, A., Oliver, A., Ritter, M., Rondepierre, B., Steiner, A., and van Zee, M.:
Flax: A neural network library and ecosystem for JAX, GitHub [software], <a href="http://github.com/google/flax" target="_blank"/> (last access: 15 June 2026), 2024.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib22"><label>IEC 61400-1:2019 ed. 4(2019)</label><mixed-citation>
      
IEC 61400-1:2019 ed. 4:
Wind energy generation systems – Part 1: Design requirements (IEC 61400-1:2019 ed. 4), 2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib23"><label>Joe and Kuo(2008)</label><mixed-citation>
      
Joe, S. and Kuo, F. Y.:
Constructing Sobol Sequences with Better Two-Dimensional Projections, SIAM J. Sci. Comput., 30, 2635–2654, <a href="https://doi.org/10.1137/070709359" target="_blank">https://doi.org/10.1137/070709359</a>, 2008.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib24"><label>Jørgensen and Bhowmik(2022)</label><mixed-citation>
      
Jørgensen, P. B. and Bhowmik, A.:
Equivariant graph neural networks for fast electron density estimation of molecules, liquids, and solids, npj Computational Materials, 8, 183, <a href="https://doi.org/10.1038/s41524-022-00863-y" target="_blank">https://doi.org/10.1038/s41524-022-00863-y</a>, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib25"><label>Kainz et al.(2024)Kainz, Quick, de Alencar, Moreno, Dykes, Bay, Zaaijer, and Bortolotti</label><mixed-citation>
      
Kainz, S., Quick, J., de Alencar, M. S., Moreno, S. S. P., Dykes, K., Bay, C., Zaaijer, M. B., and Bortolotti, P.:
The IEA Wind 740-10-MW Reference Offshore Wind Plants, Tech. rep., IEA Task 55, IEA (International Energy Agency), <a href="https://github.com/IEAWindSystems/IEA-Wind-740-10-ROWP" target="_blank"/> (last access: 15 June 2026), 2024.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib26"><label>Katic et al.(1987)Katic, Højstrup, and Jensen</label><mixed-citation>
      
Katic, I. ., Højstrup, J. ., and Jensen, N. O.:
A Simple Model for Cluster Efficiency, [tech. rep.], Risø National Laboratory, 1987.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib27"><label>Kingma and Ba(2014)</label><mixed-citation>
      
Kingma, D. P. and Ba, J.:
Adam: A Method for Stochastic Optimization, Preprint, arXiv [preprint], <a href="http://arxiv.org/abs/1412.6980" target="_blank"/> (last access: 15 June 2026), 2014.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib28"><label>Li et al.(2020a)Li, Xiong, Thabet, and Ghanem</label><mixed-citation>
      
Li, G., Xiong, C., Thabet, A., and Ghanem, B.:
DeeperGCN: All You Need to Train Deeper GCNs, arXiv [preprint], <a href="http://arxiv.org/abs/2006.07739" target="_blank"/> (last access: 15 June 2026), 2020a.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib29"><label>Li et al.(2022)Li, Zhang, and Piggott</label><mixed-citation>
      
Li, S., Zhang, M., and Piggott, M. D.:
End-to-end Wind Turbine Wake Modelling with Deep Graph Representation Learning, Applied Energ., 339, <a href="https://doi.org/10.1016/j.apenergy.2023.120928" target="_blank">https://doi.org/10.1016/j.apenergy.2023.120928</a>, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib30"><label>Li et al.(2024)Li, Robert, Faisal, and Piggott</label><mixed-citation>
      
Li, S., Robert, A., Faisal, A. A., and Piggott, M. D.:
Learning to optimise wind farms with graph transformers, Applied Energ., 359, 122758, <a href="https://doi.org/10.1016/j.apenergy.2024.122758" target="_blank">https://doi.org/10.1016/j.apenergy.2024.122758</a>, 2024.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib31"><label>Li et al.(2020b)Li, Kovachki, Azizzadenesheli, Liu, Bhattacharya, Stuart, and Anandkumar</label><mixed-citation>
      
Li, Z., Kovachki, N., Azizzadenesheli, K., Liu, B., Bhattacharya, K., Stuart, A., and Anandkumar, A.:
Neural Operator: Graph Kernel Network for Partial Differential Equations,  arXiv [preprint], <a href="http://arxiv.org/abs/2003.03485" target="_blank"/> (last access: 15 June 2026), 2020b.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib32"><label>Liew et al.(2023)Liew, Göçmen, Lio, and Larsen</label><mixed-citation>
      
Liew, J., Göçmen, T., Lio, A. W. H., and Larsen, G. Chr.:
Extending the dynamic wake meandering model in HAWC2Farm: a comparison with field measurements at the Lillgrund wind farm, Wind Energ. Sci., 8, 1387–1402, <a href="https://doi.org/10.5194/wes-8-1387-2023" target="_blank">https://doi.org/10.5194/wes-8-1387-2023</a>, 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib33"><label>Lissaman(1979)</label><mixed-citation>
      
Lissaman, P. B. S.:
Energy Effectiveness of Arbitrary Arrays of Wind Turbines, J. Energy, 3, 323–328, <a href="https://doi.org/10.2514/3.62441" target="_blank">https://doi.org/10.2514/3.62441</a>, 1979.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib34"><label>Lu et al.(2021)Lu, Jin, Pang, Zhang, and Karniadakis</label><mixed-citation>
      
Lu, L., Jin, P., Pang, G., Zhang, Z., and Karniadakis, G. E.:
Learning nonlinear operators via DeepONet based on the universal approximation theorem of operators, Nature Machine Intelligence, 3, 218–229, <a href="https://doi.org/10.1038/s42256-021-00302-5" target="_blank">https://doi.org/10.1038/s42256-021-00302-5</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib35"><label>Madsen et al.(2020)Madsen, Larsen, Pirrung, Li, and Zahle</label><mixed-citation>
      
Madsen, H. A., Larsen, T. J., Pirrung, G. R., Li, A., and Zahle, F.:
Implementation of the blade element momentum model on a polar grid and its aeroelastic load impact, Wind Energ. Sci., 5, 1–27, <a href="https://doi.org/10.5194/wes-5-1-2020" target="_blank">https://doi.org/10.5194/wes-5-1-2020</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib36"><label>Niayifar and Porté-Agel(2016)</label><mixed-citation>
      
Niayifar, A. and Porté-Agel, F.:
Analytical modeling of wind farms: A new approach for power prediction, Energies, 9, <a href="https://doi.org/10.3390/en9090741" target="_blank">https://doi.org/10.3390/en9090741</a>, 2016.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib37"><label>O'Rourke(1988)</label><mixed-citation>
      
O'Rourke, J.:
Computational Geometry, Annu. Rev. Comput. Sci., 3, 389–411, <a href="https://doi.org/10.1146/annurev.cs.03.060188.002133" target="_blank">https://doi.org/10.1146/annurev.cs.03.060188.002133</a>, 1988.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib38"><label>Ødegaard Bentsen et al.(2022)Ødegaard Bentsen, Warakagoda, Stenbro, and Engelstad</label><mixed-citation>
      
Ødegaard Bentsen, L., Warakagoda, N. D., Stenbro, R., and Engelstad, P.:
Wind Park Power Prediction: Attention-Based Graph Networks and Deep Learning to Capture Wake Losses, J. Phys. Conf. Ser., 2265, 022035, <a href="https://doi.org/10.1088/1742-6596/2265/2/022035" target="_blank">https://doi.org/10.1088/1742-6596/2265/2/022035</a>, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib39"><label>Park and Park(2019)</label><mixed-citation>
      
Park, J. and Park, J.:
Physics-induced graph neural network: An application to wind-farm power estimation, Energy, 187, 115883, <a href="https://doi.org/10.1016/j.energy.2019.115883" target="_blank">https://doi.org/10.1016/j.energy.2019.115883</a>, 2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib40"><label>Pedersen et al.(2023)Pedersen, Forsting, Paul van der Laan, Romàn, Risco, Friis-Møller, Quick, Schøler, Rodrigues, Olsen, and Réthoré</label><mixed-citation>
      
Pedersen, M. M., Forsting, A. M., Paul van der Laan, R. R., Romàn, L. A. A., Risco, J. C., Friis-Møller, M., Quick, J., Schøler, J. P., Rodrigues, R. V., Olsen, B. T., and Réthoré, P.-E.:
PyWake 2.5.0: An open-source wind farm simulation tool, Technical University of Denmark (DTU) Wind and Energy Systems, GitLab [software], <a href="https://gitlab.windenergy.dtu.dk/TOPFARM/PyWake" target="_blank"/> (last access: 15 June 2026), 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib41"><label>Porté-Agel et al.(2020)Porté-Agel, Bastankhah, and Shamsoddin</label><mixed-citation>
      
Porté-Agel, F., Bastankhah, M., and Shamsoddin, S.:
Wind-Turbine and Wind-Farm Flows: A Review, Bound.-Lay. Meteorol., 174, 1–59, <a href="https://doi.org/10.1007/s10546-019-00473-0" target="_blank">https://doi.org/10.1007/s10546-019-00473-0</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib42"><label>Scarselli et al.(2009)Scarselli, Gori, Tsoi, Hagenbuchner, and Monfardini</label><mixed-citation>
      
Scarselli, F., Gori, M., Tsoi, A. C., Hagenbuchner, M., and Monfardini, G.:
The Graph Neural Network Model, IEEE T. Neural Networ., 20, 61–80, <a href="https://doi.org/10.1109/TNN.2008.2005605" target="_blank">https://doi.org/10.1109/TNN.2008.2005605</a>, 2009.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib43"><label>Schøler(2026)</label><mixed-citation>
      
Schøler, J. P.: Wind-Farm-GNO-v1, Zenodo [code], <a href="https://doi.org/10.5281/zenodo.20698845" target="_blank">https://doi.org/10.5281/zenodo.20698845</a>, 2026.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib44"><label>Schøler et al.(2025)Schøler, Quick, Réthoré, and Rasmussen</label><mixed-citation>
      
Schøler, J. P., Quick, J., Réthoré, P.-E., and Rasmussen, F. P. W.:
Wind farm: Graph flow test data, Zenodo [data set], <a href="https://doi.org/10.5281/zenodo.17671257" target="_blank">https://doi.org/10.5281/zenodo.17671257</a>, 2025.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib45"><label>Seidman et al.(2022)Seidman, Kissas, Perdikaris, and Pappas</label><mixed-citation>
      
Seidman, J. H., Kissas, G., Perdikaris, P., and Pappas, G. J.:
NOMAD: Nonlinear Manifold Decoders for Operator Learning, arXiv [preprint], <a href="http://arxiv.org/abs/2206.03551" target="_blank"/> (last access: 15 June 2026), 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib46"><label>Srivastava et al.(2014)Srivastava, Hinton, Krizhevsky, and Salakhutdinov</label><mixed-citation>
      
Srivastava, N., Hinton, G., Krizhevsky, A., and Salakhutdinov, R.:
Dropout: A Simple Way to Prevent Neural Networks from Overfitting, Tech. rep., Department of Computer Science University of Toronto, 2014.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib47"><label>Sun et al.(2022)Sun, Moya, Lin, and Yue</label><mixed-citation>
      
Sun, Y., Moya, C., Lin, G., and Yue, M.:
DeepGraphONet: A Deep Graph Operator Network to Learn and Zero-shot Transfer the Dynamic Response of Networked Systems, arXiv [preprint], <a href="http://arxiv.org/abs/2209.10622" target="_blank"/> (last access: 15 June 2026), 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib48"><label>Technical University of Denmark(2019)</label><mixed-citation>
      
Technical University of Denmark:
Sophia HPC Cluster, Research Computing at DTU [compute resource], <a href="https://doi.org/10.57940/FAFC-6M81" target="_blank">https://doi.org/10.57940/FAFC-6M81</a>, 2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib49"><label>Troldborg and Meyer Forsting(2017)</label><mixed-citation>
      
Troldborg, N. and Meyer Forsting, A. R.:
A simple model of the wind turbine induction zone derived from numerical simulations, Wind Energy, 20, 2011–2020, <a href="https://doi.org/10.1002/we.2137" target="_blank">https://doi.org/10.1002/we.2137</a>, 2017.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib50"><label>van der Laan et al.(2015)van der Laan, Sørensen, Réthoré, Mann, Kelly, and Troldborg</label><mixed-citation>
      
van der Laan, M. P., Sørensen, N. N., Réthoré, P. E., Mann, J., Kelly, M. C., and Troldborg, N.:
The <i>k</i>-<i>ε</i>-<i>f</i><sub><i>p</i></sub> model applied to double wind turbine wakes using different actuator disk force methods, Wind Energy, 18, 2223–2240, <a href="https://doi.org/10.1002/we.1816" target="_blank">https://doi.org/10.1002/we.1816</a>, 2015.


    </mixed-citation></ref-html>
<ref-html id="bib1.bib51"><label>Voutsinas et al.(1990)Voutsinas, Rados, and Zervos</label><mixed-citation>
      
Voutsinas, S., Rados, K., and Zervos, A.:
On the Analysis of Wake Effects in Wind Parks, [tech. report], National Technical University of Athens, Laboratory of Aerodynamics, 1990.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib52"><label>Yu et al.(2020)Yu, Zhang, Li, Yu, Gao, Liu, You, Zheng, and Yu</label><mixed-citation>
      
Yu, M., Zhang, Z., Li, X., Yu, J., Gao, J., Liu, Z., You, B., Zheng, X., and Yu, R.:
Superposition Graph Neural Network for offshore wind power prediction, Future Gener. Comp. Sy., 113, 145–157, <a href="https://doi.org/10.1016/j.future.2020.06.024" target="_blank">https://doi.org/10.1016/j.future.2020.06.024</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib53"><label>Zehtabiyan-Rezaie et al.(2022)Zehtabiyan-Rezaie, Iosifidis, and Abkar</label><mixed-citation>
      
Zehtabiyan-Rezaie, N., Iosifidis, A., and Abkar, M.:
Data-driven fluid mechanics of wind farms: A review, J. Renew. Sustai. Ener., 14, <a href="https://doi.org/10.1063/5.0091980" target="_blank">https://doi.org/10.1063/5.0091980</a>, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib54"><label>Zong and Porté-Agel(2020)</label><mixed-citation>
      
Zong, H. and Porté-Agel, F.:
A momentum-conserving wake superposition method for wind farm power prediction, J. Fluid Mech., 889, A8, <a href="https://doi.org/10.1017/jfm.2020.77" target="_blank">https://doi.org/10.1017/jfm.2020.77</a>, 2020.

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