问题标签 [finite-element-analysis]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1097 浏览

matlab - 使用 Matlab trisurf 绘制元素数量

通常,trisurf 用于在三角形网格上绘制节点数量。但是,我想使用以下命令绘制一些元素数量。

其中 elewise_quantiy 应该与 p(:,1) 或 p(:,2) 具有相同的维度,因此我通过将元素数量与该元素的每个节点相关联来创建 elewise_quantity。

在这种特定情况下,中间的 8 个三角形元素与 1 相关联,所有其他元素的值为 0。有10*10的小正方形和10*10*2的小三角形。

问题是,如图,trisurf 不能产生我想要的效果。我期望的是“精确的元素描述”,即边缘的急剧过渡

还要注意每个角落的显示是不同的,这是由于三角形的特定方向,有没有优雅的方法来处理它?


在此处输入图像描述

0 投票
1 回答
530 浏览

python - 使用 PDE 的解来定义另一个 PDE - FEniCS

我目前正在尝试通过实现非标准边界条件来解决 FEniCS 中的 Monge-Ampere 方程。

边界条件,要求解的梯度必须将原始域的边界映射到另一个指定域。

当目标域被规定为单位圆时,实现非常简单,我通过将以下内容放入我的系统中来解决它:

其中 uh 是试验函数,vh 是测试函数。

当考虑更复杂的目标空间时,例如正方形 [−1,1]×[−1,1] 事情变得更加困难,因为手工解决并不是那么简单,所以我的想法是使用距离函数.

为此,我解决了 Eikonal 方程的稳定版本,其解决方案是有符号距离函数,然后我的想法是将 (1) 替换为:

其中 E 是 Eikonal 方程的解,但是当我尝试实现它时,我得到一个错误,指出函数需要标量参数,

有没有办法以第二个微分形式对解决方案进行编程以接受 grad(uh) 作为输入?

谢谢大家的时间!

0 投票
1 回答
827 浏览

python - fenics:在特定点上施加力

我是 fenics 和有限元方法的新手。

我尝试实现一种方法来估计可变形物体的弹性参数(杨氏模量和泊松比)。我想做的是:

  • 从底部固定的对象(作为一个开始的立方体)
  • 在物体顶部的特定位置施加外力,并使用梯度下降等方法,通过比较实际位移和估计位移来估计弹性参数。

我正在查看 fenics 中的超弹性演示(http://fenicsproject.org/documentation/dolfin/1.0.1/python/demo/pde/hyperelasticity/python/documentation.html),但我不知道如何申请在网格上的特定节点上,然后根据该力使对象变形。我认为在那个演示中,整个网格上的 -y 方向施加了一个力。有体力矢量:
B = Constant((0.0, -0.5, 0.0))

我是否应该将其更改为与网格相同大小的矢量,并将力值放在与网格上的节点元素相对应的矢量元素上。

对不起,如果我没有多大意义。这个概念对我来说是新的,所以我很难说出我的想法。

0 投票
0 回答
145 浏览

c++ - 我正在使用另一个人编写的代码,有些事情我无法理解

我正在使用由另一个人编写的并行有限元代码,并且有些代码我无法理解。尤其是属于计算网格的每个节点的自由度的地图创建。网格由四边形元素组成,每个节点都有 nb_dofs 自由度。网格的元素被细分为补丁,每个补丁属于不同的处理器。相邻的元素块共享相同的节点和相同的自由度。

地图按以下步骤创建。

(1) 函子“edl”是通过调用构造函数来创建的:

其中网格是计算网格。构造函数的主体是:

其中 m,正如我之前所说,是用于计算的网格。

(2) 创建地图的规则是通过调用定义的:

其中 mesh 是计算网格,edl 是在 (1) 中创建的函子。规则构造函数的主体是:

其中,根据上面写的调用,成员mesh_m是计算网格,成员rule_m是函子edl。

(3) 最后(但这是最困难的部分),是对地图构建器的调用:

其中 shared_epetra_map 是 Trilinos 包的共享 Epetra 映射,因为属于不同处理器的相邻元素块的自由度是共享的。e_dof_map 在 (2) 中定义。

(3) 中的调用主体是:

其中 data_type 是 element_mapping,输入参数 g 是 e_dof_map。

这个函数调用函数

根据传入的data_type输入。

在我的情况下,输入参数 element_mapping 导致调用

operator g()被称为的地方。

运算符 g() 只是对所有元素和属于特定元素的所有节点的嵌套迭代,它为所有网格(称为 gid_m)提取自由度的 std::vector。正如我已经说过的,这个向量对于相邻但属于不同处理器的元素共享自由度。

因此 do_map(g()) 被 std::vector gid_m 填充。

(4) 现在出现了我无法理解的事情。致电后

并将 g() 作为共享自由度的 std::vector 返回,称为函数:

最终创建地图。

我不明白的是:

(a) 代码工程如何do_map(g())调用 do_map(const std::valarray<int>& gid)

(b) 指令map_type(-1,gid.size(),&(gid[0]))如何创建地图。我在我的代码中搜索过,但我没有找到任何可以根据上述信息创建地图的指令, (-1,gid.size(),&(gid[0]))它是标准还是 Trilinos 的功能?

我希望我足够清楚,但是所有这些调用后续结构都让我发疯。有人想帮助我吗?


我不能问编写代码的人,因为他忘记了所有这些调用链(自从他编写代码以来已经过去了一段时间,现在他正在另一个地方从事其他事情)。

您对共享 epetra 地图的构造函数是正确的,我检查了 trilinos 的 epetra 包,并且有一个构造函数作为参数

但我无法理解的是如何从调用到

其中operatot g() 返回一个std::vector,它被自动调用函数:

0 投票
1 回答
365 浏览

graph-theory - 检查 2D 网格中的边连通性

我正在尝试通过使用 FEM 和遗传算法 (GA) 来优化结构。FEM 求解器是一种商业求解器,我正在对 GA 进行编程。最终我希望得到这样的东西

我的第一种方法很简单,只是擦除元素并计算结果,但由于网格的某些部分断开连接,我得到了很多不可行的解决方案。

如何检测二维网格中未连接的结构?

0 投票
0 回答
67 浏览

c++ - MPI 将给定 GID 和 LID 列表中的映射加倍

我正在使用有限元代码,其中网格的节点根据具有本地和全局标识符的地图(让我们称之为 single_mesh_nodes)分布。我需要制作一个新地图(让我们称之为 double_mesh_nodes),其中应包含双倍数量的节点。double_mesh_nodes 的构造应将 single_mesh_nodes 作为第一部分,然后从第一个节点重新开始,但为其分配新的本地和全局标识符。换句话说,在到达最后一个全局和局部标识符节点(分别为 last_GID 和 last_LID)之后,我们应该再次拥有第一个节点,但全局标识符值最大 GID +1,本地标识符最大 LID +1 ,依此类推,适用于以下节点。例如,如果我们有一个由 4 个节点组成的网格,其中 single_mesh_nodes LIDs = 0, 1, 2, 3,GIDs = 0, 3, 2,

0 投票
1 回答
862 浏览

python - 缩进错误

我收到一个我无法找出原因的缩进错误。
错误是

我的代码是

0 投票
1 回答
185 浏览

c++ - c ++中的二维线性对流(分段错误)

我遵循 Lorena Barbara 博士对 Navier stokes 方程的 12 个步骤(http://lorenabarba.com/blog/cfd-python-12-steps-to-navier-stokes/)结构,但我不确定如何进行 2d线性对流。我想知道这里是否有人熟悉如何做到这一点。下面是我的示例代码:

0 投票
1 回答
933 浏览

matlab - 在 MATLAB 中求解非线性 FEM

我尝试在 MATLAB 中解决具有节点热源的四面体有限元上的热扩散问题,这取决于解向量。非线性方程组如下所示:

B U' + A U = q(T)

其中 B 是热容量矩阵,A 是传导率矩阵,q 是源项,U 是温度。我使用带有 Picard 迭代和时间步控制的 Adams-Bashforth/Trapezoid Rule 预测器-校正器方案。源项的温度在最后一个时间步的温度和预测变量的温度之间精确评估。这是预测器-校正器代码的简化版本。源的计算是一个函数。

如您所见,我使用反斜杠运算符来解决系统问题。系统的非线性应该不会太差。然而,随着时间步长的增加,picard 方法收敛得更慢,最终完全停止收敛。不过,我需要更大的时间步长,所以我将整个校正步骤放入一个函数中,并尝试用 fsolve 来解决它,而不是看看我是否实现了更快的收敛。不幸的是 fsolve 似乎从来没有完成第一个时间步骤。我想我没有正确配置 fsolve 的选项。谁能告诉我,如何为大型稀疏非线性系统配置 fsolve(我们正在谈论数千到上万个方程)。或者对于这个问题,是否有比 fsolve 更好的解决方案?帮助和 - 因为我不是专家或计算工程师 - 非常感谢明确的建议!

0 投票
1 回答
330 浏览

matlab - Matlab - FEM:网格多边形

我对这个多边形进行网格划分有问题:

在此处输入图像描述

我需要用这个有限元素之一填充这个多边形:

在此处输入图像描述

我不知道如何为这个问题键入代码,然后用网格绘制这个多边形,所有这些都不使用 PDEtool。

谢谢你。