The whole original input file of chapter 7:
*Heading
** plate with hole model, SI units
*Preprint, echo=NO, model=NO, history=NO, contact=NO
**
*Part, name=plate
*Node
1, 0., 5.
2, 0., 20.
3, 0.975451589, 4.90392637
4, 2.7778511, 4.15734816
5, 3.53553391, 3.53553391
6, 4.15734816, 2.7778511
7, 4.90392637, 0.975451589
8, 5., 0.
9, 20., 0.
10, 20., 20.
11, 0., 8.75
12, 0., 12.5
13, 0., 16.25
14, 1.91341722, 4.61939764
15, 4.61939764, 1.91341722
16, 17.8756886, 0.
17, 15.9219751, 0.
18, 14.1251621, 0.
19, 12.4726467, 0.
20, 10.9528408, 0.
21, 9.55508804, 0.
22, 8.26958656, 0.
23, 7.08732033, 0.
24, 6., 0.
25, 20., 16.
26, 20., 12.
27, 20., 8.
28, 20., 4.
29, 4., 20.
30, 8., 20.
31, 12., 20.
32, 16., 20.
33, 4.61048985, 4.27207041
34, 5.21953821, 3.3241663
35, 5.65414333, 2.24666381
36, 3.76305604, 5.0720458
37, 2.9698534, 5.98835516
38, 9.52673054, 1.3621918
39, 10.8648214, 1.28821659
40, 12.2752504, 1.49624527
41, 13.7877016, 1.8428328
42, 15.4558372, 2.21547365
43, 17.4501019, 2.73403955
44, 5.91304588, 1.13274133
45, 4.68926382, 5.76015615
46, 6.4430089, 3.80565119
47, 5.95787334, 5.26839066
48, 6.80666494, 2.51488447
49, 4.42414665, 6.79759693
50, 8.23377609, 1.3453728
51, 9.59390545, 2.90512729
52, 10.7518759, 2.3682847
53, 11.7106466, 2.94118524
54, 14.5212259, 4.29937983
55, 8.08390808, 2.67795062
56, 7.78504944, 3.97590899
57, 7.77411175, 5.33681679
58, 6.10621023, 6.95071125
59, 1.94550073, 7.10477209
60, 11.838357, 5.2793541
61, 7.02121258, 1.25902271
62, 10.0063887, 6.35130978
63, 8.010355, 6.83067751
64, 9.39275265, 4.97939444
65, 6.02029657, 8.60703278
66, 3.87908149, 8.27187824
67, 8.93236446, 3.98667765
68, 8.23227215, 8.46074009
69, 8.32474804, 10.2367725
70, 10.6257029, 8.00327873
71, 16.7049828, 6.19563103
72, 13.6436939, 9.75342178
73, 10.8004723, 10.1224651
74, 5.94967222, 10.5041113
75, 13.4720745, 6.85688591
76, 3.24529791, 13.0592442
77, 8.33017063, 11.9740849
78, 16.8983517, 9.04143524
79, 8.14096928, 15.8777552
80, 16.4028816, 16.3181858
81, 12.5486145, 16.4053078
82, 13.2811871, 13.0176907
83, 16.7287922, 12.6320887
84, 3.71863937, 16.398428
85, 3.26978445, 10.2153568
86, 16.1973763, 4.55466032
87, 13.0253439, 3.65237355
88, 6.37839174, 12.9158268
89, 10.1812487, 12.8076839
90, 10.6965008, 4.08778143
*Element, type=CPS4R
1, 36, 37, 14, 4
2, 4, 5, 33, 36
3, 57, 47, 46, 56
4, 34, 33, 5, 6
5, 6, 15, 35, 34
6, 8, 24, 44, 7
7, 85, 76, 12, 11
8, 37, 59, 3, 14
9, 45, 36, 33, 47
10, 47, 33, 34, 46
11, 9, 28, 43, 16
12, 43, 42, 17, 16
13, 41, 40, 19, 18
14, 40, 39, 20, 19
15, 39, 38, 21, 20
16, 39, 40, 53, 52
17, 46, 34, 35, 48
18, 22, 21, 38, 50
19, 44, 35, 15, 7
20, 25, 10, 32, 80
21, 52, 51, 38, 39
22, 2, 13, 84, 29
23, 77, 88, 74, 69
24, 69, 74, 65, 68
25, 82, 83, 80, 81
26, 45, 47, 58, 49
27, 61, 50, 55, 48
28, 36, 45, 49, 37
29, 1, 3, 59, 11
30, 90, 51, 52, 53
31, 18, 17, 42, 41
32, 87, 41, 42, 54
33, 86, 71, 75, 54
34, 44, 24, 23, 61
35, 23, 22, 50, 61
36, 60, 62, 64, 90
37, 49, 66, 59, 37
38, 35, 44, 61, 48
39, 67, 51, 90, 64
40, 51, 55, 50, 38
41, 48, 55, 56, 46
42, 53, 40, 41, 87
43, 54, 75, 60, 87
44, 71, 86, 43, 28
45, 63, 57, 64, 62
46, 68, 63, 62, 70
47, 58, 47, 57, 63
48, 63, 68, 65, 58
49, 66, 49, 58, 65
50, 66, 65, 74, 85
51, 87, 60, 90, 53
52, 60, 75, 70, 62
53, 68, 70, 73, 69
54, 57, 56, 67, 64
55, 59, 66, 85, 11
56, 67, 56, 55, 51
57, 69, 73, 89, 77
58, 80, 83, 26, 25
59, 29, 84, 79, 30
60, 73, 72, 82, 89
61, 71, 28, 27, 78
62, 75, 71, 78, 72
63, 70, 75, 72, 73
64, 30, 79, 81, 31
65, 76, 85, 74, 88
66, 84, 76, 88, 79
67, 13, 12, 76, 84
68, 89, 82, 81, 79
69, 78, 27, 26, 83
70, 80, 32, 31, 81
71, 83, 82, 72, 78
72, 86, 54, 42, 43
73, 79, 88, 77, 89
*Node
91, 0., 20., 0.
*Nset, nset=plate-RefPt_, internal
91,
*Nset, nset=RP
91,
*Nset, nset=y_sym
8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24
*Elset, elset=y_sym
6, 11, 12, 13, 14, 15, 18, 31, 34, 35
*Nset, nset=x_sym
1, 2, 11, 12, 13
*Elset, elset=x_sym
7, 22, 29, 67
*Nset, nset=top
2, 10, 29, 30, 31, 32
*Elset, elset=top
20, 22, 59, 64, 70
*Nset, nset=all, generate
1, 90, 1
*Elset, elset=all, generate
1, 73, 1
** Section: steel
*Solid Section, elset=all, material=steel
,
*End Part
**
*Assembly, name=Assembly
*Instance, name=plate-1, part=plate
*End Instance
**
*Surface, type=NODE, name=plate-1_top_CNS_, internal
plate-1.top, 1.
** Constraint: couple_top_uy
*Coupling, constraint name=couple_top_uy, ref node=plate-1.RP, surface=plate-1_top_CNS_
*Kinematic
2, 2
*End Assembly
**
*Material, name=steel
*Elastic
210000., 0.3
*Plastic
500.,0.
**
** Name: x_sym Type: Displacement/Rotation
*Boundary
plate-1.x_sym, 1, 1
** Name: y_sym Type: Displacement/Rotation
*Boundary
plate-1.y_sym, 2, 2
** ----------------------------------------------------------------
*Step, name=pull_y, nlgeom=YES
*Static
1., 1., 1e-05, 1.
**
*Boundary
plate-1.RP, 1, 1
plate-1.RP, 2, 2, 0.08
plate-1.RP, 6, 6
**
*Output, field, variable=PRESELECT
*Output, history, variable=PRESELECT
** print node and element results into dat-file
*NODE PRINT
U, RF,
*EL PRINT
S, COORD, PEEQ,
*End Step
Code language: plaintext (plaintext)
II) The model_plate.py file using functions
# Plate with hole model for Abaqus/Python course, MP, 09-2020
from abaqus import *
from abaqusConstants import *
from caeModules import *
import os
import numpy as np
session.journalOptions.setValues(replayGeometry=COORDINATE,
recoverGeometry=COORDINATE)
DIR0 = os.path.abspath('')
TOL = 1e-6
# Model functions
# ------------------------------------------------------
def make_geometry(model,(b,h,radius),mesh_size):
# draw the sketch
s = model.ConstrainedSketch(name='plate', sheetSize=200.0)
s.ArcByCenterEnds(center=(0,0), point1=(0,radius), point2=(radius,0),
direction=CLOCKWISE)
s.Line(point1=(radius,0), point2=(b/2.,0))
s.Line(point1=(b/2.,0), point2=(b/2.,h/2.))
s.Line(point1=(b/2.,h/2.), point2=(0,h/2.))
s.Line(point1=(0,radius), point2=(0,h/2.))
# create the part
p = model.Part(name='plate', dimensionality=TWO_D_PLANAR, type=DEFORMABLE_BODY)
p.BaseShell(sketch=s)
# create sets, surfaces, and reference point
p.Set(name='all', faces=p.faces[:])
p.Set(name='x_sym', edges=p.edges.getByBoundingBox(xMax=TOL))
p.Set(name='y_sym', edges=p.edges.getByBoundingBox(yMax=TOL))
p.Set(name='top', edges=p.edges.getByBoundingBox(yMin=h/2.-TOL))
rp = p.ReferencePoint(point=(0,h/2,0))
p.Set(name='RP', referencePoints=(p.referencePoints[rp.id],))
# meshing
p.seedPart(size=mesh_size)
p.generateMesh()
return p
def make_sections(model, p, (E,nu,sy)):
# create material, create and assign sketchOptions
mat = model.Material(name='steel')
mat.Elastic(table=((E_steel, nu_steel), ))
mat.Plastic(table=((sy_steel, 0.0), ))
model.HomogeneousSolidSection(name='steel', material='steel', thickness=None)
p.SectionAssignment(region=p.sets['all'], sectionName='steel',
thicknessAssignment=FROM_SECTION)
return
def make_assembly(model,p):
# assembly
a = model.rootAssembly
inst = a.Instance(name='plate-1', part=p, dependent=ON)
# constraint
model.Coupling(name='couple_top', controlPoint=inst.sets['RP'],
surface=inst.sets['top'], influenceRadius=WHOLE_SURFACE,
couplingType=KINEMATIC, u1=OFF, u2=ON, ur3=OFF)
return inst
def make_boundaries(model,inst,uy):
# step and hostory output
step = model.StaticStep(name='pull', previous='Initial', maxNumInc=1000,
initialInc=0.1, minInc=1e-08, maxInc=0.1, nlgeom=ON)
model.HistoryOutputRequest(name='H-Output-2', createStepName='pull',
variables=('U2', 'RF2'), region=inst.sets['RP'])
# boundaries and load
model.DisplacementBC(name='x_sym', createStepName='Initial',
region=inst.sets['x_sym'], u1=0)
model.DisplacementBC(name='y_sym', createStepName='Initial',
region=inst.sets['y_sym'], u2=0)
model.DisplacementBC(name='pull', createStepName='pull',
region=inst.sets['RP'], u1=0, u2=uy, ur3=0)
return
def run_model(model,job_name):
# create and run job
job = mdb.Job(name=job_name, model='Model-1', type=ANALYSIS,
resultsFormat=ODB)
job.submit(consistencyChecking=OFF)
job.waitForCompletion()
return
def evaluate_image(job_name):
# open the odb
odb = session.openOdb(job_name+'.odb')
vp = session.viewports['Viewport: 1']
vp.setValues(displayedObject=odb)
# Change size of viewport (e.g. 300x200 pixel)
vp.restore()
# position of the viwport
vp.setValues(origin=(50,-50))
vp.setValues(width=150, height=200)
# set up in Abaqus Viewer, recorded, and copied here
"""
session.View(name='User-1', nearPlane=24.242, farPlane=39.003, width=7.2278,
height=9.3665, projection=PERSPECTIVE, cameraPosition=(2.5, 5, 31.623),
cameraUpVector=(0, 1, 0), cameraTarget=(2.5, 5, 0),
viewOffsetX=-1.3504, viewOffsetY=0.25069, autoFit=OFF)
# load the defined view
vp.view.setValues(session.views['User-1'])
"""
# for a changing plate size, take an automatic front view
vp.view.setValues(session.views['Front'])
# view the right filed output
vp.odbDisplay.display.setValues(plotState=(CONTOURS_ON_DEF, ))
vp.odbDisplay.setPrimaryVariable(variableLabel='S',
outputPosition=INTEGRATION_POINT,
refinement=(INVARIANT, 'Mises'),)
# change the legend and what is displayed
vp.viewportAnnotationOptions.setValues(legendFont=
'-*-verdana-medium-r-normal-*-*-140-*-*-p-*-*-*')
vp.viewportAnnotationOptions.setValues(triad=OFF, state=OFF,
legendBackgroundStyle=MATCH,annotations=OFF,compass=OFF,
title=OFF)
# print viewport to png file
session.printOptions.setValues(reduceColors=False, vpDecorations=OFF)
session.pngOptions.setValues(imageSize=(1500, 2000))
session.printToFile(fileName=job_name+'_mises', format=PNG,
canvasObjects=(vp,))
odb.close()
return
def evaluate_ho_path(job_name):
# open the odb
odb = session.openOdb(job_name+'.odb')
vp = session.viewports['Viewport: 1']
vp.setValues(displayedObject=odb)
# evaluate the history output
# ------------------------------------------------------
step = odb.steps['pull']
# select the history region with the name starting with 'Node '
hr_rp = [i for i in step.historyRegions.values()
if i.name.startswith('Node ')][0]
# get vertical dispacement and reaction force data
# ((t,u),...), ((t,rf),...)
res_u = np.array(hr_rp.historyOutputs['U2'].data)
res_rf = np.array(hr_rp.historyOutputs['RF2'].data)
# only take the second colum of data and stack those columns
res_u_f = np.column_stack((res_u[:,1],res_rf[:,1]))
# write u-rf data to file
np.savetxt(job_name+'_res_u_f.dat',res_u_f)
# evaluate the stresses along path (y=0)
# ------------------------------------------------------
# create path from coordinates
pth = session.Path(name='Path-1', type=POINT_LIST,
expression=((radius,0,0), (b/2.,0,0)))
# field output to be evaluated along path
vp.odbDisplay.setPrimaryVariable(variableLabel='S',
outputPosition=INTEGRATION_POINT,refinement=(COMPONENT, 'S22'))
# output for 20 eqiuidistant points over path
# shape: path over DEFORMED or UNDEFORMED geometry
n_points = 20
# get vertical stress S22 over X_COORDINATE
xy = session.XYDataFromPath(name='XYData-1', path=pth,
includeIntersections=False, shape=UNDEFORMED,
projectOntoMesh=False, pathStyle=UNIFORM_SPACING,
numIntervals=n_points, projectionTolerance=0,
labelType=X_COORDINATE)
# write results to file
np.savetxt(job_name+'_res_s22_path.dat',xy.data)
odb.close()
return
# one funtion for the whole plate model (create, run, evaluate)
def plate_model(job_name,(b,h,radius),(E,nu,sy),uy,mesh_size):
# check parameters for errors
if radius >= b/2:
raise ValueError('width b too small for hole radius')
if radius >= h/2:
raise ValueError('height h too small for hole radius')
# reset model
Mdb()
model = mdb.models['Model-1']
# make the parts, mesh it and return it
p = make_geometry(model,(b,h,radius),mesh_size)
# make materials and sections
make_sections(model,p,(E,nu,sy))
# make the assembly & constraint
inst = make_assembly(model,p)
# create step and boundaries
make_boundaries(model,inst,uy)
# save the model
mdb.saveAs(job_name)
# run the model
run_model(model,job_name)
# evaluate: create image
evaluate_image(job_name)
# evaluate: history output and path
evaluate_ho_path(job_name)
return model
# parameters for geometry, material, load and mesh (N-mm-s)
# ------------------------------------------------------
b = 16. # width of the plate (mm)
h = 20. # height of the plate (mm)
radius = 4.5 # radius of the hole (mm)
uy = 0.08 # vertical displacement of the top (mm)
E_steel = 210000. # Young's modulus of steel (MPa)
nu_steel = 0.3 # Poisson's ratio of steel (1)
sy_steel = 500. # yield stress of steel (MPa)
mesh_size = 0.3 # edge length of the mesh (mm)
# run the model function
# ------------------------------------------------------
plate_model('plate-test',(b,h,radius),(E_steel,nu_steel,sy_steel),
uy,mesh_size)
Code language: Python (python)