Bước 1: Mở chương trình ABAQUS CAE, sau đó copy dòng bên dưới và dán vào dòng lệnh của ABAQUS
1 |
session.journalOptions.setValues(replayGeometry=COORDINATE, recoverGeometry=COORDINATE) |


Sau đó nhấn Enter
Bước 2: Tạo mởi Part, nhập các tham số như hình sau

Sau đó nhận nút Continue..
Bước 3: Chọn Rectangle để vẽ kích thước mô hình với tọa độ điểm đầu là (0, 0) và tọa độ điểm thứ 2 là (20, 20)


Bước 4: Chọn nút Partion Face: Sketch

Tọa độ (0,0) của mô hình sẽ tự động điều chỉnh từ điểm O’ sang điểm O như hình bên dưới.

Để thay đổi tọa độ gốc, click chọn Sketcher options sẽ hiển thị trình đơn như sau:

Sau đó, click chọn nút Origin, sau đó Pick chọn điểm tọa độ gốc ban đầu.

Bước 5: Tạo hình tròn có bán kính là 1.5 với tọa độ tâm là 2.5. Chọn nút tạo hình tròn, sau đó nhập tọa độ tâm là (2.5,2.5), sau đó nhập điểm thứ 2 là (4,2.5). Sau đó nhấn nút “Done” để kết thúc.

Bước 6: Khai báo vật liệu
Tiến hành khai báo vật liệu Steel như hình mô tả bên dưới

Làm tương tự với vật liệu Polymer

Bước 7: Định nghĩa các Section.
- Đối với vật liệu Steel, làm theo các bước sau

Sau đó, chọn loại vật liệu đã khai báo

Làm tương tự đối với Section Polymer

Bước 8: Gắn vật liệu cho các Part
- Gắn vật liệu cho phần Polymer


Tương tự cho việc gắn vật liệu cho Part Steel

Bước 9: Assembly – Tạo mô hình: Chọn Module: Assembly, chọn Create Instance sai đó chọn tên Part và nhấn OK.

Bước 10: Định nghĩa STEP: Chọn Step trong Module, sau đó chọn Create Step, chọn Static, General sau đó click nút “Continue…”

Sau đó, định nghĩa các bước thời gian tính toán như sau:

Nhấn OK để kết thúc
Bước 11: Định nghĩa tải trọng (Load):
- Khai báo tải trọng cho cạnh trên, với giá trị tải trọng cần nhập là -10



- Tương tự khai báo tải trọng cạnh dưới

Bước 11: Thiết lập điều kiện biên
Chọn Create Boundary Condition

Sau đó, pick chọn điểm gốc để thiết lập điều kiện biên

Bước 12: Chia lưới phần tử
Chọn Mesh, sau đó chọn Part và tên của part đã định nghĩa

Vào SAR chọn đối tượng Polymer, sau đó chọn Element Type là Plane Strain

Làm tương tự cho đối tượng Steel, kiểu Element Type là Plane Strain.
Sau đó, chọn nút Global Seeds, rồi khai báo như sau

Sau đó chọn nút Mesh để chia lưới phần tử
Sau khi chia lưới phần tử, mô hình trông như hình sau

Bước 13: Tạo Job

Bước 14: Không cần submite Job vừa tạo, mà nên lưu lại mô hình đã tạo
Bước 15: Vào thư mục đã lưu file mô hình CAE, bạn sẽ thấu có hai file là CAE File and JNL file như hình minh họa bên dưới

Bước 16: Mở file JNL bằng phần mềm Notepad++, bạn sẽ thấy nội dung là code Python như sau

Trong trình đơn Notepad++, chọn save as và chọn kiểu “Trong trình đơn Notepad++, chọn save as và chọn kiểu “Save as type” là “Python file (*.py,*.pyw) để chuyển định dạng từ *.jnl sang *.py. Bạn sẽ thấy màu sắc thay đổi như sau

Sau đó, bạn có thể sửa lại code như sau
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 |
# -*- 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 optimization import * from job import * from sketch import * from visualization import * from connectorBehavior import * mdb.models['Model-1'].ConstrainedSketch(name='__profile__', sheetSize=200.0) mdb.models['Model-1'].sketches['__profile__'].rectangle(point1=(0.0, 0.0), point2=(20.0, 20.0)) mdb.models['Model-1'].Part(dimensionality=TWO_D_PLANAR, name='Composite', type= DEFORMABLE_BODY) mdb.models['Model-1'].parts['Composite'].BaseShell(sketch= mdb.models['Model-1'].sketches['__profile__']) del mdb.models['Model-1'].sketches['__profile__'] # Region for composite center_x = 2.5 center_y = 2.5 radius = 1.5 for i in range(1,17): mdb.models['Model-1'].ConstrainedSketch(gridSpacing=1.41, name='__profile__', sheetSize=56.56, transform= mdb.models['Model-1'].parts['Composite'].MakeSketchTransform( sketchPlane=mdb.models['Model-1'].parts['Composite'].faces.findAt(( 0.1, 0.1, 0.0), (0.0, 0.0, 1.0)), sketchPlaneSide=SIDE1, sketchOrientation=RIGHT, origin=(0.0, 0.0, 0.0))) mdb.models['Model-1'].parts['Composite'].projectReferencesOntoSketch(filter= COPLANAR_EDGES, sketch=mdb.models['Model-1'].sketches['__profile__']) # mdb.models['Model-1'].sketches['__profile__'].sketchOptions.setValues( # gridOrigin=(-10.0, -10.0)) mdb.models['Model-1'].sketches['__profile__'].CircleByCenterPerimeter(center=( center_x, center_y), point1=((center_x+radius), center_y)) mdb.models['Model-1'].parts['Composite'].PartitionFaceBySketch(faces= mdb.models['Model-1'].parts['Composite'].faces.findAt(((0.1, 0.1, 0.0), )), sketch=mdb.models['Model-1'].sketches['__profile__']) del mdb.models['Model-1'].sketches['__profile__'] if center_x < 15.0: center_x = center_x + 5.0 else: center_y = center_y + 5.0 center_x = 2.5 # mdb.models['Model-1'].ConstrainedSketch(gridSpacing=1.41, name='__profile__', # sheetSize=56.56, transform= # mdb.models['Model-1'].parts['Composite'].MakeSketchTransform( # sketchPlane=mdb.models['Model-1'].parts['Composite'].faces.findAt(( # 6.666667, 6.666667, 0.0), (0.0, 0.0, 1.0)), sketchPlaneSide=SIDE1, # sketchOrientation=RIGHT, origin=(10.0, 10.0, 0.0))) # mdb.models['Model-1'].parts['Composite'].projectReferencesOntoSketch(filter= # COPLANAR_EDGES, sketch=mdb.models['Model-1'].sketches['__profile__']) # del mdb.models['Model-1'].sketches['__profile__'] # mdb.models['Model-1'].ConstrainedSketch(gridSpacing=1.41, name='__profile__', # sheetSize=56.56, transform= # mdb.models['Model-1'].parts['Composite'].MakeSketchTransform( # sketchPlane=mdb.models['Model-1'].parts['Composite'].faces.findAt(( # 6.666667, 6.666667, 0.0), (0.0, 0.0, 1.0)), sketchPlaneSide=SIDE1, # sketchOrientation=RIGHT, origin=(10.0, 10.0, 0.0))) # mdb.models['Model-1'].parts['Composite'].projectReferencesOntoSketch(filter= # COPLANAR_EDGES, sketch=mdb.models['Model-1'].sketches['__profile__']) # del mdb.models['Model-1'].sketches['__profile__'] # mdb.models['Model-1'].ConstrainedSketch(gridSpacing=1.41, name='__profile__', # sheetSize=56.56, transform= # mdb.models['Model-1'].parts['Composite'].MakeSketchTransform( # sketchPlane=mdb.models['Model-1'].parts['Composite'].faces.findAt(( # 6.666667, 6.666667, 0.0), (0.0, 0.0, 1.0)), sketchPlaneSide=SIDE1, # sketchOrientation=RIGHT, origin=(10.0, 10.0, 0.0))) # mdb.models['Model-1'].parts['Composite'].projectReferencesOntoSketch(filter= # COPLANAR_EDGES, sketch=mdb.models['Model-1'].sketches['__profile__']) # mdb.models['Model-1'].sketches['__profile__'].sketchOptions.setValues( # gridOrigin=(-10.0, -10.0)) # mdb.models['Model-1'].sketches['__profile__'].CircleByCenterPerimeter(center=( # -7.5, -7.5), point1=(-6.0, -7.5)) # mdb.models['Model-1'].sketches['__profile__'].geometry.findAt((-9.0, -7.5)) # mdb.models['Model-1'].sketches['__profile__'].delete(objectList=( # mdb.models['Model-1'].sketches['__profile__'].geometry.findAt((-9.0, -7.5), # ), )) # mdb.models['Model-1'].sketches['__profile__'].CircleByCenterPerimeter(center=( # -7.5, -7.5), point1=(-6.0, -7.5)) # mdb.models['Model-1'].parts['Composite'].PartitionFaceBySketch(faces= # mdb.models['Model-1'].parts['Composite'].faces.findAt(((6.666667, 6.666667, # 0.0), )), sketch=mdb.models['Model-1'].sketches['__profile__']) # del mdb.models['Model-1'].sketches['__profile__'] mdb.models['Model-1'].Material(name='Steel') mdb.models['Model-1'].materials['Steel'].Elastic(table=((200000.0, 0.3), )) mdb.models['Model-1'].Material(name='Polymer') mdb.models['Model-1'].materials['Polymer'].Elastic(table=((1700.0, 0.4), )) mdb.models['Model-1'].HomogeneousSolidSection(material='Steel', name='Steel', thickness=None) mdb.models['Model-1'].HomogeneousSolidSection(material='Polymer', name= 'Polymer', thickness=None) mdb.models['Model-1'].parts['Composite'].Set(faces= mdb.models['Model-1'].parts['Composite'].faces.findAt(((9.148826, 1.121772, 0.0), )), name='Set-steel') mdb.models['Model-1'].parts['Composite'].SectionAssignment(offset=0.0, offsetField='', offsetType=MIDDLE_SURFACE, region= mdb.models['Model-1'].parts['Composite'].sets['Set-steel'], sectionName= 'Steel', thicknessAssignment=FROM_SECTION) del mdb.models['Model-1'].parts['Composite'].sectionAssignments[0] mdb.models['Model-1'].parts['Composite'].Set(faces= mdb.models['Model-1'].parts['Composite'].faces.findAt(((9.148826, 1.121772, 0.0), )), name='Set-Polymer') mdb.models['Model-1'].parts['Composite'].SectionAssignment(offset=0.0, offsetField='', offsetType=MIDDLE_SURFACE, region= mdb.models['Model-1'].parts['Composite'].sets['Set-Polymer'], sectionName= 'Polymer', thicknessAssignment=FROM_SECTION) center_x = 2.5 center_y = 2.5 for i in range(1,17): mdb.models['Model-1'].parts['Composite'].Set(faces= mdb.models['Model-1'].parts['Composite'].faces.findAt(((center_x, center_y, 0.0), )), name='Set-%d' %(i+1)) mdb.models['Model-1'].parts['Composite'].SectionAssignment(offset=0.0, offsetField='', offsetType=MIDDLE_SURFACE, region= mdb.models['Model-1'].parts['Composite'].sets['Set-%d' %(i+1)], sectionName='Steel' , thicknessAssignment=FROM_SECTION) if center_x < 15.0: center_x = center_x + 5.0 else: center_y = center_y + 5.0 center_x = 2.5 # del mdb.models['Model-1'].parts['Composite'].sets['Set-steel'] # mdb.models['Model-1'].parts['Composite'].Set(faces= # mdb.models['Model-1'].parts['Composite'].faces.findAt(((2.853553, 3.777433, # 0.0), )), name='Set-Steel') # mdb.models['Model-1'].parts['Composite'].SectionAssignment(offset=0.0, # offsetField='', offsetType=MIDDLE_SURFACE, region= # mdb.models['Model-1'].parts['Composite'].sets['Set-Steel'], sectionName= # 'Steel', thicknessAssignment=FROM_SECTION) # Assembly mdb.models['Model-1'].rootAssembly.DatumCsysByDefault(CARTESIAN) mdb.models['Model-1'].rootAssembly.Instance(dependent=ON, name='Composite-1', part=mdb.models['Model-1'].parts['Composite']) mdb.models['Model-1'].StaticStep(initialInc=0.01, maxInc=0.1, maxNumInc=10000, minInc=1e-12, name='Step-1', previous='Initial') mdb.models['Model-1'].rootAssembly.Surface(name='Surf-1', side1Edges= mdb.models['Model-1'].rootAssembly.instances['Composite-1'].edges.findAt((( 5.0, 20.0, 0.0), ))) mdb.models['Model-1'].Pressure(amplitude=UNSET, createStepName='Step-1', distributionType=UNIFORM, field='', magnitude=-10.0, name='Top-load', region=mdb.models['Model-1'].rootAssembly.surfaces['Surf-1']) mdb.models['Model-1'].rootAssembly.Surface(name='Surf-2', side1Edges= mdb.models['Model-1'].rootAssembly.instances['Composite-1'].edges.findAt((( 15.0, 0.0, 0.0), ))) mdb.models['Model-1'].Pressure(amplitude=UNSET, createStepName='Step-1', distributionType=UNIFORM, field='', magnitude=-10.0, name='Bot-Load', region=mdb.models['Model-1'].rootAssembly.surfaces['Surf-2']) mdb.models['Model-1'].rootAssembly.Set(name='Set-1', vertices= mdb.models['Model-1'].rootAssembly.instances['Composite-1'].vertices.findAt( ((0.0, 0.0, 0.0), ))) mdb.models['Model-1'].DisplacementBC(amplitude=UNSET, createStepName='Step-1', distributionType=UNIFORM, fieldName='', fixed=OFF, localCsys=None, name= 'BC-1', region=mdb.models['Model-1'].rootAssembly.sets['Set-1'], u1=0.0, u2=UNSET, ur3=UNSET) mdb.models['Model-1'].parts['Composite'].setElementType(elemTypes=(ElemType( elemCode=CPE4R, elemLibrary=STANDARD, secondOrderAccuracy=OFF, hourglassControl=DEFAULT, distortionControl=DEFAULT), ElemType( elemCode=CPE3, elemLibrary=STANDARD)), regions=( mdb.models['Model-1'].parts['Composite'].faces.findAt(((9.148826, 1.121772, 0.0), )), )) center_x = 2.5 center_y = 2.5 for i in range(1,17): mdb.models['Model-1'].parts['Composite'].setElementType(elemTypes=(ElemType( elemCode=CPE4R, elemLibrary=STANDARD, secondOrderAccuracy=OFF, hourglassControl=DEFAULT, distortionControl=DEFAULT), ElemType( elemCode=CPE3, elemLibrary=STANDARD)), regions=( mdb.models['Model-1'].parts['Composite'].faces.findAt(((center_x, center_y, 0.0), )), )) if center_x < 15.0: center_x = center_x + 5.0 else: center_y = center_y + 5.0 center_x = 2.5 # mdb.models['Model-1'].parts['Composite'].setElementType(elemTypes=(ElemType( # elemCode=CPE4R, elemLibrary=STANDARD, secondOrderAccuracy=OFF, # hourglassControl=DEFAULT, distortionControl=DEFAULT), ElemType( # elemCode=CPE3, elemLibrary=STANDARD)), regions=( # mdb.models['Model-1'].parts['Composite'].faces.findAt(((2.853553, 3.777433, # 0.0), )), )) mdb.models['Model-1'].parts['Composite'].seedPart(deviationFactor=0.1, minSizeFactor=0.1, size=0.1) mdb.models['Model-1'].parts['Composite'].generateMesh() mdb.models['Model-1'].rootAssembly.regenerate() mdb.Job(atTime=None, contactPrint=OFF, description='', echoPrint=OFF, explicitPrecision=SINGLE, getMemoryFromAnalysis=True, historyPrint=OFF, memory=90, memoryUnits=PERCENTAGE, model='Model-1', modelPrint=OFF, multiprocessingMode=DEFAULT, name='Job-1', nodalOutputPrecision=SINGLE, numCpus=1, numGPUs=0, numThreadsPerMpiProcess=1, queue=None, resultsFormat= ODB, scratch='', type=ANALYSIS, userSubroutine='', waitHours=0, waitMinutes=0) # Save by USER-PC on 2025_01_13-14.44.01; build 2023 2022_09_29-03.11.55 183150 |
Bước 17: Quay trở về ABAQUS, nhấn New để tạo dự án mới. Sau đó vào File -> Run Script và chọn file Python bạn vừa lưu ở trước đó. ABAQUS sẽ tự động tạo geometry với 16 đối tượng hình tròn dựa trên nội dung từ code Python. Mô hình sẽ có dạng như sau:


Như vậy, bạn đã tạo thành công mô hình dựa trên Python code
Xin cảm ơn bạn đã dành thời gian cho bài viết này