You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确保Abaqus中随机生成的纤维不与修剪圆相交?

问题:Abaqus中生成随机纤维时避免与左侧修剪圆相交

我使用Python编写代码在Abaqus中生成随机纤维,希望确保生成的纤维不会与左侧的修剪圆相交,但当前的相交检测逻辑并未生效。

我已尝试修改代码,添加了纤维与修剪圆的相交检测逻辑:生成新纤维后,同时检查其与现有纤维及修剪圆是否相交,若检测到相交则标记intersection_exists为True,本应排除这类纤维,但问题仍存在。

代码如下

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))

内容的提问来源于stack exchange,提问作者awjaf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:20:32