我将动态模型设置为ODE的(僵硬)系统.我目前用CVODE解决了这个问题(来自Assimulo python包中的SUNDIALS包),一切都很好.
我现在想要为问题添加一个新的3D散热器(具有与温度相关的热参数).我的想法是使用现有的FEM或FVM框架为我提供一个界面,使我可以轻松地为(t, y)常规提供3D块,并获得,而不是从头开始为3D热方程编写所有方程式.支持残差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
Run Code Online (Sandbox Code Playgroud)
我的问题是(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 …Run Code Online (Sandbox Code Playgroud) python finite-element-analysis differential-equations fipy assimulo
使用Numpy/Scipy或任何其他库,我有兴趣解决2D和3D帧分析问题.
到目前为止,我遇到了sfepy.虽然,它是一个功能齐全的FEM包,但我想知道是否有其他选择?
我正在计划通过带两个嘴的凹形双对称六边形流动的可视化.
边d1的长度等于边d2的另一长度的示例:

我在这里首先讨论的关于不规则六边形的命名.
有标准的网格工具,你可以绘制自己的网格,但我想有一些标准库,以便我可以与其他人更好地合作,以后的流程模拟.我没有找到任何网库在MathCentral文件交换六边形这里.
是否有任何标准的网格库用于不规则的六边形形状?我也对任何其他语言开放,因为我可以阅读代码并将这些标准转换为Matlab库.
geometry mesh convex-optimization finite-element-analysis non-convex
我正在开发一种有限元软件,可最大程度地减少机械结构的能量。使用倍频程及其优化包,我遇到了一个奇怪的问题:当我使用300个以上的自由度(DoF)时,lm_feasible算法根本无法计算。另一种算法(sqp)执行计算,但是当我复杂化结构并且超出测试用例时,效果不佳。
使用lm_feasible算法的DoF数量是否有限制?
如果是这样,最大可能有多少个自由度?
概述和大致了解代码的工作原理:
[x,y] = geometryGenerator()
U = zeros(lenght(x)*2,1);
U(1:2:end-1) = x;
U(2:2:end) = y;
%Non geometric argument are not optimised, and fixed during calculation
fct =@(U)complexFunctionOfEnergyIWrap(U(1:2:end-1),U(2:2:end), variousMaterialPropertiesAndOtherArgs)
para = optimset("f_equc_idx",contEq,"lb",lb,"ub",ub,"objf_grad",dEne,"objf_hessian",d2Ene,"MaxIter",1000);
[U,eneFinale,cvg,outp] = nonlin_min(fct,U,para)
Run Code Online (Sandbox Code Playgroud)
完整示例:
clear
pkg load optim
function [x,y] = geometryGenerator(r,elts = 100)
teta = linspace(0,pi,elts = 100);
x = r * cos(teta);
y = r * sin(teta);
endfunction
function ene = complexFunctionOfEnergyIWrap (x,y,E,P, X,Y)
ene = 0;
for i = 1:length(x)-1
ene += E*(x(i)/X(i))^4+ E*(y(i)/Y(i))^4- P …Run Code Online (Sandbox Code Playgroud) 你知道有限元方法的任何库,我可以用于实时应用吗?我想getFEM++,但我还没有测试.
我想用FEM来实时模拟弹塑性体的行为.我的进一步计划是将它与Bullet合并.
我可以使用在winforms应用程序中实现有限元方法的库.是否有可用于.NET平台的此类库?
你能推荐一些关于有限元法(FEM)的好文章/笔记/教程吗?我不是每天都要处理高级数学,因此向我介绍理解FEM所需的数学教程将会很棒.
我的目标是编写自己的可变形体模拟(+可塑性).我必须使用FEM,但如果我也知道BEM(边界元法)和FDM(有限差分法)也会很好.
我有两个小的用户定义的子程序,我已经在有限元软件ABAQUS中实现了(它们在我的有限元模型中定义了两种特殊类型(JTYPE = 1,2)的多点约束(MPC)).这些子程序根据需要在FORTRAN 66/77中编写,并由ABAQUS在运行时使用Intel FORTRAN编译器进行编译.我已经验证他们编译并正常工作.
但是,我只能在我的模型中一次使用其中一个子程序.这是因为他们必须使用以下名称和参数(为了让ABAQUS知道何时调用它们以及如何使用它们):
SUBROUTINE MPC(UE,A,JDOF,MDOF,N,JTYPE,X,U,UINIT,MAXDOF,
* LMPC,KSTEP,KINC,TIME,NT,NF,TEMP,FIELD,LTRAN,TRAN)
Run Code Online (Sandbox Code Playgroud)
然而,事实证明,我需要能够在给定的分析中同时使用这两种类型.由于为我的有限元模型中使用的每个MPC实例指定的JTYPE是1或2,因此理想的解决方案是组合我当前单独的子例程,并在这个新子例程内的两种类型之间切换.我想我可以使用IF(JTYPE .EQ.1)THEN类型语法来做到这一点.
问题是每个JTYPE所需的代码块都不同,即使它们都是SUBROUTINE MPC.对于我的第一个子例程(JTYPE = 1),手册需要以下界面:
SUBROUTINE MPC(UE,A,JDOF,MDOF,N,JTYPE,X,U,UINIT,MAXDOF,
* LMPC,KSTEP,KINC,TIME,NT,NF,TEMP,FIELD,LTRAN,TRAN)
C
INCLUDE 'ABA_PARAM.INC'
C
DIMENSION A(N),JDOF(N),X(6,N),U(MAXDOF,N),UINIT(MAXDOF,N),
* TIME(2),TEMP(NT,N),FIELD(NF,NT,N),LTRAN(N),TRAN(3,3,N)
user coding to define A, JDOF, and, optionally, LMPC
RETURN
END
Run Code Online (Sandbox Code Playgroud)
对于第二个子例程(JTYPE = 2),手册需要以下接口:
SUBROUTINE MPC(UE,A,JDOF,MDOF,N,JTYPE,X,U,UINIT,MAXDOF,
* LMPC,KSTEP,KINC,TIME,NT,NF,TEMP,FIELD,LTRAN,TRAN)
C
INCLUDE 'ABA_PARAM.INC'
C
DIMENSION UE(MDOF),A(MDOF,MDOF,N),JDOF(MDOF,N),X(6,N),
* U(MAXDOF,N),UINIT(MAXDOF,N),TIME(2),TEMP(NT,N),
* FIELD(NF,NT,N),LTRAN(N),TRAN(3,3,N)
user coding to define JDOF, A and, optionally, LMPC
RETURN
END
Run Code Online (Sandbox Code Playgroud)
重要的区别在于A和JDOF阵列的尺寸对于每种类型都是不同的.
我希望通过在IF循环中声明这些变量来解决这个问题,如下所示:
SUBROUTINE MPC(UE,A,JDOF,MDOF,N,JTYPE,X,U,UINIT,MAXDOF,
* LMPC,KSTEP,KINC,TIME,NT,NF,TEMP,FIELD,LTRAN,TRAN)
C
C CUSTOM MULTI POINT …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个脚本,该脚本将使用Gmsh Python API自动对几何进行网格划分以进行CFD分析。我遇到了一些问题:
首先,我希望能够编写用于调试目的的Gmsh脚本文件(.geo)。我查看了Gmsh API的源代码,发现该功能支持.geo_unrolled扩展名gmsh.write(),而不仅限于.geo。此扩展名最能解决问题,但是使用时,似乎没有将任何网格划分操作(例如将曲线标记为超限)或变换(例如膨胀)写入输出文件gmsh.write('test.geo_unrolled')。我认为这与_unrolled部分有关。但是,有什么方法可以从API中获取完整的Gmsh脚本?
其次,当我尝试复制样例的样例时:
p1 = gmsh.model.geo.addPoint(-1, 0.5, 0, 0.1)
p2 = gmsh.model.geo.addPoint(0, 1, 0, 0.1)
p3 = gmsh.model.geo.addPoint(1, 0.5, 0, 0.1)
s1 = gmsh.model.geo.addSpline([p1, p2, p3])
s2 = gmsh.model.geo.copy([s1])
Run Code Online (Sandbox Code Playgroud)
我懂了ValueError: ('gmshModelGeoCopy returned non-zero error code: ', 1)。错误代码1似乎表明s1在copy()调用时找不到原始样条()的标签。我在这里想念什么吗?例如,gmsh.model.geo.synchronize()在尝试致电之前,我曾尝试致电copy(),但这没有任何效果。
最后,当我在Gmsh GUI中使用“ 模块”-“几何”-“基本实体”-“变换”-“缩放”使用dilate 变换时,检查对话框中的“ 在副本上应用缩放”选项,在上面的示例样条线上,我的确得到了曲线符合预期,包括三个点。假设我能够使用API完成相同的操作,然后如何参考缩放后的样条曲线所经过的三个新点,例如,如果我想在原始样条曲线的起点和缩放的样条曲线?
最后,我要完成的工作如下:通过点列表绘制样条线,创建该样条线的缩放副本,在起点和终点之间绘制线,并创建由两个样条线和线。是否有比我尝试做的更好的方法?
python numeric mesh numerical-methods finite-element-analysis