|
67 | 67 | <li class="toctree-l1"><a class="reference internal" href="EB_Chapter.html">Embedded Boundaries</a></li>
|
68 | 68 | <li class="toctree-l1 current"><a class="reference internal" href="FFT_Chapter.html">Discrete Fourier Transform</a><ul class="current">
|
69 | 69 | <li class="toctree-l2 current"><a class="current reference internal" href="#">FFT::R2C Class</a></li>
|
| 70 | +<li class="toctree-l2"><a class="reference internal" href="#fft-localr2c-class">FFT::LocalR2C Class</a></li> |
70 | 71 | <li class="toctree-l2"><a class="reference internal" href="#poisson-solver">Poisson Solver</a></li>
|
71 | 72 | </ul>
|
72 | 73 | </li>
|
|
112 | 113 | <section id="fft-r2c-class">
|
113 | 114 | <span id="sec-fft-r2c"></span><h1>FFT::R2C Class<a class="headerlink" href="#fft-r2c-class" title="Permalink to this heading"></a></h1>
|
114 | 115 | <p>Class template <cite>FFT::R2C</cite> supports discrete Fourier transforms between real
|
115 |
| -and complex data. The name R2C indicates that the forward transform converts |
116 |
| -real data to complex data, while the backward transform converts complex |
117 |
| -data to real data. It should be noted that both directions of transformation |
118 |
| -are supported, not just from real to complex.</p> |
| 116 | +and complex data across MPI processes. The name R2C indicates that the |
| 117 | +forward transform converts real data to complex data, while the backward |
| 118 | +transform converts complex data to real data. It should be noted that both |
| 119 | +directions of transformation are supported, not just from real to complex.</p> |
119 | 120 | <p>The implementation utilizes cuFFT, rocFFT, oneMKL and FFTW, for CUDA, HIP,
|
120 | 121 | SYCL and CPU builds, respectively. Because the parallel communication is
|
121 | 122 | handled by AMReX, it does not need the parallel version of
|
122 | 123 | FFTW. Furthermore, there is no constraint on the domain decomposition such
|
123 | 124 | as one Box per process. This class performs parallel FFT on AMReX’s parallel
|
124 | 125 | data containers (e.g., <code class="code highlight cpp c++ docutils literal highlight-c++"><span class="n">MultiFab</span><span class="w"></span></code> and
|
125 |
| -<code class="code highlight cpp c++ docutils literal highlight-c++"><span class="n">FabArray</span><span class="o"><</span><span class="n">BaseFab</span><span class="o"><</span><span class="n">ComplexData</span><span class="o"><</span><span class="n">Real</span><span class="o">>>></span><span class="w"></span></code>. For local FFT, the users can |
126 |
| -use FFTW, cuFFT, rocFFT, or oneMKL directly.</p> |
| 126 | +<code class="code highlight cpp c++ docutils literal highlight-c++"><span class="n">FabArray</span><span class="o"><</span><span class="n">BaseFab</span><span class="o"><</span><span class="n">ComplexData</span><span class="o"><</span><span class="n">Real</span><span class="o">>>></span><span class="w"></span></code>.</p> |
127 | 127 | <p>Other than using column-majored order, AMReX follows the convention of
|
128 | 128 | FFTW. Applying the forward transform followed by the backward transform
|
129 | 129 | scales the original data by the size of the input array. The layout of the
|
|
165 | 165 | <code class="code highlight cpp c++ docutils literal highlight-c++"><span class="n">FFT</span><span class="o">::</span><span class="n">R2C</span><span class="w"></span></code> does not have a default constructor, one could always use
|
166 | 166 | <code class="code highlight cpp c++ docutils literal highlight-c++"><span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o"><</span><span class="n">FFT</span><span class="o">::</span><span class="n">R2C</span><span class="o"><</span><span class="n">Real</span><span class="o">>></span><span class="w"></span></code> to store an object in one’s class.</p>
|
167 | 167 | </section>
|
| 168 | +<section id="fft-localr2c-class"> |
| 169 | +<span id="sec-fft-localr2c"></span><h1>FFT::LocalR2C Class<a class="headerlink" href="#fft-localr2c-class" title="Permalink to this heading"></a></h1> |
| 170 | +<p>Class template <cite>FFT::LocalR2C</cite> supports local discrete Fourier transforms |
| 171 | +between real and complex data. The name R2C indicates that the forward |
| 172 | +transform converts real data to complex data, while the backward transform |
| 173 | +converts complex data to real data. It should be noted that both directions |
| 174 | +of transformation are supported, not just from real to complex.</p> |
| 175 | +<p>Below is an example of using <code class="code highlight cpp c++ docutils literal highlight-c++"><span class="n">FFT</span><span class="o">::</span><span class="n">LocalR2C</span><span class="w"></span></code>.</p> |
| 176 | +<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="n">MultiFab</span><span class="w"> </span><span class="nf">mf</span><span class="p">(...);</span><span class="w"></span> |
| 177 | +<span class="n">BaseFab</span><span class="o"><</span><span class="n">GpuComplex</span><span class="o"><</span><span class="n">T</span><span class="o">>></span><span class="w"> </span><span class="n">cfab</span><span class="p">;</span><span class="w"></span> |
| 178 | +<span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">MFIter</span><span class="w"> </span><span class="n">mfi</span><span class="p">(</span><span class="n">mf</span><span class="p">);</span><span class="w"> </span><span class="n">mfi</span><span class="p">.</span><span class="n">isValid</span><span class="p">();</span><span class="w"> </span><span class="o">++</span><span class="n">mfi</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span> |
| 179 | +<span class="w"> </span><span class="n">FFT</span><span class="o">::</span><span class="n">LocalR2C</span><span class="w"> </span><span class="nf">fft</span><span class="p">(</span><span class="n">mfi</span><span class="p">.</span><span class="n">fabbox</span><span class="p">().</span><span class="n">length</span><span class="p">());</span><span class="w"></span> |
| 180 | +<span class="w"> </span><span class="n">cfab</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">IntVect</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span><span class="w"> </span><span class="n">fft</span><span class="p">.</span><span class="n">spectralSize</span><span class="p">()</span><span class="mi">-1</span><span class="p">);</span><span class="w"></span> |
| 181 | +<span class="w"> </span><span class="n">fft</span><span class="p">.</span><span class="n">forward</span><span class="p">(</span><span class="n">mf</span><span class="p">[</span><span class="n">mfi</span><span class="p">].</span><span class="n">dataPtr</span><span class="p">(),</span><span class="w"> </span><span class="n">cfab</span><span class="p">.</span><span class="n">dataPtr</span><span class="p">());</span><span class="w"></span> |
| 182 | +<span class="p">}</span><span class="w"></span> |
| 183 | +</pre></div> |
| 184 | +</div> |
| 185 | +</section> |
168 | 186 | <section id="poisson-solver">
|
169 | 187 | <h1>Poisson Solver<a class="headerlink" href="#poisson-solver" title="Permalink to this heading"></a></h1>
|
170 | 188 | <p>AMReX provides FFT based Poisson solvers. Here, Poisson’s equation is</p>
|
|
0 commit comments