from abaqus import *
import os
os.chdir('D:\\SeekSook\\Data\\bridge-data\\output\\runs\\job_no_submit\\eae0c525db7e')
from abaqusConstants import *
import regionToolset
import mesh

modelName = 'CantileverBeamModel'
jobName = 'CantileverBeamJob'

L = 1000.0
H = 100.0
B = 50.0

E = 210000.0
nu = 0.30

loadMagnitude = 1.0
meshSize = 50.0
tol = 0.01

if modelName in mdb.models.keys():
    del mdb.models[modelName]

if jobName in mdb.jobs.keys():
    del mdb.jobs[jobName]

model = mdb.Model(name=modelName)

sketch = model.ConstrainedSketch(
    name='BeamSketch',
    sheetSize=2000.0
)

sketch.rectangle(
    point1=(0.0, 0.0),
    point2=(L, H)
)

part = model.Part(
    name='Beam',
    dimensionality=THREE_D,
    type=DEFORMABLE_BODY
)

part.BaseSolidExtrude(
    sketch=sketch,
    depth=B
)

del model.sketches['BeamSketch']

steel = model.Material(name='Steel')

steel.Elastic(
    table=((E, nu),)
)

model.HomogeneousSolidSection(
    name='BeamSection',
    material='Steel',
    thickness=None
)

allCells = part.cells[:]

part.Set(
    name='BeamCells',
    cells=allCells
)

part.SectionAssignment(
    region=part.sets['BeamCells'],
    sectionName='BeamSection'
)

assembly = model.rootAssembly

assembly.DatumCsysByDefault(CARTESIAN)

instance = assembly.Instance(
    name='Beam-1',
    part=part,
    dependent=ON
)

model.StaticStep(
    name='LoadStep',
    previous='Initial',
    timePeriod=1.0,
    initialInc=0.1,
    minInc=0.001,
    maxInc=0.2,
    maxNumInc=20,
    nlgeom=OFF
)

fixedFaces = instance.faces.getByBoundingBox(
    xMin=-tol,
    xMax=tol,
    yMin=-tol,
    yMax=H + tol,
    zMin=-tol,
    zMax=B + tol
)

assembly.Set(
    name='FixedEnd',
    faces=fixedFaces
)

model.EncastreBC(
    name='FixedBC',
    createStepName='Initial',
    region=assembly.sets['FixedEnd']
)

loadFaces = instance.faces.getByBoundingBox(
    xMin=L - tol,
    xMax=L + tol,
    yMin=-tol,
    yMax=H + tol,
    zMin=-tol,
    zMax=B + tol
)

assembly.Surface(
    name='LoadSurface',
    side1Faces=loadFaces
)

model.SurfaceTraction(
    name='EndLoad',
    createStepName='LoadStep',
    region=assembly.surfaces['LoadSurface'],
    magnitude=loadMagnitude,
    directionVector=(
        (0.0, 0.0, 0.0),
        (0.0, -1.0, 0.0)
    ),
    distributionType=UNIFORM,
    field='',
    localCsys=None,
    traction=GENERAL
)

if 'F-Output-1' in model.fieldOutputRequests.keys():
    model.fieldOutputRequests['F-Output-1'].setValues(
        variables=('S', 'E', 'U', 'RF')
    )
else:
    model.FieldOutputRequest(
        name='F-Output-1',
        createStepName='LoadStep',
        variables=('S', 'E', 'U', 'RF')
    )

part.setMeshControls(
    regions=part.cells[:],
    elemShape=HEX,
    technique=STRUCTURED
)

elemType = mesh.ElemType(
    elemCode=C3D8R,
    elemLibrary=STANDARD
)

meshRegions = (part.cells,)

part.setElementType(
    regions=meshRegions,
    elemTypes=(elemType,)
)

part.seedPart(
    size=meshSize,
    deviationFactor=0.1,
    minSizeFactor=0.1
)

part.generateMesh()

assembly.regenerate()

job = mdb.Job(
    name=jobName,
    model=modelName,
    description='Cantilever beam static bending analysis',
    type=ANALYSIS,
    memory=90,
    memoryUnits=PERCENTAGE,
    getMemoryFromAnalysis=True,
    explicitPrecision=SINGLE,
    nodalOutputPrecision=SINGLE,
    echoPrint=OFF,
    modelPrint=OFF,
    contactPrint=OFF,
    historyPrint=OFF,
    userSubroutine='',
    scratch='',
    resultsFormat=ODB,
    multiprocessingMode=DEFAULT,
    numCpus=4,
    numDomains=4,
    numGPUs=0
)

job.writeInput()

print('Cantilever beam model created successfully.')
print('Model: ' + modelName)
print('Job: ' + jobName)
print('Input file written successfully.')

# SEEKOOK_CAE_SAVE
mdb.saveAs(pathName='D:\\SeekSook\\Data\\bridge-data\\output\\runs\\job_no_submit\\eae0c525db7e\\abaqus_model.cae')
