最近感觉CSDN有点大病,用各种浏览器都不显示最上面那一栏(就是点赞、数据、发布啥啥的那一栏),今天用ubuntu偶然发现又显示了, 赶紧把之前写的东西发出来记录一下,不知道问题出在哪:(

CFDpython - 12 steps to N-S equation

后面四步,每一步都是一个不同的方程,分别是:二维拉普拉斯方程、二维泊松方程、二维空腔流动、二维管渠流动

Step 9: 2D Laplace Equation

  1. 方程形式如下:
    ∂ 2 p ∂ x 2 + ∂ 2 p ∂ y 2 = 0 \frac{\partial ^2 p}{\partial x^2} + \frac{\partial ^2 p}{\partial y^2} = 0 ∂x2∂2p​+∂y2∂2p​=0
  2. 通过观察这个方程可以发现,两项是关于x和y的扩散项方程,因此可以用二阶中心差分进行离散:
    p i + 1 , j n − 2 p i , j n + p i − 1 , j n Δ x 2 + p i , j + 1 n − 2 p i , j n + p i , j − 1 n Δ y 2 = 0 \frac{p_{i+1, j}^n - 2p_{i,j}^n + p_{i-1,j}^n}{\Delta x^2} + \frac{p_{i,j+1}^n - 2p_{i,j}^n + p_{i, j-1}^n}{\Delta y^2} = 0 Δx2pi+1,jn​−2pi,jn​+pi−1,jn​​+Δy2pi,j+1n​−2pi,jn​+pi,j−1n​​=0
  3. 该方程与时间t无关(也就是常说的稳态),那么可以通过迭代的方法求解 p i , j n p_{i,j}^n pi,jn​ ,即将离散方程转化为五点差分形式
    p i , j n = Δ y 2 ( p i + 1 , j n + p i − 1 , j n ) + Δ x 2 ( p i , j + 1 n + p i , j − 1 n ) 2 ( Δ x 2 + Δ y 2 ) p_{i,j}^n = \frac{\Delta y^2(p_{i+1,j}^n+p_{i-1,j}^n)+\Delta x^2(p_{i,j+1}^n + p_{i,j-1}^n)}{2(\Delta x^2 + \Delta y^2)} pi,jn​=2(Δx2+Δy2)Δy2(pi+1,jn​+pi−1,jn​)+Δx2(pi,j+1n​+pi,j−1n​)​
  4. 初始条件: p = 0 p=0 p=0
  5. 边界条件:
    • p = 0 p=0 p=0 at x = 0 x=0 x=0
    • p = y p=y p=y at x = 2 x=2 x=2
    • ∂ p ∂ y = 0 \frac{\partial p}{\partial y}=0 ∂y∂p​=0 at y = 0 , 1 y=0, \ 1 y=0, 1
  6. 解析解:
    p ( x , y ) = x 4 − 4 ∑ n = 1 , o d d ∞ 1 ( n π ) 2 sinh ⁡ 2 n π sinh ⁡ n π x cos ⁡ n π y p(x,y)=\frac{x}{4}-4\sum_{n=1,odd}^{\infty}\frac{1}{(n\pi)^2\sinh2n\pi}\sinh n\pi x\cos n\pi y p(x,y)=4x​−4n=1,odd∑∞​(nπ)2sinh2nπ1​sinhnπxcosnπy
  7. 代码如下(自己写的,原文可以看最上方的链接)
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cmdef plot2D(x,y,p):plt.ion() # 这个东西是方便close,不然close不鸟fig=plt.figure(figsize=(11,7),dpi=100) # 在Matplotlib 3.4版本之后,将fig.gca弃用了ax = fig.add_subplot(projection='3d')X,Y=np.meshgrid(x,y)surf=ax.plot_surface(X,Y,p[:],rstride=1,cstride=1,cmap=cm.viridis,linewidth=0,antialiased=False)ax.set_xlim(0,2)ax.set_ylim(0, 1)ax.view_init(30,225)# create x and y coordinate
nx=100
ny=100
x=np.linspace(0,2,nx)
y=np.linspace(0,1,ny)
dx=2/(nx-1)
dy=1/(ny-1)# initial p
p=np.zeros((nx,ny))# boundary p
p[0,:]=0
p[-1,:]=y
p[:,0]=p[:,1] # dp/dy=0 at y=0
p[:,-1]=p[:,-2] # dp/dy=0 at y=1# start iteration
error=1
pn=np.empty_like(p)
while error>=1e-6:pn=p.copy()p[1:-1,1:-1]=((dy**2*(p[2:,1:-1]+p[0:-2,1:-1]))+dx**2*(p[1:-1,2:]+p[1:-1,0:-2]))/(2*(dx**2+dy**2))# boundaryp[0, :] = 0p[-1, :] = yp[:, 0] = p[:, 1]  # dp/dy=0 at y=0p[:, -1] = p[:, -2]  # dp/dy=0 at y=1# error= norm L2error=np.linalg.norm(x=p-pn,ord=2)# draw in every iterationplt.close()plot2D(x,y,p)plt.show()plt.pause(1)

Step 10: 2D Poisson Equation

  1. 这一步作者在最后提到,其实求解这种方程的代码都很像(事实也确实如此,仅仅是边界条件和初始条件不同,离散方程的方法大差不差),如果想规整这些代码,涉及到python中package的概念。
  2. 二维泊松方程的形式如下:
    ∂ 2 p ∂ x 2 + ∂ 2 p ∂ y 2 = b \frac{\partial ^2 p}{\partial x^2} + \frac{\partial ^2 p}{\partial y^2} = b ∂x2∂2p​+∂y2∂2p​=b
  3. 离散方式和上文大同小异,就是扩散项和常数源项:
    p i + 1 , j n − 2 p i , j n + p i − 1 , j n Δ x 2 + p i , j + 1 n − 2 p i , j n + p i , j − 1 n Δ y 2 = b i , j n \frac{p_{i+1,j}^{n}-2p_{i,j}^{n}+p_{i-1,j}^{n}}{\Delta x^2}+\frac{p_{i,j+1}^{n}-2 p_{i,j}^{n}+p_{i,j-1}^{n}}{\Delta y^2}=b_{i,j}^{n} Δx2pi+1,jn​−2pi,jn​+pi−1,jn​​+Δy2pi,j+1n​−2pi,jn​+pi,j−1n​​=bi,jn​
  4. 代码就不贴了,有需要的话看原文去,这里也让笔者大受启发,在求解CFD问题的时候,不要想着一口气吃成一个大胖子,先从稳态方程写起,弄好之后再加非稳态项,最后加源项。

Step 11: Cavity Flow with Navier–Stokes

  1. 这是N-S方程质量和动量守恒方程组:
    ∇ ⋅ v ⃗ = 0 \nabla\cdot\vec{v} = 0 ∇⋅v =0
    ∂ v ⃗ ∂ t + ( v ⃗ ⋅ ∇ ) v ⃗ = − 1 ρ ∇ p + ν ∇ 2 v ⃗ \frac{\partial \vec{v}}{\partial t}+(\vec{v}\cdot\nabla)\vec{v} = -\frac{1}{\rho}\nabla p + \nu \nabla^2\vec{v} ∂t∂v ​+(v ⋅∇)v =−ρ1​∇p+ν∇2v
  2. 二维方腔流方程形式如下,其中第三个压力的扩散方程就是上一步推出的2维泊松方程,这里由于要分别求压力和流速,可以尝试采用SIMPLE算法
    ∂ u ∂ t + u ∂ u ∂ x + v ∂ u ∂ y = − 1 ρ ∂ p ∂ x + ν ( ∂ 2 u ∂ x 2 + ∂ 2 u ∂ y 2 ) \frac{\partial u}{\partial t}+u\frac{\partial u}{\partial x}+v\frac{\partial u}{\partial y} = -\frac{1}{\rho}\frac{\partial p}{\partial x}+\nu \left(\frac{\partial^2 u}{\partial x^2}+\frac{\partial^2 u}{\partial y^2} \right) ∂t∂u​+u∂x∂u​+v∂y∂u​=−ρ1​∂x∂p​+ν(∂x2∂2u​+∂y2∂2u​)

∂ v ∂ t + u ∂ v ∂ x + v ∂ v ∂ y = − 1 ρ ∂ p ∂ y + ν ( ∂ 2 v ∂ x 2 + ∂ 2 v ∂ y 2 ) \frac{\partial v}{\partial t}+u\frac{\partial v}{\partial x}+v\frac{\partial v}{\partial y} = -\frac{1}{\rho}\frac{\partial p}{\partial y}+\nu\left(\frac{\partial^2 v}{\partial x^2}+\frac{\partial^2 v}{\partial y^2}\right) ∂t∂v​+u∂x∂v​+v∂y∂v​=−ρ1​∂y∂p​+ν(∂x2∂2v​+∂y2∂2v​)

∂ 2 p ∂ x 2 + ∂ 2 p ∂ y 2 = − ρ ( ∂ u ∂ x ∂ u ∂ x + 2 ∂ u ∂ y ∂ v ∂ x + ∂ v ∂ y ∂ v ∂ y ) \frac{\partial^2 p}{\partial x^2}+\frac{\partial^2 p}{\partial y^2} = -\rho\left(\frac{\partial u}{\partial x}\frac{\partial u}{\partial x}+2\frac{\partial u}{\partial y}\frac{\partial v}{\partial x}+\frac{\partial v}{\partial y}\frac{\partial v}{\partial y} \right) ∂x2∂2p​+∂y2∂2p​=−ρ(∂x∂u​∂x∂u​+2∂y∂u​∂x∂v​+∂y∂v​∂y∂v​)

  1. 方程离散,作者建议这里要手写一下,原理不难,就是简单的差分罢了,但是很考验一个人的手感:
    u i , j n + 1 − u i , j n Δ t + u i , j n u i , j n − u i − 1 , j n Δ x + v i , j n u i , j n − u i , j − 1 n Δ y = − 1 ρ p i + 1 , j n − p i − 1 , j n 2 Δ x + ν ( u i + 1 , j n − 2 u i , j n + u i − 1 , j n Δ x 2 + u i , j + 1 n − 2 u i , j n + u i , j − 1 n Δ y 2 ) \begin{split} & \frac{u_{i,j}^{n+1}-u_{i,j}^{n}}{\Delta t}+u_{i,j}^{n}\frac{u_{i,j}^{n}-u_{i-1,j}^{n}}{\Delta x}+v_{i,j}^{n}\frac{u_{i,j}^{n}-u_{i,j-1}^{n}}{\Delta y} = \\ & \qquad -\frac{1}{\rho}\frac{p_{i+1,j}^{n}-p_{i-1,j}^{n}}{2\Delta x}+\nu\left(\frac{u_{i+1,j}^{n}-2u_{i,j}^{n}+u_{i-1,j}^{n}}{\Delta x^2}+\frac{u_{i,j+1}^{n}-2u_{i,j}^{n}+u_{i,j-1}^{n}}{\Delta y^2}\right) \end{split} ​Δtui,jn+1​−ui,jn​​+ui,jn​Δxui,jn​−ui−1,jn​​+vi,jn​Δyui,jn​−ui,j−1n​​=−ρ1​2Δxpi+1,jn​−pi−1,jn​​+ν(Δx2ui+1,jn​−2ui,jn​+ui−1,jn​​+Δy2ui,j+1n​−2ui,jn​+ui,j−1n​​)​
    v i , j n + 1 − v i , j n Δ t + u i , j n v i , j n − v i − 1 , j n Δ x + v i , j n v i , j n − v i , j − 1 n Δ y = − 1 ρ p i , j + 1 n − p i , j − 1 n 2 Δ y + ν ( v i + 1 , j n − 2 v i , j n + v i − 1 , j n Δ x 2 + v i , j + 1 n − 2 v i , j n + v i , j − 1 n Δ y 2 ) \begin{split} &\frac{v_{i,j}^{n+1}-v_{i,j}^{n}}{\Delta t}+u_{i,j}^{n}\frac{v_{i,j}^{n}-v_{i-1,j}^{n}}{\Delta x}+v_{i,j}^{n}\frac{v_{i,j}^{n}-v_{i,j-1}^{n}}{\Delta y} = \\ & \qquad -\frac{1}{\rho}\frac{p_{i,j+1}^{n}-p_{i,j-1}^{n}}{2\Delta y} +\nu\left(\frac{v_{i+1,j}^{n}-2v_{i,j}^{n}+v_{i-1,j}^{n}}{\Delta x^2}+\frac{v_{i,j+1}^{n}-2v_{i,j}^{n}+v_{i,j-1}^{n}}{\Delta y^2}\right) \end{split} ​Δtvi,jn+1​−vi,jn​​+ui,jn​Δxvi,jn​−vi−1,jn​​+vi,jn​Δyvi,jn​−vi,j−1n​​=−ρ1​2Δypi,j+1n​−pi,j−1n​​+ν(Δx2vi+1,jn​−2vi,jn​+vi−1,jn​​+Δy2vi,j+1n​−2vi,jn​+vi,j−1n​​)​
    p i + 1 , j n − 2 p i , j n + p i − 1 , j n Δ x 2 + p i , j + 1 n − 2 p i , j n + p i , j − 1 n Δ y 2 = ρ [ 1 Δ t ( u i + 1 , j − u i − 1 , j 2 Δ x + v i , j + 1 − v i , j − 1 2 Δ y ) − u i + 1 , j − u i − 1 , j 2 Δ x u i + 1 , j − u i − 1 , j 2 Δ x − 2 u i , j + 1 − u i , j − 1 2 Δ y v i + 1 , j − v i − 1 , j 2 Δ x − v i , j + 1 − v i , j − 1 2 Δ y v i , j + 1 − v i , j − 1 2 Δ y ] \begin{split} & \frac{p_{i+1,j}^{n}-2p_{i,j}^{n}+p_{i-1,j}^{n}}{\Delta x^2}+\frac{p_{i,j+1}^{n}-2p_{i,j}^{n}+p_{i,j-1}^{n}}{\Delta y^2} = \\ & \qquad \rho \left[ \frac{1}{\Delta t}\left(\frac{u_{i+1,j}-u_{i-1,j}}{2\Delta x}+\frac{v_{i,j+1}-v_{i,j-1}}{2\Delta y}\right) -\frac{u_{i+1,j}-u_{i-1,j}}{2\Delta x}\frac{u_{i+1,j}-u_{i-1,j}}{2\Delta x} - 2\frac{u_{i,j+1}-u_{i,j-1}}{2\Delta y}\frac{v_{i+1,j}-v_{i-1,j}}{2\Delta x} - \frac{v_{i,j+1}-v_{i,j-1}}{2\Delta y}\frac{v_{i,j+1}-v_{i,j-1}}{2\Delta y}\right] \end{split} ​Δx2pi+1,jn​−2pi,jn​+pi−1,jn​​+Δy2pi,j+1n​−2pi,jn​+pi,j−1n​​=ρ[Δt1​(2Δxui+1,j​−ui−1,j​​+2Δyvi,j+1​−vi,j−1​​)−2Δxui+1,j​−ui−1,j​​2Δxui+1,j​−ui−1,j​​−22Δyui,j+1​−ui,j−1​​2Δxvi+1,j​−vi−1,j​​−2Δyvi,j+1​−vi,j−1​​2Δyvi,j+1​−vi,j−1​​]​
  2. 把上一时刻的压力和速度放一侧:
    u i , j n + 1 = u i , j n − u i , j n Δ t Δ x ( u i , j n − u i − 1 , j n ) − v i , j n Δ t Δ y ( u i , j n − u i , j − 1 n ) − Δ t ρ 2 Δ x ( p i + 1 , j n − p i − 1 , j n ) + ν ( Δ t Δ x 2 ( u i + 1 , j n − 2 u i , j n + u i − 1 , j n ) + Δ t Δ y 2 ( u i , j + 1 n − 2 u i , j n + u i , j − 1 n ) ) \begin{split} u_{i,j}^{n+1} = u_{i,j}^{n} & - u_{i,j}^{n} \frac{\Delta t}{\Delta x} \left(u_{i,j}^{n}-u_{i-1,j}^{n}\right) - v_{i,j}^{n} \frac{\Delta t}{\Delta y} \left(u_{i,j}^{n}-u_{i,j-1}^{n}\right) \\ & - \frac{\Delta t}{\rho 2\Delta x} \left(p_{i+1,j}^{n}-p_{i-1,j}^{n}\right) \\ & + \nu \left(\frac{\Delta t}{\Delta x^2} \left(u_{i+1,j}^{n}-2u_{i,j}^{n}+u_{i-1,j}^{n}\right) + \frac{\Delta t}{\Delta y^2} \left(u_{i,j+1}^{n}-2u_{i,j}^{n}+u_{i,j-1}^{n}\right)\right) \end{split} ui,jn+1​=ui,jn​​−ui,jn​ΔxΔt​(ui,jn​−ui−1,jn​)−vi,jn​ΔyΔt​(ui,jn​−ui,j−1n​)−ρ2ΔxΔt​(pi+1,jn​−pi−1,jn​)+ν(Δx2Δt​(ui+1,jn​−2ui,jn​+ui−1,jn​)+Δy2Δt​(ui,j+1n​−2ui,jn​+ui,j−1n​))​
    p i , j n = ( p i + 1 , j n + p i − 1 , j n ) Δ y 2 + ( p i , j + 1 n + p i , j − 1 n ) Δ x 2 2 ( Δ x 2 + Δ y 2 ) − ρ Δ x 2 Δ y 2 2 ( Δ x 2 + Δ y 2 ) × [ 1 Δ t ( u i + 1 , j − u i − 1 , j 2 Δ x + v i , j + 1 − v i , j − 1 2 Δ y ) − u i + 1 , j − u i − 1 , j 2 Δ x u i + 1 , j − u i − 1 , j 2 Δ x − 2 u i , j + 1 − u i , j − 1 2 Δ y v i + 1 , j − v i − 1 , j 2 Δ x − v i , j + 1 − v i , j − 1 2 Δ y v i , j + 1 − v i , j − 1 2 Δ y ] \begin{split} p_{i,j}^{n} = & \frac{\left(p_{i+1,j}^{n}+p_{i-1,j}^{n}\right) \Delta y^2 + \left(p_{i,j+1}^{n}+p_{i,j-1}^{n}\right) \Delta x^2}{2\left(\Delta x^2+\Delta y^2\right)} \\ & -\frac{\rho\Delta x^2\Delta y^2}{2\left(\Delta x^2+\Delta y^2\right)} \\ & \times \left[\frac{1}{\Delta t}\left(\frac{u_{i+1,j}-u_{i-1,j}}{2\Delta x}+\frac{v_{i,j+1}-v_{i,j-1}}{2\Delta y}\right)-\frac{u_{i+1,j}-u_{i-1,j}}{2\Delta x}\frac{u_{i+1,j}-u_{i-1,j}}{2\Delta x} -2\frac{u_{i,j+1}-u_{i,j-1}}{2\Delta y}\frac{v_{i+1,j}-v_{i-1,j}}{2\Delta x}-\frac{v_{i,j+1}-v_{i,j-1}}{2\Delta y}\frac{v_{i,j+1}-v_{i,j-1}}{2\Delta y}\right] \end{split} pi,jn​=​2(Δx2+Δy2)(pi+1,jn​+pi−1,jn​)Δy2+(pi,j+1n​+pi,j−1n​)Δx2​−2(Δx2+Δy2)ρΔx2Δy2​×[Δt1​(2Δxui+1,j​−ui−1,j​​+2Δyvi,j+1​−vi,j−1​​)−2Δxui+1,j​−ui−1,j​​2Δxui+1,j​−ui−1,j​​−22Δyui,j+1​−ui,j−1​​2Δxvi+1,j​−vi−1,j​​−2Δyvi,j+1​−vi,j−1​​2Δyvi,j+1​−vi,j−1​​]​
  3. 边界条件:
    • u = 1 u=1 u=1 at y = 2 y=2 y=2 (the “lid”);

    • u , v = 0 u, v=0 u,v=0 on the other boundaries;

    • ∂ p ∂ y = 0 \frac{\partial p}{\partial y}=0 ∂y∂p​=0 at y = 0 y=0 y=0;

    • p = 0 p=0 p=0 at y = 2 y=2 y=2

    • ∂ p ∂ x = 0 \frac{\partial p}{\partial x}=0 ∂x∂p​=0 at x = 0 , 2 x=0,2 x=0,2

  4. 代码如下:
import numpy
from matplotlib import pyplot, cm
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inlinenx = 41
ny = 41
nt = 500
nit = 50
c = 1
dx = 2 / (nx - 1)
dy = 2 / (ny - 1)
x = numpy.linspace(0, 2, nx)
y = numpy.linspace(0, 2, ny)
X, Y = numpy.meshgrid(x, y)rho = 1
nu = .1
dt = .001u = numpy.zeros((ny, nx))
v = numpy.zeros((ny, nx))
p = numpy.zeros((ny, nx))
b = numpy.zeros((ny, nx))def build_up_b(b, rho, dt, u, v, dx, dy):b[1:-1, 1:-1] = (rho * (1 / dt * ((u[1:-1, 2:] - u[1:-1, 0:-2]) / (2 * dx) + (v[2:, 1:-1] - v[0:-2, 1:-1]) / (2 * dy)) -((u[1:-1, 2:] - u[1:-1, 0:-2]) / (2 * dx))**2 -2 * ((u[2:, 1:-1] - u[0:-2, 1:-1]) / (2 * dy) *(v[1:-1, 2:] - v[1:-1, 0:-2]) / (2 * dx))-((v[2:, 1:-1] - v[0:-2, 1:-1]) / (2 * dy))**2))return bdef pressure_poisson(p, dx, dy, b):pn = numpy.empty_like(p)pn = p.copy()for q in range(nit):pn = p.copy()p[1:-1, 1:-1] = (((pn[1:-1, 2:] + pn[1:-1, 0:-2]) * dy**2 + (pn[2:, 1:-1] + pn[0:-2, 1:-1]) * dx**2) /(2 * (dx**2 + dy**2)) -dx**2 * dy**2 / (2 * (dx**2 + dy**2)) * b[1:-1,1:-1])p[:, -1] = p[:, -2] # dp/dx = 0 at x = 2p[0, :] = p[1, :]   # dp/dy = 0 at y = 0p[:, 0] = p[:, 1]   # dp/dx = 0 at x = 0p[-1, :] = 0        # p = 0 at y = 2return pdef cavity_flow(nt, u, v, dt, dx, dy, p, rho, nu):un = numpy.empty_like(u)vn = numpy.empty_like(v)b = numpy.zeros((ny, nx))for n in range(nt):un = u.copy()vn = v.copy()b = build_up_b(b, rho, dt, u, v, dx, dy)p = pressure_poisson(p, dx, dy, b)u[1:-1, 1:-1] = (un[1:-1, 1:-1]-un[1:-1, 1:-1] * dt / dx *(un[1:-1, 1:-1] - un[1:-1, 0:-2]) -vn[1:-1, 1:-1] * dt / dy *(un[1:-1, 1:-1] - un[0:-2, 1:-1]) -dt / (2 * rho * dx) * (p[1:-1, 2:] - p[1:-1, 0:-2]) +nu * (dt / dx**2 *(un[1:-1, 2:] - 2 * un[1:-1, 1:-1] + un[1:-1, 0:-2]) +dt / dy**2 *(un[2:, 1:-1] - 2 * un[1:-1, 1:-1] + un[0:-2, 1:-1])))v[1:-1,1:-1] = (vn[1:-1, 1:-1] -un[1:-1, 1:-1] * dt / dx *(vn[1:-1, 1:-1] - vn[1:-1, 0:-2]) -vn[1:-1, 1:-1] * dt / dy *(vn[1:-1, 1:-1] - vn[0:-2, 1:-1]) -dt / (2 * rho * dy) * (p[2:, 1:-1] - p[0:-2, 1:-1]) +nu * (dt / dx**2 *(vn[1:-1, 2:] - 2 * vn[1:-1, 1:-1] + vn[1:-1, 0:-2]) +dt / dy**2 *(vn[2:, 1:-1] - 2 * vn[1:-1, 1:-1] + vn[0:-2, 1:-1])))u[0, :]  = 0u[:, 0]  = 0u[:, -1] = 0u[-1, :] = 1    # set velocity on cavity lid equal to 1v[0, :]  = 0v[-1, :] = 0v[:, 0]  = 0v[:, -1] = 0return u, v, pu = numpy.zeros((ny, nx))
v = numpy.zeros((ny, nx))
p = numpy.zeros((ny, nx))
b = numpy.zeros((ny, nx))
nt = 100 # change to 700
u, v, p = cavity_flow(nt, u, v, dt, dx, dy, p, rho, nu)fig = pyplot.figure(figsize=(11,7), dpi=100)
# plotting the pressure field as a contour
pyplot.contourf(X, Y, p, alpha=0.5, cmap=cm.viridis)
pyplot.colorbar()
# plotting the pressure field outlines
pyplot.contour(X, Y, p, cmap=cm.viridis)
# plotting velocity field
pyplot.quiver(X[::2, ::2], Y[::2, ::2], u[::2, ::2], v[::2, ::2])
pyplot.xlabel('X')
pyplot.ylabel('Y');
  1. 也可以用streamplot画图,这样流线是连续的,用quiver画图流线是间断的。
fig = pyplot.figure(figsize=(11, 7), dpi=100)
pyplot.contourf(X, Y, p, alpha=0.5, cmap=cm.viridis)
pyplot.colorbar()
pyplot.contour(X, Y, p, cmap=cm.viridis)
pyplot.streamplot(X, Y, u, v)
pyplot.xlabel('X')
pyplot.ylabel('Y');

Step 12: Channel Flow with Navier–Stokes

  1. 二维管道流就是在u方向的动量方程加了源项F,原文处是采用迭代收敛的方法计算的
  2. 全篇看完后第一感觉就是太浅显了,全文基本是通过有限差分的方式进行求解,然后对于其物理本质基本没有概括。但总而言之,浅显有浅显的好处,非常利好初学者自学,但笔者后期时间有限,加上作者这最后几个步骤同质化过于严重,导致笔者第三篇笔记写的非常水,所以强烈建议有兴趣的读者去看看github原文

【Python4CFD】笔记step9-12相关推荐

  1. Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  2. springboot学习笔记:12.解决springboot打成可执行jar在linux上启动慢的问题

    springboot学习笔记:12.解决springboot打成可执行jar在linux上启动慢的问题 参考文章: (1)springboot学习笔记:12.解决springboot打成可执行jar在 ...

  3. ElasticSearch 6.x 学习笔记:12.字段类型

    ElasticSearch 6.x 学习笔记:12.字段类型 欢迎转载. https://blog.csdn.net/chengyuqiang/article/details/79048800 12. ...

  4. C# 学习笔记(12)hex文件转bin文件小工具

    C# 学习笔记(12)hex文件转bin文件小工具 hex文件格式 hex文件格式网上有很多 我这里参考HEX文件格式详解https://blog.csdn.net/weixin_39752827/a ...

  5. 台湾国立大学郭彦甫Matlab教程笔记(12) advanced 2D plot 下

    台湾国立大学郭彦甫Matlab教程笔记(12) advanced 2D plot 下 上文记录的是关于统计的图标的绘制 下面我们来到另一个模块:颜色 fill()填充函数 功能:某一个封闭曲线,图上特 ...

  6. Git笔记(12) 分支使用

    Git笔记(12) 分支使用 1. 使用场景 2. 新建并切换iss分支 3. 推进iss分支 4. 切回master分支 5. 新建并切换hotfix分支 6. 合并hotfix分支 7. 删除ho ...

  7. 视觉SLAM笔记(12) 四元数

    视觉SLAM笔记(12) 四元数 1. 定义 2. 运算 2.1. 加法和减法 2.2. 乘法 2.3. 共轭 2.4. 模长 2.5. 逆 2.6. 数乘与点乘 3. 旋转表示 4. 旋转矩阵转换 ...

  8. CAN笔记(12) 同步

    CAN笔记(12) 同步 1. 同步偏差 2. 硬件同步 3. 再同步 4. 调整同步的规则 1. 同步偏差 CAN 协议的通信方法为 NRZ(Non-Return to Zero)方式 各个位的开头 ...

  9. TensorFlow笔记(12) VGG16

    TensorFlow笔记(12) VGG16 1. 迁移学习 2. 数据读取 3. 构建模型 4. 训练模型 5. 模型预测 1. 迁移学习 现在已经有很很多优秀的神经网络模型,这些模型大部分都是使用 ...

  10. ROS笔记(12) Rviz

    ROS笔记(12) Rviz 1. 简介 2. 运行rviz 3. 数据可视化 4. 插件扩展机制 1. 简介 机器人系统中存在大量数据,这些数据在计算过程中往往都处于数据形态 比如图像数据中0~25 ...

最新文章

  1. 数据库性能分析及调整一例
  2. Win7下快速预览各种类型的文本文件
  3. 《C++ Primer》1.51节练习
  4. 教你如何做出想要的PHPDocker镜像
  5. java 蓝牙指定连接失败_java – Android蓝牙连接 – 服务发现失败
  6. 非标准语法;请使用 _一文读懂使用MCU SPI访问具有非标准SPI接口ADC的方法
  7. Native Instruments Maschine 2 Factory Library Mac(预置音色库)
  8. 云计算数据中心网络性能测试
  9. 如何在 Windows 显示扩展名?
  10. python socket recvfrom 超时捕获_python-udp客户端超时机制
  11. fiddler4使用教程
  12. java 1.7 32位官网下载地址_jdk1.7 32位下载|jdk1.7 32位官方下载「Java」-太平洋下载中心...
  13. Nikto漏洞扫描工具简介
  14. 近日,软件项目管理高峰论坛成功召开,项目管理平台发布正式亮相……
  15. activator java_Activator常用方法
  16. go语言多package使用实战
  17. 计算机教室最适合的植物,适合放电脑前的植物 电脑前放什么植物比较好
  18. go语言求时间的差值(按天数算)
  19. 如何实现 JS 运行时的 Inspector 能力
  20. 基于核概念的KCCA算法

热门文章

  1. php朋友圈九宫格怎么做,微信朋友圈九宫格视频怎么做 图片背景加九宫格视频随机播放的效果制作|微信九宫格视频...
  2. 【参赛作品97】openGauss单机版安装步骤
  3. 一名非典型二流学生的自述 | 我是如何从菜鸟进化到辣鸡的
  4. 基于java的社区志愿者服务系统
  5. 纯css position:sticky 实现表格首行和首列固定
  6. KubeSphere 内置的 Prometheus 通过 remote write 至 Thanos 存更长期数据
  7. wildfly软件介绍
  8. 移动APP、WEB端、PC端 测试区别
  9. QML动画分组(Grouped Animations)
  10. Python seaborn.barplot绘图将纵轴设置成百分比形式