random generated fiber in polymer matrix
I create a randomly fiber generated in python and execute in abaqus. I want to make sure the random fiber generated didnt intersect with the trim circle on the left as shown in the image uploaded. Please help.
i have tried modified code, I added an additional check for intersection with the trim circle. After generating each new fiber, it is checked for intersection with both existing fibers and the trim circle. If an intersection is detected, the variable intersection_exists is set to True. This ensures that fibers that intersect with the trim circle are not included in the CentList and are not counted towards the fiber volume fraction.But it still intersect.
Here is the code:
from abaqus import *
from abaqusConstants import *
from caeModules import *
from driverUtils import executeOnCaeStartup
from random import *
from math import *
executeOnCaeStartup()
# Function to check the intersection of a circle with a list of circles
def intersection(R1, Cen1, R2, Cen2, Tol):
Distan = ((Cen1[0] - Cen2[0]) ** 2.0 + (Cen1[1] - Cen2[1]) ** 2.0) ** 0.5
Min_Dis = R1 + R2 + Tol
if Distan > Min_Dis:
Intersection = 'No'
else:
Intersection = 'Yes'
return Intersection
def ran(X1, X2):
value = (X2 - X1) * random() + X1
return value
Wcomp = 2.0 # Adjust the matrix width
Hcomp = 6.0 # Adjust the matrix height
Rmin = 0.1
Rmax = 0.1
Tol = 0.001
Vf_target = 0.3 # Target fiber volume fraction (30%)
Vff = 0.0
CentList = []
while Vff < Vf_target:
CentList = []`
Vff = 0.0
while Vff < Vf_target:
Newcircle = [ran(Rmax, Wcomp - Rmax), ran(Rmax, Hcomp - Rmax), ran(Rmin, Rmax)]
# Check for intersection with existing fibers
intersection_exists = False
for Cent in CentList:
R = Cent[2]
Check = intersection(R, Cent, Newcircle[2], Newcircle, Tol)
if Check == 'Yes':
intersection_exists = True
break
# Check for intersection with matrix boundaries
if (Newcircle[0] - Newcircle[2] < 0 + Tol or
Newcircle[0] + Newcircle[2] > Wcomp - Tol or
Newcircle[1] - Newcircle[2] < 0 + Tol or
Newcircle[1] + Newcircle[2] > Hcomp - Tol):
intersection_exists = True
if not intersection_exists:
CentList.append(Newcircle)
Vff += pi * Newcircle[2] ** 2.0 / (Wcomp * Hcomp)
# Check for intersection with trim circle
trim_circle_center = (0.0, Hcomp / 2)
trim_circle_radius = 3.375
trim_check = intersection(Newcircle[2], Newcircle, trim_circle_radius, trim_circle_center, Tol)
if trim_check == 'Yes':
intersection_exists = True
if not intersection_exists:
CentList.append(Newcircle)
Vff += pi * Newcircle[2] ** 2.0 / (Wcomp * Hcomp)
print(Vff)
print(CentList)
# Create Part (Matrix)
s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__', sheetSize=20.0)
g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints
s.setPrimaryObject(option=STANDALONE)
s.rectangle(point1=(0.0, 0.0), point2=(Wcomp, Hcomp))
s.CircleByCenterPerimeter(center=(0.0, Hcomp/2), point1=(0.0, 3.375))
s.CoincidentConstraint(entity1=v[4], entity2=g[2], addUndoState=False)
s.EqualDistanceConstraint(entity1=v[0], entity2=v[1], midpoint=v[4],
addUndoState=False)
s.autoTrimCurve(curve1=g[6], point1=(-0.232322692871094, 2.57432436943054))
s.autoTrimCurve(curve1=g[2], point1=(-0.0296030044555664, 3.15962839126587))
p = mdb.models['Model-1'].Part(name='Plate', dimensionality=TWO_D_PLANAR,
type=DEFORMABLE_BODY)
p = mdb.models['Model-1'].parts['Plate']
p.BaseShell(sketch=s)
s.unsetPrimaryObject()
session.viewports['Viewport: 1'].setValues(displayedObject=p)
del mdb.models['Model-1'].sketches['__profile__']
# Partition
f, e, d1 = p.faces, p.edges, p.datums
t = p.MakeSketchTransform(sketchPlane=f[0], sketchPlaneSide=SIDE1, origin=(0.0, 0.0, 0.0))
s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__', sheetSize=1.0, gridSpacing=0.01, transform=t)
g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints
s.setPrimaryObject(option=SUPERIMPOSE)
p = mdb.models['Model-1'].parts['Plate']
# Generate random fibers
for Cent in CentList:
X = Cent[0]
Y = Cent[1]
R = Cent[2]
p.projectReferencesOntoSketch(sketch=s, filter=COPLANAR_EDGES)
s.CircleByCenterPerimeter(center=(X, Y), point1=(X + R, Y))
p = mdb.models['Model-1'].parts['Plate']
f = p.faces
pickedFaces = f.getSequenceFromMask(mask=('[#1 ]',), )
pickedFaces = f[:]
e1, d2 = p.edges, p.datums
p.PartitionFaceBySketch(faces=pickedFaces, sketch=s)
s.unsetPrimaryObject()
del mdb.models['Model-1'].sketches['__profile__']
#Property
#Matrix
mdb.models['Model-1'].Material(name='Matrix')
mdb.models['Model-1'].materials['Matrix'].Elastic(table=((3000.0, 0.3), ))
mdb.models['Model-1'].HomogeneousSolidSection(name='Section-2',
material='Matrix', thickness=None)
p = mdb.models['Model-1'].parts['Plate']
f = p.faces
faces = f.findAt((0,0,0))
q=faces.index
Fac = f[q:q+1]
region = p.Set(faces=Fac, name='Set-Matrix')
p = mdb.models['Model-1'].parts['Plate']
p.SectionAssignment(region=region, sectionName='Section-2', offset=0.0,
offsetType=MIDDLE_SURFACE, offsetField='',
thicknessAssignment=FROM_SECTION)
#fibers
mdb.models['Model-1'].Material(name='Fiber')
mdb.models['Model-1'].materials['Fiber'].Elastic(table=((70000.0, 0.3), ))
mdb.models['Model-1'].HomogeneousSolidSection(name='Section-1',
material='Fiber', thickness=None)
f = p.faces
i = 1
for Cent in CentList:
X = Cent[0]
Y = Cent[1]
R = Cent[2]
# Find faces and assign section to each fiber
for i, Cent in enumerate(CentList):
X = Cent[0]
Y = Cent[1]
R = Cent[2]
faces = f.findAt((X, Y, 0))
if faces:
q = faces.index
Fac = f[q:q+1]
region = p.Set(faces=Fac, name='Set-1'+str(i+1))
p.SectionAssignment(region=region, sectionName='Section-1', offset=0.0,
offsetType=MIDDLE_SURFACE, offsetField='',
thicknessAssignment=FROM_SECTION)
else:
print("No faces found at coordinates ({X}, {Y})".format(X=X, Y=Y))