''' ----------------------------------------------------------------------------- Axisymmetric model of a conical crack in a block modeled using axisymmetric elements (CAX8R). ----------------------------------------------------------------------------- ''' from abaqus import * import testUtils testUtils.setBackwardCompatibility() from abaqusConstants import * import part, material, section, assembly, step, interaction import regionToolset, displayGroupMdbToolset as dgm, mesh, load, job #---------------------------------------------------------------------------- # Create a model Mdb() modelName = 'AxisymmConeCrackGl' myModel = mdb.Model(name=modelName) # Create a new viewport in which to display the model # and the results of the analysis. myViewport = session.Viewport(name=modelName) myViewport.makeCurrent() myViewport.maximize() #--------------------------------------------------------------------------- # Create a part # Create a sketch for the base feature mySketch = myModel.Sketch(name='blockProfile', sheetSize=500.0) mySketch.sketchOptions.setValues(viewStyle=AXISYM) mySketch.setPrimaryObject(option=STANDALONE) mySketch.ObliqueConstructionLine(point1=(0.0, -250.0), point2=(0.0, 250.0)) mySketch.rectangle(point1=(0.0, 0.0), point2=(300.0, -300.0)) myBlock = myModel.Part(name='Block', dimensionality=AXISYMMETRIC, type=DEFORMABLE_BODY) myBlock.BaseShell(sketch=mySketch) mySketch.unsetPrimaryObject() del myModel.sketches['blockProfile'] myViewport.setValues(displayedObject=myBlock) # Create the conical crack on the block f = myBlock.faces.findAt((150,-150,0)) t = myBlock.MakeSketchTransform(sketchPlane=f, sketchPlaneSide=SIDE1, origin=(150.0, -150.0, 0.0)) mySketch = myModel.Sketch(name='coneCrackProfile', sheetSize=848.52, gridSpacing=21.21, transform=t) mySketch.setPrimaryObject(option=SUPERIMPOSE) myBlock.projectReferencesOntoSketch(sketch=mySketch, filter=COPLANAR_EDGES) mySketch.sketchOptions.setValues(gridOrigin=(-150.0, 150.0)) mySketch.AngularConstructionLine(point=(-140.0, 150.0), angle=135.0) mySketch.Line(point1=(-140.0, 150.0), point2=(-129.393398282202, 139.393398282202)) mySketch.Line(point1=(-129.393398282202, 139.393398282202), point2=(-150.0, 139.393398282202)) pickedFaces = myBlock.faces.findAt(((150,-150,0),)) myBlock.PartitionFaceBySketch(faces=pickedFaces, sketch=mySketch) mySketch.unsetPrimaryObject() del myModel.sketches['coneCrackProfile'] #--------------------------------------------------------------------------- # Partition the model for meshing f = myBlock.faces.findAt((150,-150,0)) t = myBlock.MakeSketchTransform(sketchPlane=f, sketchPlaneSide=SIDE1, origin=(150.256637, -150.260327, 0.0)) mySketch = myModel.Sketch(name='profile', sheetSize=848.52, gridSpacing=21.21, transform=t) mySketch.setPrimaryObject(option=SUPERIMPOSE) myBlock.projectReferencesOntoSketch(sketch=mySketch, filter=COPLANAR_EDGES) mySketch.sketchOptions.setValues(gridOrigin=(-150.256637,150.260327)) mySketch.Line(point1=(-129.650035282202,139.653725282202), point2=(149.743362999999,139.653725282202)) mySketch.CircleByCenterPerimeter(center=(-129.650035282202,139.653725282202), point1=(-134.650035282202,139.653725282202)) mySketch.AngularConstructionLine(point=(-124.650035282202,139.653725282202), angle=45.0) mySketch.AngularConstructionLine(point=(-134.650035282202,139.653725282202), angle=240.0) mySketch.AngularConstructionLine(point=(-124.650035282202,139.653725282202), angle=135.0) mySketch.Line(point1=(-150.256637,131.650327), point2=(149.743362999999,131.650327)) mySketch.Line(point1=(-124.650035282202,139.653725282202), point2=(-114.043433564404,150.260327)) mySketch.Line(point1=(-124.650035282202,139.653725282202), point2=(-116.646637000001,131.650327)) mySketch.Line(point1=(-134.650035282202,139.653725282202), point2=(-139.270799434863,131.650327)) mySketch.Line(point1=(-139.270799434863,131.650327), point2=(-139.270799434863,-149.739672999999)) mySketch.Line(point1=(-116.646637000001,131.650327), point2=(-116.646637000001,-149.739672999999)) pickedFaces = myBlock.faces.findAt((150,-150,0)) f = myBlock.faces myBlock.PartitionFaceBySketch(faces=f, sketch=mySketch) mySketch.unsetPrimaryObject() del myModel.sketches['profile'] #--------------------------------------------------------------------------- # Assign material properties import material import section # Create linear elastic material myModel.Material(name='ElasticMaterial') myModel.Material(name='LinearElastic') myModel.materials['LinearElastic'].Elastic(table=((30000000.0, 0.3), )) myModel.HomogeneousSolidSection(name='SolidHomogeneous', material='LinearElastic', thickness=1.0) # Create a set for the entire part allFaces = myBlock.faces myBlock.Set(faces=allFaces, name='All') # Assign the above section properties to the part region = myBlock.sets['All'] myBlock.SectionAssignment(region=region, sectionName='SolidHomogeneous') #--------------------------------------------------------------------------- # Create an assembly myAssembly = myModel.rootAssembly myViewport.setValues(displayedObject=myAssembly) myAssembly.DatumCsysByThreePoints(coordSysType=CYLINDRICAL, origin=(0.0, 0.0, 0.0), point1=(1.0, 0.0, 0.0), point2=(0.0, 0.0, -1.0)) myBlockInstance = myAssembly.Instance(name='Block-1', part=myBlock, dependent=OFF) #--------------------------------------------------------------------------- # Create a step for applying a load myModel.StaticStep(name='ApplyLoad', previous='Initial', description='Apply the load') #--------------------------------------------------------------------------- # Create interaction properties # Create a set for the crack tip v1 = myAssembly.instances['Block-1'].vertices v = myBlockInstance.vertices.findAt((20.606602,-10.606602,0.)) verts1 = v1[v.index:(v.index+1)] myAssembly.Set(vertices=verts1, name='crackTip') # Create a set for the seam crack edges edges1 = myBlockInstance.edges.findAt(((13.535534,-3.535534,0.),), ((18.838835,-8.838835,0.),),) myAssembly.Set(edges=edges1, name='seamCrackEdge') # Assign seam crack properties pickedRegions = myAssembly.sets['seamCrackEdge'] myAssembly.engineeringFeatures.assignSeam(regions=pickedRegions) crackFront = crackTip = myAssembly.sets['crackTip'] v1 = myBlockInstance.vertices.findAt((10.,0.,0.)) v2 = myBlockInstance.vertices.findAt((20.606602,-10.606602,0.)) myAssembly.engineeringFeatures.ContourIntegral(name='Crack', symmetric=OFF, crackFront=crackFront, crackTip=crackTip, extensionDirectionMethod=Q_VECTORS, qVectors=((v1,v2), ), midNodePosition=0.27, collapsedElementAtTip=SINGLE_NODE) #--------------------------------------------------------------------------- # Create loads and boundary conditions # Create sets for assigning boundary conditions and loads # Create a set for the base e = myBlockInstance.edges edges1 = myBlockInstance.edges.findAt(((150.,-300.,0.),), ((22.297919,-300.,0.),), ((5.492919,-300.,0.),)) myAssembly.Set(edges=edges1, name='base') # Create a set for the axisymmetric edge edges1 = myBlockInstance.edges.findAt(((0.,-5.303301,0.),), ((0.,-159.305,0.),), ((0.,-14.608301,0.),)) myAssembly.Set(edges=edges1, name='axisymmEdge') # Create a set for the top surface of the cone s1 = myBlockInstance.edges.findAt((5,0,0)) side1Edges1 = e[s1.index:(s1.index+1)] myAssembly.Surface(side1Edges=side1Edges1, name='topCrackSurf') # Assign boundary conditions baseFixed = myAssembly.sets['base'] myModel.DisplacementBC(name='baseFixed', createStepName='Initial', region=baseFixed, u2=0.0, fixed=OFF, distributionType=UNIFORM, localCsys=None) axiEdge = myAssembly.sets['axisymmEdge'] myModel.DisplacementBC(name='axisymmEdge', createStepName='Initial', region=axiEdge, u1=0.0, fixed=OFF, distributionType=UNIFORM, localCsys=None) # Assign load conditions topSurf = myAssembly.surfaces['topCrackSurf'] myModel.Pressure(name='Load', createStepName='ApplyLoad', region=topSurf, distributionType=UNIFORM, magnitude=10.0) #--------------------------------------------------------------------------- # Create a mesh # Seed all the edges pickedEdges = myBlockInstance.edges.findAt(((5,0,0),)) myAssembly.seedEdgeByNumber(edges=pickedEdges, number=3, constraint=FIXED) pickedEdges = myBlockInstance.edges.findAt(((7.803301,-10.606602,0.),), ((5.492919,-18.61,0.),)) myAssembly.seedEdgeByNumber(edges=pickedEdges, number=5, constraint=FIXED) pickedEdges = myBlockInstance.edges.findAt(((0.,-5.303301,0.),)) myAssembly.seedEdgeByNumber(edges=pickedEdges, number=3, constraint=FIXED) pickedEdges = myBlockInstance.edges.findAt(((29.608301,-14.608301,0),), ((300.,-14.608301,0.),), ((13.29622,-14.608301,0.),), ((0.,-14.608301,0.),)) myAssembly.seedEdgeByNumber(edges=pickedEdges, number=2, constraint=FIXED) pickedEdges = myBlockInstance.edges.findAt(((13.535534,-3.535534,0.),), ((30.909903,-5.303301,0.),), ((300.,-5.303301,0.),)) myAssembly.seedEdgeByNumber(edges=pickedEdges, number=2, constraint=FIXED) pickedEdges = myBlockInstance.edges.findAt(((23.106602,0.,0.),)) myAssembly.seedEdgeByNumber(edges=pickedEdges, number=6, constraint=FIXED) pickedEdges = myBlockInstance.edges.findAt(((22.297919,-18.61,0.),)) myAssembly.seedEdgeByNumber(edges=pickedEdges, number=8, constraint=FIXED) pickedEdges1 = myBlockInstance.edges.findAt(((19.5,-10.606602,0.),), ((21.837944,-10.606602,0.),)) pickedEdges2 = myBlockInstance.edges.findAt(((19.73591,-9.735911,0.),)) myAssembly.seedEdgeByBias(end1Edges=pickedEdges1, end2Edges=pickedEdges2, ratio=3.7, number=2, constraint=FIXED) pickedEdges = myBlockInstance.edges.findAt(((15.987204,-8.693185,0.),)) myAssembly.seedEdgeByNumber(edges=pickedEdges, number=3, constraint=FIXED) pickedEdges = myBlockInstance.edges.findAt(((22.520019,-5.987204,0.),)) myAssembly.seedEdgeByNumber(edges=pickedEdges, number=6, constraint=FIXED) pickedEdges = myBlockInstance.edges.findAt(((20.606602,-15.606602,0.),)) myAssembly.seedEdgeByNumber(edges=pickedEdges, number=8, constraint=FIXED) pickedEdges = myBlockInstance.edges.findAt(((54.017143,0.,0.),)) myAssembly.seedEdgeByBias(end2Edges=pickedEdges, ratio=1.5, number=12, constraint=FIXED) pickedEdges = myBlockInstance.edges.findAt(((45.593697,-10.606602,0.),)) myAssembly.seedEdgeByBias(end1Edges=pickedEdges, ratio=1.3, number=12, constraint=FIXED) pickedEdges = myBlockInstance.edges.findAt(((40,-18.61,0.),)) myAssembly.seedEdgeByBias(end1Edges=pickedEdges, ratio=1.5, number=12, constraint=FIXED) pickedEdges1 = myBlockInstance.edges.findAt(((33.61,-39,0.),), ((10.985838,-39.106735,0.),), ((0.,-39.106735,0.),)) pickedEdges2 = myBlockInstance.edges.findAt(((300.,-39.106735,0.),)) myAssembly.seedEdgeByBias(end1Edges=pickedEdges1, end2Edges=pickedEdges2, ratio=5, number=8, constraint=FIXED) pickedEdges = myBlockInstance.edges.findAt(((40,-300,0.),)) myAssembly.seedEdgeByBias(end1Edges=pickedEdges, ratio=1.5, number=12, constraint=FIXED) pickedEdges = myBlockInstance.edges.findAt(((22.297919,-300.,0.),)) myAssembly.seedEdgeByNumber(edges=pickedEdges, number=8, constraint=FIXED) pickedEdges = myBlockInstance.edges.findAt(((5.492919,-300.,0.),)) myAssembly.seedEdgeByNumber(edges=pickedEdges, number=5, constraint=FIXED) # Assign meshing controls to the respective regions pickedRegions = myBlockInstance.faces.findAt(((162,-5,0),), ((162,-15,0),), ((5,-5,0),), ((5,-15,0),), ((23.10,-2,0),), ((20.606602,-17,0),), ((5.4929,-150,0),), ((22.2979,-150,0),), ((166.805,-150,0),)) myAssembly.setMeshControls(regions=pickedRegions, elemShape=QUAD, technique=STRUCTURED) pickedRegions = myBlockInstance.faces.findAt(((18.5,-9,0.),), ((22.52,-8,0),), ((20.60,-12,0.),)) myAssembly.setMeshControls(regions=pickedRegions, elemShape=QUAD_DOMINATED, technique=SWEEP) elemType1 = mesh.ElemType(elemCode=CAX8R, elemLibrary=STANDARD, secondOrderAccuracy=OFF, hourglassControl=STIFFNESS, distortionControl=OFF) elemType2 = mesh.ElemType(elemCode=CAX6M, elemLibrary=STANDARD) faces1 = myBlockInstance.faces pickedRegions = (faces1, ) myAssembly.setElementType(regions=pickedRegions, elemTypes=(elemType1, elemType2)) partInstances = (myBlockInstance, ) myAssembly.generateMesh(regions=partInstances) #--------------------------------------------------------------------------- # Request history output for the crack myModel.historyOutputRequests.changeKey(fromName='H-Output-1', toName='JInt') myModel.historyOutputRequests['JInt'].setValues( contourIntegral='Crack', numberOfContours=5) myModel.HistoryOutputRequest(name='StrInt', createStepName='ApplyLoad', contourIntegral='Crack', numberOfContours=5, contourType=K_FACTORS) myModel.HistoryOutputRequest(name='TStr', createStepName='ApplyLoad', contourIntegral='Crack', numberOfContours=5, contourType=T_STRESS) #--------------------------------------------------------------------------- # Create the job myJob = mdb.Job(name=modelName, model=modelName, description='Contour integral analysis') mdb.saveAs(pathName=modelName) #---------------------------------------------------------------------------