许可优化
产品
解决方案
服务支持
关于
软件库
当前位置:服务支持 >  软件文章 >  [Abaqus对比]CEL、CFD与SPH方法优劣分析

[Abaqus对比]CEL、CFD与SPH方法优劣分析

阅读数 6
点赞 0
article_banner

Abaqus是一款强大的有限元计算软件

传统的 FEA Abaqus/Standard, Abaqus/Explicit

拉格朗日描述 ,网格随材料一起变形

CEL: Coupled Eulerian-Lagrangian Abaqus/Explicit

CEL:流—固耦合算法采用欧拉法描述流体,材料通过不变形的网格点(坐标)

CFD : Computational Fluid Dynamics Abaqus/CFD
CFD:计算流体动力学,采用欧拉法描述流体,通过描述物质通过坐标点时的密度、能量等来描述流体

SPH : Smooth Particle Hydrodynamics Abaqus/Explicit

SPH:光滑粒子流体动力学一种也算是拉格朗日法的一种无网格法,粒子既为材料随材料一起运动。

三种方法各自各自的优势,如同三剑客一样


CFD像阿多斯,是三种方法中最为年长的一个,使用经验与计算方法已经十分成熟,而且计算结果十分漂亮,就像阿多斯一用优雅而强大,经验老道而灵魂高贵,能让你清晰解决不少问题,但是也由于老道的经验,他的思维模式很难超越。

CEL算法就像阿拉密斯,是一个年轻的算法,但是由于他兼有流体算法与固体算法的优势,在建模时又需要仔细雕琢,不然计算结果会让你受到魅惑,就像风流倜傥的阿拉密斯,文采斐然而机敏异常,但是却难以透射他的内心。

SPH算法就像波尔多斯,是一个强大的算法,在商业软件使用并不多见,因为他就像波尔多斯一样不是所用的队长都可以驾驭,计算量大结果华丽,但是精确性上常受到质疑,与波尔多斯一样虽然坚强而忠诚,但是却有可能问题的根源。

(忽略达达尼昂)

三种方法对于材料要求不同,首先,SPH可用的范围较广几乎可以适用于显式求解模块的(Abaqus/Explicit)各类材料,如下表所示:


在多相流体的使用方面,CEL的表现较为出色可以模拟多相流体的运动过程。

这个流固耦合联合仿真其实指,将一个流体力学问题进行拆解,就变成了一个流体力学问题和固体力学问题(两个MODEL),设置成相同的坐标、合适的流-固接触面以及相同的求解步就可以在耦合面上完成参数传递。

从前文描述来看感觉Abaqus的CFD好弱,其实CFD有其自身的优势:

1.对于CFD来讲,湍流模型 很重要,包k-ε、RNG k-ε等等。

2.CFD可以模拟流体冲击多孔介质的情形,比如这样:


由于,CEL与CFD都对使用欧拉法描述流体,所以这两类方法在描述如下问题时有着独特的优势,比如模拟漩涡。



比如轮胎滑水问题。

由于SPH方法采用严格的拉格朗日描述,所以流进流出的边界条件很难才该类方法中实现,其实现模式也是采用了将整个体积计算出后进行相对运动已达到材料流进流出的边界条件。

除此之外,CEL算法模拟内压方面有一定的优势比如:

左侧使用采用CEL算法模拟向袋子注入空气的现象,后者是SPH模拟类似的情况,但是对于CEL来讲只要定义一个合适的流入边界条件就可以描述这样的问题,而SPH要将整体全部给出才可以。

流-固问题的解决方案一般就是这五种方案,整体上讲有左自右计算量迅速增加,

三种方法在模拟流固耦合时功能存在一定差距

首先,CEL法采用两种不同描述形式因此在固体部分限制较少几乎可以使用显式计算模块的功能比如,拥有裂缝(XFEM,)的固体部分,较大的变形(拓扑结构的变形),比如,在耦合部分可以局部细化网格等等,

但是SPH法这样的方法,采用直接使用粒子当节点,所以其要求与固体部分网格有清晰的区分,同时也没有细化接触面的必要。

CFD方法时严格的流体力学方法,需要严格网格以及清晰的边界条件(在FSI中的接触面),其实在合理的情况下使用CFD FSI是可以允许材料又不连续的情况。


不连续的CFD FSI情况,裂纹的添加方法详见XFEM的使用,当然

对于SPH法来讲最大的优势是可以允许单元类型的转化(按照应变、应力或者时间三种类型的准则),但是SPH还是不能计算热传导问题,下图是CFD计算的热传递问题。

说到底,SPH是研究瞬态的、极端变形问题的对于处理长周期、近似固体计算非常不占优势,计算精度与计算资源的花费是巨大的。

CEL作为一种常见的流固耦合算法,其根本是目的是将固体问题、流体问题一起解决带来其流固耦合面不固定、迭代增量计算周期大等问题,其天然的计算资源耗费视巨大因此对于长周期的模拟时完全不占优势的,但是其计算精度高、收敛性较好,处理瞬态问题具有一定的优势。

CFD (FSI)本质上流体方法,在其传统领域(湍流现象、热传导)有着无可比拟的优势,计算资源耗费较少,但是,在流固耦合计算方面天然就不占优势,需要固定的接触面,但是可以满足长周期的计算。

总体来看:

既然如此,不放一个算例,感觉白看了一样Rivet forming 铆钉成型模型


#
#Script to generate two rivet forming models in Abaqus/CAE:
#  - Pure Lagrangian model
#  - Coupled Eulerian-Lagrangian model
#
# -*- coding: mbcs -*-
from part import *
from material import *
from section import *
from assembly import *
from step import *
from interaction import *
from load import *
from mesh import *
from job import *
from sketch import *
from visualization import *
from stub import *
from connectorBehavior import *
mdb.models.changeKey(fromName='Model-1', toName='Rivet forming - CEL')
#
# Rivet geometry
#
mdb.models['Rivet forming - CEL'].ConstrainedSketch(name='__profile__', 
    sheetSize=20.0)
mdb.models['Rivet forming - CEL'].sketches['__profile__'].ConstructionLine(
    point1=(0.0, -10.0), point2=(0.0, 10.0))
mdb.models['Rivet forming - CEL'].sketches['__profile__'].FixedConstraint(
    entity=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[2])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].ArcByCenterEnds(
    center=(0.0, 0.0), direction=CLOCKWISE, point1=(0.0, 1.0), point2=(1.0, 
    0.0))
mdb.models['Rivet forming - CEL'].sketches['__profile__'].CoincidentConstraint(
    entity1=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].vertices[2], 
    entity2=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[2])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].CoincidentConstraint(
    entity1=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].vertices[0], 
    entity2=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[2])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].Line(point1=(1.0, 
    0.0), point2=(3.0, 0.0))
mdb.models['Rivet forming - CEL'].sketches['__profile__'].HorizontalConstraint(
    entity=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[4])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].PerpendicularConstraint(
    entity1=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[3], 
    entity2=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[4])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].Line(point1=(3.0, 
    0.0), point2=(3.0, 3.25))
mdb.models['Rivet forming - CEL'].sketches['__profile__'].VerticalConstraint(
    entity=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[5])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].PerpendicularConstraint(
    entity1=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[4], 
    entity2=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[5])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].Line(point1=(3.0, 
    3.25), point2=(4.0, 3.25))
mdb.models['Rivet forming - CEL'].sketches['__profile__'].HorizontalConstraint(
    entity=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[6])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].PerpendicularConstraint(
    entity1=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[5], 
    entity2=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[6])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].Line(point1=(4.0, 
    3.25), point2=(4.0, 8.25))
mdb.models['Rivet forming - CEL'].sketches['__profile__'].VerticalConstraint(
    entity=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[7])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].PerpendicularConstraint(
    entity1=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[6], 
    entity2=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[7])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].Line(point1=(4.0, 
    8.25), point2=(0.0, 8.44635772705078))
mdb.models['Rivet forming - CEL'].sketches['__profile__'].CoincidentConstraint(
    entity1=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].vertices[7], 
    entity2=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[2])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].Line(point1=(0.0, 
    8.44635772705078), point2=(0.0, 1.0))
mdb.models['Rivet forming - CEL'].sketches['__profile__'].VerticalConstraint(
    entity=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[9])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].sketchOptions.setValues(
    grid=OFF)
mdb.models['Rivet forming - CEL'].sketches['__profile__'].FixedConstraint(
    entity=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[4])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].HorizontalConstraint(
    entity=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[8])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].delete(objectList=(
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].constraints[30], 
    ))
mdb.models['Rivet forming - CEL'].sketches['__profile__'].ObliqueDimension(
    textPoint=(6.12089824676514, 6.64175748825073), value=6.0, vertex1=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].vertices[5], 
    vertex2=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].vertices[6])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].ObliqueDimension(
    textPoint=(6.12089824676514, 0.582228660583496), value=4.46898, vertex1=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].vertices[3], 
    vertex2=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].vertices[4])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].ObliqueDimension(
    textPoint=(1.64401686191559, 11.7831764221191), value=4.0, vertex1=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].vertices[6], 
    vertex2=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].vertices[7])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].RadialDimension(
    curve=mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[3]
    , radius=1.5, textPoint=(1.36421167850494, 1.81511974334717))
mdb.models['Rivet forming - CEL'].sketches['__profile__'].ObliqueDimension(
    textPoint=(3.54669141769409, 3.3627917766571), value=1.1, vertex1=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].vertices[4], 
    vertex2=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].vertices[5])
mdb.models['Rivet forming - CEL'].Part(dimensionality=THREE_D, name='Rivet', 
    type=DEFORMABLE_BODY)
mdb.models['Rivet forming - CEL'].parts['Rivet'].BaseSolidRevolve(angle=360.0, 
    flipRevolveDirection=OFF, sketch=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'])
del mdb.models['Rivet forming - CEL'].sketches['__profile__']
#
# Plate geometry
#
mdb.models['Rivet forming - CEL'].ConstrainedSketch(name='__profile__', 
    sheetSize=20.0)
mdb.models['Rivet forming - CEL'].sketches['__profile__'].CircleByCenterPerimeter(
    center=(0.0, 0.0), point1=(0.5, 0.0))
mdb.models['Rivet forming - CEL'].sketches['__profile__'].CircleByCenterPerimeter(
    center=(0.0, 0.0), point1=(1.5, 0.0))
mdb.models['Rivet forming - CEL'].sketches['__profile__'].RadialDimension(
    curve=mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[3]
    , radius=11.0, textPoint=(2.16842985153198, 0.752570629119873))
mdb.models['Rivet forming - CEL'].sketches['__profile__'].RadialDimension(
    curve=mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[2]
    , radius=2.95, textPoint=(1.49165344238281, 0.937847852706909))
mdb.models['Rivet forming - CEL'].Part(dimensionality=THREE_D, name='Plate', 
    type=DEFORMABLE_BODY)
mdb.models['Rivet forming - CEL'].parts['Plate'].BaseSolidExtrude(depth=2.0, 
    sketch=mdb.models['Rivet forming - CEL'].sketches['__profile__'])
del mdb.models['Rivet forming - CEL'].sketches['__profile__']
#
# Die geometry
#
mdb.models['Rivet forming - CEL'].ConstrainedSketch(name='__profile__', 
    sheetSize=20.0)
mdb.models['Rivet forming - CEL'].sketches['__profile__'].CircleByCenterPerimeter(
    center=(0.0, 0.0), point1=(1.0, 0.0))
mdb.models['Rivet forming - CEL'].sketches['__profile__'].RadialDimension(
    curve=mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[2]
    , radius=10.0, textPoint=(1.86937546730042, 1.08200299739838))
mdb.models['Rivet forming - CEL'].Part(dimensionality=THREE_D, name='Die', 
    type=DEFORMABLE_BODY)
mdb.models['Rivet forming - CEL'].parts['Die'].BaseSolidExtrude(depth=1.0, 
    sketch=mdb.models['Rivet forming - CEL'].sketches['__profile__'])
del mdb.models['Rivet forming - CEL'].sketches['__profile__']
#
# Eulerian domain geometry
#
mdb.models['Rivet forming - CEL'].ConstrainedSketch(name='__profile__', 
    sheetSize=40.0)
mdb.models['Rivet forming - CEL'].sketches['__profile__'].rectangle(point1=(
    -2.0, -2.0), point2=(2.0, 2.0))
mdb.models['Rivet forming - CEL'].sketches['__profile__'].ConstructionLine(
    angle=0.0, point1=(0.0, 0.0))
mdb.models['Rivet forming - CEL'].sketches['__profile__'].HorizontalConstraint(
    entity=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[6])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].ConstructionLine(
    angle=90.0, point1=(0.0, 0.0))
mdb.models['Rivet forming - CEL'].sketches['__profile__'].VerticalConstraint(
    entity=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[7])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].SymmetryConstraint(
    entity1=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[2], 
    entity2=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[4], 
    symmetryAxis=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[7])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].FixedConstraint(entity=mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[7])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].ObliqueDimension(
    textPoint=(-0.803647994995117, -4.68112373352051), value=17.0, vertex1=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].vertices[3], 
    vertex2=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].vertices[0])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].FixedConstraint(entity=mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[5])
mdb.models['Rivet forming - CEL'].sketches['__profile__'].EqualLengthConstraint(
    entity1=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[5], 
    entity2=
    mdb.models['Rivet forming - CEL'].sketches['__profile__'].geometry[2])
mdb.models['Rivet forming - CEL'].Part(dimensionality=THREE_D, name='Eulerian', 
    type=EULERIAN)
mdb.models['Rivet forming - CEL'].parts['Eulerian'].BaseSolidExtrude(depth=11.5
    , sketch=mdb.models['Rivet forming - CEL'].sketches['__profile__'])
del mdb.models['Rivet forming - CEL'].sketches['__profile__']
#
# Sets
#
mdb.models['Rivet forming - CEL'].parts['Eulerian'].Set(cells=
    mdb.models['Rivet forming - CEL'].parts['Eulerian'].cells.getSequenceFromMask(
    ('[#1 ]', ), ), name='All')
mdb.models['Rivet forming - CEL'].parts['Die'].Set(cells=
    mdb.models['Rivet forming - CEL'].parts['Die'].cells.getSequenceFromMask((
    '[#1 ]', ), ), name='All')
mdb.models['Rivet forming - CEL'].parts['Plate'].Set(cells=
    mdb.models['Rivet forming - CEL'].parts['Plate'].cells.getSequenceFromMask(
    ('[#1 ]', ), ), name='All')
mdb.models['Rivet forming - CEL'].parts['Rivet'].Set(cells=
    mdb.models['Rivet forming - CEL'].parts['Rivet'].cells.getSequenceFromMask(
    ('[#1 ]', ), ), name='All')
#
# Materials
#
mdb.models['Rivet forming - CEL'].Material(name='Mat-1')
mdb.models['Rivet forming - CEL'].materials['Mat-1'].Density(table=((7.85e-09, 
    ), ))
mdb.models['Rivet forming - CEL'].materials['Mat-1'].Elastic(table=((210000.0, 
    0.266), ))
mdb.models['Rivet forming - CEL'].materials['Mat-1'].Plastic(table=((300.0, 
    0.0), (450.0, 0.02), (750.0, 0.34), (1400.0, 0.35)))
mdb.models['Rivet forming - CEL'].Material(name='Mat-2')
mdb.models['Rivet forming - CEL'].materials['Mat-2'].Density(table=((7.85e-09, 
    ), ))
mdb.models['Rivet forming - CEL'].materials['Mat-2'].Elastic(table=((210000.0, 
    0.3), ))
#
# Sections
#
mdb.models['Rivet forming - CEL'].HomogeneousSolidSection(material='Mat-2', 
    name='Rigid', thickness=None)
mdb.models['Rivet forming - CEL'].EulerianSection(data={'Mat-1-1': 'Mat-1'}, 
    name='Rivet')
#
# Section assignments
#
mdb.models['Rivet forming - CEL'].parts['Die'].SectionAssignment(offset=0.0, 
    offsetField='', offsetType=MIDDLE_SURFACE, region=
    mdb.models['Rivet forming - CEL'].parts['Die'].sets['All'], sectionName=
    'Rigid')
mdb.models['Rivet forming - CEL'].parts['Eulerian'].SectionAssignment(offset=
    0.0, offsetField='', offsetType=MIDDLE_SURFACE, region=Region(
    cells=mdb.models['Rivet forming - CEL'].parts['Eulerian'].cells.getSequenceFromMask(
    mask=('[#1 ]', ), )), sectionName='Rivet')
mdb.models['Rivet forming - CEL'].parts['Plate'].SectionAssignment(offset=0.0, 
    offsetField='', offsetType=MIDDLE_SURFACE, region=
    mdb.models['Rivet forming - CEL'].parts['Plate'].sets['All'], sectionName=
    'Rigid')
#
# Mesh the die
#
mdb.models['Rivet forming - CEL'].parts['Die'].PartitionCellByPlaneThreePoints(
    cells=
    mdb.models['Rivet forming - CEL'].parts['Die'].cells.getSequenceFromMask((
    '[#1 ]', ), ), point1=
    mdb.models['Rivet forming - CEL'].parts['Die'].vertices[1], point2=
    mdb.models['Rivet forming - CEL'].parts['Die'].vertices[0], point3=
    mdb.models['Rivet forming - CEL'].parts['Die'].InterestingPoint(
    mdb.models['Rivet forming - CEL'].parts['Die'].edges[0], CENTER))
mdb.models['Rivet forming - CEL'].parts['Die'].PartitionCellByPlaneThreePoints(
    cells=
    mdb.models['Rivet forming - CEL'].parts['Die'].cells.getSequenceFromMask((
    '[#3 ]', ), ), point1=
    mdb.models['Rivet forming - CEL'].parts['Die'].InterestingPoint(
    mdb.models['Rivet forming - CEL'].parts['Die'].edges[6], MIDDLE), point2=
    mdb.models['Rivet forming - CEL'].parts['Die'].InterestingPoint(
    mdb.models['Rivet forming - CEL'].parts['Die'].edges[5], MIDDLE), point3=
    mdb.models['Rivet forming - CEL'].parts['Die'].InterestingPoint(
    mdb.models['Rivet forming - CEL'].parts['Die'].edges[5], CENTER))
mdb.models['Rivet forming - CEL'].parts['Die'].setElementType(elemTypes=(
    ElemType(elemCode=C3D8R, elemLibrary=EXPLICIT, secondOrderAccuracy=OFF, 
    kinematicSplit=AVERAGE_STRAIN, hourglassControl=DEFAULT, 
    distortionControl=DEFAULT), ElemType(elemCode=C3D6, elemLibrary=EXPLICIT), 
    ElemType(elemCode=C3D4, elemLibrary=EXPLICIT)), regions=(
    mdb.models['Rivet forming - CEL'].parts['Die'].cells.getSequenceFromMask((
    '[#f ]', ), ), ))
mdb.models['Rivet forming - CEL'].parts['Die'].seedPart(deviationFactor=0.1, 
    size=0.75)
mdb.models['Rivet forming - CEL'].parts['Die'].generateMesh()
#
# Mesh the plate
#
mdb.models['Rivet forming - CEL'].parts['Plate'].PartitionCellByPlaneThreePoints(
    cells=
    mdb.models['Rivet forming - CEL'].parts['Plate'].cells.getSequenceFromMask(
    ('[#1 ]', ), ), point1=
    mdb.models['Rivet forming - CEL'].parts['Plate'].InterestingPoint(
    mdb.models['Rivet forming - CEL'].parts['Plate'].edges[1], MIDDLE), point2=
    mdb.models['Rivet forming - CEL'].parts['Plate'].InterestingPoint(
    mdb.models['Rivet forming - CEL'].parts['Plate'].edges[0], MIDDLE), point3=
    mdb.models['Rivet forming - CEL'].parts['Plate'].InterestingPoint(
    mdb.models['Rivet forming - CEL'].parts['Plate'].edges[0], CENTER))
mdb.models['Rivet forming - CEL'].parts['Plate'].PartitionCellByPlaneThreePoints(
    cells=
    mdb.models['Rivet forming - CEL'].parts['Plate'].cells.getSequenceFromMask(
    ('[#3 ]', ), ), point1=
    mdb.models['Rivet forming - CEL'].parts['Plate'].InterestingPoint(
    mdb.models['Rivet forming - CEL'].parts['Plate'].edges[14], MIDDLE), 
    point2=mdb.models['Rivet forming - CEL'].parts['Plate'].InterestingPoint(
    mdb.models['Rivet forming - CEL'].parts['Plate'].edges[12], MIDDLE), 
    point3=mdb.models['Rivet forming - CEL'].parts['Plate'].InterestingPoint(
    mdb.models['Rivet forming - CEL'].parts['Plate'].edges[10], CENTER))
mdb.models['Rivet forming - CEL'].parts['Plate'].setElementType(elemTypes=(
    ElemType(elemCode=C3D8R, elemLibrary=STANDARD, secondOrderAccuracy=OFF, 
    kinematicSplit=AVERAGE_STRAIN, hourglassControl=DEFAULT, 
    distortionControl=DEFAULT), ElemType(elemCode=C3D6, elemLibrary=STANDARD), 
    ElemType(elemCode=C3D4, elemLibrary=STANDARD)), regions=(
    mdb.models['Rivet forming - CEL'].parts['Plate'].cells.getSequenceFromMask(
    ('[#f ]', ), ), ))
mdb.models['Rivet forming - CEL'].parts['Plate'].seedPart(deviationFactor=0.1, 
    size=0.75)
mdb.models['Rivet forming - CEL'].parts['Plate'].generateMesh()
#
# Partition the rivet geometry (no mesh needed for CEL model)
#
mdb.models['Rivet forming - CEL'].parts['Rivet'].PartitionCellByExtendFace(
    cells=
    mdb.models['Rivet forming - CEL'].parts['Rivet'].cells.getSequenceFromMask(
    ('[#1 ]', ), ), extendFace=
    mdb.models['Rivet forming - CEL'].parts['Rivet'].faces[3])
mdb.models['Rivet forming - CEL'].parts['Rivet'].PartitionCellByExtendFace(
    cells=
    mdb.models['Rivet forming - CEL'].parts['Rivet'].cells.getSequenceFromMask(
    ('[#2 ]', ), ), extendFace=
    mdb.models['Rivet forming - CEL'].parts['Rivet'].faces[4])
mdb.models['Rivet forming - CEL'].parts['Rivet'].PartitionCellByPlaneThreePoints(
    cells=
    mdb.models['Rivet forming - CEL'].parts['Rivet'].cells.getSequenceFromMask(
    ('[#7 ]', ), ), point1=
    mdb.models['Rivet forming - CEL'].parts['Rivet'].InterestingPoint(
    mdb.models['Rivet forming - CEL'].parts['Rivet'].edges[10], CENTER), 
    point2=mdb.models['Rivet forming - CEL'].parts['Rivet'].vertices[4], 
    point3=mdb.models['Rivet forming - CEL'].parts['Rivet'].vertices[0])
mdb.models['Rivet forming - CEL'].parts['Rivet'].PartitionCellByPlaneThreePoints(
    cells=
    mdb.models['Rivet forming - CEL'].parts['Rivet'].cells.getSequenceFromMask(
    ('[#3f ]', ), ), point1=
    mdb.models['Rivet forming - CEL'].parts['Rivet'].InterestingPoint(
    mdb.models['Rivet forming - CEL'].parts['Rivet'].edges[23], MIDDLE), 
    point2=mdb.models['Rivet forming - CEL'].parts['Rivet'].InterestingPoint(
    mdb.models['Rivet forming - CEL'].parts['Rivet'].edges[17], MIDDLE), 
    point3=mdb.models['Rivet forming - CEL'].parts['Rivet'].InterestingPoint(
    mdb.models['Rivet forming - CEL'].parts['Rivet'].edges[16], CENTER))
#
# Mesh the Eulerian domain
#
mdb.models['Rivet forming - CEL'].parts['Eulerian'].setElementType(elemTypes=(
    ElemType(elemCode=EC3D8R, elemLibrary=EXPLICIT, hourglassControl=DEFAULT), 
    ElemType(elemCode=UNKNOWN_WEDGE, elemLibrary=EXPLICIT), ElemType(
    elemCode=UNKNOWN_TET, elemLibrary=EXPLICIT)), regions=(
    mdb.models['Rivet forming - CEL'].parts['Eulerian'].cells.getSequenceFromMask(
    ('[#1 ]', ), ), ))
mdb.models['Rivet forming - CEL'].parts['Eulerian'].seedPart(deviationFactor=
    0.1, size=0.25)
mdb.models['Rivet forming - CEL'].parts['Eulerian'].generateMesh()
#
# Instance parts into the assembly
#
mdb.models['Rivet forming - CEL'].rootAssembly.DatumCsysByDefault(CARTESIAN)
mdb.models['Rivet forming - CEL'].rootAssembly.Instance(dependent=ON, name=
    'Plate-1', part=mdb.models['Rivet forming - CEL'].parts['Plate'])
mdb.models['Rivet forming - CEL'].rootAssembly.Instance(dependent=ON, name=
    'Rivet-1', part=mdb.models['Rivet forming - CEL'].parts['Rivet'])
mdb.models['Rivet forming - CEL'].rootAssembly.Coaxial(fixedAxis=
    mdb.models['Rivet forming - CEL'].rootAssembly.instances['Plate-1'].faces[15]
    , flip=ON, movableAxis=
    mdb.models['Rivet forming - CEL'].rootAssembly.instances['Rivet-1'].faces[45])
mdb.models['Rivet forming - CEL'].rootAssembly.FaceToFace(clearance=0.0, 
    fixedPlane=
    mdb.models['Rivet forming - CEL'].rootAssembly.instances['Plate-1'].faces[9]
    , flip=ON, movablePlane=
    mdb.models['Rivet forming - CEL'].rootAssembly.instances['Rivet-1'].faces[7])
mdb.models['Rivet forming - CEL'].rootAssembly.Instance(dependent=ON, name=
    'Die-1', part=mdb.models['Rivet forming - CEL'].parts['Die'])
mdb.models['Rivet forming - CEL'].rootAssembly.FaceToFace(clearance=0.0, 
    fixedPlane=
    mdb.models['Rivet forming - CEL'].rootAssembly.instances['Rivet-1'].faces[11]
    , flip=ON, movablePlane=
    mdb.models['Rivet forming - CEL'].rootAssembly.instances['Die-1'].faces[2])
mdb.models['Rivet forming - CEL'].rootAssembly.Instance(dependent=ON, name=
    'Die-2', part=mdb.models['Rivet forming - CEL'].parts['Die'])
mdb.models['Rivet forming - CEL'].rootAssembly.FaceToFace(clearance=0.0, 
    fixedPlane=
    mdb.models['Rivet forming - CEL'].rootAssembly.instances['Rivet-1'].faces[46]
    , flip=ON, movablePlane=
    mdb.models['Rivet forming - CEL'].rootAssembly.instances['Die-2'].faces[6])
mdb.models['Rivet forming - CEL'].rootAssembly.Instance(dependent=ON, name=
    'Eulerian-1', part=mdb.models['Rivet forming - CEL'].parts['Eulerian'])
# Combine the following three translates?
mdb.models['Rivet forming - CEL'].rootAssembly.translate(instanceList=(
    'Eulerian-1', ), vector=(1.5, 2.0, -2.5))
mdb.models['Rivet forming - CEL'].rootAssembly.translate(instanceList=(
    'Eulerian-1', ), vector=(-10.0, 0.0, 0.0))
mdb.models['Rivet forming - CEL'].rootAssembly.translate(instanceList=(
    'Eulerian-1', ), vector=(8.5, -8.5, -0.45))
#
mdb.models['Rivet forming - CEL'].rootAssembly.instances['Die-1'].ConvertConstraints(
    )
mdb.models['Rivet forming - CEL'].rootAssembly.instances['Die-2'].ConvertConstraints(
    )
mdb.models['Rivet forming - CEL'].rootAssembly.instances['Rivet-1'].ConvertConstraints(
    )
#
# Create step, general contact, rigid bodies, volume fraction field, and boundary conditions
#
mdb.models['Rivet forming - CEL'].ExplicitDynamicsStep(description=
    'Displace dies', name='Step-1', previous='Initial', timePeriod=0.001)
#
mdb.models['Rivet forming - CEL'].ContactProperty('Frictionless')
mdb.models['Rivet forming - CEL'].ContactExp(createStepName='Step-1', name=
    'General contact')
mdb.models['Rivet forming - CEL'].interactions['General contact'].includedPairs.setValuesInStep(
    stepName='Step-1', useAllstar=ON)
mdb.models['Rivet forming - CEL'].interactions['General contact'].contactPropertyAssignments.appendInStep(
    assignments=((GLOBAL, SELF, 'Frictionless'), ), stepName='Step-1')
#
mdb.models['Rivet forming - CEL'].rootAssembly.ReferencePoint(point=(0.0, 0.0, 
    10.0))
mdb.models['Rivet forming - CEL'].rootAssembly.ReferencePoint(point=(0.0, 0.0, 
    -4.5))
mdb.models['Rivet forming - CEL'].rootAssembly.ReferencePoint(point=(0.0, 0.0, 
    0.0))
mdb.models['Rivet forming - CEL'].rootAssembly.Set(name='Die-1-RefNode', 
    referencePoints=(
    mdb.models['Rivet forming - CEL'].rootAssembly.referencePoints[15], ))
mdb.models['Rivet forming - CEL'].rootAssembly.Set(name='Die-2-RefNode', 
    referencePoints=(
    mdb.models['Rivet forming - CEL'].rootAssembly.referencePoints[16], ))
mdb.models['Rivet forming - CEL'].rootAssembly.Set(name='Plate-RefNode', 
    referencePoints=(
    mdb.models['Rivet forming - CEL'].rootAssembly.referencePoints[17], ))
mdb.models['Rivet forming - CEL'].RigidBody(bodyRegion=
    mdb.models['Rivet forming - CEL'].rootAssembly.instances['Die-1'].sets['All']
    , name='Rigid-Die-1', refPointRegion=
    mdb.models['Rivet forming - CEL'].rootAssembly.sets['Die-1-RefNode'])
mdb.models['Rivet forming - CEL'].RigidBody(bodyRegion=
    mdb.models['Rivet forming - CEL'].rootAssembly.instances['Die-2'].sets['All']
    , name='Rigid-Die-2', refPointRegion=
    mdb.models['Rivet forming - CEL'].rootAssembly.sets['Die-2-RefNode'])
mdb.models['Rivet forming - CEL'].RigidBody(bodyRegion=
    mdb.models['Rivet forming - CEL'].rootAssembly.instances['Plate-1'].sets['All']
    , name='Rigid-Plate', refPointRegion=
    mdb.models['Rivet forming - CEL'].rootAssembly.sets['Plate-RefNode'])
#
mdb.models['Rivet forming - CEL'].SmoothStepAmplitude(data=((0.0, 0.0), 
    (0.0008, 1.0)), name='Amp-1', timeSpan=STEP)
mdb.models['Rivet forming - CEL'].DisplacementBC(amplitude=UNSET, 
    createStepName='Step-1', distributionType=UNIFORM, fieldName='', fixed=OFF, 
    localCsys=None, name='Fix plate', region=
    mdb.models['Rivet forming - CEL'].rootAssembly.sets['Plate-RefNode'], u1=
    0.0, u2=0.0, u3=0.0, ur1=0.0, ur2=0.0, ur3=0.0)
mdb.models['Rivet forming - CEL'].DisplacementBC(amplitude='Amp-1', 
    createStepName='Step-1', distributionType=UNIFORM, fieldName='', fixed=OFF, 
    localCsys=None, name='Displace Die-1', region=
    mdb.models['Rivet forming - CEL'].rootAssembly.sets['Die-1-RefNode'], u1=
    0.0, u2=0.0, u3=-3.0, ur1=0.0, ur2=0.0, ur3=0.0)
mdb.models['Rivet forming - CEL'].DisplacementBC(amplitude='Amp-1', 
    createStepName='Step-1', distributionType=UNIFORM, fieldName='', fixed=OFF, 
    localCsys=None, name='Displace Die-2', region=
    mdb.models['Rivet forming - CEL'].rootAssembly.sets['Die-2-RefNode'], u1=
    0.0, u2=0.0, u3=2.0, ur1=0.0, ur2=0.0, ur3=0.0)
#
mdb.models['Rivet forming - CEL'].rootAssembly.DiscreteFieldByVolumeFraction(
    description='Volume faction field for rivet material', eulerianInstance=
    mdb.models['Rivet forming - CEL'].rootAssembly.instances['Eulerian-1'], 
    name='Rivet VF', referenceInstance=
    mdb.models['Rivet forming - CEL'].rootAssembly.instances['Rivet-1'])
mdb.models['Rivet forming - CEL'].MaterialAssignment(fieldList=((Region(
    cells=mdb.models['Rivet forming - CEL'].rootAssembly.instances['Eulerian-1'].cells.getSequenceFromMask(
    mask=('[#1 ]', ), )), ('Rivet VF', )), ), instanceList=(
    mdb.models['Rivet forming - CEL'].rootAssembly.instances['Eulerian-1'], ), 
    name='Rivet VF', useFields=True)
#
# Copy CEL model to use as basis for Lagrangian simulation then delete the Eulerian 
# part and related features
#
mdb.Model(name='Rivet forming - Lagrangian', objectToCopy=
    mdb.models['Rivet forming - CEL'])
del mdb.models['Rivet forming - Lagrangian'].rootAssembly.features['Eulerian-1']
del mdb.models['Rivet forming - Lagrangian'].predefinedFields['Rivet VF']
del mdb.models['Rivet forming - Lagrangian'].discreteFields['Rivet VF']
del mdb.models['Rivet forming - Lagrangian'].parts['Eulerian']
del mdb.models['Rivet forming - Lagrangian'].sections['Rivet']
#
# Section and section assignment for the Lagrangian rivet
#
mdb.models['Rivet forming - Lagrangian'].HomogeneousSolidSection(material=
    'Mat-1', name='Rivet', thickness=None)
mdb.models['Rivet forming - Lagrangian'].parts['Rivet'].SectionAssignment(
    offset=0.0, offsetField='', offsetType=MIDDLE_SURFACE, region=
    mdb.models['Rivet forming - Lagrangian'].parts['Rivet'].sets['All'], 
    sectionName='Rivet')
#
# Mesh the rivet
#
mdb.models['Rivet forming - Lagrangian'].parts['Rivet'].setElementType(
    elemTypes=(ElemType(elemCode=C3D8R, elemLibrary=EXPLICIT, 
    secondOrderAccuracy=OFF, kinematicSplit=AVERAGE_STRAIN, 
    hourglassControl=DEFAULT, distortionControl=DEFAULT), ElemType(
    elemCode=C3D6, elemLibrary=EXPLICIT), ElemType(elemCode=C3D4, 
    elemLibrary=EXPLICIT)), regions=(
    mdb.models['Rivet forming - Lagrangian'].parts['Rivet'].cells.getSequenceFromMask(
    ('[#fff ]', ), ), ))
mdb.models['Rivet forming - Lagrangian'].parts['Rivet'].seedPart(
    deviationFactor=0.1, size=0.25)
mdb.models['Rivet forming - Lagrangian'].parts['Rivet'].generateMesh()
#
# Customize the output requests
#
mdb.models['Rivet forming - Lagrangian'].historyOutputRequests.changeKey(
    fromName='H-Output-1', toName='Whole model energy')
mdb.models['Rivet forming - Lagrangian'].historyOutputRequests['Whole model energy'].setValues(
    frequency=100, variables=('ALLAE', 'ALLIE', 'ALLKE', 'ALLPD', 'ALLSE', 
    'ALLVD', 'ALLWK', 'ETOTAL'))
mdb.models['Rivet forming - Lagrangian'].HistoryOutputRequest(createStepName=
    'Step-1', timeInterval=1e-05, name='Die-1 reaction force', rebar=EXCLUDE, region=
    mdb.models['Rivet forming - Lagrangian'].rootAssembly.sets['Die-1-RefNode']
    , filter=ANTIALIASING, sectionPoints=DEFAULT, variables=('RF3', ))
mdb.models['Rivet forming - Lagrangian'].HistoryOutputRequest(createStepName=
    'Step-1', timeInterval=1e-05, name='Die-2 reaction force', rebar=EXCLUDE, region=
    mdb.models['Rivet forming - Lagrangian'].rootAssembly.sets['Die-2-RefNode']
    , filter=ANTIALIASING, sectionPoints=DEFAULT, variables=('RF3', ))
mdb.models['Rivet forming - Lagrangian'].fieldOutputRequests.changeKey(
    fromName='F-Output-1', toName='Displacement')
mdb.models['Rivet forming - Lagrangian'].fieldOutputRequests['Displacement'].setValues(
    numIntervals=30, variables=('UT', ))
mdb.models['Rivet forming - Lagrangian'].FieldOutputRequest(createStepName=
    'Step-1', name='Plastic strain', numIntervals=30, rebar=EXCLUDE, region=
    mdb.models['Rivet forming - Lagrangian'].rootAssembly.instances['Rivet-1'].sets['All']
    , sectionPoints=DEFAULT, variables=('PEEQ', ))
#
mdb.models['Rivet forming - CEL'].historyOutputRequests['H-Output-1'].setValues(
    frequency=100, variables=('ALLAE', 'ALLIE', 'ALLKE', 'ALLPD', 'ALLSE', 
    'ALLVD', 'ALLWK', 'ETOTAL'))
mdb.models['Rivet forming - CEL'].historyOutputRequests.changeKey(fromName=
    'H-Output-1', toName='Whole model energy')
mdb.models['Rivet forming - CEL'].HistoryOutputRequest(createStepName='Step-1', 
    timeInterval=1e-05, name='Die-1 reaction force', rebar=EXCLUDE, region=
    mdb.models['Rivet forming - CEL'].rootAssembly.sets['Die-1-RefNode'], 
    filter=ANTIALIASING, sectionPoints=DEFAULT, variables=('RF3', ))
mdb.models['Rivet forming - CEL'].HistoryOutputRequest(createStepName='Step-1', 
    timeInterval=1e-05, name='Die-2 reaction force', rebar=EXCLUDE, region=
    mdb.models['Rivet forming - CEL'].rootAssembly.sets['Die-2-RefNode'], 
    filter=ANTIALIASING, sectionPoints=DEFAULT, variables=('RF3', ))
mdb.models['Rivet forming - CEL'].fieldOutputRequests['F-Output-1'].setValues(
    numIntervals=30, variables=('UT', ))
mdb.models['Rivet forming - CEL'].fieldOutputRequests.changeKey(fromName=
    'F-Output-1', toName='Displacement')
mdb.models['Rivet forming - CEL'].FieldOutputRequest(createStepName='Step-1', 
    name='Plastic strain and volume fraction', numIntervals=30, rebar=EXCLUDE, 
    region=
    mdb.models['Rivet forming - CEL'].rootAssembly.instances['Eulerian-1'].sets['All']
    , sectionPoints=DEFAULT, variables=('PEEQVAVG', 'EVF'))
#
# Suppress Rivet instance in the CEL model and regenerate both assemblies
#
mdb.models['Rivet forming - CEL'].rootAssembly.features['Rivet-1'].suppress()
mdb.models['Rivet forming - Lagrangian'].rootAssembly.regenerate()
mdb.models['Rivet forming - CEL'].rootAssembly.regenerate()
#
# Create jobs and write out input files
#
mdb.Job(contactPrint=OFF, description='Rivet forming w/ Lagrangian', echoPrint=
    OFF, explicitPrecision=SINGLE, historyPrint=OFF, memory=1512, memoryUnits=
    MEGA_BYTES, model='Rivet forming - Lagrangian', modelPrint=OFF, 
    multiprocessingMode=DEFAULT, name='Rivet-Forming-Lagrangian', 
    nodalOutputPrecision=SINGLE, numCpus=1, numDomains=1, 
    parallelizationMethodExplicit=DOMAIN, scratch='', type=ANALYSIS, 
    userSubroutine='')
mdb.Job(contactPrint=OFF, description='Rivet forming w/ CEL', echoPrint=OFF, 
    explicitPrecision=SINGLE, historyPrint=OFF, memory=1512, memoryUnits=
    MEGA_BYTES, model='Rivet forming - CEL', modelPrint=OFF, 
    multiprocessingMode=DEFAULT, name='Rivet-Forming-CEL', 
    nodalOutputPrecision=SINGLE, numCpus=1, numDomains=1, 
    parallelizationMethodExplicit=DOMAIN, scratch='', type=ANALYSIS, 
    userSubroutine='')

mdb.jobs['Rivet-Forming-Lagrangian'].writeInput(consistencyChecking=OFF)
mdb.jobs['Rivet-Forming-CEL'].writeInput(consistencyChecking=OFF)

#
# Save models
#

mdb.saveAs('rivet_forming_example')


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删
相关文章
QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空