0

I have written a python script to make some models in Abaqus. Then without submitting jobs I write inputs and run input files to get the odbs in other python script. As there are now more than 500 models and need to reduce computational time or to save my computer from being crushed , what I want in one python script should do...

  1. submit one job to write inputs and automatically delete all the files of one job..Then second...third...fourth... To make it clear,for an example::for model-1(i=1),create part,create mesh,write input,close ... model-100(i=100),create part,create mesh,close. So then I do not have anything running before going from one model to others. I am a beginner and do not know much of abaqus python scripting. I have added one simple example similar to my big file. I would appreciate your help.
from abaqus import *
from abaqusConstants import *

import __main__
import section
import regionToolset
import displayGroupMdbToolset as dgm
import part
import material
import assembly
import step
import interaction
import load
import mesh
import optimization
import job
import sketch
import visualization
import xyPlot
import displayGroupOdbToolset as dgo
import connectorBehavior

Beam_h = [20, 50,30] #Beam Height mm
Beam_w = [10, 10,10] #Beam width mm 

mesh_size = 2.5 #mesh size mm
Beam_d = 400.0 #Beam length mm
Z1 = [50,385,350]
Z2 = [50,5,10]
Pressure = 50.0 # Applied Pressure [MPa]
Young_m = 190000 #Young's Modulus [MPa]
Poisson_r = 0.32 #Poisson's ratio

session.journalOptions.setValues(replayGeometry=COORDINATE,recoverGeometry=COORDINATE)
for i in range(len(Beam_h)):
    mdb.Model(name='Model-%s'%(Beam_h[i]), modelType=STANDARD_EXPLICIT)
    session.viewports['Viewport: 1'].setValues(displayedObject=None)
    
    session.viewports['Viewport: 1'].partDisplay.setValues(sectionAssignments=OFF, 
        engineeringFeatures=OFF)
    session.viewports['Viewport: 1'].partDisplay.geometryOptions.setValues(
        referenceRepresentation=ON)
        
    s = mdb.models['Model-%s'%(Beam_h[i])].ConstrainedSketch(name='__profile__', 
        sheetSize=200.0)
        
    g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints
    s.setPrimaryObject(option=STANDALONE)

    #Create a rectangle using two points
    s.setPrimaryObject(option=STANDALONE)
    s.Spot(point=(-Beam_w[i]*0.5, Beam_h[i]*0.5))
    s.Spot(point=(-Beam_w[i]*0.5, -Beam_h[i]*0.5))
    s.Spot(point=(Beam_w[i]*0.5, -Beam_h[i]*0.5))
    s.Spot(point=(Beam_w[i]*0.5, Beam_h[i]*0.5))
    s.Line(point1=(-Beam_w[i]*0.5, Beam_h[i]*0.5), point2=(-Beam_w[i]*0.5, -Beam_h[i]*0.5))
    s.VerticalConstraint(entity=g[2], addUndoState=False)
    s.Line(point1=(-Beam_w[i]*0.5, -Beam_h[i]*0.5), point2=(Beam_w[i]*0.5, -Beam_h[i]*0.5))
    s.HorizontalConstraint(entity=g[3], addUndoState=False)
    s.PerpendicularConstraint(entity1=g[2], entity2=g[3], addUndoState=False)
    s.Line(point1=(Beam_w[i]*0.5, -Beam_h[i]*0.5), point2=(Beam_w[i]*0.5, Beam_h[i]*0.5))
    s.VerticalConstraint(entity=g[4], addUndoState=False)
    s.PerpendicularConstraint(entity1=g[3], entity2=g[4], addUndoState=False)
    s.Line(point1=(Beam_w[i]*0.5, Beam_h[i]*0.5), point2=(-Beam_w[i]*0.5, Beam_h[i]*0.5))
    s.HorizontalConstraint(entity=g[5], addUndoState=False)
    s.PerpendicularConstraint(entity1=g[4], entity2=g[5], addUndoState=False)
        
    p = mdb.models['Model-%s'%(Beam_h[i])].Part(name='Beam', dimensionality=THREE_D, 
        type=DEFORMABLE_BODY)
    p = mdb.models['Model-%s'%(Beam_h[i])].parts['Beam']

    #Extrude the sketch "s" over the depth "Beam_d"
    p.BaseSolidExtrude(sketch=s, depth=Beam_d)

    #Define elastic material    
    mdb.models['Model-%s'%(Beam_h[i])].Material(name='Steel')
    mdb.models['Model-%s'%(Beam_h[i])].materials['Steel'].Elastic(table=((Young_m, Poisson_r), ))

    #Define homogeneous solid section 
    mdb.models['Model-%s'%(Beam_h[i])].HomogeneousSolidSection(name='BeamSection', 
        material='Steel', thickness=None)

    #Create a set into part level, used for section assignment    
    p = mdb.models['Model-%s'%(Beam_h[i])].parts['Beam']
    c = p.cells
    cells = c.getSequenceFromMask(mask=('[#1 ]', ), )
    region = p.Set(cells=cells, name='Beam')
    p = mdb.models['Model-%s'%(Beam_h[i])].parts['Beam']

    #Assign the section to a defined "region"
    p.SectionAssignment(region=region, sectionName='BeamSection', offset=0.0, 
        offsetType=MIDDLE_SURFACE, offsetField='', 
        thicknessAssignment=FROM_SECTION)
    session.viewports['Viewport: 1'].partDisplay.setValues(sectionAssignments=OFF, 
        engineeringFeatures=OFF, mesh=ON)
    session.viewports['Viewport: 1'].partDisplay.meshOptions.setValues(
        meshTechnique=ON)
        
    p = mdb.models['Model-%s'%(Beam_h[i])].parts['Beam']
    p.DatumPlaneByPrincipalPlane(principalPlane=XYPLANE, offset=Z1[i])###first partition in xy plane
    p = mdb.models['Model-%s'%(Beam_h[i])].parts['Beam']
    p.DatumPlaneByPrincipalPlane(principalPlane=XYPLANE, offset=Beam_d-Z2[i])###2nd partition over xy plane which is total depth-z1
    p = mdb.models['Model-%s'%(Beam_h[i])].parts['Beam']
    
    c = p.cells
    pickedCells = c.getSequenceFromMask(mask=('[#1 ]', ), )
    d1 = p.datums
    p.PartitionCellByDatumPlane(datumPlane=d1[3], cells=pickedCells)
    p = mdb.models['Model-%s'%(Beam_h[i])].parts['Beam']
    c = p.cells
    pickedCells = c.getSequenceFromMask(mask=('[#1 ]', ), )
    d2 = p.datums
    p.PartitionCellByDatumPlane(datumPlane=d2[4], cells=pickedCells)
    
    #Apply general mesh seed    
    p = mdb.models['Model-%s'%(Beam_h[i])].parts['Beam']
    p.seedPart(size=mesh_size, deviationFactor=0.1, minSizeFactor=0.1)

    #Generate Mesh
    p = mdb.models['Model-%s'%(Beam_h[i])].parts['Beam']
    p.generateMesh()

    #Import part into the instance
    a = mdb.models['Model-%s'%(Beam_h[i])].rootAssembly
    session.viewports['Viewport: 1'].setValues(displayedObject=a)
    session.viewports['Viewport: 1'].assemblyDisplay.setValues(
        optimizationTasks=OFF, geometricRestrictions=OFF, stopConditions=OFF)
    a = mdb.models['Model-%s'%(Beam_h[i])].rootAssembly
    a.DatumCsysByDefault(CARTESIAN)
    p = mdb.models['Model-%s'%(Beam_h[i])].parts['Beam']
    a.Instance(name='Beam-1', part=p, dependent=ON)

    # a = mdb.models['Model-%s'%(Beam_h[i])].rootAssembly
    # f1 = a.instances['Beam-1'].faces
    # faces1 = f1.getSequenceFromMask(mask=('[#20 ]', ), )
    # a.Set(faces=faces1, name='BC_Set')

    # Create a surface set
    a = mdb.models['Model-%s'%(Beam_h[i])].rootAssembly
    s1 = a.instances['Beam-1'].faces
    #side1Faces1 = s1.findAt(((0.0,Beam_h[i]*0.5,(Beam_d-Z2[i]-Z1[i]), ))for pressure in the middle of the surface
    side1Faces1 = s1.findAt(((0.0,Beam_h[i]*0.5,(Z1[i]+0.1)), )) #pressure in the left surface and +0.1 is just a number to flip on right side
    
    a.Surface(side1Faces=side1Faces1, name='PressSurface')
    
 
    session.viewports['Viewport: 1'].assemblyDisplay.setValues(
        adaptiveMeshConstraints=ON)

    #Create analysis    
    mdb.models['Model-%s'%(Beam_h[i])].StaticStep(name='Step-1', previous='Initial', 
        timePeriod=1.0, maxNumInc=100, initialInc=1.0, minInc=1e-05, 
        maxInc=1.0, nlgeom=OFF)
    session.viewports['Viewport: 1'].assemblyDisplay.setValues(step='Step-1')
    session.viewports['Viewport: 1'].assemblyDisplay.setValues(loads=ON, bcs=ON, 
        predefinedFields=ON, connectors=ON, adaptiveMeshConstraints=OFF)

    #Define a region using a set    
    a = mdb.models['Model-%s'%(Beam_h[i])].rootAssembly
    region = a.surfaces['PressSurface']

    #Applied Load
    mdb.models['Model-%s'%(Beam_h[i])].Pressure(name='Load-1', createStepName='Step-1', 
        region=region, distributionType=UNIFORM, field='', magnitude=Pressure, 
        amplitude=UNSET)

    #Boundary conditions
    a = mdb.models['Model-%s'%(Beam_h[i])].rootAssembly  #access the root assembly
    e1 = a.instances['Beam-1'].edges               #access the edges,e1 contains all of the edges
    edges1 = e1.findAt(((0.0,-Beam_h[i]*0.5,0.0), ))#but we need only one edge so edge1. findAt needs exact coordinates x,y,z.of the edge
    
    region = a.Set(edges=edges1, name='Set-2')
    mdb.models['Model-%s'%(Beam_h[i])].DisplacementBC(name='BC_Set1', createStepName='Step-1', 
        region=region, u1=0.0, u2=0.0, u3=0.0, ur2=0.0, ur3=0.0, 
        amplitude=UNSET, fixed=OFF, distributionType=UNIFORM, fieldName='', 
        localCsys=None)
        
    a = mdb.models['Model-%s'%(Beam_h[i])].rootAssembly
    e1 = a.instances['Beam-1'].edges
    edges2 = e1.findAt(((0.0,-Beam_h[i]*0.5,Beam_d), ))       

    region = a.Set(edges=edges2, name='Set-3')
    mdb.models['Model-%s'%(Beam_h[i])].DisplacementBC(name='BC_Set2', createStepName='Step-1', 
        region=region, u1=0.0, u2=0.0, ur2=0.0, ur3=0.0, 
        amplitude=UNSET, fixed=OFF, distributionType=UNIFORM, fieldName='', 
        localCsys=None)
        
    mdb.Job(name='Model-Job-%s'%(Beam_h[i]), model='Model-%s'%(Beam_h[i]), contactPrint=OFF, description='', echoPrint=OFF, 
    explicitPrecision=SINGLE, historyPrint=OFF, 
    memory=50, memoryUnits=PERCENTAGE,  modelPrint=OFF, 
    multiprocessingMode=DEFAULT,  nodalOutputPrecision=SINGLE, 
    numCpus=1, numGPUs=0, scratch='', type=ANALYSIS, 
    userSubroutine='')

    mdb.jobs['Model-Job-%s'%(Beam_h[i])].writeInput()
``

``
#Then I used script to run the inputs
import os
os.system('abaqus -j Model-Job-20') 
``

1 Answers1

1

Basically, you want to delete the models and Abaqus files.
To delete the Abaqus model you can use:
del mdb.models['Model-1']
To delete the files created by Abaqus after running job, you can use the following:

import os
job_name = 'Model-Job-20'
files_ext = ['.jnl','.inp','.res','.lck','.dat','.msg','.sta','.fil','.sim',
              '.stt','.mdl','.prt','.ipm','.log','.com','.odb_f','.odb',]
for file_ex in files_ext:
    file_path = job_name + file_ex
    if os.path.exists(file_path):
        os.remove(file_path)
Satish Thorat
  • 584
  • 1
  • 5
  • 13
  • Wouldn't it be easier to create a new model in a new subfolder and delete the folder? Or , as an alternative, you can list not file extensions "to be deleted", but extensions "to be kept" – Roman Zh. Jul 02 '21 at 07:21
  • 1
    Yes. Creating separate folder for each model would be better. However deleting entire folder would not be desirable as we need odb and input file for our further use. – Satish Thorat Jul 02 '21 at 10:34
  • Hi,Thank you both for your answer. Is it possible that,in my first script my models will create the inputs one by one and every time the model will automatically deleted one by one? I can use....as @SatishThorat suggested, ``mdb.jobs['Job-%s'%(i+1)].writeInput() del mdb.models['Model-%s'%(Beam_h[i])]``. But it doesn't help me because it delete all the models together at the end. I want them to create 1st input and delete then 2nd input and delete. Please give me a guideline. – pinkey09 _CEN Jul 02 '21 at 11:05
  • See the thread I've sent you in a comment to the original post: you need to wait till the previous job is finished before deleting it. – Roman Zh. Jul 02 '21 at 12:37