<?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-8-1235-2023</article-id><title-group><article-title>Stochastic gradient descent for wind farm optimization</article-title><alt-title>Stochastic gradient descent for wind farm optimization</alt-title>
      </title-group><?xmltex \runningtitle{Stochastic gradient descent for wind farm optimization}?><?xmltex \runningauthor{J.~Quick et al.}?>
      <contrib-group>
        <contrib contrib-type="author" corresp="yes">
          <name><surname>Quick</surname><given-names>Julian</given-names></name>
          <email>juqu@dtu.dk</email>
        </contrib>
        <contrib contrib-type="author" corresp="no">
          <name><surname>Rethore</surname><given-names>Pierre-Elouan</given-names></name>
          
        <ext-link>https://orcid.org/0000-0002-2300-5440</ext-link></contrib>
        <contrib contrib-type="author" corresp="no">
          <name><surname>Mølgaard Pedersen</surname><given-names>Mads</given-names></name>
          
        <ext-link>https://orcid.org/0000-0003-1411-6402</ext-link></contrib>
        <contrib contrib-type="author" corresp="no">
          <name><surname>Rodrigues</surname><given-names>Rafael Valotta</given-names></name>
          
        <ext-link>https://orcid.org/0000-0002-2395-9957</ext-link></contrib>
        <contrib contrib-type="author" corresp="no">
          <name><surname>Friis-Møller</surname><given-names>Mikkel</given-names></name>
          
        </contrib>
        <aff id="aff1"><institution>Technical University of Denmark, Risø National Laboratory for Sustainable Energy, <?xmltex \hack{\break}?> Frederiksborgvej 399, 4000 Roskilde, Denmark</institution>
        </aff>
      </contrib-group>
      <author-notes><corresp id="corr1">Julian Quick (juqu@dtu.dk)</corresp></author-notes><pub-date><day>1</day><month>August</month><year>2023</year></pub-date>
      
      <volume>8</volume>
      <issue>8</issue>
      <fpage>1235</fpage><lpage>1250</lpage>
      <history>
        <date date-type="received"><day>31</day><month>October</month><year>2022</year></date>
           <date date-type="rev-request"><day>9</day><month>November</month><year>2022</year></date>
           <date date-type="rev-recd"><day>17</day><month>April</month><year>2023</year></date>
           <date date-type="accepted"><day>20</day><month>June</month><year>2023</year></date>
      </history>
      <permissions>
        <copyright-statement>Copyright: © 2023 Julian Quick et al.</copyright-statement>
        <copyright-year>2023</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/8/1235/2023/wes-8-1235-2023.html">This article is available from https://wes.copernicus.org/articles/8/1235/2023/wes-8-1235-2023.html</self-uri><self-uri xlink:href="https://wes.copernicus.org/articles/8/1235/2023/wes-8-1235-2023.pdf">The full text article is available as a PDF file from https://wes.copernicus.org/articles/8/1235/2023/wes-8-1235-2023.pdf</self-uri>
      <abstract><title>Abstract</title>

      <p id="d1e117">It is important to optimize wind turbine positions to mitigate potential wake losses. To perform this optimization, atmospheric conditions, such as the inflow speed and direction, are assigned probability distributions according to measured data, which are propagated through engineering wake models to estimate the annual energy production (AEP). This study presents stochastic gradient descent (SGD) for wind farm optimization, which is an approach that estimates the gradient of the AEP using Monte Carlo simulation, allowing for the consideration of an arbitrarily large number of atmospheric conditions. SGD is demonstrated using wind farms with square and circular boundaries, considering cases with 100, 144, 225, and 325 turbines, and the results are compared to a deterministic optimization approach. It is shown that SGD finds a larger optimal AEP in substantially less time than the deterministic counterpart as the number of wind turbines is increased.</p>
  </abstract>
    </article-meta>
  </front>
<body>
      

<sec id="Ch1.S1" sec-type="intro">
  <label>1</label><title>Introduction</title>
      <p id="d1e129">Wind farms are groups of wind turbines that harness the power in the atmospheric boundary layer to provide renewable energy. When a wind turbine absorbs energy from the air, the air downstream of the wind turbine has reduced power, which often reduces the power production of downstream turbines. This is known as the wake effect <xref ref-type="bibr" rid="bib1.bibx59 bib1.bibx25" id="paren.1"/>. When a new wind power plant is to be constructed, optimal turbine locations are determined using engineering wind farm models <xref ref-type="bibr" rid="bib1.bibx58 bib1.bibx45 bib1.bibx3" id="paren.2"/>. Turbine positions are optimized to exploit the benefits of the local wind resource while avoiding energy losses from turbine wakes. In the wind turbine placement problem, atmospheric conditions, such as the inflow speed and direction, are assigned probability distributions according to measured data. By propagating these probability distributions through the engineering wake model, the annual energy production (AEP) can be estimated. The AEP is often computed using rectangular quadrature, dividing the relevant speeds and directions into equal-sized bins, then computing the expected AEP as the product of the power and probability of each bin, added together, then multiplied by the number of hours per year. The cost of wind farm optimization generally increases with the number of atmospheric conditions considered during AEP computation, and this expense becomes more extreme as more complex wake models (e.g., Reynolds-averaged Navier–Stokes models) are considered. For example, there are some memory limitations when computing AEP gradients using automatic differentiation with very large wind farms. This has given rise to studies seeking convergence of the AEP, proposing methods such as polynomial chaos expansion <xref ref-type="bibr" rid="bib1.bibx46 bib1.bibx42" id="paren.3"/> or Bayesian quadrature <xref ref-type="bibr" rid="bib1.bibx32" id="paren.4"/> to avoid discretizing the input distributions into evenly spaced intervals. In this study, we present an approach for wind farm optimization that estimates the gradient of the AEP using Monte Carlo simulation. This does not require the input to be discretized at all and allows for the consideration of an arbitrarily large number of atmospheric conditions.</p>
      <p id="d1e144">Stochastic gradient descent (SGD) is an optimization algorithm commonly used in machine learning when selecting neural network weights <xref ref-type="bibr" rid="bib1.bibx31" id="paren.5"/>. The algorithm samples the gradient of a stochastic objective, following the mean gradient by a specified distance, then repeating the process, which amounts to optimizing the expected value of the<?pagebreak page1236?> objective. The SGD algorithm is often enhanced to avoid oscillations caused by large changes in the gradient of the objective <xref ref-type="bibr" rid="bib1.bibx56" id="paren.6"/>. This includes methods to reuse previous gradient information <xref ref-type="bibr" rid="bib1.bibx48" id="paren.7"/>, dampen oscillations <xref ref-type="bibr" rid="bib1.bibx51" id="paren.8"/>, or incorporate an estimate of the Hessian matrix
<xref ref-type="bibr" rid="bib1.bibx41 bib1.bibx6 bib1.bibx39 bib1.bibx43" id="paren.9"/>. <xref ref-type="bibr" rid="bib1.bibx34" id="text.10"/> introduced the Adam SGD algorithm, which reuses gradient evaluations and dampens oscillations, and which is the basis of the SGD method we propose in this study.</p>
      <p id="d1e166">Interestingly, SGD is not often applied to problems with nonlinear constraints, although it can be fruitful to include nonlinear constraints in the context of training a machine learning algorithm. For example, when recognizing three-dimensional pictures of people, it can be useful to impose a constraint that any person's left arm should be close to the same length as their right arm <xref ref-type="bibr" rid="bib1.bibx40" id="paren.11"/>. Many frameworks have been proposed for constrained SGD, including the log-barrier function <xref ref-type="bibr" rid="bib1.bibx30" id="paren.12"/>, penalty functions <xref ref-type="bibr" rid="bib1.bibx40" id="paren.13"/>, blending barrier and penalty functions <xref ref-type="bibr" rid="bib1.bibx30" id="paren.14"/>, and Riemannian geometry <xref ref-type="bibr" rid="bib1.bibx55" id="paren.15"/>. In this study, we use a penalty term to transform the constrained problem into an unconstrained optimization.</p>
      <p id="d1e184">The wind farm layout optimization problem presents a setting where the objective (AEP) can be formulated as being stochastic (e.g., the AEP is derived from a probability density function), while the constraints (e.g., boundaries and minimum turbine spacing) are firmly deterministic. This paper explores the potential benefits of formulating the wind farm layout optimization problem in this way. As part of this, the Adam algorithm is extended to optimize a stochastic objective with deterministic constraints. To the best of the authors' knowledge, this exact algorithm has not been published before.</p>
      <p id="d1e188">This study benchmarks the performance of the proposed SGD approach when compared to conventional gradient-based optimization within the TOPFARM framework <xref ref-type="bibr" rid="bib1.bibx14" id="paren.16"/>, considering wind farms with different shapes and sizes. We examine the open-source SLSQP algorithm <xref ref-type="bibr" rid="bib1.bibx36" id="paren.17"/>, which is employed in many engineering frameworks  <xref ref-type="bibr" rid="bib1.bibx33 bib1.bibx2 bib1.bibx68 bib1.bibx70 bib1.bibx73 bib1.bibx35 bib1.bibx8 bib1.bibx60" id="paren.18"/> and has been used in previous comparisons of optimization algorithms <xref ref-type="bibr" rid="bib1.bibx37 bib1.bibx38 bib1.bibx18" id="paren.19"/>. The TOPFARM framework has been used with SLSQP in several wind farm optimization studies <xref ref-type="bibr" rid="bib1.bibx52 bib1.bibx7 bib1.bibx9 bib1.bibx54" id="paren.20"/>. In future work, this approach can be extended to co-optimize layout and control strategy – the SGD framework can naturally incorporate uncertainty quantification when modeling the potential control strategies for potential layouts (similar to the work in <xref ref-type="bibr" rid="bib1.bibx19 bib1.bibx50 bib1.bibx27" id="altparen.21"/>).</p>
      <p id="d1e210"><?xmltex \hack{\newpage}?>While there are some wind plant optimization studies that resemble our approach, we are not aware of any studies that have applied SGD to the wind farm optimization problem (although SGD has been applied to other problems in engineering optimization, e.g., <xref ref-type="bibr" rid="bib1.bibx11 bib1.bibx61" id="altparen.22"/>). Several wind farm optimization studies have made use of gradient-based optimization techniques <xref ref-type="bibr" rid="bib1.bibx26 bib1.bibx23 bib1.bibx22 bib1.bibx19 bib1.bibx4 bib1.bibx52 bib1.bibx62 bib1.bibx10" id="paren.23"/>.
<xref ref-type="bibr" rid="bib1.bibx16" id="text.24"/> present a random search approach, moving the wind turbines one by one using a greedy algorithm. Some studies have employed neural networks to forecast power production <xref ref-type="bibr" rid="bib1.bibx21" id="paren.25"/>, estimate local atmospheric conditions <xref ref-type="bibr" rid="bib1.bibx63" id="paren.26"/>, suggest control strategies <xref ref-type="bibr" rid="bib1.bibx44" id="paren.27"/>, or optimize engineering wake models <xref ref-type="bibr" rid="bib1.bibx72 bib1.bibx71 bib1.bibx28" id="paren.28"/>, which all use SGD algorithms to train the parameters of the neural networks.</p>
      <p id="d1e236">The remainder of the paper is the following. Section <xref ref-type="sec" rid="Ch1.S2"/> outlines the SGD and deterministic optimization approaches used in this study. Section <xref ref-type="sec" rid="Ch1.S3"/> details the wind farm optimization application cases examined. Section <xref ref-type="sec" rid="Ch1.S4"/> discusses the results of these optimization comparisons. Section <xref ref-type="sec" rid="Ch1.S5"/> provides conclusions and future research directions.</p>
</sec>
<sec id="Ch1.S2">
  <label>2</label><title>Methods</title>
      <p id="d1e255">When deciding where to put wind turbines, a typical strategy is to maximize wind farm AEP while ensuring turbines are within the prospective site and are not spaced too closely together. In this study, we examine square and circular wind farms, where the corresponding optimization problems are posed as
          <disp-formula id="Ch1.E1" content-type="numbered"><label>1</label><mml:math id="M1" display="block"><mml:mtable class="array" columnalign="left left"><mml:mtr><mml:mtd><mml:munder><mml:mi mathvariant="normal">maximize</mml:mi><mml:mrow><mml:mi mathvariant="bold-italic">x</mml:mi><mml:mo>,</mml:mo><mml:mi mathvariant="bold-italic">y</mml:mi></mml:mrow></mml:munder></mml:mtd><mml:mtd><mml:mrow><mml:mi mathvariant="normal">AEP</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">x</mml:mi><mml:mo>,</mml:mo><mml:mi mathvariant="bold-italic">y</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mi mathvariant="normal">subject</mml:mi><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mi mathvariant="normal">to</mml:mi></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:msup><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>+</mml:mo><mml:msup><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi>y</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>≥</mml:mo><mml:msup><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">D</mml:mi></mml:msub><mml:mi>D</mml:mi></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mo>∀</mml:mo><mml:mi>i</mml:mi><mml:mo>≠</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi>l</mml:mi></mml:msub><mml:mo>≤</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>≤</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi>u</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:msub><mml:mi>y</mml:mi><mml:mi>l</mml:mi></mml:msub><mml:mo>≤</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>≤</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mi>u</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
        and
          <disp-formula id="Ch1.E2" content-type="numbered"><label>2</label><mml:math id="M2" display="block"><mml:mtable class="array" columnalign="left left"><mml:mtr><mml:mtd><mml:munder><mml:mi mathvariant="normal">maximize</mml:mi><mml:mrow><mml:mi mathvariant="bold-italic">x</mml:mi><mml:mo>,</mml:mo><mml:mi mathvariant="bold-italic">y</mml:mi></mml:mrow></mml:munder></mml:mtd><mml:mtd><mml:mrow><mml:mi mathvariant="normal">AEP</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">x</mml:mi><mml:mo>,</mml:mo><mml:mi mathvariant="bold-italic">y</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mi mathvariant="normal">subject</mml:mi><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mi mathvariant="normal">to</mml:mi></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:msup><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>+</mml:mo><mml:msup><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi>y</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>≥</mml:mo><mml:msup><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">D</mml:mi></mml:msub><mml:mi>D</mml:mi></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mo>∀</mml:mo><mml:mi>i</mml:mi><mml:mo>≠</mml:mo><mml:mi>j</mml:mi></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:msqrt><mml:mrow><mml:msubsup><mml:mi>x</mml:mi><mml:mi>i</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msubsup><mml:mo>+</mml:mo><mml:msubsup><mml:mi>y</mml:mi><mml:mi>i</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msubsup></mml:mrow></mml:msqrt><mml:mo>≤</mml:mo><mml:mi>R</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
        respectively, where <inline-formula><mml:math id="M3" display="inline"><mml:mi mathvariant="bold-italic">x</mml:mi></mml:math></inline-formula> and <inline-formula><mml:math id="M4" display="inline"><mml:mi mathvariant="bold-italic">y</mml:mi></mml:math></inline-formula> are the turbine horizontal and vertical locations, <inline-formula><mml:math id="M5" display="inline"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi>l</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M6" display="inline"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi>u</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> are the lower and upper horizontal square wind farm boundaries, <inline-formula><mml:math id="M7" display="inline"><mml:mrow><mml:msub><mml:mi>y</mml:mi><mml:mi>l</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M8" display="inline"><mml:mrow><mml:msub><mml:mi>y</mml:mi><mml:mi>u</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> are the lower and upper square wind farm vertical boundaries, <inline-formula><mml:math id="M9" display="inline"><mml:mi>R</mml:mi></mml:math></inline-formula> is the radius of the circular wind farm, <inline-formula><mml:math id="M10" display="inline"><mml:mi>D</mml:mi></mml:math></inline-formula> is the rotor diameter, and <inline-formula><mml:math id="M11" display="inline"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">D</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the minimum allowable spacing between turbines measured<?pagebreak page1237?> in rotor diameters. From this point forward, we will use a single variable to represent the <inline-formula><mml:math id="M12" display="inline"><mml:mi>x</mml:mi></mml:math></inline-formula> and <inline-formula><mml:math id="M13" display="inline"><mml:mi>y</mml:mi></mml:math></inline-formula> locations, <inline-formula><mml:math id="M14" display="inline"><mml:mrow><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mo>=</mml:mo><mml:mo mathvariant="italic">{</mml:mo><mml:mi mathvariant="bold-italic">x</mml:mi><mml:mo>,</mml:mo><mml:mi mathvariant="bold-italic">y</mml:mi><mml:mo mathvariant="italic">}</mml:mo></mml:mrow></mml:math></inline-formula>. When optimizing square wind farms, <inline-formula><mml:math id="M15" display="inline"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi>l</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M16" display="inline"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi>u</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M17" display="inline"><mml:mrow><mml:msub><mml:mi>y</mml:mi><mml:mi>l</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, and <inline-formula><mml:math id="M18" display="inline"><mml:mrow><mml:msub><mml:mi>y</mml:mi><mml:mi>u</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> are constant.</p>
      <p id="d1e708">The AEP is defined as
          <disp-formula id="Ch1.E3" content-type="numbered"><label>3</label><mml:math id="M19" display="block"><mml:mrow><mml:mi mathvariant="normal">AEP</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:mn mathvariant="normal">8760</mml:mn><mml:munderover><mml:mo movablelimits="false">∫</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mrow><mml:mn mathvariant="normal">2</mml:mn><mml:mi mathvariant="italic">π</mml:mi></mml:mrow></mml:munderover><mml:munderover><mml:mo movablelimits="false">∫</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mi mathvariant="normal">∞</mml:mi></mml:munderover><mml:mi>P</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mo>,</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:mi mathvariant="italic">θ</mml:mi></mml:mrow></mml:mfenced><mml:mi mathvariant="italic">π</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:mi mathvariant="italic">θ</mml:mi></mml:mrow></mml:mfenced><mml:mi mathvariant="normal">d</mml:mi><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi></mml:msub><mml:mi mathvariant="normal">d</mml:mi><mml:mi mathvariant="italic">θ</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>
        where <inline-formula><mml:math id="M20" display="inline"><mml:mi>P</mml:mi></mml:math></inline-formula> is power, <inline-formula><mml:math id="M21" display="inline"><mml:mi mathvariant="italic">π</mml:mi></mml:math></inline-formula> is probability, <inline-formula><mml:math id="M22" display="inline"><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the freestream velocity, and <inline-formula><mml:math id="M23" display="inline"><mml:mi mathvariant="italic">θ</mml:mi></mml:math></inline-formula> is the freestream direction. The 8760 factor reflects the number of hours per year, converting from units of power to units of energy.</p>
      <p id="d1e822">The AEP is typically estimated through rectangular quadrature, where the freestream velocity and direction are discretized using evenly spaced intervals,
          <disp-formula id="Ch1.E4" content-type="numbered"><label>4</label><mml:math id="M24" display="block"><mml:mrow><mml:mi mathvariant="normal">AEP</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mo>)</mml:mo><mml:mo>≈</mml:mo><mml:mn mathvariant="normal">8760</mml:mn><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>d</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mi>D</mml:mi></mml:munderover><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>u</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mi>U</mml:mi></mml:munderover><mml:mi>P</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="script">U</mml:mi><mml:mi mathvariant="normal">u</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mi mathvariant="normal">d</mml:mi></mml:msub></mml:mrow></mml:mfenced><mml:mi mathvariant="italic">ρ</mml:mi><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi mathvariant="script">U</mml:mi><mml:mi mathvariant="normal">u</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mi mathvariant="normal">d</mml:mi></mml:msub></mml:mrow></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>
        where <inline-formula><mml:math id="M25" display="inline"><mml:mi mathvariant="bold-script">U</mml:mi></mml:math></inline-formula> is a vector of evenly spaced wind speeds, <inline-formula><mml:math id="M26" display="inline"><mml:mi mathvariant="bold-italic">θ</mml:mi></mml:math></inline-formula> is a vector of evenly spaced wind directions, and <inline-formula><mml:math id="M27" display="inline"><mml:mrow><mml:mi mathvariant="italic">ρ</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mi mathvariant="script">U</mml:mi><mml:mi mathvariant="normal">u</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">θ</mml:mi><mml:mi mathvariant="normal">d</mml:mi></mml:msub><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> is a probability mass function.</p>
      <p id="d1e944">The AEP can also be estimated through Monte Carlo integration,
          <disp-formula id="Ch1.E5" content-type="numbered"><label>5</label><mml:math id="M28" display="block"><mml:mrow><mml:mi mathvariant="normal">AEP</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mo>)</mml:mo><mml:mo>≈</mml:mo><mml:mn mathvariant="normal">8760</mml:mn><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mi>K</mml:mi></mml:mfrac></mml:mstyle><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mi>K</mml:mi></mml:munderover><mml:mi>P</mml:mi><mml:mfenced open="(" close=")"><mml:mrow><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mo>,</mml:mo><mml:msubsup><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>k</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mo>,</mml:mo><mml:msup><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>k</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>
        where <inline-formula><mml:math id="M29" display="inline"><mml:mrow><mml:msubsup><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi><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="M30" display="inline"><mml:mrow><mml:msup><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>k</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula> represent draw <inline-formula><mml:math id="M31" display="inline"><mml:mi>k</mml:mi></mml:math></inline-formula> of the probability distribution <inline-formula><mml:math id="M32" display="inline"><mml:mrow><mml:mi mathvariant="italic">π</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mi mathvariant="italic">θ</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula>.</p>
      <p id="d1e1081">The associated AEP gradient can also be approximated through Monte Carlo simulation:
          <disp-formula id="Ch1.E6" content-type="numbered"><label>6</label><mml:math id="M33" display="block"><mml:mrow><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mi mathvariant="normal">d</mml:mi><mml:mrow><mml:mi mathvariant="normal">d</mml:mi><mml:mi mathvariant="bold-italic">s</mml:mi></mml:mrow></mml:mfrac></mml:mstyle><mml:mi mathvariant="normal">AEP</mml:mi><mml:mo>≈</mml:mo><mml:mn mathvariant="normal">8760</mml:mn><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mn mathvariant="normal">1</mml:mn><mml:mi>K</mml:mi></mml:mfrac></mml:mstyle><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mi>K</mml:mi></mml:munderover><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mi mathvariant="normal">d</mml:mi><mml:mrow><mml:mi mathvariant="normal">d</mml:mi><mml:mi mathvariant="bold-italic">s</mml:mi></mml:mrow></mml:mfrac></mml:mstyle><mml:mi>P</mml:mi><mml:mfenced open="(" close=")"><mml:mrow><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mo>,</mml:mo><mml:msubsup><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>k</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mo>,</mml:mo><mml:msup><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>k</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:mfenced><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<sec id="Ch1.S2.SS1">
  <label>2.1</label><title>Stochastic gradient descent</title>
      <p id="d1e1172">SGD is built upon the steepest descent algorithm. Early SGD algorithms added a moving average term (sometimes referred to as “momentum”) to avoid spurious oscillations <xref ref-type="bibr" rid="bib1.bibx65" id="paren.29"/>. The conventional Adam SGD algorithm uses two moving averages: one of the gradient and one of the squared gradient. The ratio of these moving averages is used to determine the search direction. SGD algorithms are often combined with a learning rate scheduler, where the step size of the gradient descent is gradually decreased, allowing the optimization algorithm to hone in on the best solution. While the Adam algorithm is already designed to dynamically change the step size, including a learning rate scheduler can further improve the performance. The conventional Adam algorithm is designed for unconstrained optimization algorithms. In the following, we extend the algorithm to allow for deterministic constraints, which is a case that is common in mechanical engineering and unusual in the context of training neural networks. The basic idea is to aggregate the constraints to a penalty term with units that are consistent with the objective. The penalty term is designed so that, initially, the penalty gradients are of similar magnitude to the AEP gradients and so that the penalty gradients overwhelm the AEP gradients as the optimization continues. The SGD algorithm is shown in Algorithm 1,
where <inline-formula><mml:math id="M34" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> is the initial turbine position; <inline-formula><mml:math id="M35" display="inline"><mml:mi>i</mml:mi></mml:math></inline-formula> is the iteration number; <inline-formula><mml:math id="M36" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is referred to as the constraint multiplier;
<inline-formula><mml:math id="M37" display="inline"><mml:mrow><mml:mi mathvariant="italic">γ</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> is a penalty function; <inline-formula><mml:math id="M38" display="inline"><mml:mrow><mml:mi>P</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mo>,</mml:mo><mml:msubsup><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>k</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mo>,</mml:mo><mml:msup><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>k</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> is the wind farm power associated with the inflow speed and direction, <inline-formula><mml:math id="M39" display="inline"><mml:mrow><mml:msubsup><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi><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="M40" display="inline"><mml:mrow><mml:msup><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>k</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula>; <inline-formula><mml:math id="M41" display="inline"><mml:mi>K</mml:mi></mml:math></inline-formula> is the number of samples employed in each SGD iteration; <inline-formula><mml:math id="M42" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M43" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> are constants; <inline-formula><mml:math id="M44" display="inline"><mml:mi>T</mml:mi></mml:math></inline-formula> is the number of SGD iterations; <inline-formula><mml:math id="M45" display="inline"><mml:mi mathvariant="script">S</mml:mi></mml:math></inline-formula> is the learning rate scheduler;
and <inline-formula><mml:math id="M46" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the learning rate. By default, the early stopping option is false.</p><?xmltex \floatpos{t}?><boxed-text content-type="algorithm" position="float" id="Ch1.Prog1"><?xmltex \currentcnt{1}?><label>Algorithm 1</label><caption><p id="d1e1352">TOPFARM stochastic gradient descent implementation.</p></caption><disp-quote content-type="algorithmic" specific-use="numbering{0}"><list>

    <list-item>

      <p id="d1e1359" specific-use="STATE"><inline-formula><mml:math id="M47" display="inline"><mml:mrow><mml:mi mathvariant="bold-italic">m</mml:mi><mml:mo>←</mml:mo><mml:mn mathvariant="bold">0</mml:mn></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M48" display="inline"><mml:mrow><mml:mi mathvariant="bold-italic">v</mml:mi><mml:mo>←</mml:mo><mml:mn mathvariant="bold">0</mml:mn></mml:mrow></mml:math></inline-formula>, <inline-formula><mml:math id="M49" display="inline"><mml:mrow><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mo>←</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula></p>

      <p id="d1e1399" specific-use="STATE">for <inline-formula><mml:math id="M50" display="inline"><mml:mi>i</mml:mi></mml:math></inline-formula> in [0, 1, 2, …, <inline-formula><mml:math id="M51" display="inline"><mml:mrow><mml:mi>T</mml:mi><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:math></inline-formula>]</p>

      <p id="d1e1421" specific-use="STATE">do</p>

      <p id="d1e1424" specific-use="STATE">if early_stopping and <inline-formula><mml:math id="M52" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>/</mml:mo><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mo>≤</mml:mo></mml:mrow></mml:math></inline-formula> threshold:</p>

      <p id="d1e1447" specific-use="STATE"><inline-formula><mml:math id="M53" display="inline"><mml:mrow><mml:mi mathvariant="bold-italic">j</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mstyle displaystyle="false"><mml:mfrac style="text"><mml:mrow><mml:mo>∂</mml:mo><mml:mi mathvariant="italic">γ</mml:mi></mml:mrow><mml:mrow><mml:mo>∂</mml:mo><mml:mi mathvariant="bold-italic">s</mml:mi></mml:mrow></mml:mfrac></mml:mstyle></mml:mrow></mml:math></inline-formula></p>

      <p id="d1e1476" specific-use="STATE">if <inline-formula><mml:math id="M54" display="inline"><mml:mrow><mml:mo>|</mml:mo><mml:mi mathvariant="bold-italic">j</mml:mi><mml:mo>|</mml:mo><mml:mo>≡</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:math></inline-formula>:</p>

      <p id="d1e1495" specific-use="STATE">break</p>

      <p id="d1e1498" specific-use="STATE">else:</p>

      <p id="d1e1501" specific-use="STATE"><inline-formula><mml:math id="M55" display="inline"><mml:mrow><mml:mi mathvariant="bold-italic">j</mml:mi><mml:mo>=</mml:mo><mml:mo>-</mml:mo><mml:mstyle displaystyle="false"><mml:mfrac style="text"><mml:mn mathvariant="normal">8760</mml:mn><mml:mi>K</mml:mi></mml:mfrac></mml:mstyle><mml:munderover><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow><mml:mi>K</mml:mi></mml:munderover><mml:mstyle displaystyle="false"><mml:mfrac style="text"><mml:mo>∂</mml:mo><mml:mrow><mml:mo>∂</mml:mo><mml:mi mathvariant="bold-italic">s</mml:mi></mml:mrow></mml:mfrac></mml:mstyle><mml:mi>P</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mo>,</mml:mo><mml:mspace linebreak="nobreak" width="0.25em"/><mml:msubsup><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>k</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mo>,</mml:mo><mml:mspace width="0.25em" linebreak="nobreak"/><mml:msup><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>k</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup></mml:mrow></mml:mfenced><mml:mo>+</mml:mo><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mstyle displaystyle="false"><mml:mfrac style="text"><mml:mrow><mml:mo>∂</mml:mo><mml:mi mathvariant="italic">γ</mml:mi></mml:mrow><mml:mrow><mml:mo>∂</mml:mo><mml:mi mathvariant="bold-italic">s</mml:mi></mml:mrow></mml:mfrac></mml:mstyle></mml:mrow></mml:math></inline-formula></p>

      <p id="d1e1594" specific-use="STATE"><inline-formula><mml:math id="M56" display="inline"><mml:mrow><mml:mi mathvariant="bold-italic">m</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:mi mathvariant="bold-italic">m</mml:mi><mml:mo>-</mml:mo><mml:mfenced open="(" close=")"><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>-</mml:mo><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub></mml:mrow></mml:mfenced><mml:mi mathvariant="bold-italic">j</mml:mi></mml:mrow></mml:math></inline-formula></p>

      <p id="d1e1627" specific-use="STATE"><inline-formula><mml:math id="M57" display="inline"><mml:mrow><mml:mi mathvariant="bold-italic">v</mml:mi><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mi mathvariant="bold-italic">v</mml:mi><mml:mo>-</mml:mo><mml:mfenced close=")" open="("><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>-</mml:mo><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub></mml:mrow></mml:mfenced><mml:msup><mml:mi mathvariant="bold-italic">j</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></p>

      <p id="d1e1664" specific-use="STATE"><inline-formula><mml:math id="M58" display="inline"><mml:mrow><mml:mover accent="true"><mml:mi mathvariant="bold-italic">m</mml:mi><mml:mo stretchy="false" mathvariant="normal">^</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mstyle displaystyle="false"><mml:mfrac style="text"><mml:mi mathvariant="bold-italic">m</mml:mi><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>-</mml:mo><mml:msup><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub></mml:mrow></mml:mfenced><mml:mi>i</mml:mi></mml:msup></mml:mrow></mml:mfrac></mml:mstyle></mml:mrow></mml:math></inline-formula></p>

      <p id="d1e1697" specific-use="STATE"><inline-formula><mml:math id="M59" display="inline"><mml:mrow><mml:mover accent="true"><mml:mi mathvariant="bold-italic">v</mml:mi><mml:mo mathvariant="normal" stretchy="false">^</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mstyle displaystyle="false"><mml:mfrac style="text"><mml:mi mathvariant="bold-italic">v</mml:mi><mml:mrow><mml:mn mathvariant="normal">1</mml:mn><mml:mo>-</mml:mo><mml:msup><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub></mml:mrow></mml:mfenced><mml:mi>i</mml:mi></mml:msup></mml:mrow></mml:mfrac></mml:mstyle></mml:mrow></mml:math></inline-formula></p>

      <p id="d1e1730" specific-use="STATE"><inline-formula><mml:math id="M60" display="inline"><mml:mrow><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mo>=</mml:mo><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mo>-</mml:mo><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mover accent="true"><mml:mi mathvariant="bold-italic">m</mml:mi><mml:mo stretchy="false" mathvariant="normal">^</mml:mo></mml:mover><mml:mo>/</mml:mo><mml:msqrt><mml:mover accent="true"><mml:mi mathvariant="bold-italic">v</mml:mi><mml:mo stretchy="false" mathvariant="normal">^</mml:mo></mml:mover></mml:msqrt></mml:mrow></mml:math></inline-formula></p>

      <p id="d1e1763" specific-use="STATE"><inline-formula><mml:math id="M61" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mi mathvariant="script">S</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mi mathvariant="italic">δ</mml:mi><mml:mo>,</mml:mo><mml:mi>i</mml:mi></mml:mrow></mml:mfenced></mml:mrow></mml:math></inline-formula></p>

      <p id="d1e1795" specific-use="STATE"><inline-formula><mml:math id="M62" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mstyle displaystyle="false"><mml:mfrac style="text"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:mfrac></mml:mstyle></mml:mrow></mml:math></inline-formula></p>
            </list-item>
          </list></disp-quote></boxed-text>
      <p id="d1e1830">The spacing between turbines is enforced using a penalty term,
            <disp-formula id="Ch1.E7" content-type="numbered"><label>7</label><mml:math id="M63" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="italic">γ</mml:mi><mml:mi mathvariant="normal">s</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:munder><mml:mo movablelimits="false">∑</mml:mo><mml:mrow><mml:mo>∀</mml:mo><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mi>j</mml:mi><mml:mo>&gt;</mml:mo><mml:mi>i</mml:mi></mml:mrow></mml:munder><mml:mi mathvariant="normal">min</mml:mi><mml:mfenced close="]" open="["><mml:mrow><mml:msup><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>+</mml:mo><mml:msup><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi>y</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>-</mml:mo><mml:msup><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">D</mml:mi></mml:msub><mml:mi>D</mml:mi></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:mfenced><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
      <?pagebreak page1238?><p id="d1e1921">Similarly, the distance outside of boundaries is enforced using a penalty term. When considering square wind farms this penalty term is defined as

                <disp-formula specific-use="align"><mml:math id="M64" display="block"><mml:mtable displaystyle="true"><mml:mtr><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:msub><mml:mi mathvariant="italic">γ</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub></mml:mrow></mml:mtd><mml:mtd><mml:mrow><mml:mstyle class="stylechange" displaystyle="true"/><mml:mo>=</mml:mo><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:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">t</mml:mi></mml:msub></mml:mrow></mml:munderover><mml:mfenced open="[" close=""><mml:mrow><mml:mi mathvariant="normal">max</mml:mi><mml:msup><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="normal">ub</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>+</mml:mo><mml:mi mathvariant="normal">max</mml:mi><mml:msup><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi mathvariant="normal">lb</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></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:mstyle class="stylechange" displaystyle="true"/></mml:mtd><mml:mtd><mml:mrow><mml:mstyle displaystyle="true" class="stylechange"/><mml:mo>+</mml:mo><mml:mfenced open="" close="]"><mml:mrow><mml:mi mathvariant="normal">max</mml:mi><mml:msup><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi>y</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mi mathvariant="normal">ub</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>+</mml:mo><mml:mi mathvariant="normal">max</mml:mi><mml:msup><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi>y</mml:mi><mml:mi mathvariant="normal">lb</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup></mml:mrow></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>

            and, in the case of circular boundaries, it is defined as
<?xmltex \hack{\newpage}?><?xmltex \hack{\vspace*{-6mm}}?>
            <disp-formula id="Ch1.E8" content-type="numbered"><label>8</label><mml:math id="M65" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="italic">γ</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub><mml:mo>=</mml:mo><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:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">t</mml:mi></mml:msub></mml:mrow></mml:munderover><mml:mi mathvariant="normal">max</mml:mi><mml:msup><mml:mfenced open="(" close=")"><mml:mrow><mml:msqrt><mml:mrow><mml:msubsup><mml:mi>x</mml:mi><mml:mi>i</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msubsup><mml:mo>+</mml:mo><mml:msubsup><mml:mi>y</mml:mi><mml:mi>i</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msubsup></mml:mrow></mml:msqrt><mml:mo>-</mml:mo><mml:mi>R</mml:mi><mml:mo>,</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>
          where <inline-formula><mml:math id="M66" display="inline"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">t</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the number of wind turbines.</p>
      <p id="d1e2149">The total penalty, <inline-formula><mml:math id="M67" display="inline"><mml:mi mathvariant="italic">γ</mml:mi></mml:math></inline-formula>, is defined as the sum of these two penalty terms,
            <disp-formula id="Ch1.E9" content-type="numbered"><label>9</label><mml:math id="M68" display="block"><mml:mrow><mml:mi mathvariant="italic">γ</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="italic">γ</mml:mi><mml:mi mathvariant="normal">s</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mo>)</mml:mo><mml:mo>+</mml:mo><mml:msub><mml:mi mathvariant="italic">γ</mml:mi><mml:mi mathvariant="normal">b</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mo>)</mml:mo><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>
          The gradient of the penalty term, <inline-formula><mml:math id="M69" display="inline"><mml:mi mathvariant="italic">γ</mml:mi></mml:math></inline-formula>, is scaled before being added to the negative gradient of the AEP using the scaling factor, <inline-formula><mml:math id="M70" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>.</p>
      <p id="d1e2220">In Algorithm 1, the learning rate (<inline-formula><mml:math id="M71" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>), constraint multiplier (<inline-formula><mml:math id="M72" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>), number of SGD iterations (<inline-formula><mml:math id="M73" display="inline"><mml:mi>T</mml:mi></mml:math></inline-formula>), and the samples per SGD iteration (<inline-formula><mml:math id="M74" display="inline"><mml:mi>K</mml:mi></mml:math></inline-formula>) are all free parameters. These parameters can be optimized to perform well for individual wind farm optimization problems. But there is no guarantee that these particular parameters will perform well for other wind farm problems – and this meta-optimization can be expensive. In the machine learning community, these parameters are sometimes optimized using evolutionary, grid search, or Bayesian optimization approaches <xref ref-type="bibr" rid="bib1.bibx1" id="paren.30"/>. In addition, it is common to schedule the learning rate to decay as the optimization proceeds <xref ref-type="bibr" rid="bib1.bibx69 bib1.bibx12" id="paren.31"/>.</p>
      <p id="d1e2266">We propose a method for setting free parameters to ensure that all units are consistent. The only free parameters we manually set are the number of optimization iterations and the number of power samples per iteration. The optimization generally becomes more accurate and more expensive as these parameters increase, and users are free to balance this trade-off as they see fit. Our formulation does not guarantee that all intermediate solutions satisfy the constraints, especially in the beginning of the optimization. The constraint multiplier begins on a comparable scale to the AEP and is scheduled to increase so that the constraint gradients overwhelm the AEP gradients as the optimization progresses. The number of iterations, <inline-formula><mml:math id="M75" display="inline"><mml:mi>T</mml:mi></mml:math></inline-formula>, can be based on a prescribed computational budget.</p>
      <p id="d1e2276">We initially attempted this approach using the widely used default parameter values in the original Adam algorithm, <inline-formula><mml:math id="M76" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.9</mml:mn></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M77" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.999</mml:mn></mml:mrow></mml:math></inline-formula>. The parameters can be thought of as adding momentum to the moving averages of the gradient and squared gradient, <inline-formula><mml:math id="M78" display="inline"><mml:mi mathvariant="bold-italic">m</mml:mi></mml:math></inline-formula> and <inline-formula><mml:math id="M79" display="inline"><mml:mi mathvariant="bold-italic">v</mml:mi></mml:math></inline-formula>. We found that these default values gave too much emphasis to gradients from the penalty function, launching the turbines away from the boundaries in a dramatic fashion. Instead, we suggest the parameters <inline-formula><mml:math id="M80" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.1</mml:mn></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M81" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">β</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.2</mml:mn></mml:mrow></mml:math></inline-formula>,
which encode a shorter memory of the presence of the penalty. With these new default parameters, and the learning rate defined below, we observed successful convergence for a wide variety of test cases.</p>
      <p id="d1e2354">The learning rate, <inline-formula><mml:math id="M82" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, can be interpreted as converting <inline-formula><mml:math id="M83" display="inline"><mml:mrow><mml:mover accent="true"><mml:mi mathvariant="bold-italic">m</mml:mi><mml:mo mathvariant="normal" stretchy="false">^</mml:mo></mml:mover><mml:mo>/</mml:mo><mml:msqrt><mml:mover accent="true"><mml:mi mathvariant="bold-italic">v</mml:mi><mml:mo stretchy="false" mathvariant="normal">^</mml:mo></mml:mover></mml:msqrt></mml:mrow></mml:math></inline-formula> (with unity units) to distance (units of m). In this study, the learning rate is scheduled to decay according to
            <disp-formula id="Ch1.E10" content-type="numbered"><label>10</label><mml:math id="M84" display="block"><mml:mtable class="split" rowspacing="0.2ex" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mi>S</mml:mi><mml:mo>(</mml:mo><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:mi>S</mml:mi><mml:mo>(</mml:mo><mml:mi>t</mml:mi><mml:mo>=</mml:mo><mml:mi>T</mml:mi><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn><mml:mo>)</mml:mo><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>T</mml:mi></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
          where <inline-formula><mml:math id="M85" display="inline"><mml:mi>T</mml:mi></mml:math></inline-formula> is the number of optimization iterations, <inline-formula><mml:math id="M86" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> is the initial learning rate, and <inline-formula><mml:math id="M87" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>T</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is the scheduled final learning rate. This final learning rate can be thought of as a solution tolerance for the design variables. In this study, we set <inline-formula><mml:math id="M88" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>T</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0.1</mml:mn></mml:mrow></mml:math></inline-formula> m.</p>
      <p id="d1e2490">The initial learning rate, <inline-formula><mml:math id="M89" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula>, is based on a length scale parameter, <inline-formula><mml:math id="M90" display="inline"><mml:mi>L</mml:mi></mml:math></inline-formula>, which corresponds to a reasonable initial step size for the optimization.  By setting the initial learning rate according to
            <disp-formula id="Ch1.E11" content-type="numbered"><label>11</label><mml:math id="M91" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:mi>L</mml:mi><mml:mo>=</mml:mo><mml:mi>D</mml:mi><mml:mo>/</mml:mo><mml:mn mathvariant="normal">5</mml:mn><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>
          where <inline-formula><mml:math id="M92" display="inline"><mml:mi>D</mml:mi></mml:math></inline-formula> is the turbine rotor diameter, we encourage the turbines to move at most <inline-formula><mml:math id="M93" display="inline"><mml:mi>L</mml:mi></mml:math></inline-formula> distance every optimization iteration.</p>
      <p id="d1e2551">The learning rate is scheduled to decay as
            <disp-formula id="Ch1.E12" content-type="numbered"><label>12</label><mml:math id="M94" display="block"><mml:mrow><mml:mi>S</mml:mi><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:mi mathvariant="italic">δ</mml:mi><mml:mo>,</mml:mo><mml:mi>t</mml:mi></mml:mrow></mml:mfenced><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:munderover><mml:mo movablelimits="false">∏</mml:mo><mml:mrow><mml:mi>i</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow><mml:mi>t</mml:mi></mml:munderover><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:mi>i</mml:mi><mml:mi mathvariant="italic">δ</mml:mi></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>
          where <inline-formula><mml:math id="M95" display="inline"><mml:mi mathvariant="italic">δ</mml:mi></mml:math></inline-formula> is a parameter that controls the learning rate length, such that the final learning rate is <inline-formula><mml:math id="M96" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>T</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>. The parameter <inline-formula><mml:math id="M97" display="inline"><mml:mi mathvariant="italic">δ</mml:mi></mml:math></inline-formula> is numerically set as
            <disp-formula id="Ch1.E13" content-type="numbered"><label>13</label><mml:math id="M98" display="block"><mml:mrow><mml:mi mathvariant="italic">δ</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>T</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:mi>T</mml:mi></mml:mrow></mml:mfenced><mml:mo>=</mml:mo><mml:munder><mml:mi mathvariant="normal">argmin</mml:mi><mml:mo mathvariant="italic">δ</mml:mo></mml:munder><mml:mo>|</mml:mo><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>T</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:mi>S</mml:mi><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mo>,</mml:mo><mml:mi mathvariant="italic">δ</mml:mi><mml:mo>,</mml:mo><mml:mi>T</mml:mi></mml:mrow></mml:mfenced><mml:mo>|</mml:mo><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
      <p id="d1e2698">The constraint multiplier, <inline-formula><mml:math id="M99" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, can be interpreted as converting the gradient of constrained square distances (in units of m) to AEP gradients. The initial constraint multiplier, <inline-formula><mml:math id="M100" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula>, is set as the mean absolute AEP gradient divided by the length scale, <inline-formula><mml:math id="M101" display="inline"><mml:mi>L</mml:mi></mml:math></inline-formula>, so that the separation constraint has a similar scale to AEP gradients,
            <disp-formula id="Ch1.E14" content-type="numbered"><label>14</label><mml:math id="M102" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:mi mathvariant="normal">mean</mml:mi><mml:mfenced open="[" close="]"><mml:mrow><mml:mo>|</mml:mo><mml:mi mathvariant="normal">∇</mml:mi><mml:mi mathvariant="normal">AEP</mml:mi><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:mfenced><mml:mo>|</mml:mo></mml:mrow></mml:mfenced></mml:mrow><mml:mi>L</mml:mi></mml:mfrac></mml:mstyle><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>
          where <inline-formula><mml:math id="M103" display="inline"><mml:mrow><mml:mi mathvariant="normal">mean</mml:mi><mml:mo>[</mml:mo><mml:mo>|</mml:mo><mml:mi mathvariant="normal">∇</mml:mi><mml:mi mathvariant="normal">AEP</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mi mathvariant="bold-italic">s</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mo>)</mml:mo><mml:mo>]</mml:mo></mml:mrow></mml:math></inline-formula> is the mean of the absolute AEP gradient of the initial guess with respect to each component of the gradient. During each iteration, the constraint multiplier, <inline-formula><mml:math id="M104" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, is scheduled to increase based on the inverse of the learning rate,
            <disp-formula id="Ch1.E15" content-type="numbered"><label>15</label><mml:math id="M105" display="block"><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:mfrac></mml:mstyle><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
      <?pagebreak page1239?><p id="d1e2841">The wind rose samples, <inline-formula><mml:math id="M106" display="inline"><mml:mrow><mml:mo>(</mml:mo><mml:msubsup><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>i</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msubsup><mml:mo>,</mml:mo><mml:msup><mml:mi mathvariant="italic">θ</mml:mi><mml:mrow><mml:mo>(</mml:mo><mml:mi>i</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:msup><mml:mo>)</mml:mo><mml:mo>∼</mml:mo><mml:mi mathvariant="italic">π</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:mi mathvariant="italic">θ</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula>, are randomly selected based on the direction frequency and direction-specific Weibull shape and scale parameters. Note that the tilde (<inline-formula><mml:math id="M107" display="inline"><mml:mo lspace="0mm">∼</mml:mo></mml:math></inline-formula>) denotes a shared probability distribution. After a direction is sampled, the wind speed is sampled as a continuous Weibull-distributed random variable,
            <disp-formula id="Ch1.E16" content-type="numbered"><label>16</label><mml:math id="M108" display="block"><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi></mml:msub><mml:mo>(</mml:mo><mml:mi mathvariant="italic">θ</mml:mi><mml:mo>)</mml:mo><mml:mo>∼</mml:mo><mml:mi mathvariant="script">W</mml:mi><mml:mfenced close="]" open="["><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:mi>A</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="italic">θ</mml:mi><mml:mo>)</mml:mo><mml:mo>,</mml:mo><mml:mi>k</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="italic">θ</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:mfenced><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>
          where the probability density of the Weibull distribution, <inline-formula><mml:math id="M109" display="inline"><mml:mi mathvariant="script">W</mml:mi></mml:math></inline-formula>, is  given by
            <disp-formula id="Ch1.E17" content-type="numbered"><label>17</label><mml:math id="M110" display="block"><mml:mrow><mml:mi mathvariant="script">W</mml:mi><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:mi>A</mml:mi><mml:mo>,</mml:mo><mml:mi>k</mml:mi></mml:mrow></mml:mfenced><mml:mo>=</mml:mo><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mi>k</mml:mi><mml:mi>A</mml:mi></mml:mfrac></mml:mstyle><mml:msup><mml:mfenced open="(" close=")"><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi></mml:msub></mml:mrow><mml:mi>A</mml:mi></mml:mfrac></mml:mstyle></mml:mfenced><mml:mrow><mml:mi>k</mml:mi><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup><mml:mi>exp⁡</mml:mi><mml:mfenced open="[" close="]"><mml:mrow><mml:mo>-</mml:mo><mml:msup><mml:mfenced close=")" open="("><mml:mstyle displaystyle="true"><mml:mfrac style="display"><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi></mml:msub></mml:mrow><mml:mi>A</mml:mi></mml:mfrac></mml:mstyle></mml:mfenced><mml:mi>k</mml:mi></mml:msup></mml:mrow></mml:mfenced><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
</sec>
<sec id="Ch1.S2.SS2">
  <label>2.2</label><title>Deterministic approach</title>
      <p id="d1e3039">The SLSQP algorithm <xref ref-type="bibr" rid="bib1.bibx36" id="paren.32"/> is selected to be the deterministic optimization algorithm to act as a benchmark to the SGD approach. SLSQP is a conventional deterministic optimization approach. It is employed in many open-source engineering design codes <xref ref-type="bibr" rid="bib1.bibx2 bib1.bibx68 bib1.bibx7" id="paren.33"/> and has been used in previous comparisons of optimization algorithms <xref ref-type="bibr" rid="bib1.bibx37 bib1.bibx38 bib1.bibx18" id="paren.34"/>.</p>
      <p id="d1e3051">The spacing and boundary constraints are passed to the optimizer as individual inequality constraints. The spacing constraints are defined as
            <disp-formula id="Ch1.E18" content-type="numbered"><label>18</label><mml:math id="M111" display="block"><mml:mrow><mml:msub><mml:mi>C</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:msup><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>+</mml:mo><mml:msup><mml:mfenced open="(" close=")"><mml:mrow><mml:msub><mml:mi>y</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mo>-</mml:mo><mml:msup><mml:mfenced close=")" open="("><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">D</mml:mi></mml:msub><mml:mi>D</mml:mi></mml:mrow></mml:mfenced><mml:mn mathvariant="normal">2</mml:mn></mml:msup><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mspace width="0.25em" linebreak="nobreak"/><mml:mo>∀</mml:mo><mml:mi>i</mml:mi><mml:mo>,</mml:mo><mml:mspace linebreak="nobreak" width="0.25em"/><mml:mi>j</mml:mi><mml:mo>&gt;</mml:mo><mml:mi>i</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>
          where <inline-formula><mml:math id="M112" display="inline"><mml:mi mathvariant="bold-italic">C</mml:mi></mml:math></inline-formula> is an upper triangular matrix of nonlinear inequality constraints.</p>
      <p id="d1e3146">Square wind farm boundaries are represented using four inequality constraints per turbine,
            <disp-formula id="Ch1.E19" content-type="numbered"><label>19</label><mml:math id="M113" display="block"><mml:mtable class="split" rowspacing="0.2ex" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:msub><mml:mi>D</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi>u</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:msub><mml:mi>D</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi>l</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>x</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:msub><mml:mi>D</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mn mathvariant="normal">3</mml:mn></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mi>u</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:msub><mml:mi>D</mml:mi><mml:mrow><mml:mi>i</mml:mi><mml:mn mathvariant="normal">4</mml:mn></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mi>l</mml:mi></mml:msub><mml:mo>-</mml:mo><mml:msub><mml:mi>y</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
          and the circular wind farm boundaries are represented with one inequality constraint per turbine,
            <disp-formula id="Ch1.E20" content-type="numbered"><label>20</label><mml:math id="M114" display="block"><mml:mrow><mml:msub><mml:mi>D</mml:mi><mml:mi>i</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:msqrt><mml:mrow><mml:msubsup><mml:mi>x</mml:mi><mml:mi>i</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msubsup><mml:mo>+</mml:mo><mml:msubsup><mml:mi>y</mml:mi><mml:mi>i</mml:mi><mml:mn mathvariant="normal">2</mml:mn></mml:msubsup></mml:mrow></mml:msqrt><mml:mo>-</mml:mo><mml:mi>R</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>
          where <inline-formula><mml:math id="M115" display="inline"><mml:mi mathvariant="bold">D</mml:mi></mml:math></inline-formula> is a matrix of boundary constraints that must be less than or equal to 0.</p>
</sec>
</sec>
<sec id="Ch1.S3">
  <label>3</label><title>Application</title>
      <p id="d1e3314">We apply the optimization approaches discussed above to optimize wind power plants of various sizes using the TOPFARM framework <xref ref-type="bibr" rid="bib1.bibx14" id="paren.35"/>.
Each farm consists of turbines with 70 m hub heights, 80 m rotor diameters, and 2 MW rated powers. Power is computed using PyWake <xref ref-type="bibr" rid="bib1.bibx47" id="paren.36"/>, which is an open-source wake modeling tool that has been used in several related studies <xref ref-type="bibr" rid="bib1.bibx52 bib1.bibx53 bib1.bibx7 bib1.bibx66 bib1.bibx17" id="paren.37"/>.
Power gradients are computed directly from PyWake using automatic differentiation. The power of each turbine is estimated by a combination of velocity deficits predicted by the Bastankhah Gaussian wake model <xref ref-type="bibr" rid="bib1.bibx5" id="paren.38"/> using the default parameters in the PyWake tool and the squared sum superposition <xref ref-type="bibr" rid="bib1.bibx47 bib1.bibx13" id="paren.39"/>. We require each turbine to be spaced at minimum two rotor diameters apart (<inline-formula><mml:math id="M116" display="inline"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">D</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2</mml:mn></mml:mrow></mml:math></inline-formula>). This is imposed as an optimization constraint. We considered wind farms with square and circular boundaries. The square wind farm boundaries are determined as
          <disp-formula id="Ch1.E21" content-type="numbered"><label>21</label><mml:math id="M117" display="block"><mml:mtable rowspacing="0.2ex" class="split" displaystyle="true" columnalign="right left"><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi>l</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:msub><mml:mi>y</mml:mi><mml:mi>l</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mn mathvariant="normal">0</mml:mn></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:msub><mml:mi>x</mml:mi><mml:mi>u</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mi>D</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:msqrt><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">t</mml:mi></mml:msub></mml:mrow></mml:msqrt><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:mfenced><mml:mi mathvariant="normal">Δ</mml:mi></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd/><mml:mtd><mml:mrow><mml:msub><mml:mi>y</mml:mi><mml:mi>u</mml:mi></mml:msub><mml:mo>=</mml:mo><mml:mi>D</mml:mi><mml:mfenced open="(" close=")"><mml:mrow><mml:msqrt><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">t</mml:mi></mml:msub></mml:mrow></mml:msqrt><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:mfenced><mml:mi mathvariant="normal">Δ</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
        and, in cases with circular wind farm boundaries, the radius is determined as
          <disp-formula id="Ch1.E22" content-type="numbered"><label>22</label><mml:math id="M118" display="block"><mml:mrow><mml:mi>R</mml:mi><mml:mo>=</mml:mo><mml:mi>D</mml:mi><mml:mfenced close=")" open="("><mml:mrow><mml:msqrt><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">t</mml:mi></mml:msub></mml:mrow></mml:msqrt><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:mfenced><mml:mi mathvariant="normal">Δ</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>
        where the <inline-formula><mml:math id="M119" display="inline"><mml:mi mathvariant="normal">Δ</mml:mi></mml:math></inline-formula> parameter controls the average spacing of the turbines. In this study, <inline-formula><mml:math id="M120" display="inline"><mml:mrow><mml:mi mathvariant="normal">Δ</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">5</mml:mn></mml:mrow></mml:math></inline-formula>.</p>
      <p id="d1e3486">We use the pyOptSparseDriver <xref ref-type="bibr" rid="bib1.bibx68" id="paren.40"/> SLSQP <xref ref-type="bibr" rid="bib1.bibx36" id="paren.41"/> implementation <xref ref-type="bibr" rid="bib1.bibx67" id="paren.42"/> in TOPFARM.
The optimizer was set to run for 300 maximum iterations with a tolerance of 10<inline-formula><mml:math id="M121" display="inline"><mml:msup><mml:mi/><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:math></inline-formula>. The TOPFARM “expected_cost” parameter is set to 10. The turbine coordinates are normalized from 0 to 1. In each optimization iteration, the AEP, and the corresponding gradient, is computed using rectangular quadrature as described in Eq. (<xref ref-type="disp-formula" rid="Ch1.E4"/>), using 360 wind direction bins and 23 wind speed bins, resulting in 8280 power evaluations.</p>
      <?pagebreak page1240?><p id="d1e3512">The wind rose, visualized in Fig. <xref ref-type="fig" rid="Ch1.F1"/>, is based on PyWake's Lillgrund example site. A probability mass function is assigned to different direction bins. Each direction bin is associated with Weibull scale and shape parameters describing the distributions of wind speeds within the sector. This probability mass is derived from 7 months of measured data used in a previous study <xref ref-type="bibr" rid="bib1.bibx20" id="paren.43"/>. Each direction bin is 30<inline-formula><mml:math id="M122" display="inline"><mml:msup><mml:mi/><mml:mo>∘</mml:mo></mml:msup></mml:math></inline-formula> wide. The reasoning behind this is similar to that behind the IEC 614 400 power curve standard <xref ref-type="bibr" rid="bib1.bibx29" id="paren.44"/> – it is crucial that the reference data consider a statistically significant number of data in each bin. This coarse direction discretization results in a faster convergence of the estimated probability mass function than a finer discretization would. The continuous probability density function <inline-formula><mml:math id="M123" display="inline"><mml:mrow><mml:mi mathvariant="italic">π</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi></mml:msub><mml:mo>,</mml:mo><mml:mi mathvariant="italic">θ</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> is approximated as <inline-formula><mml:math id="M124" display="inline"><mml:mrow><mml:mi mathvariant="italic">ρ</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="italic">θ</mml:mi><mml:mo>)</mml:mo><mml:mi mathvariant="italic">π</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi></mml:msub><mml:mo>|</mml:mo><mml:mi mathvariant="italic">θ</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula>, where <inline-formula><mml:math id="M125" display="inline"><mml:mi mathvariant="italic">ρ</mml:mi></mml:math></inline-formula> is the previously mentioned probability mass function, linearly interpolated across 1<inline-formula><mml:math id="M126" display="inline"><mml:msup><mml:mi/><mml:mo>∘</mml:mo></mml:msup></mml:math></inline-formula> bins, and <inline-formula><mml:math id="M127" display="inline"><mml:mrow><mml:mi mathvariant="italic">π</mml:mi><mml:mo>(</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mi mathvariant="normal">∞</mml:mi></mml:msub><mml:mo>|</mml:mo><mml:mi mathvariant="italic">θ</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula> is parameterized by direction-specific Weibull shape and scale parameters that are also linearly interpolated from the provided data. With this formulation, the likelihood of different wind directions is provided as a probability mass function, <inline-formula><mml:math id="M128" display="inline"><mml:mrow><mml:mi mathvariant="italic">ρ</mml:mi><mml:mo>(</mml:mo><mml:mi mathvariant="italic">θ</mml:mi><mml:mo>)</mml:mo></mml:mrow></mml:math></inline-formula>. This probability mass is used as weights passed to the Numpy “choice” function <xref ref-type="bibr" rid="bib1.bibx24" id="paren.45"/>, allowing the wind direction to be sampled as a discrete random variable. We note that this formulation could be extended to a fully continuous formulation by drawing the direction samples from the inverse of an empirical cumulative direction density function.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F1"><?xmltex \currentcnt{1}?><?xmltex \def\figurename{Figure}?><label>Figure 1</label><caption><p id="d1e3640">Lillgrund wind speed and direction probability mass function with 360 direction bins and five wind speed bins, where the probability mass function is a linear interpolation of coarser measurements.</p></caption>
        <?xmltex \igopts{width=236.157874pt}?><graphic xlink:href="https://wes.copernicus.org/articles/8/1235/2023/wes-8-1235-2023-f01.png"/>

      </fig>

      <p id="d1e3649">In all wind farm optimization problems considered, constraint gradients, and the associated penalty function gradients, are computed analytically. The AEP gradient is computed via automatic differentiation. The directions are discretized from 0 to 360<inline-formula><mml:math id="M129" display="inline"><mml:msup><mml:mi/><mml:mo>∘</mml:mo></mml:msup></mml:math></inline-formula>, with 1<inline-formula><mml:math id="M130" display="inline"><mml:msup><mml:mi/><mml:mo>∘</mml:mo></mml:msup></mml:math></inline-formula> increments. In the deterministic formulation, the discretized wind speed ranges from 3–25 m s<inline-formula><mml:math id="M131" display="inline"><mml:msup><mml:mi/><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:math></inline-formula> and is divided using increments of 1 m s<inline-formula><mml:math id="M132" display="inline"><mml:msup><mml:mi/><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:math></inline-formula>.</p>
      <p id="d1e3694">While each Monte Carlo estimate of AEP has significant error, the average error will be close to 0 throughout the course of the SGD optimization.
We compare the accuracy of the Monte Carlo approach (Eq. <xref ref-type="disp-formula" rid="Ch1.E5"/>) and the quadrature approach (Eq. <xref ref-type="disp-formula" rid="Ch1.E4"/>) to estimate the AEP and the L-2 norm of the AEP gradient. The true values are estimated with a very fine discretization of speed and direction, 0.2 m s<inline-formula><mml:math id="M133" display="inline"><mml:msup><mml:mi/><mml:mrow><mml:mo>-</mml:mo><mml:mn mathvariant="normal">1</mml:mn></mml:mrow></mml:msup></mml:math></inline-formula> and 0.2<inline-formula><mml:math id="M134" display="inline"><mml:msup><mml:mi/><mml:mo>∘</mml:mo></mml:msup></mml:math></inline-formula>. These are used as reference values to assess the accuracy of the Monte Carlo and quadrature approaches by comparing the errors associated with both approaches as functions of the number of samples and the discretization level, respectively, when analyzing a 100-turbine farm with square boundaries. This convergence analysis is shown in Fig. <xref ref-type="fig" rid="Ch1.F2"/>. While some realizations of the Monte Carlo approach yield more accurate results than the quadrature approach, the quadrature approach is generally more accurate than Monte Carlo sampling. The Monte Carlo approach requires on average around 10 times as many power evaluations to obtain the same accuracy as the deterministic approach.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F2" specific-use="star"><?xmltex \currentcnt{2}?><?xmltex \def\figurename{Figure}?><label>Figure 2</label><caption><p id="d1e3726">Convergence of AEP <bold>(a)</bold> and L-2 norm of the AEP gradient <bold>(b)</bold> with respect to the number of samples used in the quadrature and Monte Carlo techniques. The grey cloud shows the 90 % confidence interval associated with the Monte Carlo approach, using 50 samples. The dashed black line shows the average error associated with the Monte Carlo approach. The solid black line shows the error associated with the deterministic approach.</p></caption>
        <?xmltex \igopts{width=341.433071pt}?><graphic xlink:href="https://wes.copernicus.org/articles/8/1235/2023/wes-8-1235-2023-f02.png"/>

      </fig>

      <p id="d1e3741">In this study, we select 50 samples for every SGD iteration. Figure <xref ref-type="fig" rid="Ch1.F3"/> shows the measured computational cost of computing AEP gradients using the circular wind farm described in this study, with different wind farm sizes. The minimum measured time is reported as the minimum of 30 identical runs on the DTU Sophia supercomputer <xref ref-type="bibr" rid="bib1.bibx64" id="paren.46"/>. The computational time generally scales logarithmically with the number of turbines. This is to be expected, as there are more interaction terms in the wake model as more turbines are considered. The computational time does not scale logarithmically with the number of wind rose samples. For small numbers of turbines, evaluating 10 wind rose samples is about as expensive as evaluating 50 samples. This scaling changes as the wind farm grows in size, and it gradually becomes more expensive to sample the wind rose. The evaluation time appears to converge to a logarithmic scaling for large numbers of wind rose samples. These scaling results are likely influenced by memory limitations.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F3" specific-use="star"><?xmltex \currentcnt{3}?><?xmltex \def\figurename{Figure}?><label>Figure 3</label><caption><p id="d1e3752">Computational time associated with computing the gradient for various wind farm sizes and wind rose sampling strategies. The left panel compares the cost of computing AEP gradients when using different numbers of Monte Carlo samples with the cost of the full factorial wind rose (8280 samples) for farms with various numbers of wind turbines. The right panel compares the cost of Monte Carlo estimates of the AEP gradient for different numbers of samples of the atmospheric conditions and turbines in the wind farm.</p></caption>
        <?xmltex \igopts{width=341.433071pt}?><graphic xlink:href="https://wes.copernicus.org/articles/8/1235/2023/wes-8-1235-2023-f03.png"/>

      </fig>

      <p id="d1e3761">The optimization algorithms are timed based on the time elapsed between the first and final optimization gradient evaluations. Each optimization case is run on first-generation AMD EPYC 7351 processors.</p>
</sec>
<sec id="Ch1.S4">
  <label>4</label><title>Results and discussion</title>
      <p id="d1e3772">In the following subsections, the performance of SGD and SLSQP is compared for wind farms with square and circular boundaries, and the sensitivity of the SGD algorithm is assessed.</p>
<sec id="Ch1.S4.SS1">
  <label>4.1</label><title>Square wind farm</title>
      <p id="d1e3782">The performance of SGD is compared to the deterministic counterpart, considering wind farms with 100, 144, 225, and 324 turbines, with square boundary constraints, using 20 different initial starting conditions to obtain statistically significant results. The AEP, constraint violation (<inline-formula><mml:math id="M135" display="inline"><mml:mi mathvariant="italic">γ</mml:mi></mml:math></inline-formula>), and time elapsed associated with each optimization solution
are plotted in Fig. <xref ref-type="fig" rid="Ch1.F4"/>. The SGD approach consistently yields higher AEPs than the SLSQP approach when the number of scheduled SGD iterations, <inline-formula><mml:math id="M136" display="inline"><mml:mi>T</mml:mi></mml:math></inline-formula>, is 2000. There is a large range of computational times associated with the SLSQP approach, though the computational expense of SLSQP generally grows much larger than SGD as the number of turbines is increased. This is largely due to the nature of the turbine spacing constraint, the size of which grows as the number of turbines squared. SLSQP takes about as much computational time as the SGD approach with 500 scheduled iterations when there are 100 turbines in the square farm. As the number of turbines grows, the average time required by SLSQP becomes more costly than SGD with 2000 scheduled iterations. The computational cost of SLSQP is a strong function<?pagebreak page1241?> of the initial layout, and the variance of the SLSQP optimization time also increases with the wind farm size. This is due to the complex interaction between the linear boundary constraints and nonlinear spacing constraints. As the proposed SGD formulation does not offer an automatic way to set the number of SGD iterations, <inline-formula><mml:math id="M137" display="inline"><mml:mi>T</mml:mi></mml:math></inline-formula>, results are shown for different values of <inline-formula><mml:math id="M138" display="inline"><mml:mi>T</mml:mi></mml:math></inline-formula>. When <inline-formula><mml:math id="M139" display="inline"><mml:mi>T</mml:mi></mml:math></inline-formula> is increased, the optimizer finds solutions with larger AEPs, with a computational cost that is approximately proportional to <inline-formula><mml:math id="M140" display="inline"><mml:mi>T</mml:mi></mml:math></inline-formula>. The SGD solution consistently improves as more optimization iterations are scheduled (larger values of <inline-formula><mml:math id="M141" display="inline"><mml:mi>T</mml:mi></mml:math></inline-formula>). Results associated with 1000 SGD iterations tend to yield similar AEPs to the SLSQP approach, and results with 2000 SGD iterations tend to yield higher AEPs than the SLSQP designs.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F4" specific-use="star"><?xmltex \currentcnt{4}?><?xmltex \def\figurename{Figure}?><label>Figure 4</label><caption><p id="d1e3839">Optimization results associated with SGD and SLSQP for square wind farms with 100, 144, 225, and 324 turbines, using 20 random initial starting conditions. The AEP (top panels), constraint penalty (middle panels), and computational time (bottom panels) are plotted as boxplots. The SGD results are plotted for <inline-formula><mml:math id="M142" display="inline"><mml:mrow><mml:mi>T</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">500</mml:mn></mml:mrow></mml:math></inline-formula>, 1000, and 2000 iterations.</p></caption>
          <?xmltex \igopts{width=341.433071pt}?><graphic xlink:href="https://wes.copernicus.org/articles/8/1235/2023/wes-8-1235-2023-f04.png"/>

        </fig>

      <p id="d1e3860">The final layouts associated with one of the random initial conditions used in the 324-turbine analysis, when <inline-formula><mml:math id="M143" display="inline"><mml:mrow><mml:mi>T</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2000</mml:mn></mml:mrow></mml:math></inline-formula> iterations, are shown in Fig. <xref ref-type="fig" rid="Ch1.F5"/>. The SGD approach generally identifies solutions with the majority of turbines packed into the side boundaries. The deterministic algorithm also packed turbines into the edges of the farm, although not as many turbines were packed into the east and west boundaries as in the SGD results. The layouts found using the SGD approach tend to have interior turbines that generally appear to be more aligned in the north–south direction than in the deterministic solutions.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F5" specific-use="star"><?xmltex \currentcnt{5}?><?xmltex \def\figurename{Figure}?><label>Figure 5</label><caption><p id="d1e3880">The final layouts found using SLSQP <bold>(a)</bold> and SGD <bold>(b)</bold> using one of the random initial layouts examined in a 324-turbine wind farm with square boundaries for <inline-formula><mml:math id="M144" display="inline"><mml:mrow><mml:mi>T</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2000</mml:mn></mml:mrow></mml:math></inline-formula> iterations. Each circle has a radius of one rotor diameter.</p></caption>
          <?xmltex \igopts{width=341.433071pt}?><graphic xlink:href="https://wes.copernicus.org/articles/8/1235/2023/wes-8-1235-2023-f05.png"/>

        </fig>

      <p id="d1e3907">The results of the 100-, 144-, 225-, and 324-turbine wind farm optimization cases are summarized in Table <xref ref-type="table" rid="Ch1.T1"/>.  The mean time, mean constraint violation, and mean and standard deviation of the AEP are reported with respect to the 20 random initial starting conditions.  Constraint violation is reported as <inline-formula><mml:math id="M145" display="inline"><mml:msqrt><mml:mrow><mml:mi mathvariant="italic">γ</mml:mi><mml:mo>/</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">t</mml:mi></mml:msub></mml:mrow></mml:msqrt></mml:math></inline-formula> to quantify the mean length of the constraint violations of each turbine. The final constraint violations can be reduced by lowering the <inline-formula><mml:math id="M146" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>T</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> parameter. In all of these cases, the SLSQP optimization resulted in solutions with zero constraint violations. This is likely because of the linear formulation of the boundary constraints – when a solution satisfies the spacing constraint, any solutions that satisfy the boundary constraints can quickly be found. SGD with<?pagebreak page1242?> 2000 iterations generally yields solutions with AEP that are 0.3 %–0.5 % higher than the solutions found using SLSQP. This is likely because the SGD algorithm is able to better explore the design space by initially relaxing the constraints, allowing for some initial constraint violations.</p>

<?xmltex \floatpos{t}?><table-wrap id="Ch1.T1" specific-use="star"><?xmltex \currentcnt{1}?><label>Table 1</label><caption><p id="d1e3942">Results of SGD and deterministic optimizations for various square wind farm sizes. Each optimization case is run using 20 random initial starting conditions, and the mean and standard deviation are reported with respect to these 20 initial points. The SGD results are associated with <inline-formula><mml:math id="M147" display="inline"><mml:mrow><mml:mi>T</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2000</mml:mn></mml:mrow></mml:math></inline-formula> iterations.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="6">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="left"/>
     <oasis:colspec colnum="3" colname="col3" align="right"/>
     <oasis:colspec colnum="4" colname="col4" align="center"/>
     <oasis:colspec colnum="5" colname="col5" align="center"/>
     <oasis:colspec colnum="6" colname="col6" align="left"/>
     <oasis:thead>
       <oasis:row>

         <oasis:entry colname="col1"><inline-formula><mml:math id="M148" display="inline"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">t</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>

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

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

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

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

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

       </oasis:row>
       <oasis:row>

         <oasis:entry colname="col1"/>

         <oasis:entry colname="col2"/>

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

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

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

         <oasis:entry colname="col6"><inline-formula><mml:math id="M149" display="inline"><mml:msqrt><mml:mrow><mml:mi mathvariant="italic">γ</mml:mi><mml:mo>/</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">t</mml:mi></mml:msub></mml:mrow></mml:msqrt></mml:math></inline-formula></oasis:entry>

       </oasis:row>
       <oasis:row>

         <oasis:entry colname="col1"/>

         <oasis:entry colname="col2"/>

         <oasis:entry colname="col3">(hours)</oasis:entry>

         <oasis:entry colname="col4">(kWh)</oasis:entry>

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

         <oasis:entry colname="col6">(m)</oasis:entry>

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

         <oasis:entry colname="col1"/>

         <oasis:entry colname="col2"/>

         <oasis:entry colname="col3"/>

         <oasis:entry colname="col4"/>

         <oasis:entry colname="col5">(kWh)</oasis:entry>

         <oasis:entry colname="col6"/>

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

         <oasis:entry rowsep="1" colname="col1" morerows="1">100</oasis:entry>

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

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

         <oasis:entry colname="col4"><inline-formula><mml:math id="M150" display="inline"><mml:mrow><mml:mn mathvariant="normal">5.667</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">8</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col5"><inline-formula><mml:math id="M151" display="inline"><mml:mrow><mml:mn mathvariant="normal">6.223</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">5</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M152" display="inline"><mml:mrow><mml:mn mathvariant="normal">0.000</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">0</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

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

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

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

         <oasis:entry colname="col4"><inline-formula><mml:math id="M153" display="inline"><mml:mrow><mml:mn mathvariant="normal">5.691</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">8</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col5"><inline-formula><mml:math id="M154" display="inline"><mml:mrow><mml:mn mathvariant="normal">5.347</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">5</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M155" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.919</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">3</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

       </oasis:row>
       <oasis:row>

         <oasis:entry rowsep="1" colname="col1" morerows="1">144</oasis:entry>

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

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

         <oasis:entry colname="col4"><inline-formula><mml:math id="M156" display="inline"><mml:mrow><mml:mn mathvariant="normal">8.059</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">8</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col5"><inline-formula><mml:math id="M157" display="inline"><mml:mrow><mml:mn mathvariant="normal">9.188</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">5</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M158" display="inline"><mml:mrow><mml:mn mathvariant="normal">0.000</mml:mn><mml:mi>e</mml:mi><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">0</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

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

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

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

         <oasis:entry colname="col4"><inline-formula><mml:math id="M159" display="inline"><mml:mrow><mml:mn mathvariant="normal">8.089</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">8</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col5"><inline-formula><mml:math id="M160" display="inline"><mml:mrow><mml:mn mathvariant="normal">7.727</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">5</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M161" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.642</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">3</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

       </oasis:row>
       <oasis:row>

         <oasis:entry rowsep="1" colname="col1" morerows="1">225</oasis:entry>

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

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

         <oasis:entry colname="col4"><inline-formula><mml:math id="M162" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.241</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">9</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col5"><inline-formula><mml:math id="M163" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.004</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">6</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M164" display="inline"><mml:mrow><mml:mn mathvariant="normal">0.000</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">0</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

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

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

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

         <oasis:entry colname="col4"><inline-formula><mml:math id="M165" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.246</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">9</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col5"><inline-formula><mml:math id="M166" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.110</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">6</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M167" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.250</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">3</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

       </oasis:row>
       <oasis:row>

         <oasis:entry colname="col1" morerows="1">324</oasis:entry>

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

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

         <oasis:entry colname="col4"><inline-formula><mml:math id="M168" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.768</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">9</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col5"><inline-formula><mml:math id="M169" display="inline"><mml:mrow><mml:mn mathvariant="normal">2.556</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">6</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M170" display="inline"><mml:mrow><mml:mn mathvariant="normal">0.000</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">0</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

       </oasis:row>
       <oasis:row>

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

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

         <oasis:entry colname="col4"><inline-formula><mml:math id="M171" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.776</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">9</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col5"><inline-formula><mml:math id="M172" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.810</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">6</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M173" display="inline"><mml:mrow><mml:mn mathvariant="normal">9.484</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">4</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table><?xmltex \gdef\@currentlabel{1}?></table-wrap>

</sec>
<sec id="Ch1.S4.SS2">
  <label>4.2</label><title>Circular wind farms</title>
      <p id="d1e4578">To ensure that the previously presented results are not specific to square wind farms, we performed a similar set of analyses examining circular wind farms. The results yield similar trends to the analysis using square wind farms – SGD becomes significantly less time-consuming than SLSQP as the number of turbines increases and generally yields solutions with slightly larger AEPs.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F6" specific-use="star"><?xmltex \currentcnt{6}?><?xmltex \def\figurename{Figure}?><label>Figure 6</label><caption><p id="d1e4583">Optimization results associated with SGD and SLSQP for circular wind farms with 100, 144, and 225 turbines, using 20 random initial starting conditions. The AEP (top panels), constraint penalty (middle panels), and computational time (bottom panels) are plotted as box and whisker plots. The SGD results are plotted for <inline-formula><mml:math id="M174" display="inline"><mml:mrow><mml:mi>T</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">500</mml:mn></mml:mrow></mml:math></inline-formula>, 1000, and 2000 iterations.</p></caption>
          <?xmltex \igopts{width=341.433071pt}?><graphic xlink:href="https://wes.copernicus.org/articles/8/1235/2023/wes-8-1235-2023-f06.png"/>

        </fig>

      <p id="d1e4604">Circular winds farms were optimized using 20 random initial layouts, examining different farm sizes, using the SGD and SLSQP optimization algorithms. The results are summarized in Fig. <xref ref-type="fig" rid="Ch1.F6"/>. The circular wind farm optimization generally took longer than the square wind farm when using the SLSQP optimizer. This is likely due to the more complicated nature of the circular boundary when using Cartesian coordinates. These results are similar to the results in Sect. <xref ref-type="sec" rid="Ch1.S4.SS1"/> – as the number of wind turbines and scheduled SGD iterations increases, SGD tends to find solutions with larger AEPs in less computational time.</p>
      <?pagebreak page1243?><p id="d1e4612">The results of the circular wind farm optimization are compared between the SGD and SLSQP optimizers in Table <xref ref-type="table" rid="Ch1.T2"/>, where SGD is scheduled to run for 2000 optimization iterations. SGD generally results in about 0.5 % more AEPs in significantly less time than SLSQP as the number of turbines is increased. The result area is also compared in Fig. <xref ref-type="fig" rid="Ch1.F7"/>. The SGD optimizer generally results in more turbines on the boundary edge than the SLSQP optimizer.</p>

<?xmltex \floatpos{t}?><table-wrap id="Ch1.T2" specific-use="star"><?xmltex \currentcnt{2}?><label>Table 2</label><caption><p id="d1e4622">Results of SGD and deterministic optimizations for various circular wind farm sizes. Each optimization case is run using 20 random initial starting conditions, and the mean and standard deviation are reported with respect to these 20 initial points. The SGD results are associated with <inline-formula><mml:math id="M175" display="inline"><mml:mrow><mml:mi>T</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2000</mml:mn></mml:mrow></mml:math></inline-formula> iterations.</p></caption><oasis:table frame="topbot"><oasis:tgroup cols="6">
     <oasis:colspec colnum="1" colname="col1" align="left"/>
     <oasis:colspec colnum="2" colname="col2" align="left"/>
     <oasis:colspec colnum="3" colname="col3" align="right"/>
     <oasis:colspec colnum="4" colname="col4" align="center"/>
     <oasis:colspec colnum="5" colname="col5" align="center"/>
     <oasis:colspec colnum="6" colname="col6" align="center"/>
     <oasis:thead>
       <oasis:row>

         <oasis:entry colname="col1"><inline-formula><mml:math id="M176" display="inline"><mml:mrow><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">t</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula></oasis:entry>

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

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

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

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

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

       </oasis:row>
       <oasis:row>

         <oasis:entry colname="col1"/>

         <oasis:entry colname="col2"/>

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

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

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

         <oasis:entry colname="col6"><inline-formula><mml:math id="M177" display="inline"><mml:msqrt><mml:mrow><mml:mi mathvariant="italic">γ</mml:mi><mml:mo>/</mml:mo><mml:msub><mml:mi>N</mml:mi><mml:mi mathvariant="normal">t</mml:mi></mml:msub></mml:mrow></mml:msqrt></mml:math></inline-formula></oasis:entry>

       </oasis:row>
       <oasis:row>

         <oasis:entry colname="col1"/>

         <oasis:entry colname="col2"/>

         <oasis:entry colname="col3">(hours)</oasis:entry>

         <oasis:entry colname="col4">(kWh)</oasis:entry>

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

         <oasis:entry colname="col6">(m)</oasis:entry>

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

         <oasis:entry colname="col1"/>

         <oasis:entry colname="col2"/>

         <oasis:entry colname="col3"/>

         <oasis:entry colname="col4"/>

         <oasis:entry colname="col5">(kWh)</oasis:entry>

         <oasis:entry colname="col6"/>

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

         <oasis:entry rowsep="1" colname="col1" morerows="1">100</oasis:entry>

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

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

         <oasis:entry colname="col4"><inline-formula><mml:math id="M178" display="inline"><mml:mrow><mml:mn mathvariant="normal">5.383</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">8</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col5"><inline-formula><mml:math id="M179" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.193</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">6</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M180" display="inline"><mml:mrow><mml:mn mathvariant="normal">2.742</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">2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

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

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

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

         <oasis:entry colname="col4"><inline-formula><mml:math id="M181" display="inline"><mml:mrow><mml:mn mathvariant="normal">5.407</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">8</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col5"><inline-formula><mml:math id="M182" display="inline"><mml:mrow><mml:mn mathvariant="normal">7.844</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">5</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M183" display="inline"><mml:mrow><mml:mn mathvariant="normal">2.203</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">3</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

       </oasis:row>
       <oasis:row>

         <oasis:entry rowsep="1" colname="col1" morerows="1">144</oasis:entry>

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

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

         <oasis:entry colname="col4"><inline-formula><mml:math id="M184" display="inline"><mml:mrow><mml:mn mathvariant="normal">7.638</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">8</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col5"><inline-formula><mml:math id="M185" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.512</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">6</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M186" display="inline"><mml:mrow><mml:mn mathvariant="normal">8.648</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">2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

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

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

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

         <oasis:entry colname="col4"><inline-formula><mml:math id="M187" display="inline"><mml:mrow><mml:mn mathvariant="normal">7.676</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">8</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col5"><inline-formula><mml:math id="M188" display="inline"><mml:mrow><mml:mn mathvariant="normal">8.777</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">5</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M189" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.726</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">3</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

       </oasis:row>
       <oasis:row>

         <oasis:entry colname="col1" morerows="1">225</oasis:entry>

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

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

         <oasis:entry colname="col4"><inline-formula><mml:math id="M190" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.174</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">9</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col5"><inline-formula><mml:math id="M191" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.573</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">6</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M192" display="inline"><mml:mrow><mml:mn mathvariant="normal">2.359</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">1</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

       </oasis:row>
       <oasis:row>

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

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

         <oasis:entry colname="col4"><inline-formula><mml:math id="M193" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.180</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">9</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col5"><inline-formula><mml:math id="M194" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.306</mml:mn><mml:mo>×</mml:mo><mml:msup><mml:mn mathvariant="normal">10</mml:mn><mml:mn mathvariant="normal">6</mml:mn></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

         <oasis:entry colname="col6"><inline-formula><mml:math id="M195" display="inline"><mml:mrow><mml:mn mathvariant="normal">1.280</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">3</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:math></inline-formula></oasis:entry>

       </oasis:row>
     </oasis:tbody>
   </oasis:tgroup></oasis:table><?xmltex \gdef\@currentlabel{2}?></table-wrap>

      <?xmltex \floatpos{t}?><fig id="Ch1.F7" specific-use="star"><?xmltex \currentcnt{7}?><?xmltex \def\figurename{Figure}?><label>Figure 7</label><caption><p id="d1e5138">The final layouts found using SLSQP <bold>(a)</bold> and SGD <bold>(b)</bold> using one of the random initial layouts examined in the 225-turbine wind farm with circular boundaries using <inline-formula><mml:math id="M196" display="inline"><mml:mrow><mml:mi>T</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2000</mml:mn></mml:mrow></mml:math></inline-formula> iterations. The final turbine layouts are shown as filled circles.  Each circle has a radius of one rotor diameter.</p></caption>
          <?xmltex \igopts{width=341.433071pt}?><graphic xlink:href="https://wes.copernicus.org/articles/8/1235/2023/wes-8-1235-2023-f07.png"/>

        </fig>

</sec>
<sec id="Ch1.S4.SS3">
  <label>4.3</label><title>Sensitivity analysis</title>
      <p id="d1e5173">There are several parameters in the SGD algorithm that were tuned to perform reasonably well. In this section, we investigate the sensitivity of the SGD optimization results with respect to the early stopping option in Algorithm 1, the number of Monte Carlo samples per optimization iteration, the learning rate schedule, and the initial and final learning rates.</p>
      <p id="d1e5176"><?xmltex \hack{\newpage}?>As the optimization progresses, the constraint multiplier, <inline-formula><mml:math id="M197" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, becomes large (approaching 10 as th<?pagebreak page1244?>e learning rate approaches 0.1), and the gradients of the AEP are overwhelmed by the gradients of the penalty, which take very little time to compute. This situation can be addressed by using the early stopping option in Algorithm 1. The solution tends to terminate quickly when the optimizer only follows the deterministic gradient (the optimization engine terminates when the constraint gradients are 0). Figure <xref ref-type="fig" rid="Ch1.F8"/> shows the AEP, constraint violation, and computational time associated with five random initial layouts, using threshold parameters of 0.01, 0.05, and 0.1, as well as the SGD algorithm as applied in the previous sections, without the early stopping option activated. The use of each early stopping option results in layouts without constraint violations. As the threshold parameter is increased, the AEP is slightly reduced, and the total computational time decreases. A threshold parameter of 0.1 results in approximately 0.3 % reduction in AEP and 44 % reduction in computation time.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F8" specific-use="star"><?xmltex \currentcnt{8}?><?xmltex \def\figurename{Figure}?><label>Figure 8</label><caption><p id="d1e5195">Results using different configurations of the early stopping option in TOPFARM, as well as the SGD optimization without early stopping, considering the circular wind farm with 225 turbines, with <inline-formula><mml:math id="M198" display="inline"><mml:mrow><mml:mi>T</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2000</mml:mn></mml:mrow></mml:math></inline-formula>, using five random initial layouts.</p></caption>
          <?xmltex \igopts{width=398.338583pt}?><graphic xlink:href="https://wes.copernicus.org/articles/8/1235/2023/wes-8-1235-2023-f08.png"/>

        </fig>

      <p id="d1e5217">The optimization results presented in this study used 50 power samples per iteration (<inline-formula><mml:math id="M199" display="inline"><mml:mrow><mml:mi>K</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">50</mml:mn></mml:mrow></mml:math></inline-formula>). We found this to produce high-quality results without incurring unacceptable computational expense. Figure <xref ref-type="fig" rid="Ch1.F9"/> shows the behavior of the SGD approach associated with different values of <inline-formula><mml:math id="M200" display="inline"><mml:mi>K</mml:mi></mml:math></inline-formula>, considering 100 turbines with 2000 scheduled optimization iterations. As <inline-formula><mml:math id="M201" display="inline"><mml:mi>K</mml:mi></mml:math></inline-formula> increases, the optimization finds solutions with larger AEPs. There is a small increase in time elapsed and a large increase in the final AEP between the <inline-formula><mml:math id="M202" display="inline"><mml:mrow><mml:mi>K</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">5</mml:mn></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M203" display="inline"><mml:mrow><mml:mi>K</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">50</mml:mn></mml:mrow></mml:math></inline-formula> cases, while there is a large increase in time elapsed and a small increase in the final AEP between <inline-formula><mml:math id="M204" display="inline"><mml:mrow><mml:mi>K</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">50</mml:mn></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M205" display="inline"><mml:mrow><mml:mi>K</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">200</mml:mn></mml:mrow></mml:math></inline-formula>. As <inline-formula><mml:math id="M206" display="inline"><mml:mi>K</mml:mi></mml:math></inline-formula> increases, we expect the maximum AEP to reach a plateau and the time and memory required to increase indefinitely. In future work, we plan to explore scheduling <inline-formula><mml:math id="M207" display="inline"><mml:mi>K</mml:mi></mml:math></inline-formula> to change as the optimization progresses.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F9"><?xmltex \currentcnt{9}?><?xmltex \def\figurename{Figure}?><label>Figure 9</label><caption><p id="d1e5313">Optimization results associated with SGD for a square 100-turbine wind farm using 20 random initial starting conditions and <inline-formula><mml:math id="M208" display="inline"><mml:mrow><mml:mi>T</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2000</mml:mn></mml:mrow></mml:math></inline-formula>. The upper and lower bounds of the results are plotted as a function of the optimization iteration number. The SGD results associated with <inline-formula><mml:math id="M209" display="inline"><mml:mrow><mml:mi>K</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">5</mml:mn></mml:mrow></mml:math></inline-formula>, 50, and 200 iterations are shown in purple, blue, and yellow, respectively.</p></caption>
          <?xmltex \igopts{width=236.157874pt}?><graphic xlink:href="https://wes.copernicus.org/articles/8/1235/2023/wes-8-1235-2023-f09.png"/>

        </fig>

      <?pagebreak page1245?><p id="d1e5346"><?xmltex \hack{\newpage}?>This study used an exotic learning rate scheduler. We tried several schedulers and observed this one to be the best at finding sufficiently large AEP solutions that reasonably satisfied the imposed constraints. Figure <xref ref-type="fig" rid="Ch1.F10"/> shows the behavior of the SGD algorithm associated with the presented learning rate scheduler, referred to here as the product scheduler, as well as an exponential and a linear decay scheduler. The exponential scheduler quickly diminishes the learning rate, causing the SGD algorithm to become stuck in local minima. The linear transition from large to lower learning rates prevents the SGD algorithm from having sufficient time to follow enlarged constraint gradients. It is possible that the algorithm could be improved by using separate schedulers for the learning rate and constraint multiplier. For instance, it might be more effective to use a linear scheduler to decrease the learning rate and an exponential scheduler to increase the constraint multiplier. We leave this question for future work.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F10" specific-use="star"><?xmltex \currentcnt{10}?><?xmltex \def\figurename{Figure}?><label>Figure 10</label><caption><p id="d1e5354">Influence of the learning rate scheduler on the SGD optimization, considering a 100-turbine wind farm with a square boundary. The product scheduler is shown in yellow. The exponential scheduler is shown in blue. The linear scheduler is shown in purple. The AEP <bold>(a)</bold>, constraint penalty function <bold>(b)</bold>, and the learning rate decay <bold>(c)</bold> are plotted as a function of the number of optimization iterations. The optimization iteration is denoted as <inline-formula><mml:math id="M210" display="inline"><mml:mi>t</mml:mi></mml:math></inline-formula> in the legend of panel <bold>(c)</bold>.</p></caption>
          <?xmltex \igopts{width=341.433071pt}?><graphic xlink:href="https://wes.copernicus.org/articles/8/1235/2023/wes-8-1235-2023-f10.png"/>

        </fig>

      <p id="d1e5382">The initial and final learning rates, <inline-formula><mml:math id="M211" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mn mathvariant="normal">0</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> and <inline-formula><mml:math id="M212" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>T</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, have units of distance and correspond to the initial and final step size of the optimization algorithm. The final learning rate can be interpreted as the degree to which the constraints are to be satisfied, since this will be the step size the optimization algorithm uses when <inline-formula><mml:math id="M213" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">α</mml:mi><mml:mi>i</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula> is large and the constraint gradients overwhelm the AEP gradients. This is illustrated in the left panel of Fig. <xref ref-type="fig" rid="Ch1.F11"/>, which shows the results of several SGD optimizations using different initial and final learning rates. On average, there is a linear relationship between the constraint violation  of the solution and <inline-formula><mml:math id="M214" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>T</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>, where the average final constraint violation is approximately 2 times <inline-formula><mml:math id="M215" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>T</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>. The maximum observed constraint violation is approximately 4 times <inline-formula><mml:math id="M216" display="inline"><mml:mrow><mml:msub><mml:mi mathvariant="italic">η</mml:mi><mml:mi>T</mml:mi></mml:msub></mml:mrow></mml:math></inline-formula>. In addition, there is a trade-off between the AEP and constraint violation of the final solution. This trade-off is influenced by the initial and final learning rates. It is important to tune the initial learning rate. An initial learning rate that is too low will result in very little exploration. Initial learning rates that are too high will result in a rapid influx of penalty violations that overwhelm AEP gradients throughout the optimization. From our experiments, we found a step size of one-fifth of the rotor diameter to produce satisfactory results, as shown in the right panel of Fig. <xref ref-type="fig" rid="Ch1.F11"/>.</p>

      <?xmltex \floatpos{t}?><fig id="Ch1.F11" specific-use="star"><?xmltex \currentcnt{11}?><?xmltex \def\figurename{Figure}?><label>Figure 11</label><caption><p id="d1e5459"><bold>(a)</bold> The final constraint penalty plotted against the final learning rate. <bold>(b)</bold> The final AEP plotted against the final constraint penalty. The different colors represent different initial learning rates. The results of 20 initial starting positions are plotted as points. The average results of the 20 initial starting conditions are connected as lines. These data are associated with 100-turbine wind farms with square boundaries and <inline-formula><mml:math id="M217" display="inline"><mml:mrow><mml:mi>T</mml:mi><mml:mo>=</mml:mo><mml:mn mathvariant="normal">2000</mml:mn></mml:mrow></mml:math></inline-formula> iterations.</p></caption>
          <?xmltex \igopts{width=398.338583pt}?><graphic xlink:href="https://wes.copernicus.org/articles/8/1235/2023/wes-8-1235-2023-f11.png"/>

        </fig>

</sec>
</sec>
<sec id="Ch1.S5" sec-type="conclusions">
  <label>5</label><title>Conclusions</title>
      <p id="d1e5495">SGD is a promising optimization tool for wind farm design. Instead of evaluating all anticipated atmospheric conditions during every optimization iteration, SGD randomly samples the defined distributions of atmospheric conditions, resulting in substantially reduced computational time required for each optimization iteration. The total optimization time can be scheduled according to a prescribed computational budget. The presented formulation allows for continuous resolution of uncertain variables, eliminating the need to choose a<?pagebreak page1246?> discretization resolution of atmospheric conditions, such as the wind speed and direction. This technique does not become exponentially more expensive as a greater number of uncertain parameters is included, allowing for consideration of other atmospheric conditions, such as turbulence intensity, air density, veer, and shear <xref ref-type="bibr" rid="bib1.bibx57 bib1.bibx15" id="paren.47"/>.</p>
      <p id="d1e5501">The presented SGD approach was shown to become more effective than a deterministic counterpart as the number of wind turbines increased. SGD yielded slightly higher AEPs than the deterministic approach in substantially reduced computational time. The time required to optimize wind farm layouts can be a major bottleneck in corporate workflows, and the time savings associated with the SGD approach allows engineers to access optimization results sooner than a conventional approach. If the inflow conditions were discretized using extremely small bins, or if several atmospheric conditions were to be considered, we expect that the<?pagebreak page1247?> SGD approach would perform the optimization even faster and more effectively than the deterministic approach.</p>
      <p id="d1e5504">The SGD approach is a simple framework that is well suited to large-scale stochastic wind power plant design optimization challenges. This framework is available in the open-source TOPFARM package. Future work includes exploring separate schedulers for the constraint multiplier and learning rate and scheduling the number of Monte Carlo samples, <inline-formula><mml:math id="M218" display="inline"><mml:mi>K</mml:mi></mml:math></inline-formula>, to change as the optimization proceeds.</p>
</sec>

      
      </body>
    <back><notes notes-type="codeavailability"><title>Code availability</title>

      <p id="d1e5518">The code used in this study is available from DTU Wind Energy Systems' PyWake and TOPFARM repositories (<uri>https://gitlab.windenergy.dtu.dk/TOPFARM/PyWake</uri>, <xref ref-type="bibr" rid="bib1.bibx13" id="altparen.48"/>; and <uri>https://gitlab.windenergy.dtu.dk/TOPFARM/Topfarm2</uri>, <xref ref-type="bibr" rid="bib1.bibx14" id="altparen.49"/>.)</p>
  </notes><notes notes-type="dataavailability"><title>Data availability</title>

      <p id="d1e5536">The data used in this study have been made available on Zenodo: <ext-link xlink:href="https://doi.org/10.5281/zenodo.8202150" ext-link-type="DOI">10.5281/zenodo.8202150</ext-link> <xref ref-type="bibr" rid="bib1.bibx49" id="paren.50"/>.</p>
  </notes><notes notes-type="authorcontribution"><title>Author contributions</title>

      <p id="d1e5548">JQ and PER designed the experiments. JQ, PER, MMP, and RVR developed the problem formulation. JQ developed the SGD formulation. JQ, RVR, MFM, and MMP performed the simulations. JQ, MMP, and RVP prepared the paper with contributions from all co-authors.</p>
  </notes><notes notes-type="competinginterests"><title>Competing interests</title>

      <p id="d1e5554">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="d1e5560">Publisher's note: Copernicus Publications remains neutral with regard to jurisdictional claims in published maps and institutional affiliations.</p>
  </notes><ack><title>Acknowledgements</title><p id="d1e5566">The authors gratefully acknowledge the computational and data resources provided on the Sophia HPC cluster at the Technical University of Denmark,
<ext-link xlink:href="https://doi.org/10.57940/FAFC-6M81" ext-link-type="DOI">10.57940/FAFC-6M81</ext-link>.</p></ack><notes notes-type="reviewstatement"><title>Review statement</title>

      <p id="d1e5574">This paper was edited by Cristina Archer and reviewed by Ahmad Vasel-Be-Hagh and two anonymous referees.</p>
  </notes><?xmltex \hack{\newpage}?><ref-list>
    <title>References</title>

      <ref id="bib1.bibx1"><?xmltex \def\ref@label{{Alibrahim and Ludwig(2021)}}?><label>Alibrahim and Ludwig(2021)</label><?label 9504761?><mixed-citation>Alibrahim, H. and Ludwig, S. A.: Hyperparameter Optimization: Comparing Genetic Algorithm against Grid Search and Bayesian Optimization, in: 2021 IEEE Congress on Evolutionary Computation (CEC), 28 June–1 July 2021, Kraków, Poland, 1551–1559, <ext-link xlink:href="https://doi.org/10.1109/CEC45853.2021.9504761" ext-link-type="DOI">10.1109/CEC45853.2021.9504761</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx2"><?xmltex \def\ref@label{{Allen et~al.(2020)Allen, King, and Barter}}?><label>Allen et al.(2020)Allen, King, and Barter</label><?label allen2020wind?><mixed-citation>Allen, J., King, R., and Barter, G.: Wind farm simulation and layout
optimization in complex terrain, J. Phys.: Conf. Ser., 1452, 012066, <ext-link xlink:href="https://doi.org/10.1088/1742-6596/1452/1/012066" ext-link-type="DOI">10.1088/1742-6596/1452/1/012066</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx3"><?xmltex \def\ref@label{{Annoni et~al.(2018)Annoni, Fleming, Scholbrock, Roadman, Dana,
Adcock, Porte-Agel, Raach, Haizmann, and Schlipf}}?><label>Annoni et al.(2018)Annoni, Fleming, Scholbrock, Roadman, Dana,
Adcock, Porte-Agel, Raach, Haizmann, and Schlipf</label><?label annoni2018analysis?><mixed-citation>Annoni, J., Fleming, P., Scholbrock, A., Roadman, J., Dana, S., Adcock, C.,
Porte-Agel, F., Raach, S., Haizmann, F., and Schlipf, D.: Analysis of
control-oriented wake modeling tools using lidar field results, Wind Energ.
Sci., 3, 819–831, <ext-link xlink:href="https://doi.org/10.5194/wes-3-819-2018" ext-link-type="DOI">10.5194/wes-3-819-2018</ext-link>, 2018.</mixed-citation></ref>
      <ref id="bib1.bibx4"><?xmltex \def\ref@label{{Baker et~al.(2019)Baker, Stanley, Thomas, Ning, and
Dykes}}?><label>Baker et al.(2019)Baker, Stanley, Thomas, Ning, and
Dykes</label><?label baker2019best?><mixed-citation>Baker, N. F., Stanley, A. P., Thomas, J. J., Ning, A., and Dykes, K.: Best
practices for wake model and optimization algorithm selection in wind farm
layout optimization, in: AIAA Scitech 2019 forum, 7–11 January 2019, San Diego, California, USA, p. 0540, <ext-link xlink:href="https://doi.org/10.2514/6.2019-0540" ext-link-type="DOI">10.2514/6.2019-0540</ext-link>, 2019.</mixed-citation></ref>
      <ref id="bib1.bibx5"><?xmltex \def\ref@label{{Bastankhah and Port\'{e}-Agel(2014)}}?><label>Bastankhah and Porté-Agel(2014)</label><?label bastankhah2014new?><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.bibx6"><?xmltex \def\ref@label{{Byrd et~al.(2016)Byrd, Hansen, Nocedal, and
Singer}}?><label>Byrd et al.(2016)Byrd, Hansen, Nocedal, and
Singer</label><?label byrd2016stochastic?><mixed-citation>Byrd, R. H., Hansen, S. L., Nocedal, J., and Singer, Y.: A stochastic
quasi-Newton method for large-scale optimization, SIAM J. Optimiz., 26, 1008–1031, <ext-link xlink:href="https://doi.org/10.1137/140954362" ext-link-type="DOI">10.1137/140954362</ext-link>, 2016.</mixed-citation></ref>
      <ref id="bib1.bibx7"><?xmltex \def\ref@label{{Ciavarra et~al.(2022)Ciavarra, Rodrigues, Dykes, and
R{\'{e}}thor{\'{e}}}}?><label>Ciavarra et al.(2022)Ciavarra, Rodrigues, Dykes, and
Réthoré</label><?label ciavarra2022wind?><mixed-citation>Ciavarra, A. W., Rodrigues, R. V., Dykes, K., and Réthoré, P.-E.: Wind farm optimization with multiple hub heights using gradient-based methods, J. Phys.: Conf. Ser., 2265, 022012,  <ext-link xlink:href="https://doi.org/10.1088/1742-6596/2265/2/022012" ext-link-type="DOI">10.1088/1742-6596/2265/2/022012</ext-link>, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx8"><?xmltex \def\ref@label{{Clark et~al.(2022)Clark, Barter, Shaler, and
DuPont}}?><label>Clark et al.(2022)Clark, Barter, Shaler, and
DuPont</label><?label clark2022reliability?><mixed-citation>Clark, C. E., Barter, G., Shaler, K., and DuPont, B.: Reliability-based layout optimization in offshore wind energy systems, Wind Energy, 25, 125–148, <ext-link xlink:href="https://doi.org/10.1002/we.2664" ext-link-type="DOI">10.1002/we.2664</ext-link>, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx9"><?xmltex \def\ref@label{{Criado~Risco et~al.(2023)Criado~Risco, Valotta~Rodrigues,
Friis-M{\o}ller, Quick, M{\o}lgaard~Pedersen, and R\'{e}thor\'{e}}}?><label>Criado Risco et al.(2023)Criado Risco, Valotta Rodrigues,
Friis-Møller, Quick, Mølgaard Pedersen, and Réthoré</label><?label javiPaper?><mixed-citation>Criado Risco, J., Valotta Rodrigues, R., Friis-Møller, M., Quick, J., Mølgaard Pedersen, M., and Réthoré, P.-E.: Gradient-based Wind Farm Layout Optimization With Inclusion And Exclusion Zones, Wind Energ. Sci. Discuss. [preprint], <ext-link xlink:href="https://doi.org/10.5194/wes-2023-5" ext-link-type="DOI">10.5194/wes-2023-5</ext-link>, in review, 2023.</mixed-citation></ref>
      <ref id="bib1.bibx10"><?xmltex \def\ref@label{{Croonenbroeck and Hennecke(2021)}}?><label>Croonenbroeck and Hennecke(2021)</label><?label croonenbroeck2021comparison?><mixed-citation>Croonenbroeck, C. and Hennecke, D.: A comparison of optimizers in a unified
standard for optimization on wind farm layout optimization, Energy, 216,
119244, <ext-link xlink:href="https://doi.org/10.1016/j.energy.2020.119244" ext-link-type="DOI">10.1016/j.energy.2020.119244</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx11"><?xmltex \def\ref@label{{De et~al.(2020)De, Hampton, Maute, and Doostan}}?><label>De et al.(2020)De, Hampton, Maute, and Doostan</label><?label de2020topology?><mixed-citation>De, S., Hampton, J., Maute, K., and Doostan, A.: Topology optimization under
uncertainty using a stochastic gradient-based approach, Struct. Multidiscip. Optimiz., 62, 2255–2278, <ext-link xlink:href="https://doi.org/10.1007/s00158-020-02599-z" ext-link-type="DOI">10.1007/s00158-020-02599-z</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx12"><?xmltex \def\ref@label{{Denkowski and Neubig(2017)}}?><label>Denkowski and Neubig(2017)</label><?label denkowski2017stronger?><mixed-citation>Denkowski, M. and Neubig, G.: Stronger Baselines for Trustable Results in
Neural Machine Translation, in: Proceedings of the First Workshop on Neural
Machine Translation, Association for Computational Linguistics, Vancouver, 18–27, <ext-link xlink:href="https://doi.org/10.18653/v1/W17-3203" ext-link-type="DOI">10.18653/v1/W17-3203</ext-link>, 2017.</mixed-citation></ref>
      <ref id="bib1.bibx13"><?xmltex \def\ref@label{{DTU Wind Energy Systems(2023a)}}?><label>DTU Wind Energy Systems(2023a)</label><?label pywake_git?><mixed-citation>DTU Wind Energy Systems: PyWake, DTU Wind Energy [code],
<uri>https://gitlab.windenergy.dtu.dk/TOPFARM/PyWake</uri> (last access: 31 July 2023), 2023a.</mixed-citation></ref>
      <ref id="bib1.bibx14"><?xmltex \def\ref@label{{DTU Wind Energy Systems(2023b)}}?><label>DTU Wind Energy Systems(2023b)</label><?label topfarm_git?><mixed-citation>DTU Wind Energy Systems: TOPFARM, DTU Wind Energy [code],
<uri>https://gitlab.windenergy.dtu.dk/TOPFARM/Topfarm2</uri> (last access: 31 July 2023), 2023b.
</mixed-citation></ref><?xmltex \hack{\newpage}?>
      <ref id="bib1.bibx15"><?xmltex \def\ref@label{{Duc et~al.(2019)Duc, Coupiac, Girard, Giebel, and
G{\"{o}}{\c{c}}men}}?><label>Duc et al.(2019)Duc, Coupiac, Girard, Giebel, and
Göçmen</label><?label duc2019local?><mixed-citation>Duc, T., Coupiac, O., Girard, N., Giebel, G., and Göçmen, T.: Local
turbulence parameterization improves the Jensen wake model and its
implementation for power optimization of an operating wind farm, Wind Energ.
Sci., 4, 287–302, <ext-link xlink:href="https://doi.org/10.5194/wes-4-287-2019" ext-link-type="DOI">10.5194/wes-4-287-2019</ext-link>, 2019.</mixed-citation></ref>
      <ref id="bib1.bibx16"><?xmltex \def\ref@label{{Feng and Shen(2015)}}?><label>Feng and Shen(2015)</label><?label feng2015solving?><mixed-citation>Feng, J. and Shen, W. Z.: Solving the wind farm layout optimization problem
using random search algorithm, Renew. Energy, 78, 182–192,
<ext-link xlink:href="https://doi.org/10.1016/j.renene.2015.01.005" ext-link-type="DOI">10.1016/j.renene.2015.01.005</ext-link>, 2015.</mixed-citation></ref>
      <ref id="bib1.bibx17"><?xmltex \def\ref@label{{Fischereit et~al.(2022)Fischereit, Schaldemose~Hansen, Lars{\'{e}}n,
van~der Laan, R{\'{e}}thor{\'{e}}, and Murcia~Leon}}?><label>Fischereit et al.(2022)Fischereit, Schaldemose Hansen, Larsén,
van der Laan, Réthoré, and Murcia Leon</label><?label fischereit2022comparing?><mixed-citation>Fischereit, J., Schaldemose Hansen, K., Larsén, X. G., van der Laan, M. P., Réthoré, P.-E., and Murcia Leon, J. P.: Comparing and validating
intra-farm and farm-to-farm wakes across different mesoscale and
high-resolution wake models, Wind Energ. Sci., 7, 1069–1091,
<ext-link xlink:href="https://doi.org/10.5194/wes-7-1069-2022" ext-link-type="DOI">10.5194/wes-7-1069-2022</ext-link>, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx18"><?xmltex \def\ref@label{{Fleming et~al.(2022)Fleming, Stanley, Bay, King, Simley, Doekemeijer, and Mudafort}}?><label>Fleming et al.(2022)Fleming, Stanley, Bay, King, Simley, Doekemeijer, and Mudafort</label><?label fleming2022serial?><mixed-citation>Fleming, P. A., Stanley, A. P., Bay, C. J., King, J., Simley, E., Doekemeijer, B. M., and Mudafort, R.: Serial-Refine Method for Fast Wake-Steering Yaw Optimization, J. Phys.: Conf. Ser., 2265, 032109, <ext-link xlink:href="https://doi.org/10.1088/1742-6596/2265/3/032109" ext-link-type="DOI">10.1088/1742-6596/2265/3/032109</ext-link>, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx19"><?xmltex \def\ref@label{{Gebraad et~al.(2017)Gebraad, Thomas, Ning, Fleming, and
Dykes}}?><label>Gebraad et al.(2017)Gebraad, Thomas, Ning, Fleming, and
Dykes</label><?label gebraad2017maximization?><mixed-citation>Gebraad, P., Thomas, J. J., Ning, A., Fleming, P., and Dykes, K.: Maximization of the annual energy production of wind power plants by optimization of layout and yaw-based wake control, Wind Energy, 20, 97–107,
<ext-link xlink:href="https://doi.org/10.1002/we.1993" ext-link-type="DOI">10.1002/we.1993</ext-link>, 2017.</mixed-citation></ref>
      <ref id="bib1.bibx20"><?xmltex \def\ref@label{{G\"{o}\c{c}men and Giebel(2016)}}?><label>Göçmen and Giebel(2016)</label><?label goccmen2016estimation?><mixed-citation>Göçmen, T. and Giebel, G.: Estimation of turbulence intensity using
rotor effective wind speed in Lillgrund and Horns Rev-I offshore wind farms, Renew. Energy, 99, 524–532, <ext-link xlink:href="https://doi.org/10.1016/j.renene.2016.07.038" ext-link-type="DOI">10.1016/j.renene.2016.07.038</ext-link>, 2016.</mixed-citation></ref>
      <ref id="bib1.bibx21"><?xmltex \def\ref@label{{Godinho and Castro(2021)}}?><label>Godinho and Castro(2021)</label><?label godinho2021comparative?><mixed-citation>Godinho, M. and Castro, R.: Comparative performance of AI methods for wind
power forecast in Portugal, Wind Energy, 24, 39–53, <ext-link xlink:href="https://doi.org/10.1002/we.2556" ext-link-type="DOI">10.1002/we.2556</ext-link>,
2021.</mixed-citation></ref>
      <ref id="bib1.bibx22"><?xmltex \def\ref@label{{Graf et~al.(2016)Graf, Dykes, Scott, Fields, Lunacek, Quick, and
Rethore}}?><label>Graf et al.(2016)Graf, Dykes, Scott, Fields, Lunacek, Quick, and
Rethore</label><?label graf2016wind?><mixed-citation>Graf, P., Dykes, K., Scott, G., Fields, J., Lunacek, M., Quick, J., and
Rethore, P.-E.: Wind farm turbine type and placement optimization, J. Phys.: Conf. Ser., 753, 062004, <ext-link xlink:href="https://doi.org/10.1088/1742-6596/753/6/062004" ext-link-type="DOI">10.1088/1742-6596/753/6/062004</ext-link>, 2016.</mixed-citation></ref>
      <ref id="bib1.bibx23"><?xmltex \def\ref@label{{Guirguis et~al.(2016)Guirguis, Romero, and Amon}}?><label>Guirguis et al.(2016)Guirguis, Romero, and Amon</label><?label guirguis2016toward?><mixed-citation>Guirguis, D., Romero, D. A., and Amon, C. H.: Toward efficient optimization of wind farm layouts: Utilizing exact gradient information, Appl. Energy, 179, 110–123, <ext-link xlink:href="https://doi.org/10.1016/j.apenergy.2016.06.101" ext-link-type="DOI">10.1016/j.apenergy.2016.06.101</ext-link>, 2016.</mixed-citation></ref>
      <ref id="bib1.bibx24"><?xmltex \def\ref@label{{Harris et~al.(2020)Harris, Millman, van~der Walt, Gommers, Virtanen, Cournapeau, Wieser, Taylor, Berg, Smith, Kern, Picus, Hoyer, van Kerkwijk, Brett, Haldane, del R{'{\i}}o, Wiebe, Peterson, G{'{e}}rard-Marchant, Sheppard, Reddy, Weckesser, Abbasi, Gohlke, and Oliphant}}?><label>Harris et al.(2020)Harris, Millman, van der Walt, Gommers, Virtanen, Cournapeau, Wieser, Taylor, Berg, Smith, Kern, Picus, Hoyer, van Kerkwijk, Brett, Haldane, del R'ıo, Wiebe, Peterson, G'erard-Marchant, Sheppard, Reddy, Weckesser, Abbasi, Gohlke, and Oliphant</label><?label harris2020array?><mixed-citation>Harris, C. R., Millman, K. J., van der Walt, S. J., Gommers, R., Virtanen, P., Cournapeau, D., Wieser, E., Taylor, J., Berg, S., Smith, N. J., Kern, R.,
Picus, M., Hoyer, S., van Kerkwijk, M. H., Brett, M., Haldane, A., del Río, J. F., Wiebe, M., Peterson, P., G'erard-Marchant, P., Sheppard, K., Reddy, T., Weckesser, W., Abbasi, H., Gohlke, C., and Oliphant,
T. E.: Array programming with NumPy, Nature, 585, 357–362,
<ext-link xlink:href="https://doi.org/10.1038/s41586-020-2649-2" ext-link-type="DOI">10.1038/s41586-020-2649-2</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx25"><?xmltex \def\ref@label{{Hasager et~al.(2013)Hasager, Rasmussen, Pe{\~{n}}a, Jensen, and
R{\'{e}}thor{\'{e}}}}?><label>Hasager et al.(2013)Hasager, Rasmussen, Peña, Jensen, and
Réthoré</label><?label hasager2013wind?><mixed-citation>Hasager, C. B., Rasmussen, L., Peña, A., Jensen, L. E., and Réthoré, P.-E.: Wind farm wake: The Horns Rev photo case, Energies,
6, 696–716, <ext-link xlink:href="https://doi.org/10.3390/en6020696" ext-link-type="DOI">10.3390/en6020696</ext-link>, 2013.</mixed-citation></ref>
      <ref id="bib1.bibx26"><?xmltex \def\ref@label{{Herbert-Acero et~al.(2014)Herbert-Acero, Probst, R{\'{e}}thor{\'{e}},
Larsen, and Castillo-Villar}}?><label>Herbert-Acero et al.(2014)Herbert-Acero, Probst, Réthoré,
Larsen, and Castillo-Villar</label><?label herbert2014review?><mixed-citation>Herbert-Acero, J. F., Probst, O., Réthoré, P.-E., Larsen, G. C., and
Castillo-Villar, K. K.: A review of methodological approaches for the design
and optimization of wind farms, Energies, 7, 6930–7016,
<ext-link xlink:href="https://doi.org/10.3390/en7116930" ext-link-type="DOI">10.3390/en7116930</ext-link>, 2014.</mixed-citation></ref>
      <ref id="bib1.bibx27"><?xmltex \def\ref@label{{Howland et~al.(2022)Howland, Ghate, Quesada, Pena~Mart{\'{\i}}nez,
Zhong, Larra{\~{n}}aga, Lele, and Dabiri}}?><label>Howland et al.(2022)Howland, Ghate, Quesada, Pena Martínez,
Zhong, Larrañaga, Lele, and Dabiri</label><?label howland2022optimal?><mixed-citation>Howland, M. F., Ghate, A. S., Quesada, J. B., Pena Martínez, J. J., Zhong, W., Larrañaga, F. P., Lele, S. K., and Dabiri, J. O.: Optimal closed-loop wake steering – Part 2: Diurnal cycle atmospheric boundary layer conditions, Wind Energ. Sci., 7, 345–365, <ext-link xlink:href="https://doi.org/10.5194/wes-7-345-2022" ext-link-type="DOI">10.5194/wes-7-345-2022</ext-link>, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx28"><?xmltex \def\ref@label{{Hussain et~al.(2022)Hussain, Shaukat, Ahmad, Abid, Hashmi, Rajabi,
and Tariq}}?><label>Hussain et al.(2022)Hussain, Shaukat, Ahmad, Abid, Hashmi, Rajabi,
and Tariq</label><?label hussain2022micro?><mixed-citation>Hussain, M. N., Shaukat, N., Ahmad, A., Abid, M., Hashmi, A., Rajabi, Z., and
Tariq, M. A. U. R.: Micro-Siting of Wind Turbines in an Optimal Wind Farm
Area Using Teaching–Learning-Based Optimization Technique, Sustainability,
14, 8846, <ext-link xlink:href="https://doi.org/10.3390/su14148846" ext-link-type="DOI">10.3390/su14148846</ext-link>, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx29"><?xmltex \def\ref@label{{International Electrotechnical
Commission(2005)}}?><label>International Electrotechnical
Commission(2005)</label><?label international2005iec?><mixed-citation>International Electrotechnical Commission: IEC 61400-12-1 Wind Turbines-Part 12-1: Power Performance Measurements of Electricity Producing Wind Turbines, IEC – International Electrotechinal Commission, Geneva, Switzerland, 1, <uri>https://webstore.iec.ch/publication/68499</uri> (last access: 31 July 2023), 2005.</mixed-citation></ref>
      <ref id="bib1.bibx30"><?xmltex \def\ref@label{{Kervadec et~al.(2019)Kervadec, Dolz, Yuan, Desrosiers, Granger, and
Ayed}}?><label>Kervadec et al.(2019)Kervadec, Dolz, Yuan, Desrosiers, Granger, and
Ayed</label><?label kervadec2019constrained?><mixed-citation>Kervadec, H., Dolz, J., Yuan, J., Desrosiers, C., Granger, E., and Ayed, I. B.: Constrained deep networks: Lagrangian optimization via log-barrier
extensions, arXiv [preprint], arXiv:1904.04205, <ext-link xlink:href="https://doi.org/10.48550/arXiv.1904.04205" ext-link-type="DOI">10.48550/arXiv.1904.04205</ext-link>, 2019.</mixed-citation></ref>
      <ref id="bib1.bibx31"><?xmltex \def\ref@label{{Ketkar(2017)}}?><label>Ketkar(2017)</label><?label ketkar2017stochastic?><mixed-citation>Ketkar, N.: Stochastic gradient descent, in: Deep learning with Python, Springer, 113–132, <ext-link xlink:href="https://doi.org/10.1007/978-1-4842-2766-4_8" ext-link-type="DOI">10.1007/978-1-4842-2766-4_8</ext-link>, 2017.</mixed-citation></ref>
      <ref id="bib1.bibx32"><?xmltex \def\ref@label{{King et~al.(2020)King, Glaws, Geraci, and
Eldred}}?><label>King et al.(2020)King, Glaws, Geraci, and
Eldred</label><?label king2020probabilistic?><mixed-citation>King, R., Glaws, A., Geraci, G., and Eldred, M. S.: A probabilistic approach to estimating wind farm annual energy production with bayesian quadrature, in: AIAA Scitech 2020 Forum, 6–10 January 2020, Orlando, Florida, USA, p. 1951, <ext-link xlink:href="https://doi.org/10.2514/6.2020-1951" ext-link-type="DOI">10.2514/6.2020-1951</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx33"><?xmltex \def\ref@label{{King et~al.(2017)King, Dykes, Graf, and
Hamlington}}?><label>King et al.(2017)King, Dykes, Graf, and
Hamlington</label><?label king2017optimization?><mixed-citation>King, R. N., Dykes, K., Graf, P., and Hamlington, P. E.: Optimization of wind
plant layouts using an adjoint approach, Wind Energ. Sci., 2, 115–131,
<ext-link xlink:href="https://doi.org/10.5194/wes-2-115-2017" ext-link-type="DOI">10.5194/wes-2-115-2017</ext-link>, 2017.</mixed-citation></ref>
      <ref id="bib1.bibx34"><?xmltex \def\ref@label{{Kingma and Ba(2014)}}?><label>Kingma and Ba(2014)</label><?label kingma2014adam?><mixed-citation>Kingma, D. P. and Ba, J.: Adam: A method for stochastic optimization, arXiv
[preprint], arXiv:1412.6980, <ext-link xlink:href="https://doi.org/10.48550/arXiv.1412.6980" ext-link-type="DOI">10.48550/arXiv.1412.6980</ext-link>, 2014.</mixed-citation></ref>
      <ref id="bib1.bibx35"><?xmltex \def\ref@label{{K\"{o}lle et~al.(2022)K{\"{o}}lle, G{\"{o}}{\c{c}}men, Eguinoa,
Alcayaga~Rom{\'{a}}n, Aparicio-Sanchez, Feng, Meyers, Pettas, and
Sood}}?><label>Kölle et al.(2022)Kölle, Göçmen, Eguinoa,
Alcayaga Román, Aparicio-Sanchez, Feng, Meyers, Pettas, and
Sood</label><?label kolle2022farmconners?><mixed-citation>Kölle, K., Göçmen, T., Eguinoa, I., Alcayaga Román, L. A.,
Aparicio-Sanchez, M., Feng, J., Meyers, J., Pettas, V., and Sood, I.:
FarmConners market showcase results: wind farm flow control considering
electricity prices, Wind Energ. Sci., 7, 2181–2200,
<ext-link xlink:href="https://doi.org/10.5194/wes-7-2181-2022" ext-link-type="DOI">10.5194/wes-7-2181-2022</ext-link>, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx36"><?xmltex \def\ref@label{{Kraft(1988)}}?><label>Kraft(1988)</label><?label kraft1988software?><mixed-citation>Kraft, D.: A software package for sequential quadratic programming,
Forschungsbericht, Deutsche Forschungs- und Versuchsanstalt für Luft- und Raumfahrt, <uri>http://degenerateconic.com/uploads/2018/03/DFVLR_FB_88_28.pdf</uri> (last access: 31 July 2023), 1988.</mixed-citation></ref>
      <ref id="bib1.bibx37"><?xmltex \def\ref@label{{Lam et~al.(2018)Lam, Poloczek, Frazier, and
Willcox}}?><label>Lam et al.(2018)Lam, Poloczek, Frazier, and
Willcox</label><?label lam2018advances?><mixed-citation>Lam, R., Poloczek, M., Frazier, P., and Willcox, K. E.: Advances in Bayesian
optimization with applications in aerospace engineering, in: 2018 AIAA
Non-Deterministic Approaches Conference, 8–12 January 2018, Kissimmee, Florida, p. 1656, <ext-link xlink:href="https://doi.org/10.2514/6.2018-1656" ext-link-type="DOI">10.2514/6.2018-1656</ext-link>, 2018.</mixed-citation></ref>
      <ref id="bib1.bibx38"><?xmltex \def\ref@label{{Li and Zhang(2021)}}?><label>Li and Zhang(2021)</label><?label li2021data?><mixed-citation>Li, J. and Zhang, M.: Data-based approach for wing shape design optimization,
Aerospace Sci. Technol., 112, 106639, <ext-link xlink:href="https://doi.org/10.1016/j.ast.2021.106639" ext-link-type="DOI">10.1016/j.ast.2021.106639</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx39"><?xmltex \def\ref@label{{Liu et~al.(2018)Liu, Rong, Tak{\'{a}}c, and
Huang}}?><label>Liu et al.(2018)Liu, Rong, Takác, and
Huang</label><?label liu2018acceleration?><mixed-citation>Liu, J., Rong, Y., Takác, M., and Huang, J.: On the acceleration of l-bfgs with second-order information and stochastic batches, arXiv [preprint], arXiv:1807.05328, <ext-link xlink:href="https://doi.org/10.48550/arXiv.1807.05328" ext-link-type="DOI">10.48550/arXiv.1807.05328</ext-link>, 2018.</mixed-citation></ref>
      <ref id="bib1.bibx40"><?xmltex \def\ref@label{{M\'{a}rquez-Neila et~al.(2017)M{\'{a}}rquez-Neila, Salzmann, and
Fua}}?><label>Márquez-Neila et al.(2017)Márquez-Neila, Salzmann, and
Fua</label><?label marquez2017imposing?><mixed-citation>Márquez-Neila, P., Salzmann, M., and Fua, P.: Imposing hard constraints on deep networks: Promises and limitations, arXiv [preprint], arXiv:1706.02025, <ext-link xlink:href="https://doi.org/10.48550/arXiv.1706.02025" ext-link-type="DOI">10.48550/arXiv.1706.02025</ext-link>, 2017.</mixed-citation></ref>
      <ref id="bib1.bibx41"><?xmltex \def\ref@label{{Moritz et~al.(2016)Moritz, Nishihara, and
Jordan}}?><label>Moritz et al.(2016)Moritz, Nishihara, and
Jordan</label><?label moritz2016linearly?><mixed-citation>Moritz, P., Nishihara, R., and Jordan, M.<?pagebreak page1249?>: A linearly-convergent stochastic
L-BFGS algorithm, in: Artificial Intelligence and Statistics, PMLR, 249–258, <uri>https://proceedings.mlr.press/v51/moritz16.html</uri> (last access: 31 July 2023), 2016.</mixed-citation></ref>
      <ref id="bib1.bibx42"><?xmltex \def\ref@label{{Murcia et~al.(2015)Murcia, R{\'{e}}thor{\'{e}}, Natarajan, and
S{\o}rensen}}?><label>Murcia et al.(2015)Murcia, Réthoré, Natarajan, and
Sørensen</label><?label murcia2015many?><mixed-citation>Murcia, J., Réthoré, P.-E., Natarajan, A., and Sørensen, J. D.: How many model evaluations are required to predict the AEP of a wind power
plant?, J. Phys.: Conf. Ser., 625, 012030, <ext-link xlink:href="https://doi.org/10.1088/1742-6596/625/1/012030" ext-link-type="DOI">10.1088/1742-6596/625/1/012030</ext-link>, 2015.</mixed-citation></ref>
      <ref id="bib1.bibx43"><?xmltex \def\ref@label{{Najafabadi et~al.(2017)Najafabadi, Khoshgoftaar, Villanustre, and
Holt}}?><label>Najafabadi et al.(2017)Najafabadi, Khoshgoftaar, Villanustre, and
Holt</label><?label najafabadi2017large?><mixed-citation>Najafabadi, M. M., Khoshgoftaar, T. M., Villanustre, F., and Holt, J.:
Large-scale distributed l-bfgs, J. Big Data, 4, 1–17, <ext-link xlink:href="https://doi.org/10.1186/s40537-017-0084-5" ext-link-type="DOI">10.1186/s40537-017-0084-5</ext-link>, 2017.</mixed-citation></ref>
      <ref id="bib1.bibx44"><?xmltex \def\ref@label{{Najd et~al.(2020)Najd, Goksu, and Hammood}}?><label>Najd et al.(2020)Najd, Goksu, and Hammood</label><?label najd2020pitch?><mixed-citation>Najd, A. H., Goksu, G., and Hammood, H. F.: Pitch angle control using neural
network in wind turbines, Mater. Sci. Eng., 928, 022118,
<ext-link xlink:href="https://doi.org/10.1088/1757-899X/928/2/022118" ext-link-type="DOI">10.1088/1757-899X/928/2/022118</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx45"><?xmltex \def\ref@label{{Ning. et~al.(2020)Ning., Dykes., and Quick}}?><label>Ning. et al.(2020)Ning., Dykes., and Quick</label><?label ning2019systems?><mixed-citation>Ning., A., Dykes., K., and Quick, J.: Systems engineering and optimization of
wind turbines and power plants, Wind Energy Modeling and Simulation – Volume 2: Turbine and System, Institution of Engineering and Technology, 235–292, <ext-link xlink:href="https://doi.org/10.1049/pbpo125g_ch7" ext-link-type="DOI">10.1049/pbpo125g_ch7</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx46"><?xmltex \def\ref@label{{Padr\'{o}n et~al.(2019)Padr{\'{o}}n, Thomas, Stanley, Alonso, and
Ning}}?><label>Padrón et al.(2019)Padrón, Thomas, Stanley, Alonso, and
Ning</label><?label padron2019polynomial?><mixed-citation>Padrón, A. S., Thomas, J., Stanley, A. P., Alonso, J. J., and Ning, A.:
Polynomial chaos to efficiently compute the annual energy production in wind
farm layout optimization, Wind Energ. Sci., 4, 211–231,
<ext-link xlink:href="https://doi.org/10.5194/wes-4-211-2019" ext-link-type="DOI">10.5194/wes-4-211-2019</ext-link>, 2019.</mixed-citation></ref>
      <ref id="bib1.bibx47"><?xmltex \def\ref@label{{Pedersen et~al.(2019)Pedersen, van~der Laan, Friis-Møller, Rinker,
and Réthoré}}?><label>Pedersen et al.(2019)Pedersen, van der Laan, Friis-Møller, Rinker,
and Réthoré</label><?label pywake?><mixed-citation>Pedersen, M. M., van der Laan, P., Friis-Møller, M., Rinker, J., and
Réthoré, P.-E.: DTUWindEnergy/PyWake: PyWake, Zenodo [code], <ext-link xlink:href="https://doi.org/10.5281/zenodo.2562662" ext-link-type="DOI">10.5281/zenodo.2562662</ext-link>, 2019.</mixed-citation></ref>
      <ref id="bib1.bibx48"><?xmltex \def\ref@label{{Qian(1999)}}?><label>Qian(1999)</label><?label qian1999momentum?><mixed-citation>Qian, N.: On the momentum term in gradient descent learning algorithms, Neural Networks, 12, 145–151, <ext-link xlink:href="https://doi.org/10.1016/S0893-6080(98)00116-6" ext-link-type="DOI">10.1016/S0893-6080(98)00116-6</ext-link>, 1999.</mixed-citation></ref>
      <ref id="bib1.bibx49"><?xmltex \def\ref@label{{Quick(2023)}}?><label>Quick(2023)</label><?label Quick2023?><mixed-citation>Quick, J.: Data Used for Article: Stochastic Gradient Descent for Wind Farm Optimization, Zenodo [data set], <ext-link xlink:href="https://doi.org/10.5281/zenodo.8202150" ext-link-type="DOI">10.5281/zenodo.8202150</ext-link>, 2023.</mixed-citation></ref>
      <ref id="bib1.bibx50"><?xmltex \def\ref@label{{Quick et~al.(2020)Quick, King, King, Hamlington, and
Dykes}}?><label>Quick et al.(2020)Quick, King, King, Hamlington, and
Dykes</label><?label quick2020wake?><mixed-citation>Quick, J., King, J., King, R. N., Hamlington, P. E., and Dykes, K.: Wake
steering optimization under uncertainty, Wind Energ. Sci., 5, 413–426,
<ext-link xlink:href="https://doi.org/10.5194/wes-5-413-2020" ext-link-type="DOI">10.5194/wes-5-413-2020</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx51"><?xmltex \def\ref@label{{Riedmiller and Braun(1993)}}?><label>Riedmiller and Braun(1993)</label><?label riedmiller1993direct?><mixed-citation>Riedmiller, M. and Braun, H.: A direct adaptive method for faster
backpropagation learning: The RPROP algorithm, in: IEEE international conference on neural networks, 28 March–1 April 1993, San Francisco, California, USA, 586–591, <ext-link xlink:href="https://doi.org/10.1109/ICNN.1993.298623" ext-link-type="DOI">10.1109/ICNN.1993.298623</ext-link>, 1993.</mixed-citation></ref>
      <ref id="bib1.bibx52"><?xmltex \def\ref@label{{Riva et~al.(2020)Riva, Liew, Friis-M{\o}ller, Dimitrov, Barlas,
R{\'{e}}thor{\'{e}}, and Ber{\v{z}}onskis}}?><label>Riva et al.(2020)Riva, Liew, Friis-Møller, Dimitrov, Barlas,
Réthoré, and Beržonskis</label><?label riva2020wind?><mixed-citation>Riva, R., Liew, J., Friis-Møller, M., Dimitrov, N., Barlas, E.,
Réthoré, P.-E., and Beržonskis, A.: Wind farm layout optimization with load constraints using surrogate modelling, J. Phys.: Conf. Ser., 1618, 042035, <ext-link xlink:href="https://doi.org/10.1088/1742-6596/1618/4/042035" ext-link-type="DOI">10.1088/1742-6596/1618/4/042035</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx53"><?xmltex \def\ref@label{{Rodrigues et~al.(2022)Rodrigues, Friis-M{\o}ller, Dykes, Pollini, and Jensen}}?><label>Rodrigues et al.(2022)Rodrigues, Friis-Møller, Dykes, Pollini, and Jensen</label><?label rodrigues2022surrogate?><mixed-citation>Rodrigues, R. V., Friis-Møller, M., Dykes, K., Pollini, N., and Jensen, M.: A surrogate model of offshore wind farm annual energy production to support financial valuation, J. Phys.: Conf. Ser., 2265, 022003, <ext-link xlink:href="https://doi.org/10.1088/1742-6596/2265/2/022003" ext-link-type="DOI">10.1088/1742-6596/2265/2/022003</ext-link>, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx54"><?xmltex \def\ref@label{{Rodrigues et~al.(2023)Rodrigues, Pedersen, Sch{\o}ler, Quick, and
R{\'{e}}thor{\'{e}}}}?><label>Rodrigues et al.(2023)Rodrigues, Pedersen, Schøler, Quick, and
Réthoré</label><?label rodrigues2023speeding?><mixed-citation>Rodrigues, R. V., Pedersen, M. M., Schøler, J. P., Quick, J., and Réthoré, P.: Speeding up large wind farms layout optimization using gradients, parallelization, and a heuristic algorithm for the initial layout, Wind Energ. Sci. Discuss. [preprint], <ext-link xlink:href="https://doi.org/10.5194/wes-2023-61" ext-link-type="DOI">10.5194/wes-2023-61</ext-link>, in review, 2023.</mixed-citation></ref>
      <ref id="bib1.bibx55"><?xmltex \def\ref@label{{Roy and Harandi(2017)}}?><label>Roy and Harandi(2017)</label><?label 8227420?><mixed-citation>Roy, S. K. and Harandi, M.: Constrained Stochastic Gradient Descent: The Good
Practice, in: 2017 International Conference on Digital Image Computing:
Techniques and Applications (DICTA), 29 November–1 December 2017, Sydney, NSW, Australia, 1–8, <ext-link xlink:href="https://doi.org/10.1109/DICTA.2017.8227420" ext-link-type="DOI">10.1109/DICTA.2017.8227420</ext-link>, 2017.</mixed-citation></ref>
      <ref id="bib1.bibx56"><?xmltex \def\ref@label{{Ruder(2016)}}?><label>Ruder(2016)</label><?label arxivBlogPost?><mixed-citation>Ruder, S.: An overview of gradient descent optimization algorithms, arXiv [preprint], <ext-link xlink:href="https://doi.org/10.48550/ARXIV.1609.04747" ext-link-type="DOI">10.48550/ARXIV.1609.04747</ext-link>, 2016.</mixed-citation></ref>
      <ref id="bib1.bibx57"><?xmltex \def\ref@label{{Saint-Drenan et~al.(2020)Saint-Drenan, Besseau, Jansen, Staffell,
Troccoli, Dubus, Schmidt, Gruber, Sim{\~{o}}es, and
Heier}}?><label>Saint-Drenan et al.(2020)Saint-Drenan, Besseau, Jansen, Staffell,
Troccoli, Dubus, Schmidt, Gruber, Simões, and
Heier</label><?label saint2020parametric?><mixed-citation>Saint-Drenan, Y.-M., Besseau, R., Jansen, M., Staffell, I., Troccoli, A.,
Dubus, L., Schmidt, J., Gruber, K., Simões, S. G., and Heier, S.: A
parametric model for wind turbine power curves incorporating environmental
conditions, Renew. Energy, 157, 754–768, <ext-link xlink:href="https://doi.org/10.1016/j.renene.2020.04.123" ext-link-type="DOI">10.1016/j.renene.2020.04.123</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx58"><?xmltex \def\ref@label{{Samorani(2013)}}?><label>Samorani(2013)</label><?label samorani2013wind?><mixed-citation>Samorani, M.: The wind farm layout optimization problem, Handbook of wind power systems, Springer, 21–38, <ext-link xlink:href="https://doi.org/10.1007/978-3-642-41080-2_2" ext-link-type="DOI">10.1007/978-3-642-41080-2_2</ext-link>, 2013.</mixed-citation></ref>
      <ref id="bib1.bibx59"><?xmltex \def\ref@label{{Sanderse(2009)}}?><label>Sanderse(2009)</label><?label sanderse2009aerodynamics?><mixed-citation>Sanderse, B.: Aerodynamics of wind turbine wakes, US Department of Energy
Office of Scientific and Technical Information, <uri>https://www.osti.gov/etdeweb/biblio/21162007</uri> (last access: 31 July 2023), 2009.</mixed-citation></ref>
      <ref id="bib1.bibx60"><?xmltex \def\ref@label{{Simley et~al.(2023)Simley, Millstein, Jeong, and
Fleming}}?><label>Simley et al.(2023)Simley, Millstein, Jeong, and
Fleming</label><?label simley2023value?><mixed-citation>Simley, E., Millstein, D., Jeong, S., and Fleming, P.: The value of wake steering wind farm control in U.S. energy markets, Wind Energ. Sci. Discuss. [preprint], <ext-link xlink:href="https://doi.org/10.5194/wes-2023-12" ext-link-type="DOI">10.5194/wes-2023-12</ext-link>, in review, 2023.</mixed-citation></ref>
      <ref id="bib1.bibx61"><?xmltex \def\ref@label{{Sivanantham and Gopalakrishnan(2022)}}?><label>Sivanantham and Gopalakrishnan(2022)</label><?label sivanantham2022stochastic?><mixed-citation>Sivanantham, G. and Gopalakrishnan, S.: Stochastic Gradient Descent
Optimization Model for Demand Response in a Connected Microgrid, KSII
Transactions on Internet and Information Systems (TIIS), 16, 97–115,
<ext-link xlink:href="https://doi.org/10.3837/tiis.2022.01.006" ext-link-type="DOI">10.3837/tiis.2022.01.006</ext-link>, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx62"><?xmltex \def\ref@label{{Stanley et~al.(2021)Stanley, Roberts, King, and
Bay}}?><label>Stanley et al.(2021)Stanley, Roberts, King, and
Bay</label><?label stanley2021objective?><mixed-citation>Stanley, A. P., Roberts, O., King, J., and Bay, C. J.: Objective and algorithm considerations when optimizing the number and placement of turbines in a wind power plant, Wind Energ. Sci., 6, 1143–1167,
<ext-link xlink:href="https://doi.org/10.5194/wes-6-1143-2021" ext-link-type="DOI">10.5194/wes-6-1143-2021</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx63"><?xmltex \def\ref@label{{Stengel et~al.(2020)Stengel, Glaws, Hettinger, and
King}}?><label>Stengel et al.(2020)Stengel, Glaws, Hettinger, and
King</label><?label stengel2020adversarial?><mixed-citation>Stengel, K., Glaws, A., Hettinger, D., and King, R. N.: Adversarial
super-resolution of climatological wind and solar data, P. Natl. Acad. Sci. USA, 117, 16805–16815, <ext-link xlink:href="https://doi.org/10.1073/pnas.1918964117" ext-link-type="DOI">10.1073/pnas.1918964117</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx64"><?xmltex \def\ref@label{{Technical University of
Denmark(2019)}}?><label>Technical University of
Denmark(2019)</label><?label technical_university_of_denmark_sophia_2019?><mixed-citation>Technical University of Denmark: Sophia HPC Cluster,
<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.bibx65"><?xmltex \def\ref@label{{Tian et~al.(2023)Tian, Zhang, and Zhang}}?><label>Tian et al.(2023)Tian, Zhang, and Zhang</label><?label tian2023recent?><mixed-citation>Tian, Y., Zhang, Y., and Zhang, H.: Recent Advances in Stochastic Gradient
Descent in Deep Learning, Mathematics, 11, 682, <ext-link xlink:href="https://doi.org/10.3390/math11030682" ext-link-type="DOI">10.3390/math11030682</ext-link>,
2023.</mixed-citation></ref>
      <ref id="bib1.bibx66"><?xmltex \def\ref@label{{van~der Laan et~al.(2023)van~der Laan, Garc{\'{\i}}a-Santiago, Kelly,
Meyer~Forsting, Dubreuil-Boisclair, Seim, Imberger, Pe{\~{n}}a, S{\o}rensen,
and R{\'{e}}thor{\'{e}}}}?><label>van der Laan et al.(2023)van der Laan, García-Santiago, Kelly,
Meyer Forsting, Dubreuil-Boisclair, Seim, Imberger, Peña, Sørensen,
and Réthoré</label><?label van2022new?><mixed-citation>van der Laan, M. P., García-Santiago, O., Kelly, M., Meyer Forsting, A., Dubreuil-Boisclair, C., Sponheim Seim, K., Imberger, M., Peña, A., Sørensen, N. N., and Réthoréé, P.-E.: A new RANS-based wind farm parameterization and inflow model for wind farm cluster modeling, Wind Energ. Sci., 8, 819–848, <ext-link xlink:href="https://doi.org/10.5194/wes-8-819-2023" ext-link-type="DOI">10.5194/wes-8-819-2023</ext-link>, 2023.</mixed-citation></ref>
      <ref id="bib1.bibx67"><?xmltex \def\ref@label{{Virtanen et~al.(2020)Virtanen, Gommers, Oliphant, Haberland, Reddy,
Cournapeau, Burovski, Peterson, Weckesser, Bright, {van der Walt}, Brett,
Wilson, Millman, Mayorov, Nelson, Jones, Kern, Larson, Carey, Polat, Feng,
Moore, {VanderPlas}, Laxalde, Perktold, Cimrman, Henriksen, Quintero, Harris, Archibald, Ribeiro, Pedregosa, {van Mulbregt}, and {SciPy 1.0
Contributors}}}?><label>Virtanen et al.(2020)Virtanen, Gommers, Oliphant, Haberland, Reddy,
Cournapeau, Burovski, Peterson, Weckesser, Bright, van der Walt, Brett,
Wilson, Millman, Mayorov, Nelson, Jones, Kern, Larson, Carey, Polat, Feng,
Moore, VanderPlas, Laxalde, Perktold, Cimrman, Henriksen, Quintero, Harris, Archibald, Ribeiro, Pedregosa, van Mulbregt, and SciPy 1.0
Contributors</label><?label 2020SciPy?><mixed-citation>Virtanen, P., Gommers, R., Oliphant, T. E., Haberland, M., Reddy, T.,
Cournapeau, D., Burovski, E., Peterson, P., Weckesser, W., Bright, J., van
der Walt, S. J., Brett, M., Wilson, J., Millman, K. J., Mayorov, N., Nelson,
A. R. J., Jones, E., Kern, R., Larson, E., Carey, C. J., Polat, İ., Feng,
Y., Moore, E. W., VanderPlas, J., Laxalde, D., Perktold, J., Cimrman, R.,
Henriksen, I., Quintero, E. A., Harris, C. R., Archibald, A. M., Ribeiro,
A. H., Pedregosa, F., van Mulbregt, P., and SciPy 1.0 Contributors: SciPy 1.0: Fundamental Algorithms for Scientific Computing in Python, Nat. Meth., 17, 261–272, <ext-link xlink:href="https://doi.org/10.1038/s41592-019-0686-2" ext-link-type="DOI">10.1038/s41592-019-0686-2</ext-link>, 2020.</mixed-citation></ref>
      <ref id="bib1.bibx68"><?xmltex \def\ref@label{{Wu et~al.(2020)Wu, Kenway, Mader, Jasa, and
Martins}}?><label>Wu et al.(2020)Wu, Kenway, Mader, Jasa, and
Martins</label><?label wu2020pyoptsparse?><mixed-citation>Wu, N., Kenway, G., Mader, C. A., Jasa, J., and Martins, J. R.: pyOptSparse: A Python framework for large-scale constrained nonlinear optimization of sparse systems, J. Open Sour. Softw., 5, 2564, <ext-link xlink:href="https://doi.org/10.21105/joss.02564" ext-link-type="DOI">10.21105/joss.02564</ext-link>,
2020.</mixed-citation></ref>
      <?pagebreak page1250?><ref id="bib1.bibx69"><?xmltex \def\ref@label{{You et~al.(2019)You, Long, Wang, and Jordan}}?><label>You et al.(2019)You, Long, Wang, and Jordan</label><?label you2019does?><mixed-citation>You, K., Long, M., Wang, J., and Jordan, M. I.: How does learning rate decay
help modern neural networks?, arXiv [preprint], arXiv:1908.01878,
<ext-link xlink:href="https://doi.org/10.48550/arXiv.1908.01878" ext-link-type="DOI">10.48550/arXiv.1908.01878</ext-link>, 2019.</mixed-citation></ref>
      <ref id="bib1.bibx70"><?xmltex \def\ref@label{{Zhang et~al.(2022)Zhang, Kramer, Angeloudis, Zhang, Lin, and
Piggott}}?><label>Zhang et al.(2022)Zhang, Kramer, Angeloudis, Zhang, Lin, and
Piggott</label><?label zhang2022improving?><mixed-citation>Zhang, C., Kramer, S. C., Angeloudis, A., Zhang, J., Lin, X., and Piggott,
M. D.: Improving tidal turbine array performance through the optimisation of
layout and yaw angles, Int. Mar. Energ. J., 5, 273–280,
<ext-link xlink:href="https://doi.org/10.36688/imej.5.273-280" ext-link-type="DOI">10.36688/imej.5.273-280</ext-link>, 2022.</mixed-citation></ref>
      <ref id="bib1.bibx71"><?xmltex \def\ref@label{{Zhang and Zhao(2022)}}?><label>Zhang and Zhao(2022)</label><?label zhang2022wind?><mixed-citation>Zhang, J. and Zhao, X.: Wind farm wake modeling based on deep convolutional
conditional generative adversarial network, Energy, 238, 121747,
<ext-link xlink:href="https://doi.org/10.1016/j.energy.2021.121747" ext-link-type="DOI">10.1016/j.energy.2021.121747</ext-link>, 2022.
</mixed-citation></ref><?xmltex \hack{\newpage}?>
      <ref id="bib1.bibx72"><?xmltex \def\ref@label{{Zhang et~al.(2021)Zhang, Santoni, Herges, Sotiropoulos, and
Khosronejad}}?><label>Zhang et al.(2021)Zhang, Santoni, Herges, Sotiropoulos, and
Khosronejad</label><?label zhang2021time?><mixed-citation>Zhang, Z., Santoni, C., Herges, T., Sotiropoulos, F., and Khosronejad, A.:
Time-averaged wind turbine wake flow field prediction using autoencoder
convolutional neural networks, Energies, 15, 41, <ext-link xlink:href="https://doi.org/10.3390/en15010041" ext-link-type="DOI">10.3390/en15010041</ext-link>, 2021.</mixed-citation></ref>
      <ref id="bib1.bibx73"><?xmltex \def\ref@label{{Zilong and Wei(2022)}}?><label>Zilong and Wei(2022)</label><?label zilong2022layout?><mixed-citation>Zilong, T. and Wei, D. X.: Layout optimization of offshore wind farm
considering spatially inhomogeneous wave loads, Appl. Energy, 306, 117947, <ext-link xlink:href="https://doi.org/10.1016/j.apenergy.2021.117947" ext-link-type="DOI">10.1016/j.apenergy.2021.117947</ext-link>, 2022.</mixed-citation></ref>

  </ref-list></back>
    <!--<article-title-html>Stochastic gradient descent for wind farm optimization</article-title-html>
<abstract-html/>
<ref-html id="bib1.bib1"><label>Alibrahim and Ludwig(2021)</label><mixed-citation>
      
Alibrahim, H. and Ludwig, S. A.: Hyperparameter Optimization: Comparing Genetic Algorithm against Grid Search and Bayesian Optimization, in: 2021 IEEE Congress on Evolutionary Computation (CEC), 28 June–1 July 2021, Kraków, Poland, 1551–1559, <a href="https://doi.org/10.1109/CEC45853.2021.9504761" target="_blank">https://doi.org/10.1109/CEC45853.2021.9504761</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib2"><label>Allen et al.(2020)Allen, King, and Barter</label><mixed-citation>
      
Allen, J., King, R., and Barter, G.: Wind farm simulation and layout
optimization in complex terrain, J. Phys.: Conf. Ser., 1452, 012066, <a href="https://doi.org/10.1088/1742-6596/1452/1/012066" target="_blank">https://doi.org/10.1088/1742-6596/1452/1/012066</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib3"><label>Annoni et al.(2018)Annoni, Fleming, Scholbrock, Roadman, Dana,
Adcock, Porte-Agel, Raach, Haizmann, and Schlipf</label><mixed-citation>
      
Annoni, J., Fleming, P., Scholbrock, A., Roadman, J., Dana, S., Adcock, C.,
Porte-Agel, F., Raach, S., Haizmann, F., and Schlipf, D.: Analysis of
control-oriented wake modeling tools using lidar field results, Wind Energ.
Sci., 3, 819–831, <a href="https://doi.org/10.5194/wes-3-819-2018" target="_blank">https://doi.org/10.5194/wes-3-819-2018</a>, 2018.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib4"><label>Baker et al.(2019)Baker, Stanley, Thomas, Ning, and
Dykes</label><mixed-citation>
      
Baker, N. F., Stanley, A. P., Thomas, J. J., Ning, A., and Dykes, K.: Best
practices for wake model and optimization algorithm selection in wind farm
layout optimization, in: AIAA Scitech 2019 forum, 7–11 January 2019, San Diego, California, USA, p. 0540, <a href="https://doi.org/10.2514/6.2019-0540" target="_blank">https://doi.org/10.2514/6.2019-0540</a>, 2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib5"><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.bib6"><label>Byrd et al.(2016)Byrd, Hansen, Nocedal, and
Singer</label><mixed-citation>
      
Byrd, R. H., Hansen, S. L., Nocedal, J., and Singer, Y.: A stochastic
quasi-Newton method for large-scale optimization, SIAM J. Optimiz., 26, 1008–1031, <a href="https://doi.org/10.1137/140954362" target="_blank">https://doi.org/10.1137/140954362</a>, 2016.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib7"><label>Ciavarra et al.(2022)Ciavarra, Rodrigues, Dykes, and
Réthoré</label><mixed-citation>
      
Ciavarra, A. W., Rodrigues, R. V., Dykes, K., and Réthoré, P.-E.: Wind farm optimization with multiple hub heights using gradient-based methods, J. Phys.: Conf. Ser., 2265, 022012,  <a href="https://doi.org/10.1088/1742-6596/2265/2/022012" target="_blank">https://doi.org/10.1088/1742-6596/2265/2/022012</a>, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib8"><label>Clark et al.(2022)Clark, Barter, Shaler, and
DuPont</label><mixed-citation>
      
Clark, C. E., Barter, G., Shaler, K., and DuPont, B.: Reliability-based layout optimization in offshore wind energy systems, Wind Energy, 25, 125–148, <a href="https://doi.org/10.1002/we.2664" target="_blank">https://doi.org/10.1002/we.2664</a>, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib9"><label>Criado Risco et al.(2023)Criado Risco, Valotta Rodrigues,
Friis-Møller, Quick, Mølgaard Pedersen, and Réthoré</label><mixed-citation>
      
Criado Risco, J., Valotta Rodrigues, R., Friis-Møller, M., Quick, J., Mølgaard Pedersen, M., and Réthoré, P.-E.: Gradient-based Wind Farm Layout Optimization With Inclusion And Exclusion Zones, Wind Energ. Sci. Discuss. [preprint], <a href="https://doi.org/10.5194/wes-2023-5" target="_blank">https://doi.org/10.5194/wes-2023-5</a>, in review, 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib10"><label>Croonenbroeck and Hennecke(2021)</label><mixed-citation>
      
Croonenbroeck, C. and Hennecke, D.: A comparison of optimizers in a unified
standard for optimization on wind farm layout optimization, Energy, 216,
119244, <a href="https://doi.org/10.1016/j.energy.2020.119244" target="_blank">https://doi.org/10.1016/j.energy.2020.119244</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib11"><label>De et al.(2020)De, Hampton, Maute, and Doostan</label><mixed-citation>
      
De, S., Hampton, J., Maute, K., and Doostan, A.: Topology optimization under
uncertainty using a stochastic gradient-based approach, Struct. Multidiscip. Optimiz., 62, 2255–2278, <a href="https://doi.org/10.1007/s00158-020-02599-z" target="_blank">https://doi.org/10.1007/s00158-020-02599-z</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib12"><label>Denkowski and Neubig(2017)</label><mixed-citation>
      
Denkowski, M. and Neubig, G.: Stronger Baselines for Trustable Results in
Neural Machine Translation, in: Proceedings of the First Workshop on Neural
Machine Translation, Association for Computational Linguistics, Vancouver, 18–27, <a href="https://doi.org/10.18653/v1/W17-3203" target="_blank">https://doi.org/10.18653/v1/W17-3203</a>, 2017.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib13"><label>DTU Wind Energy Systems(2023a)</label><mixed-citation>
      
DTU Wind Energy Systems: PyWake, DTU Wind Energy [code],
<a href="https://gitlab.windenergy.dtu.dk/TOPFARM/PyWake" target="_blank"/> (last access: 31 July 2023), 2023a.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib14"><label>DTU Wind Energy Systems(2023b)</label><mixed-citation>
      
DTU Wind Energy Systems: TOPFARM, DTU Wind Energy [code],
<a href="https://gitlab.windenergy.dtu.dk/TOPFARM/Topfarm2" target="_blank"/> (last access: 31 July 2023), 2023b.


    </mixed-citation></ref-html>
<ref-html id="bib1.bib15"><label>Duc et al.(2019)Duc, Coupiac, Girard, Giebel, and
Göçmen</label><mixed-citation>
      
Duc, T., Coupiac, O., Girard, N., Giebel, G., and Göçmen, T.: Local
turbulence parameterization improves the Jensen wake model and its
implementation for power optimization of an operating wind farm, Wind Energ.
Sci., 4, 287–302, <a href="https://doi.org/10.5194/wes-4-287-2019" target="_blank">https://doi.org/10.5194/wes-4-287-2019</a>, 2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib16"><label>Feng and Shen(2015)</label><mixed-citation>
      
Feng, J. and Shen, W. Z.: Solving the wind farm layout optimization problem
using random search algorithm, Renew. Energy, 78, 182–192,
<a href="https://doi.org/10.1016/j.renene.2015.01.005" target="_blank">https://doi.org/10.1016/j.renene.2015.01.005</a>, 2015.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib17"><label>Fischereit et al.(2022)Fischereit, Schaldemose Hansen, Larsén,
van der Laan, Réthoré, and Murcia Leon</label><mixed-citation>
      
Fischereit, J., Schaldemose Hansen, K., Larsén, X. G., van der Laan, M. P., Réthoré, P.-E., and Murcia Leon, J. P.: Comparing and validating
intra-farm and farm-to-farm wakes across different mesoscale and
high-resolution wake models, Wind Energ. Sci., 7, 1069–1091,
<a href="https://doi.org/10.5194/wes-7-1069-2022" target="_blank">https://doi.org/10.5194/wes-7-1069-2022</a>, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib18"><label>Fleming et al.(2022)Fleming, Stanley, Bay, King, Simley, Doekemeijer, and Mudafort</label><mixed-citation>
      
Fleming, P. A., Stanley, A. P., Bay, C. J., King, J., Simley, E., Doekemeijer, B. M., and Mudafort, R.: Serial-Refine Method for Fast Wake-Steering Yaw Optimization, J. Phys.: Conf. Ser., 2265, 032109, <a href="https://doi.org/10.1088/1742-6596/2265/3/032109" target="_blank">https://doi.org/10.1088/1742-6596/2265/3/032109</a>, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib19"><label>Gebraad et al.(2017)Gebraad, Thomas, Ning, Fleming, and
Dykes</label><mixed-citation>
      
Gebraad, P., Thomas, J. J., Ning, A., Fleming, P., and Dykes, K.: Maximization of the annual energy production of wind power plants by optimization of layout and yaw-based wake control, Wind Energy, 20, 97–107,
<a href="https://doi.org/10.1002/we.1993" target="_blank">https://doi.org/10.1002/we.1993</a>, 2017.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib20"><label>Göçmen and Giebel(2016)</label><mixed-citation>
      
Göçmen, T. and Giebel, G.: Estimation of turbulence intensity using
rotor effective wind speed in Lillgrund and Horns Rev-I offshore wind farms, Renew. Energy, 99, 524–532, <a href="https://doi.org/10.1016/j.renene.2016.07.038" target="_blank">https://doi.org/10.1016/j.renene.2016.07.038</a>, 2016.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib21"><label>Godinho and Castro(2021)</label><mixed-citation>
      
Godinho, M. and Castro, R.: Comparative performance of AI methods for wind
power forecast in Portugal, Wind Energy, 24, 39–53, <a href="https://doi.org/10.1002/we.2556" target="_blank">https://doi.org/10.1002/we.2556</a>,
2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib22"><label>Graf et al.(2016)Graf, Dykes, Scott, Fields, Lunacek, Quick, and
Rethore</label><mixed-citation>
      
Graf, P., Dykes, K., Scott, G., Fields, J., Lunacek, M., Quick, J., and
Rethore, P.-E.: Wind farm turbine type and placement optimization, J. Phys.: Conf. Ser., 753, 062004, <a href="https://doi.org/10.1088/1742-6596/753/6/062004" target="_blank">https://doi.org/10.1088/1742-6596/753/6/062004</a>, 2016.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib23"><label>Guirguis et al.(2016)Guirguis, Romero, and Amon</label><mixed-citation>
      
Guirguis, D., Romero, D. A., and Amon, C. H.: Toward efficient optimization of wind farm layouts: Utilizing exact gradient information, Appl. Energy, 179, 110–123, <a href="https://doi.org/10.1016/j.apenergy.2016.06.101" target="_blank">https://doi.org/10.1016/j.apenergy.2016.06.101</a>, 2016.

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

    </mixed-citation></ref-html>
<ref-html id="bib1.bib25"><label>Hasager et al.(2013)Hasager, Rasmussen, Peña, Jensen, and
Réthoré</label><mixed-citation>
      
Hasager, C. B., Rasmussen, L., Peña, A., Jensen, L. E., and Réthoré, P.-E.: Wind farm wake: The Horns Rev photo case, Energies,
6, 696–716, <a href="https://doi.org/10.3390/en6020696" target="_blank">https://doi.org/10.3390/en6020696</a>, 2013.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib26"><label>Herbert-Acero et al.(2014)Herbert-Acero, Probst, Réthoré,
Larsen, and Castillo-Villar</label><mixed-citation>
      
Herbert-Acero, J. F., Probst, O., Réthoré, P.-E., Larsen, G. C., and
Castillo-Villar, K. K.: A review of methodological approaches for the design
and optimization of wind farms, Energies, 7, 6930–7016,
<a href="https://doi.org/10.3390/en7116930" target="_blank">https://doi.org/10.3390/en7116930</a>, 2014.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib27"><label>Howland et al.(2022)Howland, Ghate, Quesada, Pena Martínez,
Zhong, Larrañaga, Lele, and Dabiri</label><mixed-citation>
      
Howland, M. F., Ghate, A. S., Quesada, J. B., Pena Martínez, J. J., Zhong, W., Larrañaga, F. P., Lele, S. K., and Dabiri, J. O.: Optimal closed-loop wake steering – Part 2: Diurnal cycle atmospheric boundary layer conditions, Wind Energ. Sci., 7, 345–365, <a href="https://doi.org/10.5194/wes-7-345-2022" target="_blank">https://doi.org/10.5194/wes-7-345-2022</a>, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib28"><label>Hussain et al.(2022)Hussain, Shaukat, Ahmad, Abid, Hashmi, Rajabi,
and Tariq</label><mixed-citation>
      
Hussain, M. N., Shaukat, N., Ahmad, A., Abid, M., Hashmi, A., Rajabi, Z., and
Tariq, M. A. U. R.: Micro-Siting of Wind Turbines in an Optimal Wind Farm
Area Using Teaching–Learning-Based Optimization Technique, Sustainability,
14, 8846, <a href="https://doi.org/10.3390/su14148846" target="_blank">https://doi.org/10.3390/su14148846</a>, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib29"><label>International Electrotechnical
Commission(2005)</label><mixed-citation>
      
International Electrotechnical Commission: IEC 61400-12-1 Wind Turbines-Part 12-1: Power Performance Measurements of Electricity Producing Wind Turbines, IEC – International Electrotechinal Commission, Geneva, Switzerland, 1, <a href="https://webstore.iec.ch/publication/68499" target="_blank"/> (last access: 31 July 2023), 2005.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib30"><label>Kervadec et al.(2019)Kervadec, Dolz, Yuan, Desrosiers, Granger, and
Ayed</label><mixed-citation>
      
Kervadec, H., Dolz, J., Yuan, J., Desrosiers, C., Granger, E., and Ayed, I. B.: Constrained deep networks: Lagrangian optimization via log-barrier
extensions, arXiv [preprint], arXiv:1904.04205, <a href="https://doi.org/10.48550/arXiv.1904.04205" target="_blank">https://doi.org/10.48550/arXiv.1904.04205</a>, 2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib31"><label>Ketkar(2017)</label><mixed-citation>
      
Ketkar, N.: Stochastic gradient descent, in: Deep learning with Python, Springer, 113–132, <a href="https://doi.org/10.1007/978-1-4842-2766-4_8" target="_blank">https://doi.org/10.1007/978-1-4842-2766-4_8</a>, 2017.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib32"><label>King et al.(2020)King, Glaws, Geraci, and
Eldred</label><mixed-citation>
      
King, R., Glaws, A., Geraci, G., and Eldred, M. S.: A probabilistic approach to estimating wind farm annual energy production with bayesian quadrature, in: AIAA Scitech 2020 Forum, 6–10 January 2020, Orlando, Florida, USA, p. 1951, <a href="https://doi.org/10.2514/6.2020-1951" target="_blank">https://doi.org/10.2514/6.2020-1951</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib33"><label>King et al.(2017)King, Dykes, Graf, and
Hamlington</label><mixed-citation>
      
King, R. N., Dykes, K., Graf, P., and Hamlington, P. E.: Optimization of wind
plant layouts using an adjoint approach, Wind Energ. Sci., 2, 115–131,
<a href="https://doi.org/10.5194/wes-2-115-2017" target="_blank">https://doi.org/10.5194/wes-2-115-2017</a>, 2017.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib34"><label>Kingma and Ba(2014)</label><mixed-citation>
      
Kingma, D. P. and Ba, J.: Adam: A method for stochastic optimization, arXiv
[preprint], arXiv:1412.6980, <a href="https://doi.org/10.48550/arXiv.1412.6980" target="_blank">https://doi.org/10.48550/arXiv.1412.6980</a>, 2014.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib35"><label>Kölle et al.(2022)Kölle, Göçmen, Eguinoa,
Alcayaga Román, Aparicio-Sanchez, Feng, Meyers, Pettas, and
Sood</label><mixed-citation>
      
Kölle, K., Göçmen, T., Eguinoa, I., Alcayaga Román, L. A.,
Aparicio-Sanchez, M., Feng, J., Meyers, J., Pettas, V., and Sood, I.:
FarmConners market showcase results: wind farm flow control considering
electricity prices, Wind Energ. Sci., 7, 2181–2200,
<a href="https://doi.org/10.5194/wes-7-2181-2022" target="_blank">https://doi.org/10.5194/wes-7-2181-2022</a>, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib36"><label>Kraft(1988)</label><mixed-citation>
      
Kraft, D.: A software package for sequential quadratic programming,
Forschungsbericht, Deutsche Forschungs- und Versuchsanstalt für Luft- und Raumfahrt, <a href="http://degenerateconic.com/uploads/2018/03/DFVLR_FB_88_28.pdf" target="_blank"/> (last access: 31 July 2023), 1988.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib37"><label>Lam et al.(2018)Lam, Poloczek, Frazier, and
Willcox</label><mixed-citation>
      
Lam, R., Poloczek, M., Frazier, P., and Willcox, K. E.: Advances in Bayesian
optimization with applications in aerospace engineering, in: 2018 AIAA
Non-Deterministic Approaches Conference, 8–12 January 2018, Kissimmee, Florida, p. 1656, <a href="https://doi.org/10.2514/6.2018-1656" target="_blank">https://doi.org/10.2514/6.2018-1656</a>, 2018.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib38"><label>Li and Zhang(2021)</label><mixed-citation>
      
Li, J. and Zhang, M.: Data-based approach for wing shape design optimization,
Aerospace Sci. Technol., 112, 106639, <a href="https://doi.org/10.1016/j.ast.2021.106639" target="_blank">https://doi.org/10.1016/j.ast.2021.106639</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib39"><label>Liu et al.(2018)Liu, Rong, Takác, and
Huang</label><mixed-citation>
      
Liu, J., Rong, Y., Takác, M., and Huang, J.: On the acceleration of l-bfgs with second-order information and stochastic batches, arXiv [preprint], arXiv:1807.05328, <a href="https://doi.org/10.48550/arXiv.1807.05328" target="_blank">https://doi.org/10.48550/arXiv.1807.05328</a>, 2018.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib40"><label>Márquez-Neila et al.(2017)Márquez-Neila, Salzmann, and
Fua</label><mixed-citation>
      
Márquez-Neila, P., Salzmann, M., and Fua, P.: Imposing hard constraints on deep networks: Promises and limitations, arXiv [preprint], arXiv:1706.02025, <a href="https://doi.org/10.48550/arXiv.1706.02025" target="_blank">https://doi.org/10.48550/arXiv.1706.02025</a>, 2017.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib41"><label>Moritz et al.(2016)Moritz, Nishihara, and
Jordan</label><mixed-citation>
      
Moritz, P., Nishihara, R., and Jordan, M.: A linearly-convergent stochastic
L-BFGS algorithm, in: Artificial Intelligence and Statistics, PMLR, 249–258, <a href="https://proceedings.mlr.press/v51/moritz16.html" target="_blank"/> (last access: 31 July 2023), 2016.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib42"><label>Murcia et al.(2015)Murcia, Réthoré, Natarajan, and
Sørensen</label><mixed-citation>
      
Murcia, J., Réthoré, P.-E., Natarajan, A., and Sørensen, J. D.: How many model evaluations are required to predict the AEP of a wind power
plant?, J. Phys.: Conf. Ser., 625, 012030, <a href="https://doi.org/10.1088/1742-6596/625/1/012030" target="_blank">https://doi.org/10.1088/1742-6596/625/1/012030</a>, 2015.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib43"><label>Najafabadi et al.(2017)Najafabadi, Khoshgoftaar, Villanustre, and
Holt</label><mixed-citation>
      
Najafabadi, M. M., Khoshgoftaar, T. M., Villanustre, F., and Holt, J.:
Large-scale distributed l-bfgs, J. Big Data, 4, 1–17, <a href="https://doi.org/10.1186/s40537-017-0084-5" target="_blank">https://doi.org/10.1186/s40537-017-0084-5</a>, 2017.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib44"><label>Najd et al.(2020)Najd, Goksu, and Hammood</label><mixed-citation>
      
Najd, A. H., Goksu, G., and Hammood, H. F.: Pitch angle control using neural
network in wind turbines, Mater. Sci. Eng., 928, 022118,
<a href="https://doi.org/10.1088/1757-899X/928/2/022118" target="_blank">https://doi.org/10.1088/1757-899X/928/2/022118</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib45"><label>Ning. et al.(2020)Ning., Dykes., and Quick</label><mixed-citation>
      
Ning., A., Dykes., K., and Quick, J.: Systems engineering and optimization of
wind turbines and power plants, Wind Energy Modeling and Simulation – Volume 2: Turbine and System, Institution of Engineering and Technology, 235–292, <a href="https://doi.org/10.1049/pbpo125g_ch7" target="_blank">https://doi.org/10.1049/pbpo125g_ch7</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib46"><label>Padrón et al.(2019)Padrón, Thomas, Stanley, Alonso, and
Ning</label><mixed-citation>
      
Padrón, A. S., Thomas, J., Stanley, A. P., Alonso, J. J., and Ning, A.:
Polynomial chaos to efficiently compute the annual energy production in wind
farm layout optimization, Wind Energ. Sci., 4, 211–231,
<a href="https://doi.org/10.5194/wes-4-211-2019" target="_blank">https://doi.org/10.5194/wes-4-211-2019</a>, 2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib47"><label>Pedersen et al.(2019)Pedersen, van der Laan, Friis-Møller, Rinker,
and Réthoré</label><mixed-citation>
      
Pedersen, M. M., van der Laan, P., Friis-Møller, M., Rinker, J., and
Réthoré, P.-E.: DTUWindEnergy/PyWake: PyWake, Zenodo [code], <a href="https://doi.org/10.5281/zenodo.2562662" target="_blank">https://doi.org/10.5281/zenodo.2562662</a>, 2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib48"><label>Qian(1999)</label><mixed-citation>
      
Qian, N.: On the momentum term in gradient descent learning algorithms, Neural Networks, 12, 145–151, <a href="https://doi.org/10.1016/S0893-6080(98)00116-6" target="_blank">https://doi.org/10.1016/S0893-6080(98)00116-6</a>, 1999.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib49"><label>Quick(2023)</label><mixed-citation>
      
Quick, J.: Data Used for Article: Stochastic Gradient Descent for Wind Farm Optimization, Zenodo [data set], <a href="https://doi.org/10.5281/zenodo.8202150" target="_blank">https://doi.org/10.5281/zenodo.8202150</a>, 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib50"><label>Quick et al.(2020)Quick, King, King, Hamlington, and
Dykes</label><mixed-citation>
      
Quick, J., King, J., King, R. N., Hamlington, P. E., and Dykes, K.: Wake
steering optimization under uncertainty, Wind Energ. Sci., 5, 413–426,
<a href="https://doi.org/10.5194/wes-5-413-2020" target="_blank">https://doi.org/10.5194/wes-5-413-2020</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib51"><label>Riedmiller and Braun(1993)</label><mixed-citation>
      
Riedmiller, M. and Braun, H.: A direct adaptive method for faster
backpropagation learning: The RPROP algorithm, in: IEEE international conference on neural networks, 28 March–1 April 1993, San Francisco, California, USA, 586–591, <a href="https://doi.org/10.1109/ICNN.1993.298623" target="_blank">https://doi.org/10.1109/ICNN.1993.298623</a>, 1993.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib52"><label>Riva et al.(2020)Riva, Liew, Friis-Møller, Dimitrov, Barlas,
Réthoré, and Beržonskis</label><mixed-citation>
      
Riva, R., Liew, J., Friis-Møller, M., Dimitrov, N., Barlas, E.,
Réthoré, P.-E., and Beržonskis, A.: Wind farm layout optimization with load constraints using surrogate modelling, J. Phys.: Conf. Ser., 1618, 042035, <a href="https://doi.org/10.1088/1742-6596/1618/4/042035" target="_blank">https://doi.org/10.1088/1742-6596/1618/4/042035</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib53"><label>Rodrigues et al.(2022)Rodrigues, Friis-Møller, Dykes, Pollini, and Jensen</label><mixed-citation>
      
Rodrigues, R. V., Friis-Møller, M., Dykes, K., Pollini, N., and Jensen, M.: A surrogate model of offshore wind farm annual energy production to support financial valuation, J. Phys.: Conf. Ser., 2265, 022003, <a href="https://doi.org/10.1088/1742-6596/2265/2/022003" target="_blank">https://doi.org/10.1088/1742-6596/2265/2/022003</a>, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib54"><label>Rodrigues et al.(2023)Rodrigues, Pedersen, Schøler, Quick, and
Réthoré</label><mixed-citation>
      
Rodrigues, R. V., Pedersen, M. M., Schøler, J. P., Quick, J., and Réthoré, P.: Speeding up large wind farms layout optimization using gradients, parallelization, and a heuristic algorithm for the initial layout, Wind Energ. Sci. Discuss. [preprint], <a href="https://doi.org/10.5194/wes-2023-61" target="_blank">https://doi.org/10.5194/wes-2023-61</a>, in review, 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib55"><label>Roy and Harandi(2017)</label><mixed-citation>
      
Roy, S. K. and Harandi, M.: Constrained Stochastic Gradient Descent: The Good
Practice, in: 2017 International Conference on Digital Image Computing:
Techniques and Applications (DICTA), 29 November–1 December 2017, Sydney, NSW, Australia, 1–8, <a href="https://doi.org/10.1109/DICTA.2017.8227420" target="_blank">https://doi.org/10.1109/DICTA.2017.8227420</a>, 2017.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib56"><label>Ruder(2016)</label><mixed-citation>
      
Ruder, S.: An overview of gradient descent optimization algorithms, arXiv [preprint], <a href="https://doi.org/10.48550/ARXIV.1609.04747" target="_blank">https://doi.org/10.48550/ARXIV.1609.04747</a>, 2016.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib57"><label>Saint-Drenan et al.(2020)Saint-Drenan, Besseau, Jansen, Staffell,
Troccoli, Dubus, Schmidt, Gruber, Simões, and
Heier</label><mixed-citation>
      
Saint-Drenan, Y.-M., Besseau, R., Jansen, M., Staffell, I., Troccoli, A.,
Dubus, L., Schmidt, J., Gruber, K., Simões, S. G., and Heier, S.: A
parametric model for wind turbine power curves incorporating environmental
conditions, Renew. Energy, 157, 754–768, <a href="https://doi.org/10.1016/j.renene.2020.04.123" target="_blank">https://doi.org/10.1016/j.renene.2020.04.123</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib58"><label>Samorani(2013)</label><mixed-citation>
      
Samorani, M.: The wind farm layout optimization problem, Handbook of wind power systems, Springer, 21–38, <a href="https://doi.org/10.1007/978-3-642-41080-2_2" target="_blank">https://doi.org/10.1007/978-3-642-41080-2_2</a>, 2013.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib59"><label>Sanderse(2009)</label><mixed-citation>
      
Sanderse, B.: Aerodynamics of wind turbine wakes, US Department of Energy
Office of Scientific and Technical Information, <a href="https://www.osti.gov/etdeweb/biblio/21162007" target="_blank"/> (last access: 31 July 2023), 2009.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib60"><label>Simley et al.(2023)Simley, Millstein, Jeong, and
Fleming</label><mixed-citation>
      
Simley, E., Millstein, D., Jeong, S., and Fleming, P.: The value of wake steering wind farm control in U.S. energy markets, Wind Energ. Sci. Discuss. [preprint], <a href="https://doi.org/10.5194/wes-2023-12" target="_blank">https://doi.org/10.5194/wes-2023-12</a>, in review, 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib61"><label>Sivanantham and Gopalakrishnan(2022)</label><mixed-citation>
      
Sivanantham, G. and Gopalakrishnan, S.: Stochastic Gradient Descent
Optimization Model for Demand Response in a Connected Microgrid, KSII
Transactions on Internet and Information Systems (TIIS), 16, 97–115,
<a href="https://doi.org/10.3837/tiis.2022.01.006" target="_blank">https://doi.org/10.3837/tiis.2022.01.006</a>, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib62"><label>Stanley et al.(2021)Stanley, Roberts, King, and
Bay</label><mixed-citation>
      
Stanley, A. P., Roberts, O., King, J., and Bay, C. J.: Objective and algorithm considerations when optimizing the number and placement of turbines in a wind power plant, Wind Energ. Sci., 6, 1143–1167,
<a href="https://doi.org/10.5194/wes-6-1143-2021" target="_blank">https://doi.org/10.5194/wes-6-1143-2021</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib63"><label>Stengel et al.(2020)Stengel, Glaws, Hettinger, and
King</label><mixed-citation>
      
Stengel, K., Glaws, A., Hettinger, D., and King, R. N.: Adversarial
super-resolution of climatological wind and solar data, P. Natl. Acad. Sci. USA, 117, 16805–16815, <a href="https://doi.org/10.1073/pnas.1918964117" target="_blank">https://doi.org/10.1073/pnas.1918964117</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib64"><label>Technical University of
Denmark(2019)</label><mixed-citation>
      
Technical University of Denmark: Sophia HPC Cluster,
<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.bib65"><label>Tian et al.(2023)Tian, Zhang, and Zhang</label><mixed-citation>
      
Tian, Y., Zhang, Y., and Zhang, H.: Recent Advances in Stochastic Gradient
Descent in Deep Learning, Mathematics, 11, 682, <a href="https://doi.org/10.3390/math11030682" target="_blank">https://doi.org/10.3390/math11030682</a>,
2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib66"><label>van der Laan et al.(2023)van der Laan, García-Santiago, Kelly,
Meyer Forsting, Dubreuil-Boisclair, Seim, Imberger, Peña, Sørensen,
and Réthoré</label><mixed-citation>
      
van der Laan, M. P., García-Santiago, O., Kelly, M., Meyer Forsting, A., Dubreuil-Boisclair, C., Sponheim Seim, K., Imberger, M., Peña, A., Sørensen, N. N., and Réthoréé, P.-E.: A new RANS-based wind farm parameterization and inflow model for wind farm cluster modeling, Wind Energ. Sci., 8, 819–848, <a href="https://doi.org/10.5194/wes-8-819-2023" target="_blank">https://doi.org/10.5194/wes-8-819-2023</a>, 2023.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib67"><label>Virtanen et al.(2020)Virtanen, Gommers, Oliphant, Haberland, Reddy,
Cournapeau, Burovski, Peterson, Weckesser, Bright, van der Walt, Brett,
Wilson, Millman, Mayorov, Nelson, Jones, Kern, Larson, Carey, Polat, Feng,
Moore, VanderPlas, Laxalde, Perktold, Cimrman, Henriksen, Quintero, Harris, Archibald, Ribeiro, Pedregosa, van Mulbregt, and SciPy 1.0
Contributors</label><mixed-citation>
      
Virtanen, P., Gommers, R., Oliphant, T. E., Haberland, M., Reddy, T.,
Cournapeau, D., Burovski, E., Peterson, P., Weckesser, W., Bright, J., van
der Walt, S. J., Brett, M., Wilson, J., Millman, K. J., Mayorov, N., Nelson,
A. R. J., Jones, E., Kern, R., Larson, E., Carey, C. J., Polat, İ., Feng,
Y., Moore, E. W., VanderPlas, J., Laxalde, D., Perktold, J., Cimrman, R.,
Henriksen, I., Quintero, E. A., Harris, C. R., Archibald, A. M., Ribeiro,
A. H., Pedregosa, F., van Mulbregt, P., and SciPy 1.0 Contributors: SciPy 1.0: Fundamental Algorithms for Scientific Computing in Python, Nat. Meth., 17, 261–272, <a href="https://doi.org/10.1038/s41592-019-0686-2" target="_blank">https://doi.org/10.1038/s41592-019-0686-2</a>, 2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib68"><label>Wu et al.(2020)Wu, Kenway, Mader, Jasa, and
Martins</label><mixed-citation>
      
Wu, N., Kenway, G., Mader, C. A., Jasa, J., and Martins, J. R.: pyOptSparse: A Python framework for large-scale constrained nonlinear optimization of sparse systems, J. Open Sour. Softw., 5, 2564, <a href="https://doi.org/10.21105/joss.02564" target="_blank">https://doi.org/10.21105/joss.02564</a>,
2020.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib69"><label>You et al.(2019)You, Long, Wang, and Jordan</label><mixed-citation>
      
You, K., Long, M., Wang, J., and Jordan, M. I.: How does learning rate decay
help modern neural networks?, arXiv [preprint], arXiv:1908.01878,
<a href="https://doi.org/10.48550/arXiv.1908.01878" target="_blank">https://doi.org/10.48550/arXiv.1908.01878</a>, 2019.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib70"><label>Zhang et al.(2022)Zhang, Kramer, Angeloudis, Zhang, Lin, and
Piggott</label><mixed-citation>
      
Zhang, C., Kramer, S. C., Angeloudis, A., Zhang, J., Lin, X., and Piggott,
M. D.: Improving tidal turbine array performance through the optimisation of
layout and yaw angles, Int. Mar. Energ. J., 5, 273–280,
<a href="https://doi.org/10.36688/imej.5.273-280" target="_blank">https://doi.org/10.36688/imej.5.273-280</a>, 2022.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib71"><label>Zhang and Zhao(2022)</label><mixed-citation>
      
Zhang, J. and Zhao, X.: Wind farm wake modeling based on deep convolutional
conditional generative adversarial network, Energy, 238, 121747,
<a href="https://doi.org/10.1016/j.energy.2021.121747" target="_blank">https://doi.org/10.1016/j.energy.2021.121747</a>, 2022.


    </mixed-citation></ref-html>
<ref-html id="bib1.bib72"><label>Zhang et al.(2021)Zhang, Santoni, Herges, Sotiropoulos, and
Khosronejad</label><mixed-citation>
      
Zhang, Z., Santoni, C., Herges, T., Sotiropoulos, F., and Khosronejad, A.:
Time-averaged wind turbine wake flow field prediction using autoencoder
convolutional neural networks, Energies, 15, 41, <a href="https://doi.org/10.3390/en15010041" target="_blank">https://doi.org/10.3390/en15010041</a>, 2021.

    </mixed-citation></ref-html>
<ref-html id="bib1.bib73"><label>Zilong and Wei(2022)</label><mixed-citation>
      
Zilong, T. and Wei, D. X.: Layout optimization of offshore wind farm
considering spatially inhomogeneous wave loads, Appl. Energy, 306, 117947, <a href="https://doi.org/10.1016/j.apenergy.2021.117947" target="_blank">https://doi.org/10.1016/j.apenergy.2021.117947</a>, 2022.

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