用户登录

你在这里

应用周期边界条件

谁能告诉我如何在单向纤维复合材料上应用周期性的离轴加载边界条件?

我试图在这篇论文中应用PBC。”张云发,夏子辉纤维增强复合材料相间损伤的微观力学分析
层压制品,但模型缝不正确。

谁能告诉我该怎么做

如果你用的是Abaqus,其实很简单。使用方程约束(手册中*EQUATION关键字的seatch)用于面朝相反的节点,并有一个共同的参考点。这意味着什么呢,假设几何是立方的。只考虑前脸和后脸。想象一下,你对它进行网格划分,每个面有9个节点。4个角节点,4个中间边缘节点和一个中心节点。现在您将创建一个参考点,然后使用方程约束将参考点的位移自由度与前表面和后表面上的每个节点连接起来,因此它看起来像u1(后)-u1(前)+u1(参考)=0,类似地,u2(读)-u2(前)+u2(参考点)=0,等等。

我发现最好的方法是使用python脚本和扫描网格,这样每个相对的面上的节点看起来是一样的。我为每一对相反的节点做集合,然后编写方程。如果你感兴趣,我可能会发布那个python脚本。

Ashwin

你好,Ashwin,请分享PBC的python脚本

提前谢谢你

拉维

非常感谢您的回复。

我已经在输入文件.inp中编写了约束方程。对于相对面内节点。

但是在我提到的论文中,我必须把sigma23=0作为边界条件吗?我可以用e23=0代替吗?

因为我不能把荷载等于零作为边界条件。我必须使用用户定义的字段,我不熟悉。

我怎么让e23等于0呢?

如果我的问题没有意义,我很抱歉,但我在这个领域是新手:)

你好ashwin

你能描述一下如果有三层材料组成一个立方体,如何扫描网格吗?

请帮助

附论文提供了应用PBC的详细程序和必要的条文。

http://万博manbetx平台m.limpotrade.com/files/pbc.pdf

--

Anshul

非常感谢Anshulf的帮助。

对于这篇论文,我有一个疑问。

如果我使用3D,我是否必须处理内面的节点与内边的节点分离,与角上的节点分离,

就像《巴贝罗的元素》这本书里写的那样?

再次感谢你。

约翰内斯·t·b·奥弗维尔德的照片

我最近在我的网站上上传了一个函数,应用Abaqus Script编写的周期性边界条件(包括示例),你可以在这里找到它:

http://www.overvelde.com/#downloads

如果您不熟悉Abaqus脚本,该页面还包含对Abaqus脚本的简短介绍。

你亦可透过以下连结直接下载有关文件:

http://www.overvelde.com/wp-content/uploads/2015/02/Periodic-Boundary-Condtions-Script-Abaqus.zip

任何改进功能的意见都是非常感谢的!

非常感谢你分享你的剧本。我很感激:)

farzad64的照片

亲爱的约翰内斯

为什么代码不能为更多的元素工作?如果我应用二次结构网格呢?

约翰内斯·t·b·奥弗维尔德的照片

代码将运行,但可能很慢。你能做的就是定义一个只有那些需要包含在周期边界条件中的节点的集合。代码将遍历集合中的所有节点,以确定该集合中是否有另一个周期性定位的节点,因此节点越少越快。

哈哈,我看到Overvelde先生打败了我,不仅更全面地回答了你的问题,而且在提供脚本方面比我做得更好。有趣的是,Johannes,你在Python脚本文档方面也打败了我。我在大学时做了一个类似的文件,我想在朋友中分发,但就在我要发表它之前,我看到了你的网站和你的文件。现在我只是将人们重定向到您的文档!

尽管如此,这里是我的脚本,这适用于3D实现(虽然对于2D,你所要做的就是删除一些行),这里是编写python代码的matlab代码。

- 1)你的模型是三次的,由变量“ulimit”设置的维度。

2)您已经使用扫描网格或结构化网格对几何图形进行了网格划分。

3)将零件命名为part -1(默认名称)

更改ulimit的值并在matlab中运行下面的代码。

在Abaqus的消息区域复制并粘贴以下代码。

%ulimit=立方体几何尺寸,例如,如果它是10

ulimit = 10;

%周期BC实现

流(“节点= mdb.models .rootAssembly.instances(“模式1”)(“Part-1-1”).nodes \ n”);

流(k = 0 \ n”)

流(ctr = 0 \ n”)

fprintf('\nfor i in range(len(Nodes)):\n');

fprintf(' Cx = Nodes[i].coordinates[0]\n');

fprintf(' Cz = Nodes[i].coordinates[2]\n');

流(如果残雪= = 0和Cz > = 0.01和Cz < = % d - 0.01: \ n”,ulimit);

流(k = k + 1 \ n)

流(ctr = ctr + 1 \ n)

流(' Nodetemp = mdb.models .rootAssembly.instances(“模式1”)(“Part-1-1”).nodes.getByBoundingBox (Cx + % d - 0.01,节点[我].coordinates -0.01[1],[我]节点.coordinates -0.01[2],残雪+ % d + 0.01,节点[我].coordinates[1] + 0.01,节点[我].coordinates [2] + 0.01) \ n”,ulimit, ulimit);

流(“mdb.models .rootAssembly“模式1”。集(name = "简单% % d " % % k节点= Nodetemp) \ n”)

流(“强调(mdb.models .rootAssembly“模式1”。集(“简单% % d % % k)) \ n”)

流(k = k + 1 \ n)

流(“mdb.models .rootAssembly“模式1”。集(name = "简单% % d " % % k节点=节点[我+ 1])\ n”)

流(“mdb.models(“模式1”)。约束方程(name = " - - - - - - % % d % % ctr,条款=((-1.0,“简单% % d % % (k - 1), 1),(1.0,“简单% % d % % k, 1),(1.0“ReferencePt2”1)))\ n”);

流(ctr = ctr + 1 \ n)

流(“mdb.models(“模式1”)。约束方程(name = " - - - - - - % % d % % ctr,条款=((-1.0,“简单% % d % % (k - 1), 2),(1.0,“简单% % d % % k, 2),(2) 1.0、“ReferencePt2”))\ n”);

流(ctr = ctr + 1 \ n);

流(“mdb.models(“模式1”)。约束方程(name = " - - - - - - % % d % % ctr,条款=((-1.0,“简单% % d % % (k - 1)、3)、(1.0,“简单% % d % % k, 3),(1.0“ReferencePt2”3)))\ n”);

流(“强调(节点[我])\ n”)

fprintf('\nfor i in range(len(Nodes)):\n');

fprintf(' Cx = Nodes[i].coordinates[0]\n');

fprintf(' Cz = Nodes[i].coordinates[2]\n');

流(如果残雪= = 0和Cz > = 0.01和Cz < = % d - 0.01: \ n”,ulimit);

流(' Nodetemp = mdb.models .rootAssembly.instances(“模式1”)(“Part-1-1”).nodes.getByBoundingBox (Cx + % d - 0.01,节点[我].coordinates[1],[我]节点.coordinates[2],残雪+ % d + 0.01,节点[我].coordinates[1],[我]节点.coordinates [2]) \ n”,ulimit, ulimit);

(“模式1”)流(“mdb.models .rootAssembly.Set (name = " junkset "节点= Nodetemp) \ n”)

流('改变(节点[我])\ n”)

流('改变(mdb.models(“模式1”).rootAssembly.sets [" junkset "]) \ n”)

fprintf('\nfor i in range(len(Nodes)):\n');

fprintf(' Cy = Nodes[i].coordinates[1]\n');

fprintf(' Cx = Nodes[i].coordinates[0]\n');

fprintf(' Cz = Nodes[i].coordinates[2]\n');

fprintf(' if Cy==0 and Cz>=0.01 and Cz<=%d-0.01 and Cx>=0.01 and Cx<=%d-0.01:\n',ulimit,ulimit);

流(k = k + 1 \ n)

流(ctr = ctr + 1 \ n)

流(' Nodetemp = mdb.models .rootAssembly.instances(“模式1”)(“Part-1-1”).nodes.getByBoundingBox(节点[我].coordinates [0] -0.01, Cy + % d - 0.01,节点[我].coordinates -0.01[2],[我]节点.coordinates [0] + 0.01, Cy + % d + 0.01,节点[我].coordinates [2] + 0.01) \ n”,ulimit, ulimit);

流(“mdb.models .rootAssembly“模式1”。集(name = "简单% % d " % % k节点= Nodetemp) \ n”)

流(“强调(mdb.models .rootAssembly“模式1”。集(“简单% % d % % k)) \ n”)

流(k = k + 1 \ n)

流(“mdb.models .rootAssembly“模式1”。集(name = "简单% % d " % % k节点=节点[我+ 1])\ n”)

流(“强调(节点[我])\ n”)

流(“mdb.models(“模式1”)。约束方程(name = " - - - - - - % % d % % ctr,条款=((-1.0,“简单% % d % % (k - 1), 1),(1.0,“简单% % d % % k, 1),(1.0“ReferencePt3”1)))\ n”);

流(ctr = ctr + 1 \ n)

流(“mdb.models(“模式1”)。约束方程(name = " - - - - - - % % d % % ctr,条款=((-1.0,“简单% % d % % (k - 1), 2),(1.0,“简单% % d % % k, 2),(2) 1.0、“ReferencePt3”))\ n”);

流(ctr = ctr + 1 \ n)

流(“mdb.models(“模式1”)。约束方程(name = " - - - - - - % % d % % ctr,条款=((-1.0,“简单% % d % % (k - 1)、3)、(1.0,“简单% % d % % k, 3),(1.0“ReferencePt3”3)))\ n”);

fprintf('\nfor i in range(len(Nodes)):\n');

fprintf(' Cy = Nodes[i].coordinates[1]\n');

fprintf(' Cz = Nodes[i].coordinates[2]\n');

流(如果Cy = = 0和Cz > = 0.01和Cz < = % d - 0.01: \ n”,ulimit);

流(' Nodetemp = mdb.models .rootAssembly.instances(“模式1”)(“Part-1-1”).nodes.getByBoundingBox(节点[我].coordinates [0], Cy + % d - 0.01,节点[我].coordinates[2],[我]节点.coordinates [0], Cy + % d + 0.01,节点[我].coordinates [2]) \ n”,ulimit, ulimit);

(“模式1”)流(“mdb.models .rootAssembly.Set (name = " junkset "节点= Nodetemp) \ n”)

流('改变(节点[我])\ n”)

流('改变(mdb.models(“模式1”).rootAssembly.sets [" junkset "]) \ n”)

fprintf('\nfor i in range(len(Nodes)):\n');

fprintf(' Cz = Nodes[i].coordinates[2]\n');

fprintf('如果Cz<=0.001:\n');

流(k = k + 1 \ n)

流(ctr = ctr + 1 \ n)

流(' Nodetemp = mdb.models .rootAssembly.instances(“模式1”)(“Part-1-1”).nodes.getByBoundingBox(节点[我].coordinates -0.01[0],[我]节点.coordinates -0.01 [1], Cz + % d - 0.01,节点[我].coordinates[0] + 0.01,节点[我].coordinates [1] + 0.01, Cz + % d + 0.01) \ n”,ulimit, ulimit);

流(“mdb.models .rootAssembly“模式1”。集(name = "简单% % d " % % k节点= Nodetemp) \ n”)

流(“强调(mdb.models .rootAssembly“模式1”。集(“简单% % d % % k)) \ n”)

流(k = k + 1 \ n)

流(“mdb.models .rootAssembly“模式1”。集(name = "简单% % d " % % k节点=节点[我+ 1])\ n”)

流(“强调(节点[我])\ n”)

流(“mdb.models(“模式1”)。约束方程(name = " - - - - - - % % d % % ctr,条款=((-1.0,“简单% % d % % (k - 1), 1),(1.0,“简单% % d % % k, 1),(1.0“ReferencePt1”1)))\ n”);

流(ctr = ctr + 1 \ n)

流(“mdb.models(“模式1”)。约束方程(name = " - - - - - - % % d % % ctr,条款=((-1.0,“简单% % d % % (k - 1), 2),(1.0,“简单% % d % % k, 2),(2) 1.0、“ReferencePt1”))\ n”);

流(ctr = ctr + 1 \ n)

流(“mdb.models(“模式1”)。约束方程(name = " - - - - - - % % d % % ctr,条款=((-1.0,“简单% % d % % (k - 1)、3)、(1.0,“简单% % d % % k, 3),(1.0“ReferencePt1”3)))\ n”);

fprintf('\nfor i in range(len(Nodes)):\n');

fprintf(' Cz = Nodes[i].coordinates[2]\n');

fprintf('如果Cz<=0.001:\n');

流(' Nodetemp = mdb.models .rootAssembly.instances(“模式1”)(“Part-1-1”).nodes.getByBoundingBox(节点[我].coordinates[0],[我]节点.coordinates [1], Cz + % d - 0.01,节点[我].coordinates[0],[我]节点.coordinates [1], Cz + % d + 0.01) \ n”,ulimit, ulimit);

(“模式1”)流(“mdb.models .rootAssembly.Set (name = " junkset "节点= Nodetemp) \ n”)

流('改变(节点[我])\ n”)

流('改变(mdb.models(“模式1”).rootAssembly.sets [" junkset "]) \ n \ n”)

这些都是单行fprintf命令,所以在复制粘贴之后,请确保将fprintf命令放回原始的单行格式,否则将得到打印错误。

以下是python代码,警告:在python中,缩进非常重要。确保在复制粘贴后,代码格式保持不变。下面的代码适用于大小为10 × 10 × 10的立方体。为不同的立方尺寸更改下面代码中的值。

(“模式1”)节点= mdb.models .rootAssembly.instances .nodes Part-1-1”

k = 0

ctr = 0

for i in range(len(Nodes)):

Cx = Nodes[i].coordinates[0]

Cz = Nodes[i].coordinates[2]

如果Cx==0, Cz>=0.01, Cz<=10-0.01:

k = k + 1

ctr = ctr + 1

Nodetemp = mdb.models(“模式1”).rootAssembly.instances [' Part-1-1 '] .nodes.getByBoundingBox (Cx + 10 - 0.01,节点[我].coordinates -0.01[1],[我]节点.coordinates -0.01[2],残雪+ 10 + 0.01,节点[我].coordinates[1] + 0.01,节点[我].coordinates [2] + 0.01)

mdb.models .rootAssembly“模式1”。集(name = '简单% d ' % k节点= Nodetemp)

突出(mdb.models .rootAssembly“模式1”。集(“简单% d ' % k))

k = k + 1

mdb.models .rootAssembly“模式1”。集(name = '简单% d ' % k节点=节点[我+ 1])

mdb.models(“模式1”)。方程(name =约束- % d % ctr,条款=((-1.0,“简单% d ' % (k - 1), 1),(1.0,“简单% d ' % k, 1),(1.0“ReferencePt2”1)))

ctr = ctr + 1

mdb.models(“模式1”)。方程(name =约束- % d % ctr,条款=((-1.0,“简单% d ' % (k - 1), 2),(1.0,“简单% d ' % k, 2),(2) 1.0、“ReferencePt2”))

ctr = ctr + 1

mdb.models(“模式1”)。方程(name =约束- % d % ctr,条款=((-1.0,“简单% d ' % (k - 1)、3)、(1.0,“简单% d ' % k, 3),(1.0“ReferencePt2”3)))

突出(节点[我])

for i in range(len(Nodes)):

Cx = Nodes[i].coordinates[0]

Cz = Nodes[i].coordinates[2]

如果Cx==0, Cz>=0.01, Cz<=10-0.01:

Nodetemp = mdb.models(“模式1”).rootAssembly.instances [' Part-1-1 '] .nodes.getByBoundingBox (Cx + 10 - 0.01,节点[我].coordinates[1],[我]节点.coordinates[2],残雪+ 10 + 0.01,节点[我].coordinates[1],[我]节点.coordinates [2])

(“模式1”)mdb.models .rootAssembly.Set (name = ' junkset ',节点= Nodetemp)

改变(节点[我])

(“模式1”)改变(mdb.models .rootAssembly.sets [' junkset '])

for i in range(len(Nodes)):

Cy = Nodes[i].coordinates[1]

Cx = Nodes[i].coordinates[0]

Cz = Nodes[i].coordinates[2]

如果Cy==0且Cz>=0.01且Cz<=10-0.01且Cx>=0.01且Cx<=10-0.01:

k = k + 1

ctr = ctr + 1

Nodetemp = mdb.models(“模式1”).rootAssembly.instances [' Part-1-1 '] .nodes.getByBoundingBox(节点[我].coordinates [0] -0.01, Cy + 10 - 0.01,节点[我].coordinates -0.01[2],[我]节点.coordinates [0] + 0.01, Cy + 10 + 0.01,节点[我].coordinates [2] + 0.01)

mdb.models .rootAssembly“模式1”。集(name = '简单% d ' % k节点= Nodetemp)

突出(mdb.models .rootAssembly“模式1”。集(“简单% d ' % k))

k = k + 1

mdb.models .rootAssembly“模式1”。集(name = '简单% d ' % k节点=节点[我+ 1])

突出(节点[我])

mdb.models(“模式1”)。方程(name =约束- % d % ctr,条款=((-1.0,“简单% d ' % (k - 1), 1),(1.0,“简单% d ' % k, 1),(1.0“ReferencePt3”1)))

ctr = ctr + 1

mdb.models(“模式1”)。方程(name =约束- % d % ctr,条款=((-1.0,“简单% d ' % (k - 1), 2),(1.0,“简单% d ' % k, 2),(2) 1.0、“ReferencePt3”))

ctr = ctr + 1

mdb.models(“模式1”)。方程(name =约束- % d % ctr,条款=((-1.0,“简单% d ' % (k - 1)、3)、(1.0,“简单% d ' % k, 3),(1.0“ReferencePt3”3)))

for i in range(len(Nodes)):

Cy = Nodes[i].coordinates[1]

Cz = Nodes[i].coordinates[2]

如果Cy==0且Cz>=0.01且Cz<=10-0.01:

Nodetemp = mdb.models(“模式1”).rootAssembly.instances [' Part-1-1 '] .nodes.getByBoundingBox(节点[我].coordinates [0], Cy + 10 - 0.01,节点[我].coordinates[2],[我]节点.coordinates [0], Cy + 10 + 0.01,节点[我].coordinates [2])

(“模式1”)mdb.models .rootAssembly.Set (name = ' junkset ',节点= Nodetemp)

改变(节点[我])

(“模式1”)改变(mdb.models .rootAssembly.sets [' junkset '])

for i in range(len(Nodes)):

Cz = Nodes[i].coordinates[2]

如果Cz < = 0.001:

k = k + 1

ctr = ctr + 1

Nodetemp = mdb.models(“模式1”).rootAssembly.instances [' Part-1-1 '] .nodes.getByBoundingBox(节点[我].coordinates -0.01[0],[我]节点.coordinates -0.01 [1], Cz + 10 - 0.01,节点[我].coordinates[0] + 0.01,节点[我].coordinates [1] + 0.01, Cz + 10 + 0.01)

mdb.models .rootAssembly“模式1”。集(name = '简单% d ' % k节点= Nodetemp)

突出(mdb.models .rootAssembly“模式1”。集(“简单% d ' % k))

k = k + 1

mdb.models .rootAssembly“模式1”。集(name = '简单% d ' % k节点=节点[我+ 1])

突出(节点[我])

mdb.models(“模式1”)。方程(name =约束- % d % ctr,条款=((-1.0,“简单% d ' % (k - 1), 1),(1.0,“简单% d ' % k, 1),(1.0“ReferencePt1”1)))

ctr = ctr + 1

mdb.models(“模式1”)。方程(name =约束- % d % ctr,条款=((-1.0,“简单% d ' % (k - 1), 2),(1.0,“简单% d ' % k, 2),(2) 1.0、“ReferencePt1”))

ctr = ctr + 1

mdb.models(“模式1”)。方程(name =约束- % d % ctr,条款=((-1.0,“简单% d ' % (k - 1)、3)、(1.0,“简单% d ' % k, 3),(1.0“ReferencePt1”3)))

for i in range(len(Nodes)):

Cz = Nodes[i].coordinates[2]

如果Cz < = 0.001:

Nodetemp = mdb.models(“模式1”).rootAssembly.instances [' Part-1-1 '] .nodes.getByBoundingBox(节点[我].coordinates[0],[我]节点.coordinates [1], Cz + 10 - 0.01,节点[我].coordinates[0],[我]节点.coordinates [1], Cz + 10 + 0.01)

(“模式1”)mdb.models .rootAssembly.Set (name = ' junkset ',节点= Nodetemp)

改变(节点[我])

(“模式1”)改变(mdb.models .rootAssembly.sets [' junkset '])

另一个条件是有3个参考点。使集合的参考点以及,所以你可以在Matlab中使用以下代码。创建Set的部分代码可能适用于您,也可能不适用,这取决于您的参考点所在的数组位置。如果不起作用,请手动执行,将Z轴参考点称为ReferencePt1, X轴参考点称为ReferencePt2, Y轴参考点称为ReferencePt3

流(“mdb.models .rootAssembly“模式1”。ReferencePoint(点= (% f, f %, % f)) \ n " ulimit / 2, ulimit / 2, 2 * ulimit);

流(“mdb.models .rootAssembly“模式1”。ReferencePoint(点= (% f, f %, % f)) \ n " ulimit * 2, ulimit / 2, ulimit / 2);

流(“mdb.models .rootAssembly“模式1”。ReferencePoint(点= (% f, f %, % f)) \ n”,ulimit / 2, ulimit * 2, ulimit / 2);

流(“mdb.models .rootAssembly“模式1”。集(name = " ReferencePt1 " referencePoints = (mdb.models .rootAssembly“模式1”。referencePoints [4])) \ n ');

流(“mdb.models .rootAssembly“模式1”。集(name = " ReferencePt2 " referencePoints = (mdb.models .rootAssembly“模式1”。referencePoints [5],)) \ n”);

流(“mdb.models .rootAssembly“模式1”。集(name = " ReferencePt3 " referencePoints = (mdb.models .rootAssembly“模式1”。referencePoints [6])) \ n ');

非常感谢你详细的剧本。

如果你不介意的话,我还有一个问题。

我想将e2, e3和e23应用于纤维复合材料的代表性体积元件上。

我使用一个参考点来施加应变,例如e1的参考点1,e2的参考点2。

问题是,我如何把e23放在参考点3上,它是围绕1旋转的吗?在参考点3上会是UR1吗?

提前谢谢你

有没有人可以告诉我,在两序贯分析中不耦合热应力分析是否需要应用周期边界条件?

谢谢

我有一个问题。

如果两个曲面的网格是相同的,我是否可以对每个面使用内部节点集来应用约束方程,而不是将它们应用到每对节点上?

这真的会节省精力和时间:)

谢谢

谁能告诉我如何将周期性边界条件应用于纤维复合材料的热分析?

我从纤维和基体的热膨胀系数的差异中得到应力。

参考点??????的失望是什么

谢谢

订阅“应用周期性边界条件”的意见

最近的评论

更多的评论

辛迪加

订阅辛迪加