- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个动态模型设置为 ODE 的(刚性)系统。我目前用 CVODE(来自 Assimulo python 包中的 SUNDIALS 包)解决了这个问题,一切都很好。
我现在想为问题添加一个新的 3D 散热器(具有与温度相关的热参数)。我的想法是使用现有的 FEM 或 FVM 框架为我提供一个接口(interface),让我可以轻松地提供 (t, y)
将 3D block 转换为例程,并取回残差 y'
。原理是使用 FEM 系统中的方程,而不是求解器。 CVODE 可以利用稀疏性,但预计组合系统的求解速度比 FEM 系统自身求解的速度要慢,专为此类问题量身定制。
# pseudocode of a residuals function for CVODE
def residual(t, y):
# ODE system of n equations
res[0] = <function of t,y>;
res[1] = <function of t,y>;
...
res[n] = <function of t,y>;
# Here we add the FEM/FVM residuals
for i in range(FEMcount):
res[n+1+i] = FEMequations[FEMcount](t,y)
return res
我的问题是 (a) 这种方法是否合理,以及 (b) 是否有 FEM 或 FVM 库可以轻松让我将其视为方程组,以便我可以将其“附加”到我的现有的 ODE 方程组。
如果不能让两个系统共享相同的时间轴,那么我将不得不以步进模式运行它们,在其中我运行一个模型一小段时间,更新另一个模型的边界条件,运行那个一个,更新第一个模型的 BC,以此类推。
我对出色的库 FiPy 有一些经验,我希望最终以上述方式使用该库。但我想了解其他系统在此类问题上的经验,以及我错过的其他方法。
编辑: 我现在有一些示例代码似乎正在运行,展示了如何使用 CVODE 解决 FiPy 网格扩散残差。但是,这只是一种方法(使用 FiPy),我的其他问题和疑虑仍然存在。欢迎提出任何建议。
from fipy import *
from fipy.solvers.scipy import DefaultSolver
solverFIPY = DefaultSolver()
from assimulo.solvers import CVode as solverASSIMULO
from assimulo.problem import Explicit_Problem as Problem
# FiPy Setup - Using params from the Mesh1D example
###################################################
nx = 50; dx = 1.; D = 1.
mesh = Grid1D(nx = nx, dx = dx)
phi = CellVariable(name="solution variable", mesh=mesh, value=0.)
valueLeft, valueRight = 1., 0.
phi.constrain(valueRight, mesh.facesRight)
phi.constrain(valueLeft, mesh.facesLeft)
# Instead of eqX = TransientTerm() == ExplicitDiffusionTerm(coeff=D),
# Rather just operate on the diffusion term. CVODE will calculate the
# Transient side
edt = ExplicitDiffusionTerm(coeff=D)
timeStepDuration = 0.9 * dx**2 / (2 * D)
steps = 100
# For comparison with an analytical solution - again,
# taken from the Mesh1D.py example
phiAnalytical = CellVariable(name="analytical value", mesh=mesh)
x = mesh.cellCenters[0]
t = timeStepDuration * steps
from scipy.special import erf
phiAnalytical.setValue(1 - erf(x / (2 * numerix.sqrt(D * t))))
if __name__ == '__main__':
viewer = Viewer(vars=(phi, phiAnalytical))#, datamin=0., datamax=1.)
viewer.plot()
raw_input('Press a key...')
# Now for the Assimulo/Sundials solver setup
############################################
def residual(t, X):
# Pretty straightforward, phi is the unknown
phi.value = X # This is a vector, 50 elements
# Can immediately return the residuals, CVODE sees this vector
# of 50 elements as X'(t), which is like TransientTerm() from FiPy
return edt.justResidualVector(var=phi, solver=solverFIPY)
x0 = phi.value
t0 = 0.
model = Problem(residual, x0, t0)
simulation = solverASSIMULO(model)
tfinal = steps * timeStepDuration # s,
cell_tol = [1.0e-8]*50
simulation.atol = cell_tol
simulation.rtol = 1e-6
simulation.iter = 'Newton'
t, x = simulation.simulate(tfinal, 0)
print x[-1]
# Write back the answer to compare
phi.value = x[-1]
viewer.plot()
raw_input('Press a key...')
这将产生一个显示完美匹配的图表:
最佳答案
ODE 是一维微分方程。
FEM 模型适用于空间问题,即更高维度的问题。你想要一个有限差分法。从来自 ODE 世界的人的角度来看,更容易解决和理解。
我认为您真正应该问的问题是如何获取 ODE,并将其转移到 3D 问题空间。
多维偏微分方程很难求解,但我会推荐您使用 CFD 方法来解决此问题,但仅限于二维。 http://lorenabarba.com/blog/cfd-python-12-steps-to-navier-stokes/
这需要你一个充实的下午才能完成!祝你好运!
关于python - 如何将 ODE 系统与 FEM 系统相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21565517/
FEM 的快速求解器是什么?方程式?我更喜欢开源实现,但如果有商业实现,那么我不介意为此付费。 最佳答案 Code Aster 是一个开源的 FE 代码。 code aster 预处理和后处理通常由
您知道任何可用于实时应用的有限元方法库吗?我想到了 getFEM++,但我还没有测试它。 我想使用 FEM 实时模拟弹塑性体的行为。我进一步的计划是将它与 Bullet 合并。 最佳答案 您应该尝试指
全部处理,感谢您花时间阅读我的问题。我正在使用 Eigen3.3.4( http://eigen.tuxfamily.org/index.php?title=Main_Page ) 编写一些 FEM
这是 FEM/FVM 方程系统的典型用例,因此可能引起更广泛的兴趣。从三角形网格 à la 我想创建一个scipy.sparse.csr_matrix。矩阵行/列表示网格节点处的值。该矩阵在主对角线上
我有一个关于如何使用 QcustomPlot Colormap FEM 数据显示的问题。数据具有以下形式: X Y Z 0.000000
我有一个动态模型设置为 ODE 的(刚性)系统。我目前用 CVODE(来自 Assimulo python 包中的 SUNDIALS 包)解决了这个问题,一切都很好。 我现在想为问题添加一个新的 3D
我正在开发一个二维平面有限元工具。其中一项功能是能够可视化特定对象上的应力。 此工具使用以下数据创建四边形网格: 节点:numpy数组[[x1 y1], [x2 y2], etc] -> x and
在 3.3 中他们有一个 grate news - 在 GPU 上仅使用 PETC SNES 进行 FEM 求解的示例。我是 PETSc 的新手并且有一个问题 - 我需要在 3d 空间中创建一个球体并
我正在尝试修改 this page 中的说明编译Elmer在 macOS(High Sierra 10.13.5)上。 我安装了gcc , cmake , open-mpi和 hypre来自 Home
我是一名优秀的程序员,十分优秀!