python输出方格_使用Python实现LBM(格子法)方腔驱动流

使用Python实现LBM(格子法)方腔驱动流

  1. Python的不足:

    Python的最大优势也可能是它最大的弱点:它的灵活性无类型的高级语法可能导致数据和计算密集型程序的性能不佳。—— 动态类型化解释语言

  2. 什么是 numba :

    Numba,一个来自Anaconda的Python编译器,可以编译Python代码,以便在支持CUDA的GPU或多核CPU上执行。由于Python通常不是编译语言,您可能想知道为什么要使用Python编译器。答案当然是运行本机编译代码比运行动态解释代码快许多倍。 Numba允许您为Python函数指定类型签名,它可以在运行时进行编译(这是 “即时”或JIT编译)。 Numba动态编译代码的能力意味着您不会放弃Python的灵活性。这是向高效率编程和高性能计算提供理想组合的重要一步。

    使用Numba,现在可以编写标准的Python函数并在支持CUDA的GPU上运行它们。 Numba专为面向阵列的计算任务而设计,就像广泛使用的NumPy库一样。面向阵列的计算任务中的数据并行性非常适合GPU等加速器。 Numba了解NumPy数组类型,并使用它们生成有效的编译代码,以便在GPU或多核CPU上执行。所需的编程工作可以像添加函数装饰器一样简单,以指示Numba为GPU编译。例如,以下代码中的@vectorize装饰器在运行时生成标量函数Add的已编译矢量化版本,以便它可用于在GPU上并行处理数据数组

    An example:

    # -*- coding: utf-8 -*-

    """

    Created on Thu Dec  5 14:00:59 2019

    @author: Franz

    """

    import numpy as np

    from numba import vectorize

    @vectorize(['float32(float32, float32)'], target='cpu')

    def Add(a, b):

    return a + b

    # Initialize arrays

    N = 100000

    A = np.ones(N, dtype=np.float32)

    B = np.ones(A.shape, dtype=A.dtype)

    C = np.empty_like(A, dtype=A.dtype)

    # Add arrays on GPU

    C = Add(A, B)

    要在CPU上编译和运行相同的函数,我们只需将目标更改为“cpu”,从而在CPU上编译的矢量化C代码级别上产生性能,灵活性大大提高。

  3. numpy的loadtxt()函数的用法

    numpy.loadtxt(fname, dtype=, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0)

    参数作用

    fname被读取的文件名(相对地址与绝对地址1)comments跳过以指定元素开头的行(不读取)delimiter指定读取文件中的数据分割符converters2对读取数据进行预处理skiprows选择跳过的行数usecols指定读取列unpack是否将数据进行向量化输出3encoding对数据进行预编码4
  4. 用matplotlib.pyplot的quiver()函数绘制矢量图

    调用方式

    quiver(U, V, **kw)

    quiver(U, V, C, **kw)

    quiver(X, Y, U, V, **kw)

    quiver(X, Y, U, V, C, **kw)

    U、V是箭头数据(data),X、Y是箭头的位置,C是箭头的颜色。这些参数可以是一维或二维的数组或序列。

    如果X、Y不存在(absent),他们将作为均匀网格被生成。如果U和V是2维的数组,X和Y是1维数组,并且len(X)和len(Y)与U的列(column)和行(row)纬度相匹配(match),那么X和Y将使用numpy.meshgrid()——用于产生一个矩阵,具体可参考:meshgrid使用方法——进行扩展。

    默认设置会自动将箭头的长度缩放到合理的大小。要改变箭头的长度请参看 scale 和scale_units两个关键字参数(kwargs:关键字参数,参看文章最后有关键字参数与可变参数的区别)

    默认值给出一个稍微后掠(swept-back)的箭头;若要使箭头头部呈三角状,则要确保headaxislength与headlength相同。若要使箭头更尖锐(more pointed),则应减小headwidth或者增大headlength和headaxislength。若要使箭头头部相对于箭杆(shaft)更小一些,则应将所有头部参数都减小(scale down)。你最好不要单独留下minshaft(You will probably do best to leave minshaft alone.)

    相关详细用法可以参照Blog,以及官方的matplotlib参考文档

  5. 通过上述简单的加速,并通过对顶盖驱动流改写成Python程序,通过对其使用Numpy和Numba进行加速,最后使用quiver()函数绘制流场图:

    # -*- coding: utf-8 -*-

    """

    Created on Fri Dec  6 15:17:10 2019

    @author: Franz

    """

    import numpy as np

    import numba as nb

    import matplotlib.pyplot as plt

    plt.rcParams['figure.figsize'] = (5.0, 5.0)

    plt.rcParams['figure.dpi'] = 100 #分辨率

    # function

    # 1st:equilibrum function

    @nb.jit()

    def Feq(k,rho,u):

    eu = e[k,0]*u[0] + e[k,1]*u[1];

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值