全部版块 我的主页
论坛 休闲区 十二区 灌水吧
906 0
2019-12-14
<!-- markdown css tag --><div class="pinggu_markdown">
<div class="pinggu_markdown__html"><h4 id="使用python实现lbm格子法方腔驱动流">使用Python实现LBM(格子法)方腔驱动流</h4>
<hr>
<ol>
<li>
<h5 id="python的不足:">Python的不足:</h5>
<p>Python的最大优势也可能是它最大的弱点:它的<strong>灵活性</strong>和<strong>无类型</strong>的高级语法可能导致数据和计算密集型程序的性能不佳。—— <em><strong>动态类型化解释语言</strong></em></p>
</li>
<li>
<h5 id="什么是-numba-">什么是 <em><strong>numba</strong></em> :</h5>
<p>Numba,一个来自<strong>Anaconda的Python编译器</strong>,可以编译Python代码,以便在支持CUDA的GPU或多核CPU上执行。由于Python通常不是编译语言,您可能想知道为什么要使用Python编译器。答案当然是运行本机编译代码比运行动态解释代码快许多倍。 Numba允许您为Python函数指定类型签名,它可以在运行时进行编译(这是 <em><strong>“即时”或JIT编译</strong></em>)。 Numba动态编译代码的能力意味着您不会放弃Python的灵活性。这是向高效率编程和高性能计算提供理想组合的重要一步。</p>
<p>使用Numba,现在可以<strong>编写标准的Python函数并在支持CUDA的GPU上运行它们</strong>。 Numba专为面向阵列的计算任务而设计,就像广泛使用的NumPy库一样。面向阵列的计算任务中的数据并行性非常适合GPU等加速器。 Numba了解NumPy数组类型,并使用它们生成有效的编译代码,以便在GPU或多核CPU上执行。<strong>所需的编程工作可以像添加函数装饰器一样简单</strong>,以指示Numba为GPU编译。例如,以下代码中的@vectorize装饰器在运行时生成标量函数Add的已编译矢量化版本,以便它可用于在GPU上并行处理数据数组<br>
<em><strong>An example:</strong></em></p>
<pre class=" language-python"><code class="prism  language-python"><span class="token comment"># -*- coding: utf-8 -*-</span>
<span class="token triple-quoted-string string">"""
Created on Thu Dec  5 14:&#48;&#48;:59 2&#48;19

@author: Franz
"""</span>
<span class="token keyword">import</span> numpy <span class="token keyword">as</span> np
<span class="token keyword">from</span> numba <span class="token keyword">import</span> vectorize

@vectorize<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'float32(float32, float32)'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> target<span class="token operator">=</span><span class="token string">'cpu'</span><span class="token punctuation">)</span>
<span class="token keyword">def</span> <span class="token function">Add</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> b<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> a <span class="token operator">+</span> b

<span class="token comment"># Initialize arrays</span>
N <span class="token operator">=</span> <span class="token number">1&#48;&#48;&#48;&#48;&#48;</span>
A <span class="token operator">=</span> np<span class="token punctuation">.</span>ones<span class="token punctuation">(</span>N<span class="token punctuation">,</span> dtype<span class="token operator">=</span>np<span class="token punctuation">.</span>float32<span class="token punctuation">)</span>
B <span class="token operator">=</span> np<span class="token punctuation">.</span>ones<span class="token punctuation">(</span>A<span class="token punctuation">.</span>shape<span class="token punctuation">,</span> dtype<span class="token operator">=</span>A<span class="token punctuation">.</span>dtype<span class="token punctuation">)</span>
C <span class="token operator">=</span> np<span class="token punctuation">.</span>empty_like<span class="token punctuation">(</span>A<span class="token punctuation">,</span> dtype<span class="token operator">=</span>A<span class="token punctuation">.</span>dtype<span class="token punctuation">)</span>

<span class="token comment"># Add arrays on GPU</span>
C <span class="token operator">=</span> Add<span class="token punctuation">(</span>A<span class="token punctuation">,</span> B<span class="token punctuation">)</span>
</code></pre>
<p>要在CPU上编译和运行相同的函数,我们只需将目标更改为“cpu”,从而在CPU上编译的矢量化C代码级别上产生性能,<strong>灵活性</strong>大大提高。</p>
</li>
<li>
<p>numpy的<code>loadtxt()</code>函数的用法<br>
<code>numpy.loadtxt(fname, dtype=, comments='#', delimiter=None, converters=None, skiprows=&#48;, usecols=None, unpack=False, ndmin=&#48;)</code></p>

<table>
<thead>
<tr>
<th align="center">参数</th>
<th align="center">作用</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">fname</td>
<td align="center">被读取的文件名(相对地址与绝对地址<sup class="footnote-ref"><a href="#fn1" id="fnref1">1</a></sup>)</td>
</tr>
<tr>
<td align="center">comments</td>
<td align="center">跳过以指定元素开头的行(不读取)</td>
</tr>
<tr>
<td align="center">delimiter</td>
<td align="center">指定读取文件中的数据分割符</td>
</tr>
<tr>
<td align="center">converters<sup class="footnote-ref"><a href="#fn2" id="fnref2">2</a></sup></td>
<td align="center">对读取数据进行预处理</td>
</tr>
<tr>
<td align="center">skiprows</td>
<td align="center">选择跳过的行数</td>
</tr>
<tr>
<td align="center">usecols</td>
<td align="center">指定读取列</td>
</tr>
<tr>
<td align="center">unpack</td>
<td align="center">是否将数据进行向量化输出<sup class="footnote-ref"><a href="#fn3" id="fnref3">3</a></sup></td>
</tr>
<tr>
<td align="center">encoding</td>
<td align="center">对数据进行预编码<sup class="footnote-ref"><a href="#fn4" id="fnref4">4</a></sup></td>
</tr>
</tbody>
</table></li>
<li>
<p>用matplotlib.pyplot的quiver()函数绘制矢量图<br>
调用方式</p>
<pre class=" language-python"><code class="prism  language-python">quiver<span class="token punctuation">(</span>U<span class="token punctuation">,</span> V<span class="token punctuation">,</span> <span class="token operator">**</span>kw<span class="token punctuation">)</span>
quiver<span class="token punctuation">(</span>U<span class="token punctuation">,</span> V<span class="token punctuation">,</span> C<span class="token punctuation">,</span> <span class="token operator">**</span>kw<span class="token punctuation">)</span>
quiver<span class="token punctuation">(</span>X<span class="token punctuation">,</span> Y<span class="token punctuation">,</span> U<span class="token punctuation">,</span> V<span class="token punctuation">,</span> <span class="token operator">**</span>kw<span class="token punctuation">)</span>
quiver<span class="token punctuation">(</span>X<span class="token punctuation">,</span> Y<span class="token punctuation">,</span> U<span class="token punctuation">,</span> V<span class="token punctuation">,</span> C<span class="token punctuation">,</span> <span class="token operator">**</span>kw<span class="token punctuation">)</span>
</code></pre>
<p>U、V是箭头数据(data),X、Y是箭头的位置,C是箭头的颜色。这些参数可以是一维或二维的数组或序列。<br>
如果X、Y不存在(absent),他们将作为均匀网格被生成。如果U和V是2维的数组,X和Y是1维数组,并且len(X)和len(Y)与U的列(column)和行(row)纬度相匹配(match),那么X和Y将使用numpy.meshgrid()——用于产生一个矩阵,具体可参考:meshgrid使用方法——进行扩展。</p>
<p>默认设置会自动将箭头的长度缩放到合理的大小。要改变箭头的长度请参看 scale 和scale_units两个关键字参数(kwargs:关键字参数,参看文章最后有关键字参数与可变参数的区别)</p>
<p>默认值给出一个稍微后掠(swept-back)的箭头;若要使箭头头部呈三角状,则要确保headaxislength与headlength相同。若要使箭头更尖锐(more pointed),则应减小headwidth或者增大headlength和headaxislength。若要使箭头头部相对于箭杆(shaft)更小一些,则应将所有头部参数都减小(scale down)。你最好不要单独留下minshaft(You will probably do best to leave minshaft alone.)<br>
相关详细用法可以参照<a href="https://blog.csdn.net/liuchengzimozigreat/article/details/8456665&#48;">Blog</a>,以及官方的<a href="https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.quiver">matplotlib参考文档</a></p>
</li>
<li>
<p>通过上述简单的加速,并通过对顶盖驱动流改写成Python程序,通过对其使用Numpy和Numba进行加速,最后使用quiver()函数绘制流场图:</p>
<pre class=" language-python"><code class="prism  language-python"><span class="token comment"># -*- coding: utf-8 -*-</span>
<span class="token triple-quoted-string string">"""
Created on Fri Dec  6 15:17:1&#48; 2&#48;19

@author: Franz
"""</span>
<span class="token keyword">import</span> numpy <span class="token keyword">as</span> np
<span class="token keyword">import</span> numba <span class="token keyword">as</span> nb
<span class="token keyword">import</span> matplotlib<span class="token punctuation">.</span>pyplot <span class="token keyword">as</span> plt

plt<span class="token punctuation">.</span>rcParams<span class="token punctuation">[</span><span class="token string">'figure.figsize'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">5.&#48;</span><span class="token punctuation">,</span> <span class="token number">5.&#48;</span><span class="token punctuation">)</span>
plt<span class="token punctuation">.</span>rcParams<span class="token punctuation">[</span><span class="token string">'figure.dpi'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1&#48;&#48;</span> <span class="token comment">#分辨率</span>
<span class="token comment"># function</span>
<span class="token comment"># 1st:equilibrum function</span>
@nb<span class="token punctuation">.</span>jit<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">def</span> <span class="token function">Feq</span><span class="token punctuation">(</span>k<span class="token punctuation">,</span>rho<span class="token punctuation">,</span>u<span class="token punctuation">)</span><span class="token punctuation">:</span>
    eu <span class="token operator">=</span> e<span class="token punctuation">[</span>k<span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span><span class="token operator">*</span>u<span class="token punctuation">[</span><span class="token number">&#48;</span><span class="token punctuation">]</span> <span class="token operator">+</span> e<span class="token punctuation">[</span>k<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">*</span>u<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
    uv <span class="token operator">=</span> u<span class="token punctuation">[</span><span class="token number">&#48;</span><span class="token punctuation">]</span><span class="token operator">**</span><span class="token number">2</span> <span class="token operator">+</span> u<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">**</span><span class="token number">2</span><span class="token punctuation">;</span>
    feq <span class="token operator">=</span> rho<span class="token operator">*</span>w<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token operator">*</span><span class="token punctuation">(</span><span class="token number">1.&#48;</span><span class="token operator">+</span><span class="token number">3.&#48;</span><span class="token operator">*</span>eu<span class="token operator">+</span><span class="token number">4.5</span><span class="token operator">*</span>eu<span class="token operator">*</span>eu<span class="token number">-1.5</span><span class="token operator">*</span>uv<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> feq

<span class="token comment"># 2nd:evolution: including move and collide,calculate micro-parameter</span>
@nb<span class="token punctuation">.</span>jit<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">def</span> <span class="token function">Evolution</span><span class="token punctuation">(</span>f<span class="token punctuation">,</span>rho<span class="token punctuation">,</span>u<span class="token punctuation">)</span><span class="token punctuation">:</span>
    F <span class="token operator">=</span> np<span class="token punctuation">.</span>zeros<span class="token punctuation">(</span><span class="token punctuation">(</span>NX<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span>NY<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span>Q<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span>NX<span class="token punctuation">)</span><span class="token punctuation">:</span>
        <span class="token keyword">for</span> j <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span>NY<span class="token punctuation">)</span><span class="token punctuation">:</span>
            <span class="token keyword">for</span> k <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>Q<span class="token punctuation">)</span><span class="token punctuation">:</span>
                ip <span class="token operator">=</span> i <span class="token operator">-</span> e<span class="token punctuation">[</span>k<span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
                jp <span class="token operator">=</span> j <span class="token operator">-</span> e<span class="token punctuation">[</span>k<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
                F<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> f<span class="token punctuation">[</span>ip<span class="token punctuation">,</span>jp<span class="token punctuation">,</span>k<span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token punctuation">(</span>Feq<span class="token punctuation">(</span>k<span class="token punctuation">,</span>rho<span class="token punctuation">[</span>ip<span class="token punctuation">,</span>jp<span class="token punctuation">]</span><span class="token punctuation">,</span>u<span class="token punctuation">[</span>ip<span class="token punctuation">,</span>jp<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">-</span>f<span class="token punctuation">[</span>ip<span class="token punctuation">,</span>jp<span class="token punctuation">,</span>k<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">/</span>tau_f<span class="token punctuation">;</span>
   
    u&#48; <span class="token operator">=</span> np<span class="token punctuation">.</span>empty<span class="token punctuation">(</span><span class="token punctuation">(</span>NX<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span>NY<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span>NX<span class="token punctuation">)</span><span class="token punctuation">:</span>
        <span class="token keyword">for</span> j <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span>NY<span class="token punctuation">)</span><span class="token punctuation">:</span>
            u&#48;<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span> <span class="token operator">=</span> u<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
            u&#48;<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> u<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
            rho<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">&#48;</span><span class="token punctuation">;</span>
            u<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">&#48;</span><span class="token punctuation">;</span>
            u<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">&#48;</span><span class="token punctuation">;</span>
            <span class="token keyword">for</span> k <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>Q<span class="token punctuation">)</span><span class="token punctuation">:</span>
                f<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> F<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span>k<span class="token punctuation">]</span><span class="token punctuation">;</span>
                rho<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">]</span> <span class="token operator">+=</span> f<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span>k<span class="token punctuation">]</span><span class="token punctuation">;</span>
                u<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span> <span class="token operator">+=</span> e<span class="token punctuation">[</span>k<span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span><span class="token operator">*</span>f<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span>k<span class="token punctuation">]</span><span class="token punctuation">;</span>
                u<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+=</span> e<span class="token punctuation">[</span>k<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">*</span>f<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span>k<span class="token punctuation">]</span><span class="token punctuation">;</span>
            u<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span> <span class="token operator">/=</span> rho<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span>
            u<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">/=</span> rho<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span>
   
    <span class="token comment"># left &amp; right marging</span>
    <span class="token keyword">for</span> j <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span>NY<span class="token punctuation">)</span><span class="token punctuation">:</span>
        <span class="token keyword">for</span> k <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>Q<span class="token punctuation">)</span><span class="token punctuation">:</span>
            rho<span class="token punctuation">[</span>NX<span class="token punctuation">,</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> rho<span class="token punctuation">[</span>NX<span class="token number">-1</span><span class="token punctuation">,</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span>
            f<span class="token punctuation">[</span>NX<span class="token punctuation">,</span>j<span class="token punctuation">,</span>k<span class="token punctuation">]</span><span class="token operator">=</span>Feq<span class="token punctuation">(</span>k<span class="token punctuation">,</span>rho<span class="token punctuation">[</span>NX<span class="token punctuation">,</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span>u<span class="token punctuation">[</span>NX<span class="token punctuation">,</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">+</span>f<span class="token punctuation">[</span>NX<span class="token number">-1</span><span class="token punctuation">,</span>j<span class="token punctuation">,</span>k<span class="token punctuation">]</span><span class="token operator">-</span>Feq<span class="token punctuation">(</span>k<span class="token punctuation">,</span>rho<span class="token punctuation">[</span>NX<span class="token number">-1</span><span class="token punctuation">,</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span>u<span class="token punctuation">[</span>NX<span class="token number">-1</span><span class="token punctuation">,</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            rho<span class="token punctuation">[</span><span class="token number">&#48;</span><span class="token punctuation">,</span>j<span class="token punctuation">]</span><span class="token operator">=</span>rho<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span>
            f<span class="token punctuation">[</span><span class="token number">&#48;</span><span class="token punctuation">,</span>j<span class="token punctuation">,</span>k<span class="token punctuation">]</span><span class="token operator">=</span>Feq<span class="token punctuation">(</span>k<span class="token punctuation">,</span>rho<span class="token punctuation">[</span><span class="token number">&#48;</span><span class="token punctuation">,</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span>u<span class="token punctuation">[</span><span class="token number">&#48;</span><span class="token punctuation">,</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">+</span>f<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span>j<span class="token punctuation">,</span>k<span class="token punctuation">]</span><span class="token operator">-</span>Feq<span class="token punctuation">(</span>k<span class="token punctuation">,</span>rho<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span>u<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   
    <span class="token comment"># top &amp; bottom margin</span>
    <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>NX<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
        <span class="token keyword">for</span> k <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>Q<span class="token punctuation">)</span><span class="token punctuation">:</span>
            rho<span class="token punctuation">[</span>i<span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span> <span class="token operator">=</span> rho<span class="token punctuation">[</span>i<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
            f<span class="token punctuation">[</span>i<span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">,</span>k<span class="token punctuation">]</span><span class="token operator">=</span>Feq<span class="token punctuation">(</span>k<span class="token punctuation">,</span>rho<span class="token punctuation">[</span>i<span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span><span class="token punctuation">,</span>u<span class="token punctuation">[</span>i<span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">+</span>f<span class="token punctuation">[</span>i<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span>k<span class="token punctuation">]</span><span class="token operator">-</span>Feq<span class="token punctuation">(</span>k<span class="token punctuation">,</span>rho<span class="token punctuation">[</span>i<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span>u<span class="token punctuation">[</span>i<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            rho<span class="token punctuation">[</span>i<span class="token punctuation">,</span>NY<span class="token punctuation">]</span><span class="token operator">=</span>rho<span class="token punctuation">[</span>i<span class="token punctuation">,</span>NY<span class="token number">-1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
            u<span class="token punctuation">[</span>i<span class="token punctuation">,</span>NY<span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span><span class="token operator">=</span>U<span class="token punctuation">;</span>
            f<span class="token punctuation">[</span>i<span class="token punctuation">,</span>NY<span class="token punctuation">,</span>k<span class="token punctuation">]</span><span class="token operator">=</span>Feq<span class="token punctuation">(</span>k<span class="token punctuation">,</span>rho<span class="token punctuation">[</span>i<span class="token punctuation">,</span>NY<span class="token punctuation">]</span><span class="token punctuation">,</span>u<span class="token punctuation">[</span>i<span class="token punctuation">,</span>NY<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">+</span>f<span class="token punctuation">[</span>i<span class="token punctuation">,</span>NY<span class="token number">-1</span><span class="token punctuation">,</span>k<span class="token punctuation">]</span><span class="token operator">-</span>Feq<span class="token punctuation">(</span>k<span class="token punctuation">,</span>rho<span class="token punctuation">[</span>i<span class="token punctuation">,</span>NY<span class="token number">-1</span><span class="token punctuation">]</span><span class="token punctuation">,</span>u<span class="token punctuation">[</span>i<span class="token punctuation">,</span>NY<span class="token number">-1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   
    <span class="token keyword">return</span> f<span class="token punctuation">,</span>u<span class="token punctuation">,</span>u&#48;

@nb<span class="token punctuation">.</span>jit<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">def</span> <span class="token function">Error</span><span class="token punctuation">(</span>u<span class="token punctuation">,</span>u&#48;<span class="token punctuation">)</span><span class="token punctuation">:</span>
    temp1 <span class="token operator">=</span> <span class="token number">&#48;</span>
    temp2 <span class="token operator">=</span> <span class="token number">&#48;</span>
    <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span>NX<span class="token punctuation">)</span><span class="token punctuation">:</span>
        <span class="token keyword">for</span> j <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span>NY<span class="token punctuation">)</span><span class="token punctuation">:</span>
            temp1 <span class="token operator">+=</span> <span class="token punctuation">(</span>u<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span><span class="token operator">-</span>u&#48;<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">**</span><span class="token number">2</span><span class="token operator">+</span><span class="token punctuation">(</span>u<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">-</span>u&#48;<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">**</span><span class="token number">2</span><span class="token punctuation">;</span>
            temp2 <span class="token operator">+=</span> u<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span><span class="token operator">**</span><span class="token number">2</span><span class="token operator">+</span>u<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">**</span><span class="token number">2</span><span class="token punctuation">;</span>
            error <span class="token operator">=</span> np<span class="token punctuation">.</span>sqrt<span class="token punctuation">(</span>temp1<span class="token punctuation">)</span><span class="token operator">/</span>np<span class="token punctuation">.</span>sqrt<span class="token punctuation">(</span>temp2<span class="token operator">+</span><span class="token number">1e</span><span class="token operator">-</span><span class="token number">3&#48;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> error
            


<span class="token keyword">global</span> Q<span class="token punctuation">,</span>NX<span class="token punctuation">,</span>NY<span class="token punctuation">,</span>U<span class="token punctuation">;</span>
Q <span class="token operator">=</span> <span class="token number">9</span><span class="token punctuation">;</span>
NX <span class="token operator">=</span> <span class="token number">256</span><span class="token punctuation">;</span>
NY <span class="token operator">=</span> <span class="token number">256</span><span class="token punctuation">;</span>
U <span class="token operator">=</span> <span class="token number">&#48;.1</span><span class="token punctuation">;</span>

<span class="token keyword">global</span> e<span class="token punctuation">,</span>w<span class="token punctuation">,</span>tau_f<span class="token punctuation">;</span>
e <span class="token operator">=</span> np<span class="token punctuation">.</span>array<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token number">&#48;</span><span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token punctuation">[</span><span class="token number">&#48;</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token punctuation">[</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token punctuation">[</span><span class="token number">&#48;</span><span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token punctuation">[</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token punctuation">[</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">,</span>dtype<span class="token operator">=</span><span class="token builtin">int</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
w <span class="token operator">=</span> np<span class="token punctuation">.</span>array<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">4.&#48;</span><span class="token operator">/</span><span class="token number">9</span><span class="token punctuation">,</span><span class="token number">1.&#48;</span><span class="token operator">/</span><span class="token number">9</span><span class="token punctuation">,</span><span class="token number">1.&#48;</span><span class="token operator">/</span><span class="token number">9</span><span class="token punctuation">,</span><span class="token number">1.&#48;</span><span class="token operator">/</span><span class="token number">9</span><span class="token punctuation">,</span><span class="token number">1.&#48;</span><span class="token operator">/</span><span class="token number">9</span><span class="token punctuation">,</span><span class="token number">1.&#48;</span><span class="token operator">/</span><span class="token number">36</span><span class="token punctuation">,</span><span class="token number">1.&#48;</span><span class="token operator">/</span><span class="token number">36</span><span class="token punctuation">,</span><span class="token number">1.&#48;</span><span class="token operator">/</span><span class="token number">36</span><span class="token punctuation">,</span><span class="token number">1.&#48;</span><span class="token operator">/</span><span class="token number">36</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>


<span class="token comment"># main</span>
<span class="token comment"># init</span>
dx <span class="token operator">=</span> <span class="token number">1.&#48;</span><span class="token punctuation">;</span>
dy <span class="token operator">=</span> <span class="token number">1.&#48;</span><span class="token punctuation">;</span>
Lx <span class="token operator">=</span> dx <span class="token operator">*</span> NX<span class="token punctuation">;</span>
Ly <span class="token operator">=</span> dy <span class="token operator">*</span> NY<span class="token punctuation">;</span>
dt <span class="token operator">=</span> dx<span class="token punctuation">;</span>
c <span class="token operator">=</span> dx<span class="token operator">/</span>dt<span class="token punctuation">;</span>
rho&#48; <span class="token operator">=</span> <span class="token number">1.&#48;</span><span class="token punctuation">;</span>
Re <span class="token operator">=</span> <span class="token number">1&#48;&#48;&#48;</span><span class="token punctuation">;</span>
niu <span class="token operator">=</span> U <span class="token operator">*</span> Lx <span class="token operator">/</span> Re<span class="token punctuation">;</span>
tau_f <span class="token operator">=</span> <span class="token number">3.&#48;</span><span class="token operator">*</span>niu <span class="token operator">+</span> <span class="token number">&#48;.5</span><span class="token punctuation">;</span>

u <span class="token operator">=</span> np<span class="token punctuation">.</span>zeros<span class="token punctuation">(</span><span class="token punctuation">(</span>NX<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span>NY<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span>dtype<span class="token operator">=</span><span class="token string">'double'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
rho <span class="token operator">=</span> np<span class="token punctuation">.</span>ones<span class="token punctuation">(</span><span class="token punctuation">(</span>NX<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span>NY<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span>dtype<span class="token operator">=</span><span class="token string">'double'</span><span class="token punctuation">)</span><span class="token operator">*</span>rho&#48;<span class="token punctuation">;</span>
f <span class="token operator">=</span> np<span class="token punctuation">.</span>empty<span class="token punctuation">(</span><span class="token punctuation">(</span>NX<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span>NY<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span>Q<span class="token punctuation">)</span><span class="token punctuation">,</span>dtype<span class="token operator">=</span><span class="token string">'double'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>NX<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
    u<span class="token punctuation">[</span>i<span class="token punctuation">,</span>NY<span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span><span class="token operator">=</span>U<span class="token punctuation">;</span>
    <span class="token keyword">for</span> j <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>NY<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
        <span class="token keyword">for</span> k <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span>Q<span class="token punctuation">)</span><span class="token punctuation">:</span>
            f<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> Feq<span class="token punctuation">(</span>k<span class="token punctuation">,</span>rho<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">]</span><span class="token punctuation">,</span>u<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

n <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment"># calculate the times</span>
<span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span>
    f<span class="token punctuation">,</span>u<span class="token punctuation">,</span>u&#48; <span class="token operator">=</span> Evolution<span class="token punctuation">(</span>f<span class="token punctuation">,</span>rho<span class="token punctuation">,</span>u<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span> n <span class="token operator">%</span> <span class="token number">1&#48;&#48;</span> <span class="token operator">==</span> <span class="token number">&#48;</span><span class="token punctuation">:</span>
        <span class="token keyword">if</span> Error<span class="token punctuation">(</span>u<span class="token punctuation">,</span>u&#48;<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">1.&#48;e-6</span><span class="token punctuation">:</span>
            <span class="token keyword">break</span>
        <span class="token keyword">if</span> n <span class="token operator">&gt;=</span> <span class="token number">1&#48;&#48;&#48;</span> <span class="token operator">&amp;</span> n <span class="token operator">%</span> <span class="token number">1&#48;&#48;&#48;</span> <span class="token operator">==</span> <span class="token number">&#48;</span><span class="token punctuation">:</span>
            x<span class="token punctuation">,</span>y <span class="token operator">=</span> np<span class="token punctuation">.</span>mgrid<span class="token punctuation">[</span><span class="token number">&#48;</span><span class="token punctuation">:</span><span class="token number">257</span><span class="token punctuation">:</span><span class="token number">257J</span><span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">:</span><span class="token number">257</span><span class="token punctuation">:</span><span class="token number">257J</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
            ux <span class="token operator">=</span> u<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">,</span><span class="token punctuation">:</span><span class="token punctuation">,</span><span class="token number">&#48;</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
            uy <span class="token operator">=</span> u<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">,</span><span class="token punctuation">:</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
            M <span class="token operator">=</span> np<span class="token punctuation">.</span>hypot<span class="token punctuation">(</span>ux<span class="token punctuation">,</span> uy<span class="token punctuation">)</span>
            a <span class="token operator">=</span> plt<span class="token punctuation">.</span>quiver<span class="token punctuation">(</span>ux<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token number">9</span><span class="token punctuation">,</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token number">9</span><span class="token punctuation">]</span><span class="token punctuation">.</span>T<span class="token punctuation">,</span>uy<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token number">9</span><span class="token punctuation">,</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token number">9</span><span class="token punctuation">]</span><span class="token punctuation">.</span>T<span class="token punctuation">,</span>M<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token number">9</span><span class="token punctuation">,</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token number">9</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            plt<span class="token punctuation">.</span>show<span class="token punctuation">(</span><span class="token punctuation">)</span>
            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'The run times is %d'</span><span class="token operator">%</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    n <span class="token operator">+=</span> <span class="token number">1</span><span class="token punctuation">;</span>
</code></pre>
</li>
</ol>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>绝对路径和相对路径的区别及其转换可以查看<a href="https://www.cnblogs.com/wangyanyan/p/744&#48;685.html">Blog</a> <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn2" class="footnote-item"><p>converts对格式的控制类似<code>converters={1:_is_num}</code>,其中1代表控制输出第一列,,详细参考<a href="https://www.cnblogs.com/maoguy/p/6894591.html">Blog</a> <a href="#fnref2" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn3" class="footnote-item"><p><code>unpack</code>:选择是否将数据向量输出,默认是False,即将数据逐行输出,当设置为True时,数据将逐列输出 <a href="#fnref3" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn4" class="footnote-item"><p><code>encoding</code>决定读取文件时使用的编码方式,可以参照<a href="https://blog.csdn.net/lwhello/article/details/8&#48;271633">Blog</a> <a href="#fnref4" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
</div>
</div>
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群