
from abaqus import mdb
from abaqusConstants import OFF
import os as _sw_os
_sw_before_jobs = {str(n): mdb.jobs[n] for n in mdb.jobs.keys()}
_sw_written_jobs = []
def _sw_record_write(_job, *args, **kwargs):
    _answer = _job.writeInput(*args, **kwargs)
    _name = str(getattr(_job, 'name', ''))
    if not _name or _name not in mdb.jobs.keys():
        _names = [str(n) for n in mdb.jobs.keys() if mdb.jobs[n] is _job]
        if len(_names) != 1:
            raise RuntimeError('Cannot identify the job which wrote the INP')
        _name = _names[0]
    _sw_written_jobs.append((_name, _sw_os.path.abspath(_name + '.inp')))
    return _answer

from abaqus import *
from abaqusConstants import *
import regionToolset
import mesh
modelName = 'BeamFrequency3D'
jobName = 'BeamFrequency3D_Job'
length = 1.0
width = 0.05
height = 0.05
young = 210000000000.0
poisson = 0.3
density = 7850.0
meshSize = 0.0125
if jobName in mdb.jobs:
    del mdb.jobs[jobName]
if modelName in mdb.models:
    del mdb.models[modelName]
model = mdb.Model(name=modelName)
sketch = model.ConstrainedSketch(name='BeamProfile', sheetSize=2.0)
sketch.rectangle(point1=(0.0, 0.0), point2=(width, height))
part = model.Part(name='Beam', dimensionality=THREE_D, type=DEFORMABLE_BODY)
part.BaseSolidExtrude(sketch=sketch, depth=length)
del model.sketches['BeamProfile']
material = model.Material(name='Steel')
material.Elastic(table=((young, poisson),))
material.Density(table=((density,),))
model.HomogeneousSolidSection(name='BeamSection', material='Steel', thickness=None)
part.Set(name='BeamCells', cells=part.cells[:])
part.SectionAssignment(region=part.sets['BeamCells'], sectionName='BeamSection')
part.setMeshControls(regions=part.cells[:], elemShape=HEX, technique=STRUCTURED)
elementType = mesh.ElemType(elemCode=C3D8R, elemLibrary=STANDARD, hourglassControl=ENHANCED)
part.setElementType(regions=(part.cells[:],), elemTypes=(elementType,))
part.seedPart(size=meshSize, deviationFactor=0.1, minSizeFactor=0.1)
part.generateMesh()
assembly = model.rootAssembly
assembly.DatumCsysByDefault(CARTESIAN)
instance = assembly.Instance(name='Beam-1', part=part, dependent=ON)
fixedFace = instance.faces.findAt(((width / 2.0, height / 2.0, 0.0),))
assembly.Set(name='FixedEnd', faces=fixedFace)
model.EncastreBC(name='FixedEndBC', createStepName='Initial', region=assembly.sets['FixedEnd'])
model.FrequencyStep(name='FirstThreeModes', previous='Initial', eigensolver=LANCZOS, numEigen=3)
for requestName in list(model.fieldOutputRequests.keys()):
    del model.fieldOutputRequests[requestName]
model.FieldOutputRequest(name='ModeDisplacement', createStepName='FirstThreeModes', variables=('U',))
assembly.regenerate()
job = mdb.Job(name=jobName, model=modelName, type=ANALYSIS, numCpus=4, numDomains=4, memory=90, memoryUnits=PERCENTAGE, nodalOutputPrecision=FULL)
mdb.saveAs(pathName=jobName + '.cae')
_sw_record_write(job, consistencyChecking=ON)
print('SOUTHWEITION_JOB_PREPARED')

if not _sw_written_jobs:
    _sw_candidates = [n for n in mdb.jobs.keys() if n not in _sw_before_jobs or mdb.jobs[n] is not _sw_before_jobs[n]]
    if len(_sw_candidates) != 1:
        raise RuntimeError('Cannot identify this script job: call writeInput() on exactly the intended job')
    _sw_record_write(mdb.jobs[_sw_candidates[0]], consistencyChecking=OFF)
_sw_name, _sw_inp = _sw_written_jobs[-1]
if not _sw_os.path.isfile(_sw_inp):
    raise RuntimeError('This script did not produce its INP: ' + _sw_inp)
print('SOUTHWEITION_CWD ' + _sw_os.path.dirname(_sw_inp))
print('SOUTHWEITION_JOB ' + _sw_name)
print('SOUTHWEITION_MODEL ' + str(getattr(mdb.jobs[_sw_name], 'model', '')))
print('SOUTHWEITION_INP ' + _sw_inp)
print('SOUTHWEITION_JOB_PREPARED')

