# -*- coding: mbcs -*-
from abaqus import *
from abaqusConstants import *
import regionToolset
import mesh

modelName = 'DBFSW_NoFeature_Model'
jobName = 'DBFSW_NoFeature_Model'

# parameters
lx = 120.0
ly = 80.0
h = 6.0

# clean model
if modelName in mdb.models.keys():
    del mdb.models[modelName]

model = mdb.Model(name=modelName)

# ---------------- Geometry ----------------
# only one sketch and one extrusion
sk = model.ConstrainedSketch(
    name='BaseSketch',
    sheetSize=200.0)

sk.rectangle(
    point1=(0.0, 0.0),
    point2=(lx, ly))

part = model.Part(
    name='Plate',
    dimensionality=THREE_D,
    type=DEFORMABLE_BODY)

part.BaseSolidExtrude(
    sketch=sk,
    depth=h)

# ---------------- Material ----------------
mat = model.Material(name='FSW_Material')

mat.Density(
    table=((7.8e-9,),))

mat.Conductivity(
    table=((45.0,),))

mat.SpecificHeat(
    table=((500.0,),))

section = model.HomogeneousSolidSection(
    name='ThermalSection',
    material='FSW_Material')

part.SectionAssignment(
    region=regionToolset.Region(
        cells=part.cells),
    sectionName='ThermalSection')

# ---------------- Assembly ----------------
asm = model.rootAssembly
asm.DatumCsysByDefault(CARTESIAN)

inst = asm.Instance(
    name='PlateInstance',
    part=part,
    dependent=ON)

# ---------------- Step ----------------
model.HeatTransferStep(
    name='HeatStep',
    previous='Initial',
    timePeriod=20.0,
    initialInc=0.2,
    minInc=1e-5,
    maxInc=1.0,
    maxNumInc=100,
    deltmx=100.0)

# initial temperature
model.Temperature(
    name='InitialTemperature',
    createStepName='Initial',
    region=regionToolSet.Region(cells=inst.cells),
    distributionType=UNIFORM,
    magnitudes=(25.0,))

# ---------------- Heat surface ----------------
topFaces = []

for face in inst.faces:
    if face.pointOn[0][2] > h - 0.001:
        topFaces.append(face)

asm.Surface(
    name='HeatSurface',
    side1Faces=tuple(topFaces))

# equivalent double shoulder heat source
model.SurfaceHeatFlux(
    name='DoubleShoulderHeat',
    createStepName='HeatStep',
    region=asm.surfaces['HeatSurface'],
    magnitude=2.5)

# cooling
model.FilmCondition(
    name='Cooling',
    createStepName='HeatStep',
    surface=asm.surfaces['HeatSurface'],
    definition=EMBEDDED_COEFF,
    filmCoeff=0.02,
    sinkTemperature=25.0)

# ---------------- Mesh ----------------
part.seedPart(
    size=2.0)

elemType = mesh.ElemType(
    elemCode=DC3D8,
    elemLibrary=STANDARD)

part.setElementType(
    regions=(part.cells,),
    elemTypes=(elemType,))

part.generateMesh()

# ---------------- Job ----------------
job = mdb.Job(
    name=jobName,
    model=modelName,
    numCpus=4,
    numDomains=4)

job.writeInput()
print('SOUTHWEITION_JOB_PREPARED')
import os as _sw_os
try:
    print('SOUTHWEITION_CWD ' + _sw_os.getcwd())
    def _sw_job_model(_job):
        _model = getattr(_job, 'model', '')
        try:
            return str(_model.name)
        except Exception:
            return str(_model or '')
    _sw_models = list(mdb.models.keys())
    _sw_latest_model = _sw_models[-1] if _sw_models else ''
    _sw_name = ''
    for _cand in reversed(list(mdb.jobs.keys())):
        if _sw_latest_model and _sw_job_model(mdb.jobs[_cand]) == _sw_latest_model:
            _sw_name = str(_cand)
            break
    if not _sw_name:
        _sw_names = list(mdb.jobs.keys())
        if _sw_names:
            _sw_name = str(_sw_names[-1])
    if _sw_name:
        try:
            mdb.jobs[_sw_name].setValues(numCpus=4, numDomains=4)
        except Exception:
            pass
        mdb.jobs[_sw_name].writeInput(consistencyChecking=OFF)
        print('SOUTHWEITION_JOB ' + str(_sw_name))
        print('SOUTHWEITION_MODEL ' + str(_sw_latest_model))
        print('SOUTHWEITION_INP ' + _sw_os.path.abspath(str(_sw_name) + '.inp'))
    print('SOUTHWEITION_JOB_PREPARED')
except Exception:
    print('SOUTHWEITION_JOB_PREPARED')

