求解任意(潜在非常刚性)双曲偏微分方程组的ader方法

ADER的Python项目详细描述


ader方法的python实现,用于解决 stiff)以下形式的偏微分方程双曲组:

Figure 1

可以使用任意数量的空间域,并且此实现是 能够以任何精度求解方程。二阶 抛物线偏微分方程将很快实施。

Build Status

安装

需要Python3.6+。运行pip install ader

将安装以下依赖项:

  • 纽比1.14.5
  • scipy 1.1.0
  • 切线0.1.9

背景

给定计算网格上定义的单元级常量初始数据 程序对中的数据执行任意阶多项式重建 每个单元,根据WENO方法的修改版本,如 [1]。

按照相同的顺序,数据的时空多项式重建是 然后用间断伽辽金方法在每个时空单元中得到, 在时间步开始时使用WENO重建作为初始数据 (见[2,3])。

最后,采取有限体积更新步骤,使用dg重建 计算细胞间通量和非保守细胞间通量 跳跃项,内部源项和非保守项(见[3])。

细胞间通量和非保守跃迁的计算使用 Rusanov型焊剂[4]、Roe型焊剂[5]或Osher型焊剂[6]。

用法

定义方程组

用户必须定义通量函数(返回numpy数组):

F(Q, d, model_params)

给定一个保守变量向量QF必须返回 方向d(其中d=0,1,...对应于x-,y-,…轴)。 model_params应该是包含所需任何其他参数的对象 通过模型计算流量(例如,热容 欧拉方程中的比率,或navier-stokes方程中的粘度)。 model_params不必使用,但它必须包含在 F的签名。

类似地,如果需要,d方向上的非保守矩阵b(q)必须是 定义为正方形numpy数组,因此:

B(Q, d, model_params)

如果需要,源项必须定义为numpy数组,因此:

S(Q, model_params)

请注意,PDES的管理系统可以写成:

Figure 2

其中,系统jacobian m对应于:

Figure 3

如果m的分析形式已知,则应这样定义:

M(Q, d, model_params)

最大绝对值m特征值的解析形式 已知的,应该这样定义:

max_eig(Q, d, model_params)

ADER需要系统雅可比和最大绝对特征值 方法。如果没有可用的分析表格,它们将从 使用automatic differentiation提供通量(和非保守矩阵,如果提供)。 不过,这会带来一些计算开销,以及 定义通量函数时需要考虑的因素(请参见 以下专用章节)。

解方程

假设我们正在解reactive Euler equations 在2d中,我们像上面那样定义FS(但不是B,因为方程是 保守的)。我们还定义了model_params来保持热容比 以及反应常数。这些方程包含5个守恒变量。解决 他们订购3个,4个CPU核,我们设置解算器对象,因此:

from ader import Solver

solver = Solver(nvar=5, ndim=2, F=F, B=None, S=S, model_params=model_params, order=3, ncore=4)

系统雅可比的解析形式及最大绝对值特征值 反应Euler方程的大小存在。如果我们在Mmax_eig我们可以创建解算器对象,因此:

solver = Solver(nvar=5, ndim=2, F=F, B=None, S=S, M=M, max_eig=max_eig, model_params=model_params, order=3, ncore=4)

为了解决一个特殊的问题,我们必须定义初始状态, initial_grid。这必须是一个3轴的numpy数组,这样 initial_grid[i,j,k]是equal到中第k个守恒变量的值 细胞(I,J)。我们还必须定义listdX=[dx,dy],其中dx,dy是网格 X和Y轴的间距。以0.5的最终时间解决问题 cfl值为0.9,打印所有输出时,我们调用:

solution = solver.solve(initial_grid, 0.5, dX, cfl=0.9, verbose=True)

高级使用

solver类有以下附加参数:

  • riemann_解算器(默认为“rusanov”):哪个riemann解算器应该是 使用。选项:“rusanov”、“roe”、“osher”。
  • stiff\u dg(默认值为false):是否使用牛顿方法来求解 计算dg预测因子时涉及的寻根。
  • stiff_dg_guess(默认为false):是否使用高级首字母 DG预测的猜测(仅适用于非常僵硬的系统)。
  • newton_dg_guess(默认为false):是否计算高级 使用牛顿法的初始猜测(仅适用于非常、非常僵硬的系统)。
  • dg-tol(默认值6e-6):dg预测值的公差 计算。
  • 1(50):尝试的最大迭代次数 迭代求解dg寻根问题(不是用牛顿法)
  • weno_r(默认值8):weno指数r。
  • weno_uuλc(默认值1e5):中心模板的weno权重。
  • weno_uuλs(默认值1):侧模板的weno权重。
  • weno_uε(默认值1e-14):要避免的在weno方法中使用的常量 数字问题。

solver.solve方法具有以下附加参数:

  • 边界条件(默认为“可传递的”):哪种边界 使用条件。options:'传递','周期', func(grid, N, ndim)。在后一种情况下,用户定义一个函数 有明确的签名。它应该返回一个numpy数组 作为网格的轴数,但网格两边有N个以上的单元格 在每个空间方向上,其中N等于方法的顺序 被利用。n阶方法需要这些额外的单元。
  • callback(默认为none):带有签名的用户定义回调函数 callback(grid, t, count),其中grid是 计算网格在时间t(和时间步count)。

示例

查看example.py,查看正在为gpr模型解决的几个问题 以及反应欧拉方程。

注释

速度

这个实现相当慢。它真的只是用来 出于学术目的。如果您的商业应用程序需要 快速、防弹地实现ADER方法或GPR模型,然后 联系(jackson.haran@gmail.com)。

自动区分

用于派生Mmax_eig的自动微分是 使用Google’s Tangent library执行。 虽然很棒,但这个图书馆很新,不能应付所有的问题 可在焊剂中使用的操作(尽管正在进行开发 很快)。尤其是,它将永远无法处理闭包和类 尚未实施。一些numpy函数,比如inv还没有 实施。如果你遇到问题,给我发个短信,我会让你 知道我能不能成功。

参考文献

  1. dumbser,zanotti,hidalgo,balsara-ader-weno有限体积格式 时空自适应网格细化
  2. dumbser,castro,pares,toro-ader格式 非保守双曲方程组:在地球物理流中的应用
  3. dumbser,hidalgo,zanotti-高阶时空自适应ader-weno有限 非保守双曲型方程组的体积格式>
  4. toro-riemann求解器与流体动力学数值方法:a 实用介绍
  5. dumbser,toro-关于一般非线性的普遍osher型格式 双曲守恒律
  6. dumbser,toro-是osher-riemann解算器的简单扩展 非保守双曲型方程组

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
ec2中tomcat脚本的java自动启动   java如何连接到3个不同的数据库并通过JDBC并行运行查询   eclipse如何解决SpringDataMaven构建的“生命周期配置未涵盖的插件执行”   java在长时间运行的线程完成之前显示Android布局?   数组在Java中向mongoDB插入ArrayList   java如何检查网站是否已更新并发送电子邮件?   javaxaomi杀死前台服务   将动态JSON值解析为Java对象   java在主机名中是否支持下划线?   java如何获取RTC工作项epic id并使用功能id对数据进行归档   java我如何告诉Maven捆绑依赖的JAR   java Slidepuzzle,切换图标   java应用程序小部件:当背景添加到外部布局时,列表项上的涟漪效应消失   java为什么是系统。nanoTime()返回这么大的数字,而这么长的时间还没有过去?   java JPA:实现模型层次结构@MappedSuperclass vs.继承