本文为2022第一篇,感谢各位老铁的持续关注和分享!本文是上一篇Abaqus模拟RC构件捏缩效应的续篇,并分享实体及钢筋建模用到的一些脚本。这是本码第29篇原创,原创不易,且看且珍惜。”

有人说,今年冬天很冷,明年建筑行业将会更“寒冷”。现实依然残酷,但这种大环境的变化,我们是无能为力的。这时候,如果你还在这个行业或还热爱这个行业,其实你也不用想太多,努力做好自己的工作,努力往前冲就好。这样到最后无论坚守或者被迫离开这个行业,你都已经无愧于心。新的一年,或者遥远的未来,希望你出走半生,归来仍是少年,初心和热情犹在,所有困扰都迎刃而解。仅以此话,与君共勉!文章有些长,建议在看收藏,如果让你有兴趣读下去,不妨分享点赞

1 奇怪的现象

今天采用Abaqus做一片剪力墙构件静力往复推覆试验的滞回曲线拟合,分别采用壳元和实体单元,钢筋采用Truss单元,钢筋材料属性都采用方自虎老师的子程序。一方面是验证参数的取值,另一方面是为了更清楚地了解ABAQUS各类单元的局限性。正是因为Abaqus的二次开发能力太强,让abaqus有了更多可能性,与试验拟合也验证了参数取值的可靠性。

目前有一种怪现象,某些软件总是喜欢以Abaqus作为对比验证的软件,但其验证结果的可靠性是值得怀疑的。因为Abaqus具备强大的二次开发能力,使得其参数取值有很多可自由调控的地方,无法排除为了跟自己软件结果匹配而调整abaqus参数的嫌疑,而以此作为软件可靠性验证是值得商榷的。个人觉得应该从实际出发,应以试验(国内外均有较多可供模拟的试验数据)或震害等实际角度来验证软件或参数的可靠性,实事求是,不卑不亢。

还有一种怪现象,别人免费分享的资料,会被某些别有用心的人拿到网上卖钱或兑换积分。古有路不拾遗,夜不闭户,不求今人如古人,但求勿侵权。时刻牢记,网络并非法外之地,别人提供这些资料予你,仅是用于你学习,而非让你获利。若采用其研究方法或成果,应注明出处。

方老师是无私的,其子程序、论文以及论文中的算例,以及如何应用ABAQUS进行模拟的视频都有完整的介绍,大家可以移步到其博客自取,其子程序目前已经更新到2021版本。网站连接:https://www.ppxclub.com/home.php?mod=space&uid=648181&do=blog&id=38855

只希望大家尊重方老师劳动成果,运用后记得引用其论文,尊重劳动成果。

欢迎大家转发此文,消除此类怪现象。

2 Python脚本建立试验模型

今天的例子依然还是网络上的试验数据,网址: http://www.luxinzheng.net/download/OpenSEES/Examples_of_NLDKGQ_element.htm,试验图片来自见文献[1],在此表示感谢。对于科研工作者,需要建议下,如果是试验描述一定要把构件的详细信息及加载的荷载写清楚。比如这片剪力墙的静力往复推覆,其试件信息如下图。

图| 剪力墙试验信息
图| 剪力墙试验信息

加载历程如下图,尽量用曲线或数据表格表示,这样像我这样喜欢模拟的人就能根据你的文献模拟出来结果了,这样你的文章被引用的几率就大大增加了。

图| 剪力墙试验信息
图| 剪力墙试验信息

根据Python驱动Abaqus实体有限元建模[附源码]的思路建立实体模型如下:

图| 几何模型

其中,建立混凝土实体和钢筋的Python脚本如下:

# -*- coding: mbcs -*-
# author:  idealzeng@qq.com  from capol
# date: 2021/12/31
from abaqus import *
from abaqusConstants import *
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
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.unsetPrimaryObject()
del mdb.models['Model-1'].sketches['__profile__']
s1 = mdb.models['Model-1'].ConstrainedSketch(name='__profile__'
    sheetSize=2000.0)
g, v, d, c = s1.geometry, s1.vertices, s1.dimensions, s1.constraints
s1.setPrimaryObject(option=STANDALONE)
s1.rectangle(point1=(-500.062.5), point2=(500.0-62.5))
p = mdb.models['Model-1'].Part(name='SW1C', dimensionality=THREE_D, 
    type=DEFORMABLE_BODY)
p = mdb.models['Model-1'].parts['SW1C']
p.BaseSolidExtrude(sketch=s1, depth=2000.0)
s1.unsetPrimaryObject()
p = mdb.models['Model-1'].parts['SW1C']
session.viewports['Viewport: 1'].setValues(displayedObject=p)
del mdb.models['Model-1'].sketches['__profile__']
s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__'
    sheetSize=2000.0)
g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints
s.setPrimaryObject(option=STANDALONE)
s.Line(point1=(-999.00.0), point2=(999.00.0))
s.HorizontalConstraint(entity=g[2], addUndoState=False)
p = mdb.models['Model-1'].Part(name='ZONGJIN', dimensionality=THREE_D, 
    type=DEFORMABLE_BODY)
p = mdb.models['Model-1'].parts['ZONGJIN']
p.BaseWire(sketch=s)
s.unsetPrimaryObject()
p = mdb.models['Model-1'].parts['ZONGJIN']
session.viewports['Viewport: 1'].setValues(displayedObject=p)
del mdb.models['Model-1'].sketches['__profile__']
session.viewports['Viewport: 1'].view.setValues(nearPlane=3786.36
    farPlane=4205.64, width=2719.66, height=1553.19, viewOffsetX=152.789
    viewOffsetY=20.0883)
s1 = mdb.models['Model-1'].ConstrainedSketch(name='__profile__'
    sheetSize=2000.0)
g, v, d, c = s1.geometry, s1.vertices, s1.dimensions, s1.constraints
s1.setPrimaryObject(option=STANDALONE)
s1.rectangle(point1=(-485.050.0), point2=(485.0-50.0))
p = mdb.models['Model-1'].Part(name='GUJIN', dimensionality=THREE_D, 
    type=DEFORMABLE_BODY)
p = mdb.models['Model-1'].parts['GUJIN']
p.BaseWire(sketch=s1)
s1.unsetPrimaryObject()
p = mdb.models['Model-1'].parts['GUJIN']
session.viewports['Viewport: 1'].setValues(displayedObject=p)
del mdb.models['Model-1'].sketches['__profile__']
a = mdb.models['Model-1'].rootAssembly
session.viewports['Viewport: 1'].setValues(displayedObject=a)
session.viewports['Viewport: 1'].assemblyDisplay.setValues(
    optimizationTasks=OFF, geometricRestrictions=OFF, stopConditions=OFF)
a = mdb.models['Model-1'].rootAssembly
a.DatumCsysByDefault(CARTESIAN)
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-1', part=p, dependent=ON)
p = mdb.models['Model-1'].parts['SW1C']
a.Instance(name='SW1C-1', part=p, dependent=ON)
p = mdb.models['Model-1'].parts['GUJIN']
session.viewports['Viewport: 1'].setValues(displayedObject=p)
del mdb.models['Model-1'].parts['GUJIN']
p = mdb.models['Model-1'].parts['SW1C']
session.viewports['Viewport: 1'].setValues(displayedObject=p)
s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__'
    sheetSize=2000.0)
g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints
s.setPrimaryObject(option=STANDALONE)
s.unsetPrimaryObject()
del mdb.models['Model-1'].sketches['__profile__']
s1 = mdb.models['Model-1'].ConstrainedSketch(name='__profile__'
    sheetSize=2000.0)
g, v, d, c = s1.geometry, s1.vertices, s1.dimensions, s1.constraints
s1.setPrimaryObject(option=STANDALONE)
s1.rectangle(point1=(-485.050.0), point2=(-300.0-50.0))
s1.rectangle(point1=(300.050.0), point2=(485.0-50.0))
s1.Line(point1=(-300.050.0), point2=(300.050.0))
s1.HorizontalConstraint(entity=g[10], addUndoState=False)
s1.PerpendicularConstraint(entity1=g[4], entity2=g[10], addUndoState=False)
s1.Line(point1=(-300.0-50.0), point2=(300.0-50.0))
s1.HorizontalConstraint(entity=g[11], addUndoState=False)
s1.ParallelConstraint(entity1=g[3], entity2=g[11], addUndoState=False)
p = mdb.models['Model-1'].Part(name='GUJIN', dimensionality=THREE_D, 
    type=DEFORMABLE_BODY)
p = mdb.models['Model-1'].parts['GUJIN']
p.BaseWire(sketch=s1)
s1.unsetPrimaryObject()
p = mdb.models['Model-1'].parts['GUJIN']
session.viewports['Viewport: 1'].setValues(displayedObject=p)
del mdb.models['Model-1'].sketches['__profile__']
a = mdb.models['Model-1'].rootAssembly
a.regenerate()
a = mdb.models['Model-1'].rootAssembly
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-1', ), vector=(0.00.080.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-2', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-2', ), vector=(0.00.0160.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-3', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-3', ), vector=(0.00.0240.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-4', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-4', ), vector=(0.00.0320.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-5', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-5', ), vector=(0.00.0400.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-6', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-6', ), vector=(0.00.0480.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-7', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-7', ), vector=(0.00.0560.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-8', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-8', ), vector=(0.00.0640.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-9', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-9', ), vector=(0.00.0720.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-10', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-10', ), vector=(0.00.0800.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-11', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-11', ), vector=(0.00.0880.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-12', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-12', ), vector=(0.00.0960.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-13', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-13', ), vector=(0.00.01040.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-14', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-14', ), vector=(0.00.01120.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-15', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-15', ), vector=(0.00.01200.0))

a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-16', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-16', ), vector=(0.00.01280.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-17', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-17', ), vector=(0.00.01360.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-18', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-18', ), vector=(0.00.01440.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-19', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-19', ), vector=(0.00.01520.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-20', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-20', ), vector=(0.00.01600.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-21', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-21', ), vector=(0.00.01680.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-22', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-22', ), vector=(0.00.01760.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-23', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-23', ), vector=(0.00.01840.0))
a = mdb.models['Model-1'].rootAssembly
p = mdb.models['Model-1'].parts['GUJIN']
a.Instance(name='GUJIN-24', part=p, dependent=ON)
a = mdb.models['Model-1'].rootAssembly
a.translate(instanceList=('GUJIN-24', ), vector=(0.00.01920.0))
mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-1'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-1', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-1', ), 
    vector=(-485.050.0,1000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-2'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-2', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-2', ), 
    vector=(-485.0-50.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-3'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-3', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-3', ), 
    vector=(-385.050.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-4'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-4', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-4', ), 
    vector=(-385.0-50.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-5'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-5', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-5', ), 
    vector=(-300.050.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-6'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-6', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-6', ), 
    vector=(-300.0-50.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-7'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-7', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-7', ), 
    vector=(-240.050.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-8'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-8', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-8', ), 
    vector=(-240.0-50.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-9'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-9', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-9', ), 
    vector=(-120.050.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-10'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-10', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-10', ), 
    vector=(-120.0-50.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-11'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-11', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-11', ), 
    vector=(050.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-12'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-12', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-12', ), 
    vector=(0-50.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-13'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-13', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-13', ), 
    vector=(12050.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-14'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-14', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-14', ), 
    vector=(120-50.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-15'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-15', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-15', ), 
    vector=(24050.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-16'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-16', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-16', ), 
    vector=(240-50.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-17'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-17', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-17', ), 
    vector=(30050.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-18'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-18', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-18', ), 
    vector=(300-50.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-19'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-19', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-19', ), 
    vector=(38550.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-20'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-20', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-20', ), 
    vector=(385-50.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-21'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-21', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-21', ), 
    vector=(48550.01000))

mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='ZONGJIN-22'
    part=mdb.models['Model-1'].parts['ZONGJIN'])
mdb.models['Model-1'].rootAssembly.rotate(angle=-90.0, axisDirection=(0.0
    10.00.0), axisPoint=(0.00.00.0), instanceList=('ZONGJIN-22', ))
mdb.models['Model-1'].rootAssembly.translate(instanceList=('ZONGJIN-22', ), 
    vector=(485-50.01000)) 

以上代码运行效果如下:

图| 建模脚本运行效果
图| 建模脚本运行效果

以上仅为简单一片墙,复杂的结构可以通过化整为零来实现。通过文章Python驱动Abaqus实体有限元建模[附源码] 可以通过一个简单的实例介绍了整个思路。

3 混凝土损伤塑性模型参数与钢筋材料等

文献[2]中,关于混凝土损伤塑性模型(CDP),方自虎老师的经验可以参考下:

(1) 混凝土拉应力上升段取直线,下降段选用我国混凝土规范中的公式。

(2) 混凝土受压曲线建议取我国规范中的公式,但ε0建议取欧盟规范规定的数值,并可以将弹性段取到混凝土强度的0.4 倍。混凝土泊松比取0.16。

(3) 混凝土受压曲线ABAQUS 材料输入时的截断应变建议取在3ε0 。

( 4) 混凝土损伤参数建议按照d=1-σ/fc计算,并且取值到0.95 以上。

图| 受压损伤本构曲线
图| 受压损伤本构曲线
图| 受拉损伤本构曲线
图| 受拉损伤本构曲线

参考文献[3],钢筋采用方老师的子程序cs-2021-8-2.obj,调用方法如下:

Vecchio钢筋模型,调用方式:MATERIAL=BAR_V##(##可以是任意字符)

文献[3]的钢筋滞回模型如下:

图| 考虑屈曲的Vecchio钢筋模型
图| 考虑屈曲的Vecchio钢筋模型

其中水平筋可以简化一点,采用理想弹塑性即可。但实体的结果依然不是特别好。最终实体的滞回曲线结果如下:

图| 实体元结果与试验结果对比
图| 实体元结果与试验结果对比

4 壳元模型

其实实际大型工程中,一般采用的壳元S4R来模拟剪力墙,壳元的材料可以采用子程序的材料也可以采用ABAQUS的混凝土塑性损伤模型。上面那个试验直接写inp,然后导入Abaqus,模型视图如下:

图| 壳元模型
图| 壳元模型

根据文献[4],方老师采用MCFT模型来模拟混凝土材料,获得了不错的效果。采用壳元得到的结果如下:

图| 壳元结果与试验结果对比
图| 壳元结果与试验结果对比

上图基本可知,采用混凝土采用MFCT模型,钢筋采用Vecchio钢筋模型,可以得到一个相对还算合理的结果,但要每环都对的差不多还是有些难度。但是壳元如果用ABAQUS的CDP模型,则效果没有那么理想,如下:

5 结论

在ABAQUS Standard中,采用壳元+材料子程序可以得到一个比较合理的结果,前提是子程序经过了比较多实例的验证。采用Abaqus的CDP本构+壳元也是可以得到一个比实体单元略合理的结果,实体单元无法得到更合理的滞回曲线,可能需要进一步开发材料子程序。

PS:因编译环境的问题,导致出现如下报错,不影响计算,可进一步计算。欢迎大家都来自己算算。

6 2022年的展望

感谢读到此处的朋友,再次谢谢。本篇是元旦前准备开始写的,但年底各种总结工作太忙,今天才完成,后续有空再写点ABAQUS与试验校对的小东西。最后是2021年全年原创文章汇总,15篇,几乎每月一篇硬核文章的频率,基本是与计算或编程相关内容,编程和操作实现了才会写上来。2022年希望有更多时间继续在此地耕耘播种,希望达到每月2篇的频率,还没完善的小程序进一步完善,也欢迎大家继续试用。先祝大家新年愉快。

参考文献

[1]LuX,Xie L,Guan H,et al.A shear wall element for nonlinear seismic analysis ofsuper-tall buildings using OpenSees. Finite Elements in Analysis and Design,2015, 98: 14-25.

[2]方自虎,周海俊,赖少颖,等·ABAQUS混凝土应力应变关系选择[J],建筑结构,2013,43(S2):559-64.

[3]方自虎,简旭阳,周尧,等.考虑屈曲的钢筋滞回模型[J].武汉大学学报(工学版),2016,49(2):254-258.

[4]方自虎,谢强,周尧,等.循环荷载下MCFT混凝土结构模型[J].地震工程与工程振动,2015,35(3):73-78.

往期文章

#参数化建模#

详解Grasshopper中的C#脚本电池详解[附源码]

如何开发Grasshopper插件[附源码]

Rhino.Python脚本建模学习笔记【1】

#结构编程#

Python驱动Abaqus实体有限元建模[附源码]

有关选波的若干技术吐槽

自动选波程序AutoWave更新

PKPM5.转ETABS201X接口程序[Free]

YJK模型转ETABS201X自编接口介绍

结构软件关于梁柱刚域的考虑

AutoWave自动选波及人工波生成工具操作演示

结构分析设计有哪些工作可以让Python干?

一名结构工程师学习Python的心路历程

Python从YJK数据库读取荷载工况信息

#建筑大师#

[建筑大师](1)貝聿銘的光影傳奇

[建筑大师](2)勒·柯布西耶的现代主义

[建筑大师](3)奥斯卡梅尼耶的建筑曲线与女人

#结构大师#

高层建筑设计-以结构为建筑[上] bySOM大神马克*夏凯星

高层建筑设计-以结构为建筑[中] bySOM大神马克*夏凯星

高层建筑设计-以结构为建筑[下] bySOM大神马克*夏凯星

抗震性能设计大神Graham.H.Powell讲座第1节-上

抗震性能设计大神Graham.H.Powell讲座第1节-下

超高层建筑抗震性能设计by伯克利教授Jack Moehle

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

You cannot copy content of this page