ABAQUS盾构隧道开挖_Python代码辅助建模

session.journalOptions.setValues(replayGeometry=COORDINATE,recoverGeometry=COORDINATE)
from abaqus import *
from abaqusConstants import *
from caeModules import *
from driverUtils import executeOnCaeStartup
import __main__
import section
import regionToolset
import displayGroupMdbToolset as dgm
import part
import material
import assembly
import step
import interaction
import load
import mesh
import optimization
import job
import sketch
import visualization
import xyPlot
import displayGroupOdbToolset as dgo
import connectorBehavior
import math
executeOnCaeStartup()

###############土体草图############
s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',
    sheetSize=200.0)                  #200为画布尺寸,不用管
g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints
s.setPrimaryObject(option=STANDALONE)
s.rectangle(point1=(0.0, 0.0), point2=(x_length, y_length))    #建立土体xoy平面草图时,以原点为零点的地层水平方向土体的两个角点坐标,y为开挖方向
p = mdb.models['Model-1'].Part(name='soil', dimensionality=THREE_D,         #x_length为土体x方向长度,y_length为土体y方向长度(开挖长度),根据自己情况更改
    type=DEFORMABLE_BODY)
p = mdb.models['Model-1'].parts['soil']
p.BaseSolidExtrude(sketch=s, depth=z_length)            #z_length为土体z方向长度,即土体深度,根据自己情况更改

p = mdb.models['Model-1'].parts['soil']
f, e, d1 = p.faces, p.edges, p.datums
t = p.MakeSketchTransform(sketchPlane=f[3], sketchUpEdge=e[8],
    sketchPlaneSide=SIDE1, origin=(x_length/2, 0.0, z_length/2))        #划分草图时,显示平面的草图中心点,这里为xoz平面
s1 = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',
    sheetSize=128.06, gridSpacing=3.2, transform=t)
g, v, d, c = s1.geometry, s1.vertices, s1.dimensions, s1.constraints
s1.setPrimaryObject(option=SUPERIMPOSE)
p = mdb.models['Model-1'].parts['soil']
p.projectReferencesOntoSketch(sketch=s1, filter=COPLANAR_EDGES)

s1.CircleByCenterPerimeter(center=(0.0, z_length/2-H), point1=(0.0, z_length/2-H+R))        #这里为选择建立的隧道在xoz草图平面中的位置,
p = mdb.models['Model-1'].parts['soil']                                                                                      #center为圆心,H为隧道中心埋深,可以用z边长的一半减去隧道中心埋深计算;point1为另一点,用来确定半径,R即为隧道半径
f = p.faces
pickedFaces = f.findAt(((x_length-0.1,0,z_length-0.1),) )    #通过xoz平面点坐标来pick面,实现通用化,函数具体用法可上网查
e1, d2 = p.edges, p.datums
p.PartitionFaceBySketch(sketchUpEdge=e1[8], faces=pickedFaces, sketch=s1)
s1.unsetPrimaryObject()
del mdb.models['Model-1'].sketches['__profile__']

p = mdb.models['Model-1'].parts['soil']
c = p.cells
pickedCells = c.getByBoundingBox(0,0,0,x_length,y_length,z_length)      #通过实体对角点坐标的坐标值来pick cell实现通用,函数具体用法可上网查
e, d1 = p.edges, p.datums
pickedEdges =(e[4], )
p.PartitionCellByExtrudeEdge(line=e[11], cells=pickedCells, edges=pickedEdges,
    sense=REVERSE)
###############这里是用代码构建土体模型,如果不需要参数化建模或者做成插件形式完全可以手动构建模型,但是要注意坐标系与点的选择,
#因为可能会影响之后的步骤与流程


###########划分土体##########
for i in range(1,Totalstep,1):       #Totalstep为总的开挖步数,根据自己需要确定
    p.DatumPlaneByPrincipalPlane(principalPlane=XZPLANE,offset=2*i)  #这里的2是Step_length,即一个开挖步长度,可自行选取;y_length(开挖长度)=Totalstep(开挖步数)*Step_length(开挖步长度)
#这步为建立参考平面

for i in range(1,Totalstep,1):
    p = mdb.models['Model-1'].parts['soil']
    c = p.cells
    pickedCells = c.getByBoundingBox(0, 0, 0, x_length, y_length, z_length)
    d2=p.datums
    p.PartitionCellByDatumPlane(datumPlane=d2[i+3],cells=pickedCells) #这里的+3并不固定,[]内为参考平面编号,如果特征历史不同,可以用pythonreader选取第一个参考面查看具体的编号
#这步为用参考平面partion土体,以上两步适用于开始建模以(0,0)为角点的土体模型


###########建立土体集合###########
for i in range(1,Totalstep+1,1):        #Totalstep为总开挖步数
    p = mdb.models['Model-1'].parts['soil']
    c = p.cells
    cells = c.getByBoundingCylinder((x_length/2,2*(i-1),z_length-H),(x_length/2,2*i,z_length-H),4)    #函数具体用法可百度,4为待选圆柱体半径,只需比隧道半径大即可
    p.Set(cells=cells,name='excavation'+str(i))    #这是建立的每一开挖步内土体的集合

p = mdb.models['Model-1'].parts['soil']
c = p.cells
cells = c.getByBoundingCylinder((x_length/2,0,z_length-H),(x_length/2,y_length,z_length-H),4)
p.Set(cells=cells,name='excavation')          #这是建立全部的开挖土体集合

p = mdb.models['Model-1'].parts['soil']
c = p.cells
cells = c.getByBoundingBox(0,0,0,x_length,y_length,z_length)
p.Set(cells=cells,name='soil')         #这是建立整个土体模型的集合


#############建立土体表面集合##########
p = mdb.models['Model-1'].parts['soil']
side1Faces = p.faces.getByBoundingCylinder((x_length/2,0,z_length-H),(x_length/2,0.1,z_length-H),4)
p.Surface(side1Faces=side1Faces, name='excavation_surface1')
for i in range(2,Totalstep+1,1):
    p = mdb.models['Model-1'].parts['soil']
    side1Faces = p.faces.getByBoundingBox(0,2*(i-1),0,x_length,2*(i-1)+0.1,z_length)
    p.Surface(side1Faces=side1Faces, name='Surface'+str(i))       #这里的Surface面是为了选中excavation_surface而设置的,本身没有意义
    side1Faces = p.surfaces['Surface'+str(i)].faces.getByBoundingCylinder((x_length/2,2*(i-1),z_length-H),(x_length/2,2*i,z_length-H),4)
    p.Surface(side2Faces=side1Faces, name='excavation_surface'+str(i))
#以上是建立开挖土体掌子面的面集合

for i in range(1,Totalstep+1,1):                      #这里软件好像有bug,无法用命令流选中土体内部的面,得先删除选中开挖土体ex部分,再手动建立
    p = mdb.models['Model-1'].parts['soil']      #如果用这段代码,后续隧道土体选中的内表面显示颜色好像不对...
    s = p.faces
    side2Faces = s.findAt(((x_length/2,2*i-1,z_length-H-R),))
    p.Surface(side1Faces=side2Faces,name='insoil_surface'+str(i))        #这是创建开挖部分土体每一环外表面的表面集合
#这里不建议用这段代码,建议手动创建一个开挖土体内部整体表面与每段表面



##############注浆层grout############
############创建部件###########
s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',
    sheetSize=200.0)
g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints
s.setPrimaryObject(option=STANDALONE)
s.CircleByCenterPerimeter(center=(0.0, 0.0), point1=(0.0, R_out))     #R_out为注浆层外半径
s.CircleByCenterPerimeter(center=(0.0, 0.0), point1=(0.0, R_in))       #R_in为注浆层内半径
p = mdb.models['Model-1'].Part(name='grout', dimensionality=THREE_D,
    type=DEFORMABLE_BODY)
p = mdb.models['Model-1'].parts['grout']
p.BaseSolidExtrude(sketch=s, depth=y_length)      #depth即注浆层长度,等于隧道长度y_length,这里注意坐标系,depth是z轴正方向
s.unsetPrimaryObject()

##########创建注浆层整体内外表面集合#############
p = mdb.models['Model-1'].parts['grout']
s = p.faces
side1Faces = s.findAt(((0,R_out,depth-0.1),))
p.Surface(side1Faces=side1Faces,name='outgrout_surface')

p = mdb.models['Model-1'].parts['grout']
s = p.faces
side1Faces = s.findAt(((0,R_in,depth-0.1),))
p.Surface(side1Faces=side1Faces,name='ingrout_surface')

############划分部件###########
for i in range(1,Totalstep,1):           #Totalstep为划分部分数目,与前面一致
    p = mdb.models['Model-1'].parts['grout']
    p.DatumPlaneByPrincipalPlane(principalPlane=XYPLANE,offset=2*i)  #2为开挖步长

for i in range(1,Totalstep,1):
    p = mdb.models['Model-1'].parts['grout']
    c = p.cells
    pickedCells = c.findAt(((R_out,0,depth-0.1),))
    d=p.datums
    p.PartitionCellByDatumPlane(datumPlane=d[i+3],cells=pickedCells)           #这里[]内具体的数字为参考平面编号,跟操作历史有关,如果不对可以先用pythonreader选取一个看一下

##########建立注浆层集合########
for i in range(1,Totalstep+1,1):
    p = mdb.models['Model-1'].parts['grout']
    c = p.cells
    cells = c.findAt(((R_out,0,2*i-0.1),))       #2为开挖步长
    p.Set(cells=cells,name='grout'+str(i))    #这是建立的每一开挖步注浆层的集合

p = mdb.models['Model-1'].parts['grout']
c = p.cells
cells = c.getByBoundingCylinder((0,0,0),(0,0,depth),R_out+0.1)      #函数具体用法可百度,R_out+0.1即框选的圆柱略大于grout模型即可
p.Set(cells=cells,name='grout')         #建立整体注浆层的集合

##########建立每个开挖步注浆层内外表面集合########
for i in range(1,Totalstep+1,1):
    p = mdb.models['Model-1'].parts['grout']
    s = p.faces
    side1Faces = s.findAt(((0,R_out,2*i-0.1),))
    p.Surface(side1Faces=side1Faces,name='outgrout_surface'+str(i))

for i in range(1,Totalstep+1,1):
    p = mdb.models['Model-1'].parts['grout']
    s = p.faces
    side1Faces = s.findAt(((0,R_in,2*i-0.1),))
    p.Surface(side1Faces=side1Faces,name='ingrout_surface'+str(i))




##############衬砌LINING###########
##############创建部件############
s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',
    sheetSize=200.0)
g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints
s.setPrimaryObject(option=STANDALONE)
s.CircleByCenterPerimeter(center=(0.0, 0.0), point1=(0.0, r_out))      #r_out为衬砌外半径,等于注浆层内半径,即r_out=R_in
s.CircleByCenterPerimeter(center=(0.0, 0.0), point1=(0.0, r_in))      #r_in为衬砌内半径
p = mdb.models['Model-1'].Part(name='lining', dimensionality=THREE_D,
    type=DEFORMABLE_BODY)
p = mdb.models['Model-1'].parts['lining']
p.BaseSolidExtrude(sketch=s, depth=y_length)      #depth即衬砌长度,等于隧道长度
s.unsetPrimaryObject()

#########建立衬砌整体外表面集合#########
p = mdb.models['Model-1'].parts['lining']
s = p.faces
side1Faces = s.findAt(((r_out, 0, depth - 0.1),))
p.Surface(side1Faces=side1Faces, name='outlining_surface' )

############划分部件###########
for i in range(1,Totalstep,1):           #Totalstep为总开挖步数,与前面一致
    p = mdb.models['Model-1'].parts['lining']
    p.DatumPlaneByPrincipalPlane(principalPlane=XYPLANE,offset=2*i)  #2为开挖步长

for i in range(1,Totalstep,1):
    p = mdb.models['Model-1'].parts['lining']
    c = p.cells
    pickedCells = c.findAt(((r_out,0,depth-0.1),))
    d1=p.datums
    p.PartitionCellByDatumPlane(datumPlane=d1[i+2],cells=pickedCells)         #这里+2同上所述

#################建立衬砌集合##############
p = mdb.models['Model-1'].parts['lining']
c = p.cells
cells = c.getByBoundingCylinder((0, 0, 0), (0, 0, depth), r_out + 0.1)  # r_out+0.1是为了保证框选的圆柱略大于lining模型
p.Set(cells=cells, name='lining')

for i in range(1, Totalstep+1, 1):
    p = mdb.models['Model-1'].parts['lining']
    s = p.cells
    cells = c.findAt(((r_out, 0, 2 * i - 0.1),))
    p.Set(cells=cells, name='lining'+str(i))

#################建立衬砌外表面集合##############
for i in range(1, Totalstep+1, 1):
    p = mdb.models['Model-1'].parts['lining']
    s = p.faces
    side1Faces = s.findAt(((r_out, 0, 2 * i - 0.1),))
    p.Surface(side1Faces=side1Faces, name='outlining_surface' + str(i))





##############盾壳SHIELD###########
##############创建部件############
s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',
    sheetSize=200.0)
g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints
s.setPrimaryObject(option=STANDALONE)
s.CircleByCenterPerimeter(center=(0.0, 0.0), point1=(0.0, R))      #R既为盾壳外径,也等于注浆层外半径R_out与隧道半径Rsoil
p = mdb.models['Model-1'].Part(name='shield', dimensionality=THREE_D,
    type=DEFORMABLE_BODY)
p = mdb.models['Model-1'].parts['shield']
p.BaseShellExtrude(sketch=s, depth=y_length)      #depth即盾壳长度,等于隧道长度
s.unsetPrimaryObject()

##########建立盾壳整体外表面集合##########
p = mdb.models['Model-1'].parts['shield']
s = p.faces
side1Faces = s.findAt(((R, 0, depth - 0.1),))
p.Surface(side1Faces=side1Faces, name='outshield_surface')

############划分部件###########
for i in range(1,Totalstep,1):           #Totalstep为开挖步数目,与前面一致
    p = mdb.models['Model-1'].parts['shield']
    p.DatumPlaneByPrincipalPlane(principalPlane=XYPLANE,offset=2*i)  #2为开挖步长

for i in range(1,Totalstep,1):
    p = mdb.models['Model-1'].parts['shield']
    f = p.faces
    pickedFaces = f.findAt(((R,0,depth-0.1),))
    d1=p.datums
    p.PartitionFaceByDatumPlane(datumPlane=d1[i+2],faces=pickedFaces)      #这里+2同上述

##################建立盾壳与表面集合################
for i in range(1,Totalstep+1,1):
    p = mdb.models['Model-1'].parts['shield']
    f = p.faces
    faces = f.findAt(((R,0,2*i-0.1),))     #3.2=Rsoil
    p.Set(faces=faces,name='shield'+str(i))

p = mdb.models['Model-1'].parts['shield']
f = p.faces
faces = f.getByBoundingCylinder((0,0,0),(0,0,depth),R+0.1)    #用法与前面一致
p.Set(faces=faces,name='shield')

for i in range(1,Totalstep+1,1):
    p = mdb.models['Model-1'].parts['shield']
    s = p.faces
    side1Faces = s.findAt(((R,0,2*i-0.1),))
    p.Surface(side1Faces=side1Faces,name='outshield_surface'+str(i))




#############创建材料、赋予截面与属性################
###这里代码以摩尔库仑本构关系为例,该步骤可以手动建立,手动创建材料、赋予属性更为灵活简便。
mdb.models['Model-1'].Material(name='grout')
mdb.models['Model-1'].materials['grout'].Density(table=((value, ), ))
mdb.models['Model-1'].materials['grout'].Elastic(table=((value, value), ))
mdb.models['Model-1'].Material(name='lining')
mdb.models['Model-1'].materials['lining'].Density(table=((value, ), ))
mdb.models['Model-1'].materials['lining'].Elastic(table=((value, value), ))
mdb.models['Model-1'].Material(name='shield')
mdb.models['Model-1'].materials['shield'].Density(table=((value, ), ))
mdb.models['Model-1'].materials['shield'].Elastic(table=((value, value), ))
mdb.models['Model-1'].Material(name='soil1')
mdb.models['Model-1'].materials['soil1'].Density(table=((value, ), ))
mdb.models['Model-1'].materials['soil1'].Elastic(table=((value, value), ))
mdb.models['Model-1'].materials['soil1'].MohrCoulombPlasticity(table=((value,
    value), ))
mdb.models['Model-1'].materials['soil1'].mohrCoulombPlasticity.MohrCoulombHardening(
    table=((value, value), ))
mdb.models['Model-1'].materials['soil1'].mohrCoulombPlasticity.TensionCutOff(
    temperatureDependency=OFF, dependencies=0, table=((value, value), ))
mdb.models['Model-1'].Material(name='soil2')
mdb.models['Model-1'].materials['soil2'].Density(table=((value, ), ))
mdb.models['Model-1'].materials['soil2'].Elastic(table=((value, value), ))
mdb.models['Model-1'].materials['soil2'].MohrCoulombPlasticity(table=((value,
    value), ))
mdb.models['Model-1'].materials['soil2'].mohrCoulombPlasticity.MohrCoulombHardening(
    table=((value, value), ))
mdb.models['Model-1'].materials['soil2'].mohrCoulombPlasticity.TensionCutOff(
    temperatureDependency=OFF, dependencies=0, table=((value, value), ))
mdb.models['Model-1'].Material(name='soil3')
mdb.models['Model-1'].materials['soil3'].Density(table=((value, ), ))
mdb.models['Model-1'].materials['soil3'].Elastic(table=((value, value), ))
mdb.models['Model-1'].materials['soil3'].MohrCoulombPlasticity(table=((value,
    value), ))
mdb.models['Model-1'].materials['soil3'].mohrCoulombPlasticity.MohrCoulombHardening(
    table=((value, value), ))
mdb.models['Model-1'].materials['soil3'].mohrCoulombPlasticity.TensionCutOff(
    temperatureDependency=OFF, dependencies=0, table=((value, value), ))
session.viewports['Viewport: 1'].view.setProjection(projection=PERSPECTIVE)
mdb.models['Model-1'].HomogeneousSolidSection(name='grout', material='grout',   #指定截面类型
    thickness=None)
mdb.models['Model-1'].HomogeneousSolidSection(name='lining', material='lining',
    thickness=None)
mdb.models['Model-1'].HomogeneousShellSection(name='shield', preIntegrate=OFF,
    material='shield', thicknessType=UNIFORM, thickness=value, thicknessField='',    #指定壳单元厚度
    nodalThicknessField='', idealization=NO_IDEALIZATION,
    poissonDefinition=DEFAULT, thicknessModulus=None, temperature=GRADIENT,
    useDensity=OFF, integrationRule=SIMPSON, numIntPts=5)
mdb.models['Model-1'].HomogeneousSolidSection(name='soil1', material='soil1',
    thickness=None)
mdb.models['Model-1'].HomogeneousSolidSection(name='soil2', material='soil2',
    thickness=None)
mdb.models['Model-1'].HomogeneousSolidSection(name='soil3', material='soil3',
    thickness=None)


###########Building Steps 建立分析步###########
mdb.models['Model-1'].StaticStep(name='geo', previous='Initial')
session.viewports['Viewport: 1'].assemblyDisplay.setValues(step='geo')       #地应力平衡,这里用静力、通用是为了后面用重复导入ODB法平衡地应力
mdb.models['Model-1'].StaticStep(name='excavation1', previous='geo', initialInc=0.1,
    matrixSolver=DIRECT, matrixStorage=UNSYMMETRIC)         #这里的初始增量步和最大增量步都是默认的1
for i in range(2,Totalstep+5,1):                       #这里+5是因为假设盾壳长为8m,盾壳出隧道后盾尾注浆还需要4步才能完成,可根据自己情况确定
    mdb.models['Model-1'].StaticStep(name='excavation'+str(i), previous='excavation'+str(i-1), initialInc=0.1,
    matrixSolver=DIRECT, matrixStorage=UNSYMMETRIC)



#############相互作用################
##为了使模型能跑起来,不同模型的界面相互作用会因材料参数、材料截面等性质变化,需要根据自己的模型、模拟情况调试
a = mdb.models['Model-1'].rootAssembly           #这里是insoil_surface和outshield_surface用tie绑定约束的步骤
region1=a.instances['soil-1'].surfaces['insoil_surface']
a = mdb.models['Model-1'].rootAssembly
region2=a.instances['shield-1'].surfaces['outshield_surface']
mdb.models['Model-1'].Tie(name='Constraint-1', main=region1, secondary=region2,         #这里主从面选择可能得根据自己模型调试
    positionToleranceMethod=COMPUTED, adjust=OFF, tieRotations=ON,          #可选择是否关闭adjust secondary surface
    thickness=ON)

mdb.models['Model-1'].ContactProperty('IntProp-1')           #这里是建立相互作用属性IntProp-1
mdb.models['Model-1'].interactionProperties['IntProp-1'].TangentialBehavior(              #定义力学切向接触
    formulation=PENALTY, directionality=ISOTROPIC, slipRateDependency=OFF,
    pressureDependency=OFF, temperatureDependency=OFF, dependencies=0, table=((        #定义摩擦系数,这里为0.3
    0.3, ), ), shearStressLimit=None, maximumElasticSlip=FRACTION,                   #定义剪应力、最大弹性滑移
    fraction=0.005, elasticSlipStiffness=None)
mdb.models['Model-1'].interactionProperties['IntProp-1'].NormalBehavior(                #定义力学法向接触
    pressureOverclosure=HARD, allowSeparation=ON,              #定义法向接触类型,这里为硬接触
    constraintEnforcementMethod=DEFAULT)

for i in range(1,Totalstep+1,1):             #这是将insoil_surface和outshield_surface用surface-surface表面接触的步骤(假设接触面性质为IntProp-1)
    a = mdb.models['Model-1'].rootAssembly
    region1 = a.instances['soil-1'].surfaces['insoil_surface'+str(i)]
    a = mdb.models['Model-1'].rootAssembly
    region2 = a.instances['shield-1'].surfaces['outshield_surface'+str(i)]
    mdb.models['Model-1'].SurfaceToSurfaceContactStd(name='insoil-outshield'+str(i),
       createStepName='excavation'+str(i), main=region1, secondary=region2, sliding=FINITE,                #这里表示开挖土体表面为主面,盾壳为从面,可能要根据自己模型调试
       thickness=ON, interactionProperty='IntProp-1', adjustMethod=OVERCLOSED,         #不考虑干涉影响,可选择是否勾选只为调整到删除过盈
       initialClearance=OMIT, datumAxis=None, clearanceRegion=None, tied=OFF)

a = mdb.models['Model-1'].rootAssembly        #这里是将insoil_surface和outgrout_surface用tie绑定约束的步骤
region1=a.instances['soil-1'].surfaces['insoil_surface']
a = mdb.models['Model-1'].rootAssembly
region2=a.instances['grout-1'].surfaces['outgrout_surface']
mdb.models['Model-1'].Tie(name='Constraint-2', main=region1, secondary=region2,
    positionToleranceMethod=COMPUTED, adjust=OFF, tieRotations=ON,
    thickness=ON)

for i in range(1,Totalstep+1,1):                   #这里是将insoil_surface和outgrout_surface用surface-surface表面接触的步骤(假设接触面性质仍为IntProp-1不变,若不同,则新建立一个并选择IntProp-2即可)
    a = mdb.models['Model-1'].rootAssembly
    region1 = a.instances['soil-1'].surfaces['insoil_surface'+str(i)]
    a = mdb.models['Model-1'].rootAssembly
    region2 = a.instances['grout-1'].surfaces['outgrout_surface'+str(i)]
    mdb.models['Model-1'].SurfaceToSurfaceContactStd(name='insoil-outgrout'+str(i),
       createStepName='excavation'+str(i+4), main=region1, secondary=region2,sliding=FINITE,
       thickness=ON, interactionProperty='IntProp-1',adjustMethod=OVERCLOSED,
       initialClearance=OMIT, datumAxis=None, clearanceRegion=None,tied=OFF)

a = mdb.models['Model-1'].rootAssembly       #这里是将outlining_surface和ingrout_surface用tie绑定约束的步骤
region1=a.instances['lining-1'].surfaces['outlining_surface']
a = mdb.models['Model-1'].rootAssembly
region2=a.instances['grout-1'].surfaces['ingrout_surface']
mdb.models['Model-1'].Tie(name='Constraint-3', main=region1, secondary=region2,
    positionToleranceMethod=COMPUTED, adjust=OFF, tieRotations=ON,
    thickness=ON)

for i in range(1,Totalstep+1,1):               #这里是将outlining_surface和ingrout_surface用surface-surface表面接触的步骤(假设接触面性质仍为IntProp-1不变,若变化,同上)
    a = mdb.models['Model-1'].rootAssembly
    region1 = a.instances['lining-1'].surfaces['outlining_surface'+str(i)]
    a = mdb.models['Model-1'].rootAssembly
    region2 = a.instances['grout-1'].surfaces['ingrout_surface'+str(i)]
    mdb.models['Model-1'].SurfaceToSurfaceContactStd(name='outlining-ingrout'+str(i),
       createStepName='excavation'+str(i+4), main=region1, secondary=region2,sliding=FINITE,
       thickness=ON, interactionProperty='IntProp-1',adjustMethod=OVERCLOSED,
       initialClearance=OMIT, datumAxis=None, clearanceRegion=None,tied=OFF)



################生死单元############
#先创建分析步remove-GLS(grout lining and shield)杀死注浆层、衬砌、盾壳
for i in range(1,Totalstep+1,1):          #这里是逐步移除每一个开挖步内的开挖土体
    a = mdb.models['Model-1'].rootAssembly
    region = a.instances['soil-1'].sets['excavation' + str(i)]
    mdb.models['Model-1'].ModelChange(name='remove-excavation' + str(i), createStepName='excavation'+str(i),
    region=region, activeInStep=False, includeStrain=False)

for i in range(1,Totalstep+1,1):         #这里是移除开挖土体的同时激活盾壳,模拟盾壳推进过程
    a = mdb.models['Model-1'].rootAssembly
    region = a.instances['shield-1'].sets['shield' + str(i)]
    mdb.models['Model-1'].ModelChange(name='add-shield' + str(i), createStepName='excavation'+str(i),
    region=region, activeInStep=True, includeStrain=False)

for i in range(1,Totalstep+1,1):             #这里是模拟盾壳开挖经过土体的过程,即盾壳在土体中前进,盾尾逐步失效
    mdb.models['Model-1'].interactions['add-shield'+str(i)].deactivate('excavation'+str(i+4))       #这里+4,结合开挖步长2m,是因为本模型假设盾壳长8m,故从第五步使盾尾失效

for i in range(1,Totalstep+1,1):            #这里是模拟衬砌拼装过程,即在盾尾失效的同时激活开挖步内衬砌
    a = mdb.models['Model-1'].rootAssembly
    region = a.instances['lining-1'].sets['lining' + str(i)]
    mdb.models['Model-1'].ModelChange(name='add-lining' + str(i), createStepName='excavation'+str(i+4),
    region=region, activeInStep=True, includeStrain=False)

for i in range(1,Totalstep+1,1):           #这里是模拟同步注浆过程,不考虑注浆硬化(也是我嫌麻烦),简化为注浆层与衬砌都是瞬时生效
    a = mdb.models['Model-1'].rootAssembly
    region = a.instances['grout-1'].sets['grout' + str(i)]
    mdb.models['Model-1'].ModelChange(name='add-grout' + str(i), createStepName='excavation'+str(i+4),
    region=region, activeInStep=True, includeStrain=False)



############施加载荷############
##先施加重力荷载gravity,其他类型荷载可根据模拟的条件与精确度自行选择。最后施加边界条件。
for i in range(1,Totalstep+1,1):            #掌子面施加开挖荷载
    a = mdb.models['Model-1'].rootAssembly
    region = a.instances['soil-1'].surfaces['excavation_surface'+str(i)]
    mdb.models['Model-1'].Pressure(name='pressure-exsur' + str(i), createStepName='excavation'+str(i),
    region=region, distributionType=UNIFORM, field='', magnitude=180000.0,          #这里设置掌子面荷载
    amplitude=UNSET)

for i in range(1,Totalstep+1,1):          #deactivate掌子面压力
    mdb.models['Model-1'].loads['pressure-exsur'+str(i)].deactivate('excavation'+str(i+1))

for i in range(1,Totalstep+1,1):          #土体内表面施加注浆压力
    a = mdb.models['Model-1'].rootAssembly
    region = a.instances['soil-1'].surfaces['insoil_surface'+str(i)]
    mdb.models['Model-1'].Pressure(name='grout_pressure-insoil'+str(i), createStepName='excavation'+str(i+4),        #从注浆层激活的开挖步施加
                                   region=region, distributionType=UNIFORM, field='', magnitude=70000.0,      #这里设置注浆压力magnitude
                                   amplitude=UNSET)

for i in range(1,Totalstep+1,1):         #衬砌外表面施加注浆压力
    a = mdb.models['Model-1'].rootAssembly
    region = a.instances['lining-1'].surfaces['outlining_surface'+str(i)]
    mdb.models['Model-1'].Pressure(name='grout_pressyre-outlining'+str(i), createStepName='excavation'+str(i+4),        #同上
                                   region=region, distributionType=UNIFORM, field='', magnitude=70000.0,
                                   amplitude=UNSET)


for i in range(1,Totalstep+1,1):       #土体内表面施加与盾壳间的摩擦力
    a = mdb.models['Model-1'].rootAssembly
    region = a.instances['soil-1'].surfaces['insoil_surface'+str(i)]
    mdb.models['Model-1'].SurfaceTraction(name='insoil-friction'+str(i), createStepName='excavation'+str(i),
                                          region=region, magnitude=18000.0, directionVector=((0.0, 0.0, 0.0), (0.0,1.0, 0.0)),    #设置摩擦力大小
                                          distributionType=UNIFORM, field='', localCsys=None)

for i in range(1,Totalstep+1,1):       #盾壳失效的分析步中摩擦力也随之失效
    mdb.models['Model-1'].loads['insoil-friction'+str(i)].deactivate('excavation'+str(i+4))





说明一下(大佬可自动略过):

        这是我本科毕设确定课题后,临时花了一个多月根据网上的视频、教程参考学习Abaqus并编写的python代码,适合像我这种小白参考,做本科毕设用应该是可以的,至于其他方面用法以及更多细致的问题,别问我,问了我也不知道,毕竟我也不是搞这个方向研究的。只是因为之前着急写毕业论文的时候,当过大冤种花了好几百买了一些什么用都没有的教程和视频,最终还是靠自己自学才勉勉强强完成代码编写与建模,所以想分享下这些代码。

        如果代码有用,能帮助到像我这样的小白少走一些弯路那自然是最好。如果代码有问题,您自己完善或者自己编写都行,不用问我或者跟我探讨。

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值