<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2024-08-28T07:29:48+00:00</updated><id>/feed.xml</id><title type="html">Debate-A-Mejl</title><subtitle>Some fun projects in various topics.</subtitle><entry><title type="html">Weekly Notes</title><link href="/multiscale/2024/08/22/weekly-notes.html" rel="alternate" type="text/html" title="Weekly Notes" /><published>2024-08-22T13:33:00+00:00</published><updated>2024-08-22T13:33:00+00:00</updated><id>/multiscale/2024/08/22/weekly-notes</id><content type="html" xml:base="/multiscale/2024/08/22/weekly-notes.html"><![CDATA[<h3 id="2024">2024</h3>

<h4 id="aug-19---23">Aug 19 - 23</h4>

<p>Main goals</p>
<ul>
  <li>Breakdown of error discrepancy
    <ul>
      <li>Data variance, parameterization style (gauss-leg, uniform, arc), model invariance</li>
      <li>TODO:
        <ul>
          <li>a) Old training, old geometry, old data gen, G-L - RMSE = 1% error</li>
          <li>b) Old training, old geometry, old data gen, both riesz, G-L - RMSE = 2%</li>
          <li>c) Old training, old geometry, new data gen, G-L - RMSE = 7%</li>
          <li>d) Old training, old geometry, new data gen, Arc - RMSE = 7%</li>
          <li>e) Old training, old geometry, new data gen, Uni - RMSE = 4%</li>
          <li>f) Old training, new geometry, new data gen, G-L - RMSE =</li>
          <li>g) Old training, new geometry, new data gen, Uni - RMSE =</li>
          <li>h) New training, new geometry, new data gen, G-L - RMSE =</li>
          <li>i) New training, new geometry, new data gen, Arc - RMSE = 
a vs c shows high variance data, c vs d vs e shows parameterization, c vs f shows new geometry,</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Second draft
    <ul>
      <li>Figures are done</li>
      <li>Theory
        <ul>
          <li>Computational complexity</li>
          <li>Stability of iterations</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>New direction
    <ul>
      <li>Inversa problem?
        <ul>
          <li>Prata med Shervin Bagheri</li>
          <li>Multiskaligt?
            <ul>
              <li>Seismic imaging (elastiska vågekv / elektromagnetism)</li>
              <li>Vågutbrednin gaussian beams</li>
              <li>Travel time tomography</li>
            </ul>
          </li>
          <li>Vågfrontsmängden
            <ul>
              <li>Signal och operator som verkar</li>
              <li>Hur propagerar singulariteter under operatorn</li>
            </ul>
          </li>
        </ul>
      </li>
      <li><b> Learned Homogenization:</b>
        <ul>
          <li>Multiscale methods for Fredholm integral equations - Book</li>
          <li>Homogenization as an operator learning problem \(A_\epsilon \mapsto \tilde A\)</li>
          <li>Homogenization of Fredholm integral operators on rough surfaces: \(K_\epsilon (I - K_\epsilon)\sigma_\epsilon \approx \tilde K(I - \tilde K)\tilde\sigma.\) Reading about wavelets and representations using isometries. Possibly homogenize using sparse wavelet strategy? How to do that without needing to compare on all levels. Reinforcement learning</li>
          <li>Possible colab with phillip scholl</li>
        </ul>
      </li>
      <li><b> Game theory perspective on optimization </b>
        <ul>
          <li>Reinforcement learning</li>
          <li>Placement of computational boxes in HMM -&gt; Heterogeneous problems</li>
          <li>Mart</li>
        </ul>
      </li>
      <li><b> Natural gradient boosting (marius, also open to other collab) </b>
        <ul>
          <li>Finish up the code, is it useful? How to regularize</li>
        </ul>
      </li>
      <li><b> Reading </b>
        <ul>
          <li>Multiscale methods for Fredholm integral equations - Book</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>]]></content><author><name>Emanuel</name></author><category term="multiscale" /><summary type="html"><![CDATA[Weekly Progess Notes.]]></summary></entry><entry><title type="html">Coarse FEM comparison</title><link href="/multiscale/2023/04/27/olof_mail.html" rel="alternate" type="text/html" title="Coarse FEM comparison" /><published>2023-04-27T06:34:51+00:00</published><updated>2023-04-27T06:34:51+00:00</updated><id>/multiscale/2023/04/27/olof_mail</id><content type="html" xml:base="/multiscale/2023/04/27/olof_mail.html"><![CDATA[<h1 id="jämförelse-hmm---fem---randintegralmetod">Jämförelse HMM - FEM - Randintegralmetod</h1>

<p>Nedan visas diskretiseringen av domänen för de olika metoderna</p>

<h2 id="grov-fem-lösning">Grov FEM-lösning:</h2>
<p>Vi löser med FEniCS, periodiska randvillkor i x-riktningen. Den streckade linjen visar var vi ska evaluera lösningarna för jämförelsen.
<img src="/assets/posts/2023-04-27-olof_mail/domain_FEM_low.png" alt="png" /></p>

<h3 id="fin-fem-lösning">Fin FEM-lösning:</h3>
<p><img src="/assets/posts/2023-04-27-olof_mail/domain_FEM.png" alt="png" /></p>

<h3 id="hmm-lösning">HMM-lösning</h3>
<p>Spektral metod med Navier-slip koppling mellan mikro och makro, 5 st mikroproblem, vardera med storleken 5.13 epsilon (för att undvika heltal så att frekvensen matchas exakt)
<img src="/assets/posts/2023-04-27-olof_mail/domain_hmm.png" alt="png" /></p>

<h3 id="lösning">Lösning</h3>
<p>Nedan visas lösningarna längsmed den streckade linjen i figur 1. 
<img src="/assets/posts/2023-04-27-olof_mail/domain_line.png" alt="png" /></p>]]></content><author><name>Emanuel</name></author><category term="multiscale" /><summary type="html"><![CDATA[Comparing coarse FEM solution of Stokes flow with HMM.]]></summary></entry><entry><title type="html">HMM Stokes</title><link href="/hmm/solver/iterative/2023/02/26/hmm_stokes.html" rel="alternate" type="text/html" title="HMM Stokes" /><published>2023-02-26T21:34:51+00:00</published><updated>2023-02-26T21:34:51+00:00</updated><id>/hmm/solver/iterative/2023/02/26/hmm_stokes</id><content type="html" xml:base="/hmm/solver/iterative/2023/02/26/hmm_stokes.html"><![CDATA[<h2 id="stokes-flow-in-periodic-channel-with-robin-boundary">Stokes Flow in Periodic Channel with Robin boundary.</h2>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">sys</span>
<span class="n">sys</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="s">'/home/emastr/phd/'</span><span class="p">)</span>

<span class="kn">import</span> <span class="nn">torch</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="kn">from</span> <span class="nn">stokes2d.robin_solver</span> <span class="kn">import</span> <span class="n">testSolve</span><span class="p">,</span> <span class="n">solveRobinStokes_fromFunc</span>
<span class="kn">from</span> <span class="nn">util.plot_tools</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">boundary_solvers.geometry</span> <span class="kn">import</span> <span class="n">MacroGeom</span>
</code></pre></div></div>

<h2 id="multiscale-problem">Multiscale Problem</h2>

<p>We define a multiscale problem as follows. The PDE is a non-slip zero forcing Stokes flow Problem</p>

\[\Delta u  - \nabla p = 0, \qquad \qquad \nabla \cdot u = 0   \qquad \text{inside}\quad \Omega\]

<p>with the boundary conditions</p>

\[u = g,\qquad \text{on}\quad\partial\Omega\]

<p>the boundary is a two-dimensional pipe with corners at (0,-1) and (1,1), and a micro scale boundary:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">hmm.stokes</span> <span class="kn">import</span> <span class="n">StokesMacProb</span><span class="p">,</span> <span class="n">StokesMicProb</span><span class="p">,</span> <span class="n">trig_interp</span><span class="p">,</span> <span class="n">StokesData</span><span class="p">,</span> <span class="n">StokesHMMProblem</span>
<span class="kn">from</span> <span class="nn">hmm.stokes</span> <span class="kn">import</span> <span class="n">MacroSolver</span><span class="p">,</span> <span class="n">MicroSolver</span><span class="p">,</span> <span class="n">IterativeHMMSolver</span>
<span class="kn">from</span> <span class="nn">util.plot_tools</span> <span class="kn">import</span> <span class="o">*</span>

<span class="n">eps</span> <span class="o">=</span> <span class="mf">0.02</span>
<span class="n">k</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="mi">1</span> <span class="o">/</span> <span class="n">eps</span> <span class="o">/</span> <span class="mi">4</span><span class="p">)</span> <span class="o">*</span> <span class="mi">4</span>

<span class="n">A</span> <span class="o">=</span> <span class="mf">0.5</span>
<span class="n">h</span> <span class="o">=</span> <span class="mf">1.5</span>
<span class="n">f</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">eps</span> <span class="o">*</span> <span class="p">(</span><span class="o">-</span><span class="n">h</span> <span class="o">+</span> <span class="n">A</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="n">cos</span><span class="p">(</span><span class="n">k</span><span class="o">*</span><span class="n">x</span><span class="p">))</span> <span class="c1">#1.6
</span><span class="n">df</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="o">-</span><span class="n">eps</span> <span class="o">*</span> <span class="n">k</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="n">sin</span><span class="p">(</span><span class="n">k</span><span class="o">*</span><span class="n">x</span><span class="p">)</span> <span class="o">*</span> <span class="n">A</span>
<span class="n">ddf</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="o">-</span><span class="n">eps</span> <span class="o">*</span> <span class="p">(</span><span class="n">k</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="n">cos</span><span class="p">(</span><span class="n">k</span><span class="o">*</span><span class="n">x</span><span class="p">)</span> <span class="o">*</span> <span class="n">A</span>
<span class="n">g</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="mi">1</span><span class="o">+</span><span class="n">np</span><span class="p">.</span><span class="n">sin</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">np</span><span class="p">.</span><span class="n">pi</span> <span class="o">*</span> <span class="n">x</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.0</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">StokesData</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">df</span><span class="p">,</span> <span class="n">ddf</span><span class="p">,</span> <span class="n">g</span><span class="p">)</span>

<span class="n">plt</span><span class="p">.</span><span class="n">figure</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>
<span class="n">plt</span><span class="p">.</span><span class="n">title</span><span class="p">(</span><span class="s">"Multi Scale Domain"</span><span class="p">)</span>
<span class="n">data</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">plt</span><span class="p">.</span><span class="n">gca</span><span class="p">())</span>
<span class="n">remove_axes</span><span class="p">(</span><span class="n">plt</span><span class="p">.</span><span class="n">gca</span><span class="p">())</span>
<span class="n">plt</span><span class="p">.</span><span class="n">axis</span><span class="p">(</span><span class="s">"equal"</span><span class="p">)</span>

</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(-0.05, 1.05, -1.1419995844364166, 1.101999980211258)
</code></pre></div></div>

<p><img src="/assets/posts/2023-02-27-hmm_stokes/output_3_1.png" alt="png" /></p>

<h2 id="coupling-to-micro-domain">Coupling to Micro Domain</h2>

<p>To couple the macro domain to the microscopic domain, we make use of the HMM framework.
We construct a set of evenly spaced micro problems based on the Stokes data. The macro problem is constructed with a pre-specified resolution in the x- and y-directions.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Macro problem
</span><span class="n">xDim</span> <span class="o">=</span> <span class="mi">21</span>
<span class="n">yDim</span> <span class="o">=</span> <span class="mi">23</span>
<span class="n">iDeg</span> <span class="o">=</span> <span class="mi">13</span> <span class="c1">#nMic*2 +1
</span><span class="n">macro</span> <span class="o">=</span> <span class="n">StokesMacProb</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">,</span><span class="n">a</span><span class="p">:</span> <span class="n">trig_interp</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">a</span><span class="p">,</span> <span class="n">iDeg</span><span class="p">))</span>

<span class="c1"># Micro problems
</span><span class="n">nMic</span> <span class="o">=</span> <span class="mi">9</span>
<span class="n">xPos</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">4</span><span class="o">*</span><span class="n">eps</span><span class="p">,</span> <span class="mi">1</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">eps</span><span class="p">,</span> <span class="n">nMic</span><span class="p">)</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">eps</span>
<span class="n">micros</span> <span class="o">=</span> <span class="p">[</span><span class="n">StokesMicProb</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="mi">3</span><span class="o">*</span><span class="n">eps</span><span class="p">,</span> <span class="mi">3</span><span class="o">*</span><span class="n">eps</span><span class="p">,</span> <span class="mf">0.01</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">xPos</span><span class="p">]</span>

<span class="c1"># Hmm problem.
</span><span class="n">hmm_prob</span> <span class="o">=</span> <span class="n">StokesHMMProblem</span><span class="p">(</span><span class="n">macro</span><span class="p">,</span> <span class="n">micros</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>

<span class="c1">## PLOT ##
</span>
<span class="n">plt</span><span class="p">.</span><span class="n">figure</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">15</span><span class="p">,</span><span class="mi">5</span><span class="p">))</span>

<span class="n">plt</span><span class="p">.</span><span class="n">subplot2grid</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">4</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="n">colspan</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="n">title</span><span class="p">(</span><span class="s">"Multi Scale Problem"</span><span class="p">)</span>
<span class="n">hmm_prob</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">plt</span><span class="p">.</span><span class="n">gca</span><span class="p">())</span>
<span class="n">plt</span><span class="p">.</span><span class="n">axis</span><span class="p">(</span><span class="s">"Equal"</span><span class="p">)</span>
<span class="n">remove_axes</span><span class="p">(</span><span class="n">plt</span><span class="p">.</span><span class="n">gca</span><span class="p">())</span>

<span class="n">plt</span><span class="p">.</span><span class="n">subplot2grid</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">4</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">),</span> <span class="n">colspan</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="n">title</span><span class="p">(</span><span class="s">"Micro Problem Positions"</span><span class="p">)</span>
<span class="n">hmm_prob</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">plt</span><span class="p">.</span><span class="n">gca</span><span class="p">())</span>
<span class="n">plt</span><span class="p">.</span><span class="n">axis</span><span class="p">(</span><span class="s">"Equal"</span><span class="p">)</span>
<span class="n">remove_axes</span><span class="p">(</span><span class="n">plt</span><span class="p">.</span><span class="n">gca</span><span class="p">())</span>
<span class="n">plt</span><span class="p">.</span><span class="n">xlim</span><span class="p">([</span><span class="o">-</span><span class="n">eps</span><span class="p">,</span><span class="mi">1</span> <span class="o">+</span> <span class="n">eps</span><span class="p">])</span>
<span class="n">plt</span><span class="p">.</span><span class="n">ylim</span><span class="p">([</span><span class="o">-</span><span class="mi">1</span><span class="o">-</span><span class="mi">1</span><span class="o">*</span><span class="n">eps</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="o">+</span><span class="mi">6</span><span class="o">*</span><span class="n">eps</span><span class="p">])</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(-1.02, -0.88)
</code></pre></div></div>

<p><img src="/assets/posts/2023-02-27-hmm_stokes/output_5_1.png" alt="png" /></p>

<h2 id="solving-using-hmm-iterations">Solving using HMM iterations</h2>

<p>To solve the problem, we make use of a sequence of micro solvers, as well as a micro solver.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Callback</span><span class="p">():</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">macro</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">N</span> <span class="o">=</span> <span class="mi">100</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="bp">self</span><span class="p">.</span><span class="n">N</span><span class="p">)</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">macro</span> <span class="o">=</span> <span class="n">macro</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">current_alpha</span> <span class="o">=</span> <span class="n">macro</span><span class="p">.</span><span class="n">alpha</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">x</span><span class="p">)</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">diff</span> <span class="o">=</span> <span class="p">[]</span>
    
    <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">it</span><span class="p">,</span> <span class="n">macro_sol</span><span class="p">,</span> <span class="n">micro_sols</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">previous_alpha</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">current_alpha</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">current_alpha</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">macro</span><span class="p">.</span><span class="n">alpha</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">x</span><span class="p">)</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">diff</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">linalg</span><span class="p">.</span><span class="n">norm</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">previous_alpha</span> <span class="o">-</span> <span class="bp">self</span><span class="p">.</span><span class="n">current_alpha</span><span class="p">)</span> <span class="o">/</span> <span class="bp">self</span><span class="p">.</span><span class="n">N</span><span class="o">**</span><span class="mf">0.5</span><span class="p">)</span>
        
<span class="n">debug_cb</span> <span class="o">=</span> <span class="n">Callback</span><span class="p">(</span><span class="n">macro</span><span class="p">)</span>

<span class="k">print</span><span class="p">(</span><span class="s">"Precomputing..."</span><span class="p">)</span>
<span class="n">macro_solver</span> <span class="o">=</span> <span class="n">MacroSolver</span><span class="p">(</span><span class="n">xDim</span><span class="p">,</span> <span class="n">yDim</span><span class="p">)</span>
<span class="n">micro_solvers</span> <span class="o">=</span> <span class="p">[</span><span class="n">MicroSolver</span><span class="p">(</span><span class="n">m</span><span class="p">)</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">micros</span><span class="p">]</span>
<span class="n">hmm_solver</span> <span class="o">=</span> <span class="n">IterativeHMMSolver</span><span class="p">(</span><span class="n">macro_solver</span><span class="p">,</span> <span class="n">micro_solvers</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Done"</span><span class="p">)</span>


<span class="k">print</span><span class="p">(</span><span class="s">"HMM Solver..."</span><span class="p">)</span>
<span class="n">macro_guess</span> <span class="o">=</span> <span class="n">macro_solver</span><span class="p">.</span><span class="n">solve</span><span class="p">(</span><span class="n">macro</span><span class="p">)</span>
<span class="p">(</span><span class="n">macro_sol</span><span class="p">,</span> <span class="n">micro_sols</span><span class="p">)</span> <span class="o">=</span> <span class="n">hmm_solver</span><span class="p">.</span><span class="n">solve</span><span class="p">(</span><span class="n">hmm_prob</span><span class="p">,</span> <span class="n">macro_guess</span><span class="o">=</span><span class="n">macro_guess</span><span class="p">,</span> 
                                           <span class="n">callback</span><span class="o">=</span><span class="n">debug_cb</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">maxiter</span><span class="o">=</span><span class="mi">7</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">Done"</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Precomputing...
Done
HMM Solver...
Step 6/7
Done
</code></pre></div></div>

<h2 id="convergence-study-for-slip-coefficient">Convergence study for slip coefficient</h2>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">plt</span><span class="p">.</span><span class="n">figure</span><span class="p">()</span>
<span class="n">plt</span><span class="p">.</span><span class="n">title</span><span class="p">(</span><span class="s">"RMS of difference between iterates"</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="n">semilogy</span><span class="p">(</span><span class="n">debug_cb</span><span class="p">.</span><span class="n">diff</span><span class="p">,</span> <span class="s">'b*--'</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s">"Iterate n"</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s">"RMS of a_n - a_(n+1)"</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Text(0, 0.5, 'RMS of a_n - a_(n+1)')
</code></pre></div></div>

<p><img src="/assets/posts/2023-02-27-hmm_stokes/output_9_1.png" alt="png" /></p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">plt</span><span class="p">.</span><span class="n">figure</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>

<span class="n">plt</span><span class="p">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">121</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="n">axis</span><span class="p">(</span><span class="s">"equal"</span><span class="p">)</span>
<span class="n">hmm_prob</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">plt</span><span class="p">.</span><span class="n">gca</span><span class="p">())</span>
<span class="n">macro_sol</span><span class="p">.</span><span class="n">u</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">plt</span><span class="p">.</span><span class="n">gca</span><span class="p">())</span>
<span class="n">macro_sol</span><span class="p">.</span><span class="n">plot_stream</span><span class="p">(</span><span class="n">plt</span><span class="p">.</span><span class="n">gca</span><span class="p">(),</span> <span class="n">color</span><span class="o">=</span><span class="s">"white"</span><span class="p">)</span>

<span class="n">plt</span><span class="p">.</span><span class="n">subplot</span><span class="p">(</span><span class="mi">122</span><span class="p">)</span>
<span class="n">micros</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">plot</span><span class="p">(</span><span class="n">plt</span><span class="p">.</span><span class="n">gca</span><span class="p">())</span>
<span class="n">micros</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">geom</span><span class="p">.</span><span class="n">plot_field_on_boundary</span><span class="p">(</span><span class="n">plt</span><span class="p">.</span><span class="n">gca</span><span class="p">(),</span> <span class="n">micros</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">condition</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="n">axis</span><span class="p">(</span><span class="s">"equal"</span><span class="p">)</span>

<span class="n">plt</span><span class="p">.</span><span class="n">figure</span><span class="p">()</span>
<span class="n">plt</span><span class="p">.</span><span class="n">title</span><span class="p">(</span><span class="s">"Alpha"</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">100</span><span class="p">)</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">macro</span><span class="p">.</span><span class="n">alpha</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
<span class="n">xm</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">array</span><span class="p">([</span><span class="n">sol</span><span class="p">.</span><span class="n">x</span> <span class="k">for</span> <span class="n">sol</span> <span class="ow">in</span> <span class="n">micro_sols</span><span class="p">])</span>
<span class="n">am</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">array</span><span class="p">([</span><span class="n">sol</span><span class="p">.</span><span class="n">alpha</span> <span class="k">for</span> <span class="n">sol</span> <span class="ow">in</span> <span class="n">micro_sols</span><span class="p">])</span>
<span class="n">plt</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">xm</span><span class="p">,</span> <span class="n">am</span><span class="p">)</span>
<span class="c1">#print(macro.alpha)
</span>
<span class="c1">#plt.figure(figsize=(10,6))
#plt.title("Condition")
#t = np.linspace(0,2*np.pi, 300)
#v = micros[0].condition(t)
#plt.plot(t, np.real(v))
#plt.plot(t, np.imag(v))
#plt.xlim([1,3])
</span></code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[&lt;matplotlib.lines.Line2D at 0x7fa5cd550100&gt;]
</code></pre></div></div>

<p><img src="/assets/posts/2023-02-27-hmm_stokes/output_10_1.png" alt="png" /></p>

<p><img src="/assets/posts/2023-02-27-hmm_stokes/output_10_2.png" alt="png" /></p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">scipy.io</span> <span class="kn">import</span> <span class="n">loadmat</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>

<span class="n">matf</span> <span class="o">=</span> <span class="n">loadmat</span><span class="p">(</span><span class="s">"/home/emastr/phd/data/reference/run_24.mat"</span><span class="p">,</span> <span class="n">struct_as_record</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">info</span> <span class="o">=</span> <span class="n">matf</span><span class="p">[</span><span class="s">'info'</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="n">Uc</span> <span class="o">=</span> <span class="n">info</span><span class="p">[</span><span class="s">'Uc'</span><span class="p">]</span>
<span class="n">Vc</span> <span class="o">=</span> <span class="n">info</span><span class="p">[</span><span class="s">'Vc'</span><span class="p">]</span>
<span class="n">mask</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">isnan</span><span class="p">(</span><span class="n">Uc</span><span class="p">)</span>
<span class="n">Uc</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">where</span><span class="p">(</span><span class="n">mask</span><span class="p">,</span> <span class="o">-</span><span class="n">np</span><span class="p">.</span><span class="n">ones_like</span><span class="p">(</span><span class="n">Uc</span><span class="p">),</span> <span class="n">Uc</span><span class="p">)</span>
<span class="n">X</span> <span class="o">=</span> <span class="n">info</span><span class="p">[</span><span class="s">'X'</span><span class="p">]</span>
<span class="n">Y</span> <span class="o">=</span> <span class="n">info</span><span class="p">[</span><span class="s">'Y'</span><span class="p">]</span>

<span class="n">plt</span><span class="p">.</span><span class="n">figure</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">15</span><span class="p">,</span><span class="mi">5</span><span class="p">))</span>
<span class="n">plt</span><span class="p">.</span><span class="n">imshow</span><span class="p">(</span><span class="n">Uc</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="p">::</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">vmin</span><span class="o">=-</span><span class="mf">0.5</span><span class="p">,</span> <span class="n">vmax</span><span class="o">=</span><span class="mf">0.5</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="n">ylim</span><span class="p">([</span><span class="mi">220</span><span class="p">,</span> <span class="mi">100</span><span class="p">])</span>

</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(220.0, 100.0)
</code></pre></div></div>

<p><img src="/assets/posts/2023-02-27-hmm_stokes/output_11_1.png" alt="png" /></p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>

</code></pre></div></div>]]></content><author><name>Emanuel</name></author><category term="hmm" /><category term="solver" /><category term="iterative" /><summary type="html"><![CDATA[Showcase of HMM on periodic stokes flow.]]></summary></entry><entry><title type="html">Multi Scale Methods</title><link href="/multiscale/2023/02/26/multi-scale-methods.html" rel="alternate" type="text/html" title="Multi Scale Methods" /><published>2023-02-26T21:34:51+00:00</published><updated>2023-02-26T21:34:51+00:00</updated><id>/multiscale/2023/02/26/multi-scale-methods</id><content type="html" xml:base="/multiscale/2023/02/26/multi-scale-methods.html"><![CDATA[<h2 id="multi-scale-problems">Multi Scale problems</h2>

<p>Below is a list of useful literature on the subject, along with comments.</p>

<h4 id="literature">Literature</h4>
<ul>
  <li>
    <p><a href="https://link.springer.com/book/10.1007/978-3-540-88857-4">Tutorials in multi scale problems by Runborg et al.</a>
 Some tutorials on Multi Scale Simulations (FMM, Wavelet analysis.) The one on Wavelet analysis is interesting (Runborg.)</p>
  </li>
  <li>
    <p><a href="https://link.springer.com/book/10.1007/978-0-387-09496-0">Introductory book</a><br />
 Homogenization recap in Appendix B:
 Typically a problem of the form</p>

    <p>$
    \nabla \cdot (a(x/\epsilon) \nabla u(x)) + a_0(x/\epsilon) u(x) = f(x), \implies L_\epsilon u = f
 $</p>

    <p>where $a$ and $a_0$ are 1-periodic functions. Goal is to study the limit as $\epsilon \to 0$. Homogenisation theory is <strong>not</strong> what we are interested in. Instead, we want to minimize error of a low resolution approximation, at a nonzero $\epsilon$. Of course we still want convergence to homogenized solution as $\epsilon \to 0$. The 1-d homogenization consists of taking the harmonic average.</p>

    <p>The standard assumption seems to be periodic multi scale:</p>

    <p>$
    u(x) = \tilde{u}(x) + \phi(x/\epsilon),
 $</p>

    <p>where $\tilde{u}$ and $\phi$ are periodic, and $\tilde{u}$ is band limited to some large scale $»1/\epsilon$.</p>
  </li>
</ul>]]></content><author><name>Emanuel</name></author><category term="multiscale" /><summary type="html"><![CDATA[Summary of multi scale problems and methods.]]></summary></entry><entry><title type="html">Spectral Robin Solvers</title><link href="/multiscale/2023/02/26/spectral-robin-solvers.html" rel="alternate" type="text/html" title="Spectral Robin Solvers" /><published>2023-02-26T21:34:51+00:00</published><updated>2023-02-26T21:34:51+00:00</updated><id>/multiscale/2023/02/26/spectral-robin-solvers</id><content type="html" xml:base="/multiscale/2023/02/26/spectral-robin-solvers.html"><![CDATA[<h2 id="spectral-solvers-with-variable-robin-boundary-conditions">Spectral solvers with Variable Robin Boundary Conditions.</h2>
<ul>
  <li><a href="">Thesis from KTH Mechanics</a>, discusses Non homogeneous but not variable coefficients. Erik Boström, thesis. BC for Spec sim of atm. Bound layers</li>
  <li>Spectral element methods: recent dev. applications, perspectives.</li>
  <li>Pip suggested articles: <a href="https://www.sciencedirect.com/science/article/pii/S0045793015002777?via%3Dihub">Imposing D-N-R condition in level-set</a>, constant $\alpha$.<a href="https://www.sciencedirect.com/science/article/pii/S146350032100086X">Stress-free bc over deformed bathymetry</a> seems more like what we want.</li>
</ul>

<h2 id="hmm">HMM</h2>

<p>Hmm in this case gives us a lot of control. As the number of micro domains tends to infinity, and their sizes tends to zero,
we will converge very close to the true solution (depending on how accurate our boundary extrapolation is). Where do we then choose the cutoff?</p>

<h2 id="wall-models-for-cfd">Wall models for CFD</h2>
<ul>
  <li>Wall $f\colon [0,1] \to \mathbb{R}$ is viewed as a function of a random variable $Y = f(X)$, where $X\sim U[0,1]$. Moments of $f$ will hence be of the form
\(\mathbb{E}[\phi(Y)] = \int_0^1 \phi(f(x))\mathrm{d}x\)
These are interpreted as shape parameters. For example, the moments $\mathbb{E}[|Y|^m]$ are often used. A nice interpretation is that the integer moments are adding information about the measure $\mu_Y = \mu_x \circ f^{-1}$, since
\(\hat p_Y(\omega) = \sum_{n=0}^{\infty} \frac{\mathbb{E}[Y^n]\omega^n}{n!}.\)
However, it does not provide information about the regularity of $f$, such as it’s slope characteristics (for example, changing the period does not affect the moments). For such information, one can instead look at the moments of $f’$.
<a href="https://en.wikipedia.org/wiki/Surface_roughness">Wiki article on surface roughness</a>. We can likely choose a scale below which we interpret as roughness. How do we choose such a scale? Density parameters say little to nothing about the frequency.</li>
  <li>Reynolds number Re is $\frac{U\cdot L}{\nu}$, where $U$ is characteristic velocity, $L$ is characteristic scale, and $\nu$ is the kinematic viscocity. We see that $Re$ increases if $U$ increases, but also if $L$ increases. For example, flow around a large cylinder has to have lower rate to be laminar than flow around a tiny grain of dust. Wetted surface is the part that is in contact with the flow.</li>
  <li><a href="https://reader.elsevier.com/reader/sd/pii/S0017931009001483?token=D18FA33E7133CAC9FDE00008F2285AF7483F0C21E931A369B41D29783F67025CAEC49BA0EB1708C37104EE8F58E81D93&amp;originRegion=eu-west-1&amp;originCreation=20230410120744">Multi Scale Coupling for Rough Reactive Boundary</a>. Calculate an effective wall height where they then put no-slip conditions. This is an alternative way. Note that the computational domain will change.</li>
  <li><a href="https://www.cfd-online.com/Wiki/Introduction_to_turbulence/Wall_bounded_turbulent_flows">Wall bounded turbulence</a>. Prandtl was first to suggest that the viscous term must persist at the boundary, otherwise no-slip cannot be satisfied. Eulerian flow can satisfy no-penetration, but will necessitate slippage at the boundary.</li>
  <li><a href="https://timreis.org/navier-slip/">Navier slip condition</a> states that the tangential velocity is proportional to the normal derivative of the velocity.The constant of proportionality is called the “slip length”, we call it $\alpha$. Holds for laminar incompressible flows (Re &lt; 1). This typically holds when the roughness does not protrude into the viscous or turbulent sublayer. Instead, we need to assume that stationary stokes flow holds.
    <ul>
      <li>Periodic Boundaries
        <ul>
          <li><a href="https://www.sarkarkausik.com/pdf/sar_1235195_6369.pdf">Effective condition viscous (laminar) flow over randomly embossed surface</a>. Justify navier slip.</li>
          <li><a href="https://www.sciencedirect.com/science/article/pii/S0021999198960880">Effective condition laminar flow over rough surface</a>, Page 198 justify navier slip.</li>
          <li><a href="https://www.igpm.rwth-aachen.de/Download/reports/mueller/DDM-IGPM-395.pdf">Effective condition laminar flow over periodic rough surface</a></li>
          <li><a href="https://aip.scitation.org/doi/pdf/10.1063/1.4982899">Navier slip derivation</a> laminar flow (steady navier stokes) over rough surface, page 13-14 justify navier slip. Reason is to avoid having to solve macro problem twice, which is not our concern.</li>
          <li>Non periodic but deterministic boundary results are on the way? Planned for ICIAM.</li>
        </ul>
      </li>
      <li>Random Boundaries
        <ul>
          <li><a href="https://hal.science/hal-00498555/document">Effective condition stationary navier stokes flow over rough surface</a>. Surface is random, bounded, ergodic, K-lipschitz, stationary random proces. Justify navier slip. Use the norm over a strip at the boundary, whose width is chosen to maximize error. Idea is to look at autocorrelation. If it is high, there will be low frequency fluctuations. Might still have peaks at the high frequencies.</li>
          <li>Non stationary roughness is not explored as far as i know</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><a href="https://cfd.blogs.upv.es/turbulence/wall-functions/">Nice blog explaining how wall models are used</a>. For finite volume methods, estimate the flow quantities in a cell at the boundary by extrapolating using known information about the shear stress at the boundary, and finite volume averages.</li>
  <li><a href="https://www.sciencedirect.com/science/article/pii/S266620272100015X">Review on turbulent flow over rough surfaces</a> Wall modeling using equivalent grain roughness. Obtained from the distribution of the wall function using different shape related quantities like variance, skewness, kurtosis. GPR has been used to obtain estimates of grain roughness with high accuracy (&lt;10%) for CFD.
    <ul>
      <li>Viscous (sub)layer = laminar flow</li>
      <li>Buffer layer (neither applies)</li>
      <li>Log layer = log law</li>
      <li>Typically cells at the log layer scale?</li>
    </ul>
  </li>
  <li><a href="https://reader.elsevier.com/reader/sd/pii/B9780124059351000125?token=D085DF58706CE6B176E3595A5259C8D8356EC4AC38E3D8960A323896B7F565D49B3976323F3B82D9A505613D5B13EDD9&amp;originRegion=eu-west-1&amp;originCreation=20230410014418">Navier Stokes rough surface book (chapter 12)</a></li>
</ul>

<h2 id="multi-scale-problems">Multi Scale problems</h2>

<p>Below is a list of useful literature on the subject, along with comments.</p>

<h4 id="literature">Literature</h4>
<ul>
  <li>
    <p><a href="https://link.springer.com/book/10.1007/978-3-540-88857-4">Tutorials in multi scale problems by Runborg et al.</a>
 Some tutorials on Multi Scale Simulations (FMM, Wavelet analysis.) The one on Wavelet analysis is interesting (Runborg.)</p>
  </li>
  <li>
    <p><a href="https://link.springer.com/book/10.1007/978-0-387-09496-0">Introductory book</a><br />
 Homogenization recap in Appendix B:
 Typically a problem of the form 
 \(\nabla \cdot (a(x/\epsilon) \nabla u(x)) + a_0(x/\epsilon) u(x) = f(x), \implies L_\epsilon u = f\)
 where $a$ and $a_0$ are 1-periodic functions. Goal is to study the limit as $\epsilon \to 0$. Homogenisation theory is <strong>not</strong> what we are interested in. Instead, we want to minimize error of a low resolution approximation, at a nonzero $\epsilon$. Of course we still want convergence to homogenized solution as $\epsilon \to 0$. The 1-d homogenization consists of taking the harmonic average.</p>

    <p>The standard assumption seems to be periodic multi scale:<br />
 \(u(x) = \tilde{u}(x) + \phi(x/\epsilon),\)
 where $\tilde{u}$ and $\phi$ are periodic, and $\tilde{u}$ is band limited to some large scale $»1/\epsilon$.</p>
  </li>
</ul>]]></content><author><name>Emanuel</name></author><category term="multiscale" /><summary type="html"><![CDATA[Spectral solver for Stokes with non-homogeneous, Robin boundary condition with variable coefficients.]]></summary></entry><entry><title type="html">Welcome to Jekyll!</title><link href="/jekyll/update/2022/10/25/welcome-to-jekyll-copy-2.html" rel="alternate" type="text/html" title="Welcome to Jekyll!" /><published>2022-10-25T21:34:51+00:00</published><updated>2022-10-25T21:34:51+00:00</updated><id>/jekyll/update/2022/10/25/welcome-to-jekyll%20copy%202</id><content type="html" xml:base="/jekyll/update/2022/10/25/welcome-to-jekyll-copy-2.html"><![CDATA[<p>You’ll find this post in your <code class="language-plaintext highlighter-rouge">_posts</code> directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run <code class="language-plaintext highlighter-rouge">jekyll serve</code>, which launches a web server and auto-regenerates your site when a file is updated.</p>

<p>Jekyll requires blog post files to be named according to the following format:</p>

<p><code class="language-plaintext highlighter-rouge">YEAR-MONTH-DAY-title.MARKUP</code></p>

<p>Where <code class="language-plaintext highlighter-rouge">YEAR</code> is a four-digit number, <code class="language-plaintext highlighter-rouge">MONTH</code> and <code class="language-plaintext highlighter-rouge">DAY</code> are both two-digit numbers, and <code class="language-plaintext highlighter-rouge">MARKUP</code> is the file extension representing the format used in the file. After that, include the necessary front matter. Take a look at the source for this post to get an idea about how it works.</p>

<p>Jekyll also offers powerful support for code snippets:</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">print_hi</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
  <span class="nb">puts</span> <span class="s2">"Hi, </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
<span class="n">print_hi</span><span class="p">(</span><span class="s1">'Tom'</span><span class="p">)</span>
<span class="c1">#=&gt; prints 'Hi, Tom' to STDOUT.</span></code></pre></figure>

<p>Check out the <a href="https://jekyllrb.com/docs/home">Jekyll docs</a> for more info on how to get the most out of Jekyll. File all bugs/feature requests at <a href="https://github.com/jekyll/jekyll">Jekyll’s GitHub repo</a>. If you have questions, you can ask them on <a href="https://talk.jekyllrb.com/">Jekyll Talk</a>.</p>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[Short introduction on how to use posts. You’ll find this post in your `_posts` directory.]]></summary></entry><entry><title type="html">Welcome to Jekyll!</title><link href="/jekyll/update/2022/10/25/welcome-to-jekyll.html" rel="alternate" type="text/html" title="Welcome to Jekyll!" /><published>2022-10-25T21:34:51+00:00</published><updated>2022-10-25T21:34:51+00:00</updated><id>/jekyll/update/2022/10/25/welcome-to-jekyll</id><content type="html" xml:base="/jekyll/update/2022/10/25/welcome-to-jekyll.html"><![CDATA[<p>You’ll find this post in your <code class="language-plaintext highlighter-rouge">_posts</code> directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run <code class="language-plaintext highlighter-rouge">jekyll serve</code>, which launches a web server and auto-regenerates your site when a file is updated.</p>

<p>Jekyll requires blog post files to be named according to the following format:</p>

<p><code class="language-plaintext highlighter-rouge">YEAR-MONTH-DAY-title.MARKUP</code></p>

<p>Where <code class="language-plaintext highlighter-rouge">YEAR</code> is a four-digit number, <code class="language-plaintext highlighter-rouge">MONTH</code> and <code class="language-plaintext highlighter-rouge">DAY</code> are both two-digit numbers, and <code class="language-plaintext highlighter-rouge">MARKUP</code> is the file extension representing the format used in the file. After that, include the necessary front matter. Take a look at the source for this post to get an idea about how it works.</p>

<p>Jekyll also offers powerful support for code snippets:</p>

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">print_hi</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
  <span class="nb">puts</span> <span class="s2">"Hi, </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
<span class="n">print_hi</span><span class="p">(</span><span class="s1">'Tom'</span><span class="p">)</span>
<span class="c1">#=&gt; prints 'Hi, Tom' to STDOUT.</span></code></pre></figure>

<p>Check out the <a href="https://jekyllrb.com/docs/home">Jekyll docs</a> for more info on how to get the most out of Jekyll. File all bugs/feature requests at <a href="https://github.com/jekyll/jekyll">Jekyll’s GitHub repo</a>. If you have questions, you can ask them on <a href="https://talk.jekyllrb.com/">Jekyll Talk</a>.</p>]]></content><author><name></name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[Short introduction on how to use posts. You’ll find this post in your `_posts` directory.]]></summary></entry><entry><title type="html">Fourier Neural Operator 2</title><link href="/fno/ml/neural/nn/2022/10/25/fno-copy-2.html" rel="alternate" type="text/html" title="Fourier Neural Operator 2" /><published>2022-10-25T21:34:51+00:00</published><updated>2022-10-25T21:34:51+00:00</updated><id>/fno/ml/neural/nn/2022/10/25/fno%20copy%202</id><content type="html" xml:base="/fno/ml/neural/nn/2022/10/25/fno-copy-2.html"><![CDATA[<h2 id="micro-domain">Micro Domain</h2>

<p>The micro domain is defined by a bounding box and a smooth function parameterising the floor of the micro domain.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">sys</span>
<span class="n">sys</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="s">'/home/emastr/phd/'</span><span class="p">)</span>

<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="nn">torch</span> <span class="k">as</span> <span class="n">pt</span>
<span class="kn">import</span> <span class="nn">torch.autograd</span> <span class="k">as</span> <span class="n">agrad</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="kn">from</span> <span class="nn">util.plot_tools</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">architecture.fno_1d</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">boundary_solvers.blobs</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">boundary_solvers.geometry</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">scipy.sparse.linalg</span> <span class="kn">import</span> <span class="n">gmres</span><span class="p">,</span> <span class="n">LinearOperator</span>
<span class="kn">from</span> <span class="nn">operators.stokes_operator</span> <span class="kn">import</span> <span class="n">StokesAdjointBoundaryOp</span>
<span class="kn">from</span> <span class="nn">util.unet</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">import</span> <span class="nn">torch.nn</span> <span class="k">as</span> <span class="n">nn</span>
</code></pre></div></div>

<h2 id="create-data-loader">Create data loader</h2>

<p>Load and transform the data.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">unpack_data</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
    <span class="n">xlabels</span> <span class="o">=</span> <span class="p">[</span><span class="s">'x'</span><span class="p">,</span> <span class="s">'y'</span><span class="p">,</span> <span class="s">'dx'</span><span class="p">,</span> <span class="s">'dy'</span><span class="p">,</span> <span class="s">'ddx'</span><span class="p">,</span> <span class="s">'ddy'</span><span class="p">,</span> <span class="s">'vx'</span><span class="p">,</span> <span class="s">'vy'</span><span class="p">,</span> <span class="s">'w'</span><span class="p">,</span> <span class="s">'t'</span><span class="p">]</span>
    <span class="n">ylabels</span> <span class="o">=</span> <span class="p">[</span><span class="s">'rx'</span><span class="p">,</span> <span class="s">'ry'</span><span class="p">]</span>
    <span class="n">inp</span> <span class="o">=</span> <span class="p">{</span><span class="n">xlabels</span><span class="p">[</span><span class="n">i</span><span class="p">]:</span> <span class="n">data</span><span class="p">[</span><span class="s">'X'</span><span class="p">][:,</span> <span class="n">i</span><span class="p">,</span> <span class="p">:]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">)}</span>
    <span class="n">out</span> <span class="o">=</span> <span class="p">{</span><span class="n">ylabels</span><span class="p">[</span><span class="n">i</span><span class="p">]:</span> <span class="n">data</span><span class="p">[</span><span class="s">'Y'</span><span class="p">][:,</span> <span class="n">i</span><span class="p">,</span> <span class="p">:]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">)}</span>
    <span class="k">return</span> <span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="n">out</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">unpack</span><span class="p">(</span><span class="n">transform</span><span class="p">):</span>
    <span class="s">"""Decorator for if a method is supposed to act on the values of a dict."""</span>
    <span class="k">def</span> <span class="nf">up_transform</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">==</span> <span class="nb">dict</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="n">transform</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="n">k</span><span class="p">],</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">data</span><span class="p">.</span><span class="n">keys</span><span class="p">()}</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">transform</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">up_transform</span>

<span class="o">@</span><span class="n">unpack</span>
<span class="k">def</span> <span class="nf">subsample</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">idx</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">x</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>

<span class="o">@</span><span class="n">unpack</span>
<span class="k">def</span> <span class="nf">integrate</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">w</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">torch</span><span class="p">.</span><span class="n">cumsum</span><span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">w</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="n">shape</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">subdict</span><span class="p">(</span><span class="n">dic</span><span class="p">,</span> <span class="n">keys</span><span class="p">):</span>
    <span class="k">return</span> <span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="n">dic</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">keys</span> <span class="k">if</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">dic</span><span class="p">.</span><span class="n">keys</span><span class="p">()}</span>

<span class="k">def</span> <span class="nf">concat_dict_entries</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">torch</span><span class="p">.</span><span class="n">cat</span><span class="p">(</span><span class="nb">tuple</span><span class="p">((</span><span class="n">d</span><span class="p">[:,</span> <span class="bp">None</span><span class="p">,</span> <span class="p">:]</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">data</span><span class="p">.</span><span class="n">values</span><span class="p">())),</span> <span class="n">dim</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
    
<span class="k">def</span> <span class="nf">arclength</span><span class="p">(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">,</span> <span class="n">w</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">integrate</span><span class="p">((</span><span class="n">dx</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">dy</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span><span class="o">**</span><span class="mf">0.5</span><span class="p">,</span> <span class="n">w</span><span class="p">)</span>    

<span class="k">def</span> <span class="nf">normalize</span><span class="p">(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">):</span>
    <span class="s">"""Normalize 2-dim vector"""</span>
    <span class="n">mag</span> <span class="o">=</span> <span class="p">(</span><span class="n">dx</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">dy</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span><span class="o">**</span><span class="mf">0.5</span>
    <span class="k">return</span> <span class="n">dx</span><span class="o">/</span><span class="n">mag</span><span class="p">,</span> <span class="n">dy</span><span class="o">/</span><span class="n">mag</span>
    
<span class="k">def</span> <span class="nf">curvature</span><span class="p">(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">,</span> <span class="n">ddx</span><span class="p">,</span> <span class="n">ddy</span><span class="p">):</span>
    <span class="s">"""Find curvature of line segment given points"""</span>
    <span class="n">mag</span> <span class="o">=</span> <span class="p">(</span><span class="n">dx</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">dy</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span><span class="o">**</span><span class="mf">0.5</span>
    <span class="k">return</span> <span class="p">(</span><span class="n">dx</span> <span class="o">*</span> <span class="n">ddy</span> <span class="o">-</span> <span class="n">dy</span> <span class="o">*</span> <span class="n">ddx</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">mag</span> <span class="o">**</span> <span class="mi">3</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">invariant_quantities</span><span class="p">(</span><span class="n">inp</span><span class="p">):</span>
    <span class="n">labels</span> <span class="o">=</span> <span class="p">(</span><span class="s">'tx'</span><span class="p">,</span> <span class="s">'ty'</span><span class="p">,</span> <span class="s">'c'</span><span class="p">)</span>
    <span class="n">tx</span><span class="p">,</span> <span class="n">ty</span> <span class="o">=</span> <span class="n">normalize</span><span class="p">(</span><span class="n">inp</span><span class="p">[</span><span class="s">'dx'</span><span class="p">],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'dy'</span><span class="p">])</span>
    <span class="n">c</span> <span class="o">=</span> <span class="n">curvature</span><span class="p">(</span><span class="n">inp</span><span class="p">[</span><span class="s">'dx'</span><span class="p">],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'dy'</span><span class="p">],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'ddx'</span><span class="p">],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'ddy'</span><span class="p">])</span>
    <span class="n">data</span> <span class="o">=</span> <span class="p">(</span><span class="n">tx</span><span class="p">,</span> <span class="n">ty</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span>
    <span class="k">return</span> <span class="p">{</span><span class="n">labels</span><span class="p">[</span><span class="n">i</span><span class="p">]:</span> <span class="n">data</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">))}</span>
</code></pre></div></div>

<p>Next, we need a way to create the integral operator from a data batch.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">op_factory</span><span class="p">(</span><span class="n">inp</span><span class="p">):</span>
    <span class="n">Z</span>   <span class="o">=</span> <span class="n">inp</span><span class="p">[</span><span class="s">'x'</span><span class="p">]</span>   <span class="o">+</span> <span class="mf">1j</span> <span class="o">*</span> <span class="n">inp</span><span class="p">[</span><span class="s">'y'</span><span class="p">]</span>
    <span class="n">dZ</span>  <span class="o">=</span> <span class="n">inp</span><span class="p">[</span><span class="s">'dx'</span><span class="p">]</span>  <span class="o">+</span> <span class="mf">1j</span> <span class="o">*</span> <span class="n">inp</span><span class="p">[</span><span class="s">'dy'</span><span class="p">]</span>
    <span class="n">ddZ</span> <span class="o">=</span> <span class="n">inp</span><span class="p">[</span><span class="s">'ddx'</span><span class="p">]</span> <span class="o">+</span> <span class="mf">1j</span> <span class="o">*</span> <span class="n">inp</span><span class="p">[</span><span class="s">'ddy'</span><span class="p">]</span>
    <span class="n">W</span> <span class="o">=</span> <span class="n">inp</span><span class="p">[</span><span class="s">'w'</span><span class="p">]</span>
    <span class="n">a</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">ones</span><span class="p">(</span><span class="n">Z</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],)</span> <span class="o">*</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="mf">1j</span>
    <span class="k">return</span> <span class="n">StokesAdjointBoundaryOp</span><span class="p">(</span><span class="n">Z</span><span class="p">,</span> <span class="n">dZ</span><span class="p">,</span> <span class="n">ddZ</span><span class="p">,</span> <span class="n">W</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span>
</code></pre></div></div>

<p>Load Data</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">@</span><span class="n">unpack</span>
<span class="k">def</span> <span class="nf">to_dtype</span><span class="p">(</span><span class="n">tensor</span><span class="p">,</span> <span class="n">dtype</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">tensor</span><span class="p">.</span><span class="n">to</span><span class="p">(</span><span class="n">dtype</span><span class="p">)</span>

<span class="c1"># Load and transform
</span><span class="n">data</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">load</span><span class="p">(</span><span class="sa">f</span><span class="s">"/home/emastr/phd/data/problem_data_riesz_TEST.torch"</span><span class="p">)</span>
<span class="n">inp</span><span class="p">,</span> <span class="n">out</span> <span class="o">=</span> <span class="n">unpack_data</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>

<span class="n">dtype</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">double</span>
<span class="n">inp</span><span class="p">,</span> <span class="n">out</span> <span class="o">=</span> <span class="n">to_dtype</span><span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="n">dtype</span><span class="p">),</span> <span class="n">to_dtype</span><span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">dtype</span><span class="p">)</span>

<span class="c1"># Add invariant quantities to data.
</span><span class="n">inp</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">invariant_quantities</span><span class="p">(</span><span class="n">inp</span><span class="p">))</span>

<span class="c1"># Normalise curvature using monotone function sigmoid(x/2) - 1/2.
</span><span class="n">inp</span><span class="p">[</span><span class="s">'c'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="o">/</span><span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="n">torch</span><span class="p">.</span><span class="n">exp</span><span class="p">(</span><span class="o">-</span><span class="mf">0.5</span> <span class="o">*</span> <span class="n">inp</span><span class="p">[</span><span class="s">'c'</span><span class="p">]))</span> <span class="o">-</span> <span class="mf">0.5</span> 
</code></pre></div></div>

<p>Split into training and test data</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Standard features (coordinates, derivatives of parameterisation)
</span><span class="n">features</span> <span class="o">=</span> <span class="p">{</span><span class="s">'x'</span><span class="p">,</span> <span class="s">'y'</span><span class="p">,</span> <span class="s">'dx'</span><span class="p">,</span><span class="s">'dy'</span><span class="p">,</span><span class="s">'ddx'</span><span class="p">,</span><span class="s">'ddy'</span><span class="p">,</span><span class="s">'vx'</span><span class="p">,</span><span class="s">'vy'</span><span class="p">}</span>

<span class="c1"># Invariant features (coordinates, tangent, curvature)
</span><span class="n">features</span> <span class="o">=</span> <span class="p">{</span><span class="s">'x'</span><span class="p">,</span> <span class="s">'y'</span><span class="p">,</span> <span class="s">'tx'</span><span class="p">,</span> <span class="s">'ty'</span><span class="p">,</span> <span class="s">'c'</span><span class="p">,</span> <span class="s">'vx'</span><span class="p">,</span> <span class="s">'vy'</span><span class="p">}</span> 

<span class="c1"># Reduced features (trust fourier transform to handle the rest)
</span><span class="n">features</span> <span class="o">=</span> <span class="p">{</span><span class="s">'x'</span><span class="p">,</span> <span class="s">'y'</span><span class="p">,</span> <span class="s">'vx'</span><span class="p">,</span> <span class="s">'vy'</span><span class="p">}</span>


<span class="c1">## TRAINING DATA
</span>
<span class="n">M_train</span> <span class="o">=</span> <span class="mi">200</span><span class="c1">#0
</span><span class="n">M_batch</span> <span class="o">=</span> <span class="mi">5</span> <span class="c1"># Batch
</span><span class="n">idx_train</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">M_train</span><span class="p">))</span>
<span class="n">X_train</span> <span class="o">=</span> <span class="n">concat_dict_entries</span><span class="p">(</span><span class="n">subdict</span><span class="p">(</span><span class="n">subsample</span><span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="n">idx_train</span><span class="p">),</span> <span class="n">features</span><span class="p">))</span>
<span class="n">V_train</span> <span class="o">=</span> <span class="n">concat_dict_entries</span><span class="p">(</span><span class="n">subdict</span><span class="p">(</span><span class="n">subsample</span><span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="n">idx_train</span><span class="p">),</span> <span class="p">{</span><span class="s">'vx'</span><span class="p">,</span> <span class="s">'vy'</span><span class="p">}))</span>
<span class="n">Y_train</span> <span class="o">=</span> <span class="n">concat_dict_entries</span><span class="p">(</span><span class="n">subsample</span><span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">idx_train</span><span class="p">))</span>
<span class="c1">#X_train = subdict(X_train, {'vx', 'vy'})
</span>
<span class="c1">## TEST DATA
</span><span class="n">M_test</span> <span class="o">=</span> <span class="mi">100</span><span class="c1">#0
</span><span class="n">idx_test</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">M_train</span><span class="p">,</span> <span class="n">M_test</span> <span class="o">+</span> <span class="n">M_train</span><span class="p">))</span>
<span class="n">X_test</span> <span class="o">=</span> <span class="n">concat_dict_entries</span><span class="p">(</span><span class="n">subdict</span><span class="p">(</span><span class="n">subsample</span><span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="n">idx_test</span><span class="p">),</span> <span class="n">features</span><span class="p">))</span>
<span class="n">V_test</span> <span class="o">=</span> <span class="n">concat_dict_entries</span><span class="p">(</span><span class="n">subdict</span><span class="p">(</span><span class="n">subsample</span><span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="n">idx_test</span><span class="p">),</span> <span class="p">{</span><span class="s">'vx'</span><span class="p">,</span> <span class="s">'vy'</span><span class="p">}))</span>
<span class="n">Y_test</span> <span class="o">=</span> <span class="n">concat_dict_entries</span><span class="p">(</span><span class="n">subsample</span><span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">idx_test</span><span class="p">))</span>
<span class="c1">#X_test = subdict(X_test, {'vx', 'vy'})
</span>
<span class="n">in_channels</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">features</span><span class="p">)</span>
<span class="n">out_channels</span> <span class="o">=</span> <span class="mi">2</span>
</code></pre></div></div>

<p>Create network</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">settings</span> <span class="o">=</span> <span class="p">{</span><span class="s">"modes"</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span>
            <span class="s">"input_features"</span><span class="p">:</span> <span class="n">features</span><span class="p">}</span>

<span class="n">net</span> <span class="o">=</span> <span class="n">FNO1d</span><span class="p">(</span><span class="n">modes</span><span class="o">=</span><span class="n">settings</span><span class="p">[</span><span class="s">"modes"</span><span class="p">],</span> <span class="n">in_channels</span><span class="o">=</span><span class="n">in_channels</span><span class="p">,</span> <span class="n">out_channels</span><span class="o">=</span><span class="n">out_channels</span><span class="p">)</span>
</code></pre></div></div>

<p>Do training</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Predefine list of losses 
</span><span class="n">trainloss</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">testloss</span>  <span class="o">=</span> <span class="p">[]</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Loss function
</span><span class="n">loss_fcn</span>  <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="n">MSELoss</span><span class="p">()</span>
<span class="n">benchloss</span> <span class="o">=</span> <span class="n">loss_fcn</span><span class="p">(</span><span class="n">V_test</span><span class="p">,</span> <span class="n">Y_test</span><span class="p">).</span><span class="n">item</span><span class="p">()</span>
<span class="n">optim</span>     <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">optim</span><span class="p">.</span><span class="n">Adam</span><span class="p">(</span><span class="n">net</span><span class="p">.</span><span class="n">parameters</span><span class="p">())</span>

<span class="c1"># DO TRAINING LOOP 
##################################################
</span><span class="n">N</span> <span class="o">=</span> <span class="mi">30001</span> <span class="c1">#30001
</span><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">):</span>
    <span class="n">idx_batch</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randperm</span><span class="p">(</span><span class="n">M_train</span><span class="p">)[:</span><span class="n">M_batch</span><span class="p">]</span> 
    <span class="n">Y_batch</span>   <span class="o">=</span> <span class="n">Y_train</span><span class="p">[</span><span class="n">idx_batch</span><span class="p">]</span>
    <span class="n">X_batch</span>   <span class="o">=</span> <span class="n">X_train</span><span class="p">[</span><span class="n">idx_batch</span><span class="p">]</span>
    
    <span class="c1"># Train on truncated net that expands as iterations progress
</span>    <span class="n">loss</span> <span class="o">=</span> <span class="n">loss_fcn</span><span class="p">(</span><span class="n">net</span><span class="p">(</span><span class="n">X_batch</span><span class="p">),</span> <span class="n">Y_batch</span><span class="p">)</span>
    <span class="n">loss</span><span class="p">.</span><span class="n">backward</span><span class="p">()</span>
    <span class="n">optim</span><span class="p">.</span><span class="n">step</span><span class="p">()</span>
        
    <span class="n">trainloss</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">loss</span><span class="p">.</span><span class="n">item</span><span class="p">())</span>
    <span class="n">testloss</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">loss_fcn</span><span class="p">(</span><span class="n">net</span><span class="p">(</span><span class="n">X_test</span><span class="p">),</span> <span class="n">Y_test</span><span class="p">).</span><span class="n">item</span><span class="p">())</span>
        
    <span class="n">optim</span><span class="p">.</span><span class="n">zero_grad</span><span class="p">()</span>
        
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"Step </span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s">. Train loss = </span><span class="si">{</span><span class="n">trainloss</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="si">}</span><span class="s">, test loss = </span><span class="si">{</span><span class="n">testloss</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="si">}</span><span class="s">, benchmark=</span><span class="si">{</span><span class="n">benchloss</span><span class="si">}</span><span class="s">"</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s">"</span><span class="se">\r</span><span class="s">"</span><span class="p">)</span>
    
    <span class="k">if</span> <span class="n">i</span> <span class="o">%</span> <span class="mi">1000</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
        <span class="n">torch</span><span class="p">.</span><span class="n">save</span><span class="p">({</span><span class="s">"state dict"</span> <span class="p">:</span> <span class="n">net</span><span class="p">.</span><span class="n">state_dict</span><span class="p">(),</span> 
                    <span class="s">"settings"</span>   <span class="p">:</span> <span class="n">settings</span><span class="p">,</span>
                    <span class="s">"trainloss"</span>  <span class="p">:</span> <span class="n">trainloss</span><span class="p">,</span>
                    <span class="s">"testloss"</span>   <span class="p">:</span> <span class="n">testloss</span><span class="p">},</span> 
                    <span class="sa">f</span><span class="s">"/home/emastr/phd/data/fno_adjoint_state_dict_2022_12_02_default5_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s">.Torch"</span><span class="p">)</span> <span class="c1"># old namme unet_state_dict #Kernel size 5, stride 2
</span></code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Step 30000. Train loss = 0.00014250755874667165, test loss = 0.0002593944797511047, benchmark=0.0248016101648704522
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">save</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">load</span><span class="p">(</span><span class="sa">f</span><span class="s">"/home/emastr/phd/data/fno_adjoint_state_dict_2022_12_02_default5_</span><span class="si">{</span><span class="mi">30000</span><span class="si">}</span><span class="s">.Torch"</span><span class="p">)</span>
<span class="n">trainloss</span> <span class="o">=</span> <span class="n">save</span><span class="p">[</span><span class="s">"trainloss"</span><span class="p">]</span>
<span class="n">testloss</span> <span class="o">=</span> <span class="n">save</span><span class="p">[</span><span class="s">"testloss"</span><span class="p">]</span>
<span class="n">net</span><span class="p">.</span><span class="n">load_state_dict</span><span class="p">(</span><span class="n">save</span><span class="p">[</span><span class="s">"state dict"</span><span class="p">])</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;All keys matched successfully&gt;
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Y_net</span> <span class="o">=</span> <span class="n">net</span><span class="p">(</span><span class="n">X_test</span><span class="p">)</span>
<span class="n">Y_net</span> <span class="o">=</span> <span class="n">Y_net</span><span class="p">.</span><span class="n">detach</span><span class="p">()</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">90</span><span class="p">]:</span>
    <span class="n">plt</span><span class="p">.</span><span class="n">figure</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
    <span class="n">plt</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">V_test</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">:],</span> <span class="n">label</span><span class="o">=</span><span class="s">'inpx'</span><span class="p">)</span>
    <span class="n">plt</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">Y_net</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">:],</span> <span class="n">label</span><span class="o">=</span><span class="s">'netx'</span><span class="p">)</span>
    <span class="n">plt</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">Y_test</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">:],</span> <span class="s">'--'</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">'outx'</span><span class="p">)</span>
    <span class="n">plt</span><span class="p">.</span><span class="n">legend</span><span class="p">()</span>
    <span class="n">plt</span><span class="p">.</span><span class="n">figure</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
    <span class="n">plt</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">V_test</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">:])</span>
    <span class="n">plt</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">Y_net</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">:])</span>
    <span class="n">plt</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">Y_test</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">:])</span>
    
<span class="n">plt</span><span class="p">.</span><span class="n">figure</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="n">semilogy</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="nb">len</span><span class="p">(</span><span class="n">trainloss</span><span class="p">)),</span> <span class="n">trainloss</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="n">semilogy</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="nb">len</span><span class="p">(</span><span class="n">testloss</span><span class="p">)),</span> <span class="n">testloss</span><span class="p">)</span>

<span class="n">plt</span><span class="p">.</span><span class="n">figure</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">inp</span><span class="p">[</span><span class="s">'x'</span><span class="p">][</span><span class="mi">0</span><span class="p">,</span> <span class="p">:],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'y'</span><span class="p">][</span><span class="mi">0</span><span class="p">,</span> <span class="p">:])</span>
<span class="n">plt</span><span class="p">.</span><span class="n">quiver</span><span class="p">(</span><span class="n">inp</span><span class="p">[</span><span class="s">'x'</span><span class="p">][</span><span class="mi">0</span><span class="p">,:],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'y'</span><span class="p">][</span><span class="mi">0</span><span class="p">,:],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'dy'</span><span class="p">][</span><span class="mi">0</span><span class="p">,:],</span> <span class="o">-</span><span class="n">inp</span><span class="p">[</span><span class="s">'dx'</span><span class="p">][</span><span class="mi">0</span><span class="p">,:])</span>
<span class="n">plt</span><span class="p">.</span><span class="n">quiver</span><span class="p">(</span><span class="n">inp</span><span class="p">[</span><span class="s">'x'</span><span class="p">][</span><span class="mi">0</span><span class="p">,:],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'y'</span><span class="p">][</span><span class="mi">0</span><span class="p">,:],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'ddx'</span><span class="p">][</span><span class="mi">0</span><span class="p">,:],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'ddy'</span><span class="p">][</span><span class="mi">0</span><span class="p">,:],</span> <span class="n">color</span><span class="o">=</span><span class="s">'red'</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="n">axis</span><span class="p">(</span><span class="s">"equal"</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(-0.8800000131130219,
 0.8800000131130219,
 -0.6743489861488342,
 1.0797309041023255)
</code></pre></div></div>

<p><img src="/assets/posts/output_16_1.png" alt="png" /></p>

<p><img src="/assets/posts/output_16_2.png" alt="png" /></p>

<p><img src="/assets/posts/output_16_3.png" alt="png" /></p>

<p><img src="/assets/posts/output_16_4.png" alt="png" /></p>]]></content><author><name>Leon</name></author><category term="fno" /><category term="ml" /><category term="neural" /><category term="nn" /><summary type="html"><![CDATA[Showcase of FNO on riesz representor data.]]></summary></entry><entry><title type="html">Fourier Neural Operator</title><link href="/fno/ml/neural/nn/2022/10/25/fno.html" rel="alternate" type="text/html" title="Fourier Neural Operator" /><published>2022-10-25T21:34:51+00:00</published><updated>2022-10-25T21:34:51+00:00</updated><id>/fno/ml/neural/nn/2022/10/25/fno</id><content type="html" xml:base="/fno/ml/neural/nn/2022/10/25/fno.html"><![CDATA[<h2 id="micro-domain">Micro Domain</h2>

<p>The micro domain is defined by a bounding box and a smooth function parameterising the floor of the micro domain.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">sys</span>
<span class="n">sys</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="s">'/home/emastr/phd/'</span><span class="p">)</span>

<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="nn">torch</span> <span class="k">as</span> <span class="n">pt</span>
<span class="kn">import</span> <span class="nn">torch.autograd</span> <span class="k">as</span> <span class="n">agrad</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="kn">from</span> <span class="nn">util.plot_tools</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">architecture.fno_1d</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">boundary_solvers.blobs</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">boundary_solvers.geometry</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">scipy.sparse.linalg</span> <span class="kn">import</span> <span class="n">gmres</span><span class="p">,</span> <span class="n">LinearOperator</span>
<span class="kn">from</span> <span class="nn">operators.stokes_operator</span> <span class="kn">import</span> <span class="n">StokesAdjointBoundaryOp</span>
<span class="kn">from</span> <span class="nn">util.unet</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">import</span> <span class="nn">torch.nn</span> <span class="k">as</span> <span class="n">nn</span>
</code></pre></div></div>

<h2 id="create-data-loader">Create data loader</h2>

<p>Load and transform the data.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">unpack_data</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
    <span class="n">xlabels</span> <span class="o">=</span> <span class="p">[</span><span class="s">'x'</span><span class="p">,</span> <span class="s">'y'</span><span class="p">,</span> <span class="s">'dx'</span><span class="p">,</span> <span class="s">'dy'</span><span class="p">,</span> <span class="s">'ddx'</span><span class="p">,</span> <span class="s">'ddy'</span><span class="p">,</span> <span class="s">'vx'</span><span class="p">,</span> <span class="s">'vy'</span><span class="p">,</span> <span class="s">'w'</span><span class="p">,</span> <span class="s">'t'</span><span class="p">]</span>
    <span class="n">ylabels</span> <span class="o">=</span> <span class="p">[</span><span class="s">'rx'</span><span class="p">,</span> <span class="s">'ry'</span><span class="p">]</span>
    <span class="n">inp</span> <span class="o">=</span> <span class="p">{</span><span class="n">xlabels</span><span class="p">[</span><span class="n">i</span><span class="p">]:</span> <span class="n">data</span><span class="p">[</span><span class="s">'X'</span><span class="p">][:,</span> <span class="n">i</span><span class="p">,</span> <span class="p">:]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">)}</span>
    <span class="n">out</span> <span class="o">=</span> <span class="p">{</span><span class="n">ylabels</span><span class="p">[</span><span class="n">i</span><span class="p">]:</span> <span class="n">data</span><span class="p">[</span><span class="s">'Y'</span><span class="p">][:,</span> <span class="n">i</span><span class="p">,</span> <span class="p">:]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">)}</span>
    <span class="k">return</span> <span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="n">out</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">unpack</span><span class="p">(</span><span class="n">transform</span><span class="p">):</span>
    <span class="s">"""Decorator for if a method is supposed to act on the values of a dict."""</span>
    <span class="k">def</span> <span class="nf">up_transform</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">==</span> <span class="nb">dict</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="n">transform</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="n">k</span><span class="p">],</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">data</span><span class="p">.</span><span class="n">keys</span><span class="p">()}</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">transform</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">up_transform</span>

<span class="o">@</span><span class="n">unpack</span>
<span class="k">def</span> <span class="nf">subsample</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">idx</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">x</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>

<span class="o">@</span><span class="n">unpack</span>
<span class="k">def</span> <span class="nf">integrate</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">w</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">torch</span><span class="p">.</span><span class="n">cumsum</span><span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">w</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="n">shape</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">subdict</span><span class="p">(</span><span class="n">dic</span><span class="p">,</span> <span class="n">keys</span><span class="p">):</span>
    <span class="k">return</span> <span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="n">dic</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">keys</span> <span class="k">if</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">dic</span><span class="p">.</span><span class="n">keys</span><span class="p">()}</span>

<span class="k">def</span> <span class="nf">concat_dict_entries</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">torch</span><span class="p">.</span><span class="n">cat</span><span class="p">(</span><span class="nb">tuple</span><span class="p">((</span><span class="n">d</span><span class="p">[:,</span> <span class="bp">None</span><span class="p">,</span> <span class="p">:]</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">data</span><span class="p">.</span><span class="n">values</span><span class="p">())),</span> <span class="n">dim</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
    
<span class="k">def</span> <span class="nf">arclength</span><span class="p">(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">,</span> <span class="n">w</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">integrate</span><span class="p">((</span><span class="n">dx</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">dy</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span><span class="o">**</span><span class="mf">0.5</span><span class="p">,</span> <span class="n">w</span><span class="p">)</span>    

<span class="k">def</span> <span class="nf">normalize</span><span class="p">(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">):</span>
    <span class="s">"""Normalize 2-dim vector"""</span>
    <span class="n">mag</span> <span class="o">=</span> <span class="p">(</span><span class="n">dx</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">dy</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span><span class="o">**</span><span class="mf">0.5</span>
    <span class="k">return</span> <span class="n">dx</span><span class="o">/</span><span class="n">mag</span><span class="p">,</span> <span class="n">dy</span><span class="o">/</span><span class="n">mag</span>
    
<span class="k">def</span> <span class="nf">curvature</span><span class="p">(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">,</span> <span class="n">ddx</span><span class="p">,</span> <span class="n">ddy</span><span class="p">):</span>
    <span class="s">"""Find curvature of line segment given points"""</span>
    <span class="n">mag</span> <span class="o">=</span> <span class="p">(</span><span class="n">dx</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">dy</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span><span class="o">**</span><span class="mf">0.5</span>
    <span class="k">return</span> <span class="p">(</span><span class="n">dx</span> <span class="o">*</span> <span class="n">ddy</span> <span class="o">-</span> <span class="n">dy</span> <span class="o">*</span> <span class="n">ddx</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">mag</span> <span class="o">**</span> <span class="mi">3</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">invariant_quantities</span><span class="p">(</span><span class="n">inp</span><span class="p">):</span>
    <span class="n">labels</span> <span class="o">=</span> <span class="p">(</span><span class="s">'tx'</span><span class="p">,</span> <span class="s">'ty'</span><span class="p">,</span> <span class="s">'c'</span><span class="p">)</span>
    <span class="n">tx</span><span class="p">,</span> <span class="n">ty</span> <span class="o">=</span> <span class="n">normalize</span><span class="p">(</span><span class="n">inp</span><span class="p">[</span><span class="s">'dx'</span><span class="p">],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'dy'</span><span class="p">])</span>
    <span class="n">c</span> <span class="o">=</span> <span class="n">curvature</span><span class="p">(</span><span class="n">inp</span><span class="p">[</span><span class="s">'dx'</span><span class="p">],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'dy'</span><span class="p">],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'ddx'</span><span class="p">],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'ddy'</span><span class="p">])</span>
    <span class="n">data</span> <span class="o">=</span> <span class="p">(</span><span class="n">tx</span><span class="p">,</span> <span class="n">ty</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span>
    <span class="k">return</span> <span class="p">{</span><span class="n">labels</span><span class="p">[</span><span class="n">i</span><span class="p">]:</span> <span class="n">data</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">))}</span>
</code></pre></div></div>

<p>Next, we need a way to create the integral operator from a data batch.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">op_factory</span><span class="p">(</span><span class="n">inp</span><span class="p">):</span>
    <span class="n">Z</span>   <span class="o">=</span> <span class="n">inp</span><span class="p">[</span><span class="s">'x'</span><span class="p">]</span>   <span class="o">+</span> <span class="mf">1j</span> <span class="o">*</span> <span class="n">inp</span><span class="p">[</span><span class="s">'y'</span><span class="p">]</span>
    <span class="n">dZ</span>  <span class="o">=</span> <span class="n">inp</span><span class="p">[</span><span class="s">'dx'</span><span class="p">]</span>  <span class="o">+</span> <span class="mf">1j</span> <span class="o">*</span> <span class="n">inp</span><span class="p">[</span><span class="s">'dy'</span><span class="p">]</span>
    <span class="n">ddZ</span> <span class="o">=</span> <span class="n">inp</span><span class="p">[</span><span class="s">'ddx'</span><span class="p">]</span> <span class="o">+</span> <span class="mf">1j</span> <span class="o">*</span> <span class="n">inp</span><span class="p">[</span><span class="s">'ddy'</span><span class="p">]</span>
    <span class="n">W</span> <span class="o">=</span> <span class="n">inp</span><span class="p">[</span><span class="s">'w'</span><span class="p">]</span>
    <span class="n">a</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">ones</span><span class="p">(</span><span class="n">Z</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],)</span> <span class="o">*</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="mf">1j</span>
    <span class="k">return</span> <span class="n">StokesAdjointBoundaryOp</span><span class="p">(</span><span class="n">Z</span><span class="p">,</span> <span class="n">dZ</span><span class="p">,</span> <span class="n">ddZ</span><span class="p">,</span> <span class="n">W</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span>
</code></pre></div></div>

<p>Load Data</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">@</span><span class="n">unpack</span>
<span class="k">def</span> <span class="nf">to_dtype</span><span class="p">(</span><span class="n">tensor</span><span class="p">,</span> <span class="n">dtype</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">tensor</span><span class="p">.</span><span class="n">to</span><span class="p">(</span><span class="n">dtype</span><span class="p">)</span>

<span class="c1"># Load and transform
</span><span class="n">data</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">load</span><span class="p">(</span><span class="sa">f</span><span class="s">"/home/emastr/phd/data/problem_data_riesz_TEST.torch"</span><span class="p">)</span>
<span class="n">inp</span><span class="p">,</span> <span class="n">out</span> <span class="o">=</span> <span class="n">unpack_data</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>

<span class="n">dtype</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">double</span>
<span class="n">inp</span><span class="p">,</span> <span class="n">out</span> <span class="o">=</span> <span class="n">to_dtype</span><span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="n">dtype</span><span class="p">),</span> <span class="n">to_dtype</span><span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">dtype</span><span class="p">)</span>

<span class="c1"># Add invariant quantities to data.
</span><span class="n">inp</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">invariant_quantities</span><span class="p">(</span><span class="n">inp</span><span class="p">))</span>

<span class="c1"># Normalise curvature using monotone function sigmoid(x/2) - 1/2.
</span><span class="n">inp</span><span class="p">[</span><span class="s">'c'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="o">/</span><span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="n">torch</span><span class="p">.</span><span class="n">exp</span><span class="p">(</span><span class="o">-</span><span class="mf">0.5</span> <span class="o">*</span> <span class="n">inp</span><span class="p">[</span><span class="s">'c'</span><span class="p">]))</span> <span class="o">-</span> <span class="mf">0.5</span> 
</code></pre></div></div>

<p>Split into training and test data</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Standard features (coordinates, derivatives of parameterisation)
</span><span class="n">features</span> <span class="o">=</span> <span class="p">{</span><span class="s">'x'</span><span class="p">,</span> <span class="s">'y'</span><span class="p">,</span> <span class="s">'dx'</span><span class="p">,</span><span class="s">'dy'</span><span class="p">,</span><span class="s">'ddx'</span><span class="p">,</span><span class="s">'ddy'</span><span class="p">,</span><span class="s">'vx'</span><span class="p">,</span><span class="s">'vy'</span><span class="p">}</span>

<span class="c1"># Invariant features (coordinates, tangent, curvature)
</span><span class="n">features</span> <span class="o">=</span> <span class="p">{</span><span class="s">'x'</span><span class="p">,</span> <span class="s">'y'</span><span class="p">,</span> <span class="s">'tx'</span><span class="p">,</span> <span class="s">'ty'</span><span class="p">,</span> <span class="s">'c'</span><span class="p">,</span> <span class="s">'vx'</span><span class="p">,</span> <span class="s">'vy'</span><span class="p">}</span> 

<span class="c1"># Reduced features (trust fourier transform to handle the rest)
</span><span class="n">features</span> <span class="o">=</span> <span class="p">{</span><span class="s">'x'</span><span class="p">,</span> <span class="s">'y'</span><span class="p">,</span> <span class="s">'vx'</span><span class="p">,</span> <span class="s">'vy'</span><span class="p">}</span>


<span class="c1">## TRAINING DATA
</span>
<span class="n">M_train</span> <span class="o">=</span> <span class="mi">200</span><span class="c1">#0
</span><span class="n">M_batch</span> <span class="o">=</span> <span class="mi">5</span> <span class="c1"># Batch
</span><span class="n">idx_train</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">M_train</span><span class="p">))</span>
<span class="n">X_train</span> <span class="o">=</span> <span class="n">concat_dict_entries</span><span class="p">(</span><span class="n">subdict</span><span class="p">(</span><span class="n">subsample</span><span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="n">idx_train</span><span class="p">),</span> <span class="n">features</span><span class="p">))</span>
<span class="n">V_train</span> <span class="o">=</span> <span class="n">concat_dict_entries</span><span class="p">(</span><span class="n">subdict</span><span class="p">(</span><span class="n">subsample</span><span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="n">idx_train</span><span class="p">),</span> <span class="p">{</span><span class="s">'vx'</span><span class="p">,</span> <span class="s">'vy'</span><span class="p">}))</span>
<span class="n">Y_train</span> <span class="o">=</span> <span class="n">concat_dict_entries</span><span class="p">(</span><span class="n">subsample</span><span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">idx_train</span><span class="p">))</span>
<span class="c1">#X_train = subdict(X_train, {'vx', 'vy'})
</span>
<span class="c1">## TEST DATA
</span><span class="n">M_test</span> <span class="o">=</span> <span class="mi">100</span><span class="c1">#0
</span><span class="n">idx_test</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">M_train</span><span class="p">,</span> <span class="n">M_test</span> <span class="o">+</span> <span class="n">M_train</span><span class="p">))</span>
<span class="n">X_test</span> <span class="o">=</span> <span class="n">concat_dict_entries</span><span class="p">(</span><span class="n">subdict</span><span class="p">(</span><span class="n">subsample</span><span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="n">idx_test</span><span class="p">),</span> <span class="n">features</span><span class="p">))</span>
<span class="n">V_test</span> <span class="o">=</span> <span class="n">concat_dict_entries</span><span class="p">(</span><span class="n">subdict</span><span class="p">(</span><span class="n">subsample</span><span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="n">idx_test</span><span class="p">),</span> <span class="p">{</span><span class="s">'vx'</span><span class="p">,</span> <span class="s">'vy'</span><span class="p">}))</span>
<span class="n">Y_test</span> <span class="o">=</span> <span class="n">concat_dict_entries</span><span class="p">(</span><span class="n">subsample</span><span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">idx_test</span><span class="p">))</span>
<span class="c1">#X_test = subdict(X_test, {'vx', 'vy'})
</span>
<span class="n">in_channels</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">features</span><span class="p">)</span>
<span class="n">out_channels</span> <span class="o">=</span> <span class="mi">2</span>
</code></pre></div></div>

<p>Create network</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">settings</span> <span class="o">=</span> <span class="p">{</span><span class="s">"modes"</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span>
            <span class="s">"input_features"</span><span class="p">:</span> <span class="n">features</span><span class="p">}</span>

<span class="n">net</span> <span class="o">=</span> <span class="n">FNO1d</span><span class="p">(</span><span class="n">modes</span><span class="o">=</span><span class="n">settings</span><span class="p">[</span><span class="s">"modes"</span><span class="p">],</span> <span class="n">in_channels</span><span class="o">=</span><span class="n">in_channels</span><span class="p">,</span> <span class="n">out_channels</span><span class="o">=</span><span class="n">out_channels</span><span class="p">)</span>
</code></pre></div></div>

<p>Do training</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Predefine list of losses 
</span><span class="n">trainloss</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">testloss</span>  <span class="o">=</span> <span class="p">[]</span>
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Loss function
</span><span class="n">loss_fcn</span>  <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="n">MSELoss</span><span class="p">()</span>
<span class="n">benchloss</span> <span class="o">=</span> <span class="n">loss_fcn</span><span class="p">(</span><span class="n">V_test</span><span class="p">,</span> <span class="n">Y_test</span><span class="p">).</span><span class="n">item</span><span class="p">()</span>
<span class="n">optim</span>     <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">optim</span><span class="p">.</span><span class="n">Adam</span><span class="p">(</span><span class="n">net</span><span class="p">.</span><span class="n">parameters</span><span class="p">())</span>

<span class="c1"># DO TRAINING LOOP 
##################################################
</span><span class="n">N</span> <span class="o">=</span> <span class="mi">30001</span> <span class="c1">#30001
</span><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">):</span>
    <span class="n">idx_batch</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">randperm</span><span class="p">(</span><span class="n">M_train</span><span class="p">)[:</span><span class="n">M_batch</span><span class="p">]</span> 
    <span class="n">Y_batch</span>   <span class="o">=</span> <span class="n">Y_train</span><span class="p">[</span><span class="n">idx_batch</span><span class="p">]</span>
    <span class="n">X_batch</span>   <span class="o">=</span> <span class="n">X_train</span><span class="p">[</span><span class="n">idx_batch</span><span class="p">]</span>
    
    <span class="c1"># Train on truncated net that expands as iterations progress
</span>    <span class="n">loss</span> <span class="o">=</span> <span class="n">loss_fcn</span><span class="p">(</span><span class="n">net</span><span class="p">(</span><span class="n">X_batch</span><span class="p">),</span> <span class="n">Y_batch</span><span class="p">)</span>
    <span class="n">loss</span><span class="p">.</span><span class="n">backward</span><span class="p">()</span>
    <span class="n">optim</span><span class="p">.</span><span class="n">step</span><span class="p">()</span>
        
    <span class="n">trainloss</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">loss</span><span class="p">.</span><span class="n">item</span><span class="p">())</span>
    <span class="n">testloss</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">loss_fcn</span><span class="p">(</span><span class="n">net</span><span class="p">(</span><span class="n">X_test</span><span class="p">),</span> <span class="n">Y_test</span><span class="p">).</span><span class="n">item</span><span class="p">())</span>
        
    <span class="n">optim</span><span class="p">.</span><span class="n">zero_grad</span><span class="p">()</span>
        
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"Step </span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s">. Train loss = </span><span class="si">{</span><span class="n">trainloss</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="si">}</span><span class="s">, test loss = </span><span class="si">{</span><span class="n">testloss</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="si">}</span><span class="s">, benchmark=</span><span class="si">{</span><span class="n">benchloss</span><span class="si">}</span><span class="s">"</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s">"</span><span class="se">\r</span><span class="s">"</span><span class="p">)</span>
    
    <span class="k">if</span> <span class="n">i</span> <span class="o">%</span> <span class="mi">1000</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
        <span class="n">torch</span><span class="p">.</span><span class="n">save</span><span class="p">({</span><span class="s">"state dict"</span> <span class="p">:</span> <span class="n">net</span><span class="p">.</span><span class="n">state_dict</span><span class="p">(),</span> 
                    <span class="s">"settings"</span>   <span class="p">:</span> <span class="n">settings</span><span class="p">,</span>
                    <span class="s">"trainloss"</span>  <span class="p">:</span> <span class="n">trainloss</span><span class="p">,</span>
                    <span class="s">"testloss"</span>   <span class="p">:</span> <span class="n">testloss</span><span class="p">},</span> 
                    <span class="sa">f</span><span class="s">"/home/emastr/phd/data/fno_adjoint_state_dict_2022_12_02_default5_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s">.Torch"</span><span class="p">)</span> <span class="c1"># old namme unet_state_dict #Kernel size 5, stride 2
</span></code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Step 30000. Train loss = 0.00014250755874667165, test loss = 0.0002593944797511047, benchmark=0.0248016101648704522
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">save</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">load</span><span class="p">(</span><span class="sa">f</span><span class="s">"/home/emastr/phd/data/fno_adjoint_state_dict_2022_12_02_default5_</span><span class="si">{</span><span class="mi">30000</span><span class="si">}</span><span class="s">.Torch"</span><span class="p">)</span>
<span class="n">trainloss</span> <span class="o">=</span> <span class="n">save</span><span class="p">[</span><span class="s">"trainloss"</span><span class="p">]</span>
<span class="n">testloss</span> <span class="o">=</span> <span class="n">save</span><span class="p">[</span><span class="s">"testloss"</span><span class="p">]</span>
<span class="n">net</span><span class="p">.</span><span class="n">load_state_dict</span><span class="p">(</span><span class="n">save</span><span class="p">[</span><span class="s">"state dict"</span><span class="p">])</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;All keys matched successfully&gt;
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Y_net</span> <span class="o">=</span> <span class="n">net</span><span class="p">(</span><span class="n">X_test</span><span class="p">)</span>
<span class="n">Y_net</span> <span class="o">=</span> <span class="n">Y_net</span><span class="p">.</span><span class="n">detach</span><span class="p">()</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">90</span><span class="p">]:</span>
    <span class="n">plt</span><span class="p">.</span><span class="n">figure</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
    <span class="n">plt</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">V_test</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">:],</span> <span class="n">label</span><span class="o">=</span><span class="s">'inpx'</span><span class="p">)</span>
    <span class="n">plt</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">Y_net</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">:],</span> <span class="n">label</span><span class="o">=</span><span class="s">'netx'</span><span class="p">)</span>
    <span class="n">plt</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">Y_test</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">:],</span> <span class="s">'--'</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">'outx'</span><span class="p">)</span>
    <span class="n">plt</span><span class="p">.</span><span class="n">legend</span><span class="p">()</span>
    <span class="n">plt</span><span class="p">.</span><span class="n">figure</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
    <span class="n">plt</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">V_test</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">:])</span>
    <span class="n">plt</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">Y_net</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">:])</span>
    <span class="n">plt</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">Y_test</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">:])</span>
    
<span class="n">plt</span><span class="p">.</span><span class="n">figure</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="n">semilogy</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="nb">len</span><span class="p">(</span><span class="n">trainloss</span><span class="p">)),</span> <span class="n">trainloss</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="n">semilogy</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="nb">len</span><span class="p">(</span><span class="n">testloss</span><span class="p">)),</span> <span class="n">testloss</span><span class="p">)</span>

<span class="n">plt</span><span class="p">.</span><span class="n">figure</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="n">plot</span><span class="p">(</span><span class="n">inp</span><span class="p">[</span><span class="s">'x'</span><span class="p">][</span><span class="mi">0</span><span class="p">,</span> <span class="p">:],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'y'</span><span class="p">][</span><span class="mi">0</span><span class="p">,</span> <span class="p">:])</span>
<span class="n">plt</span><span class="p">.</span><span class="n">quiver</span><span class="p">(</span><span class="n">inp</span><span class="p">[</span><span class="s">'x'</span><span class="p">][</span><span class="mi">0</span><span class="p">,:],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'y'</span><span class="p">][</span><span class="mi">0</span><span class="p">,:],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'dy'</span><span class="p">][</span><span class="mi">0</span><span class="p">,:],</span> <span class="o">-</span><span class="n">inp</span><span class="p">[</span><span class="s">'dx'</span><span class="p">][</span><span class="mi">0</span><span class="p">,:])</span>
<span class="n">plt</span><span class="p">.</span><span class="n">quiver</span><span class="p">(</span><span class="n">inp</span><span class="p">[</span><span class="s">'x'</span><span class="p">][</span><span class="mi">0</span><span class="p">,:],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'y'</span><span class="p">][</span><span class="mi">0</span><span class="p">,:],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'ddx'</span><span class="p">][</span><span class="mi">0</span><span class="p">,:],</span> <span class="n">inp</span><span class="p">[</span><span class="s">'ddy'</span><span class="p">][</span><span class="mi">0</span><span class="p">,:],</span> <span class="n">color</span><span class="o">=</span><span class="s">'red'</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="n">axis</span><span class="p">(</span><span class="s">"equal"</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(-0.8800000131130219,
 0.8800000131130219,
 -0.6743489861488342,
 1.0797309041023255)
</code></pre></div></div>

<p><img src="/assets/posts/output_16_1.png" alt="png" /></p>

<p><img src="/assets/posts/output_16_2.png" alt="png" /></p>

<p><img src="/assets/posts/output_16_3.png" alt="png" /></p>

<p><img src="/assets/posts/output_16_4.png" alt="png" /></p>]]></content><author><name>Emanuel</name></author><category term="fno" /><category term="ml" /><category term="neural" /><category term="nn" /><summary type="html"><![CDATA[Fourier Neural Operator. Nuff said.]]></summary></entry></feed>