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)各类材料,如下表所示:
这个流固耦合联合仿真其实指,将一个流体力学问题进行拆解,就变成了一个流体力学问题和固体力学问题(两个MODEL),设置成相同的坐标、合适的流-固接触面以及相同的求解步就可以在耦合面上完成参数传递。
从前文描述来看感觉Abaqus的CFD好弱,其实CFD有其自身的优势:
1.对于CFD来讲,湍流模型 很重要,包k-ε、RNG k-ε等等。
2.CFD可以模拟流体冲击多孔介质的情形,比如这样:
由于,CEL与CFD都对使用欧拉法描述流体,所以这两类方法在描述如下问题时有着独特的优势,比如模拟漩涡。
比如轮胎滑水问题。
由于SPH方法采用严格的拉格朗日描述,所以流进流出的边界条件很难才该类方法中实现,其实现模式也是采用了将整个体积计算出后进行相对运动已达到材料流进流出的边界条件。
流-固问题的解决方案一般就是这五种方案,整体上讲有左自右计算量迅速增加,
首先,CEL法采用两种不同描述形式因此在固体部分限制较少几乎可以使用显式计算模块的功能比如,拥有裂缝(XFEM,)的固体部分,较大的变形(拓扑结构的变形),比如,在耦合部分可以局部细化网格等等,
但是SPH法这样的方法,采用直接使用粒子当节点,所以其要求与固体部分网格有清晰的区分,同时也没有细化接触面的必要。
CFD方法时严格的流体力学方法,需要严格网格以及清晰的边界条件(在FSI中的接触面),其实在合理的情况下使用CFD FSI是可以允许材料又不连续的情况。
说到底,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')