用户登录

你在这里

应用周期边界条件

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

我试图将PBC应用到本文中。张云发,夏子辉纤维增强复合材料界面损伤细观力学分析
层压制品,但模型接缝不对。

谁能告诉我该怎么做

如果你用Abaqus,这其实很简单。使用方程约束(在手册中搜索*EQUATION关键字)对于与公共参考点相对的节点。这意味着什么呢,假设几何是三次的。想想前面和后面的脸。假设您将其网格化,使每个节点面对9个节点。4个角节点,4个中边缘节点和一个中心节点。现在你要做一个参考点然后用方程约束将参考点的位移自由度连接到前表面和后表面的每个节点上所以它看起来像u1(后)-u1(前)+u1(参考)=0,类似地u2(读)-u2(前)+u2(参考点)=0,以此类推。

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

Ashwin

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

提前感谢

拉维

非常感谢您的回复。

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

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

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

怎么让e23等于0呢?

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

你好ashwin

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

请帮助

随附的文件提供了详细的程序和必要的脚本申请PBC。

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

--

Anshul

非常感谢Anshulf的帮助。

关于这篇论文,我有一个问题。

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

就像《巴贝罗》中提到的那样?

再次感谢你:)

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

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

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

如果您不熟悉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 =节点[i].坐标[0]

Cz =节点[i].坐标[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 =节点[i].坐标[0]

Cz =节点[i].坐标[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 =节点[i].坐标[0]

Cz =节点[i].坐标[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 =节点[i].坐标[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 =节点[i].坐标[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 =节点[i].坐标[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中使用以下代码。根据参考点所在的数组位置,创建集合部分的代码可能适合您,也可能不适合您。如果它不起作用,手动执行,调用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吗?

提前感谢

有谁能告诉我,对于不耦合的热应力分析,我是否应该在两个序列分析中应用周期边界条件?

谢谢

我有一个问题。

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

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

谢谢

谁能告诉我如何应用周期边界条件对纤维复合材料进行热分析?

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

参考点??????的位移是多少

谢谢

订阅“应用周期边界条件”评论

最近的评论

更多的评论

辛迪加

认购辛迪加