# Skript zur Erstellung einer Abaqus Simu eines Brinelltests
# von Pouria
#
#Dieses Skript sollte sich am besten im /temp oder Home-Ordner befinden, muss aber nicht
#

# IMPORTS
from abaqus import *
from abaqusConstants import *
from caeModules import *
from driverUtils import executeOnCaeStartup
import os

# VARIABLEN
workDir = r'C:\temp'
bauteilBreite = 20
bauteilHoehe = 10
density = 7.85e-09
E = [2100, 2100, 1500, 1500]
nu = 0.3
radius = 5
frictionCoeff = 0.1
deltaT = 1
bcU2 = 1
bcV2 = -bcU2 / deltaT
meshBauteil = [1, 0.5, 1, 0.5]
meshBrinell = 0.5
jobName = 'myJob'+str(jCounter)

# ZIELVERZEICHNIS
os.chdir(workDir)

# RESET DES MODELLS
Mdb()

# PART BAUTEIL
# SKETCH BAUTEIL

s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__', 
    sheetSize=200.0)
g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints
s.sketchOptions.setValues(viewStyle=AXISYM)
s.setPrimaryObject(option=STANDALONE)
s.ConstructionLine(point1=(0.0, -100.0), point2=(0.0, 100.0))
s.FixedConstraint(entity=g[2])
session.viewports['Viewport: 1'].view.setValues(nearPlane=78.5166, 
    farPlane=110.045, width=101.5, height=133.283, cameraPosition=(21.7222, 
    24.3534, 94.2809), cameraTarget=(21.7222, 24.3534, 0))
s.rectangle(point1=(0.0, 0.0), point2=(bauteilBreite, -bauteilHoehe))
s.CoincidentConstraint(entity1=v[0], entity2=g[2], addUndoState=False)
p = mdb.models['Model-1'].Part(name='Bauteil', dimensionality=AXISYMMETRIC, 
    type=DEFORMABLE_BODY)
p = mdb.models['Model-1'].parts['Bauteil']
p.BaseShell(sketch=s)
s.unsetPrimaryObject()
p = mdb.models['Model-1'].parts['Bauteil']
session.viewports['Viewport: 1'].setValues(displayedObject=p)
del mdb.models['Model-1'].sketches['__profile__']

# SETS BAUTEIL

p = mdb.models['Model-1'].parts['Bauteil']
e = p.edges
edges = e.getSequenceFromMask(mask=('[#1 ]', ), )
p.Set(edges=edges, name='setOben')
edges = e.getSequenceFromMask(mask=('[#4 ]', ), )
p.Set(edges=edges, name='setUnten')
edges = e.getSequenceFromMask(mask=('[#2 ]', ), )
p.Set(edges=edges, name='setLinks')
edges = e.getSequenceFromMask(mask=('[#8 ]', ), )
p.Set(edges=edges, name='setRechts')
f = p.faces
faces = f.getSequenceFromMask(mask=('[#1 ]', ), )
p.Set(faces=faces, name='setKoerper')

# SURF SLAVE

s = mdb.models['Model-1'].parts['Bauteil'].edges
side1Edges = s.getSequenceFromMask(mask=('[#1 ]', ), )
mdb.models['Model-1'].parts['Bauteil'].Surface(side1Edges=side1Edges, name='surfSlave')

# MATERIAL BAUTEIL

mdb.models['Model-1'].Material(name='MatExp')
mdb.models['Model-1'].materials['MatExp'].Density(table=((density, ), ))
mdb.models['Model-1'].materials['MatExp'].Elastic(table=((E[jCounter], nu), ))
mdb.models['Model-1'].materials['MatExp'].Plastic(table=((91.0, 0.0), (220.0, 0.02), (500.0, 0.98)))

# SECTION BAUTEIL

mdb.models['Model-1'].HomogeneousSolidSection(name='Section-1', 
    material='MatExp', thickness=None)
region = mdb.models['Model-1'].parts['Bauteil'].sets['setKoerper']
mdb.models['Model-1'].parts['Bauteil'].SectionAssignment(region=region, sectionName='Section-1', offset=0.0, 
    offsetType=MIDDLE_SURFACE, offsetField='', 
    thicknessAssignment=FROM_SECTION)

# PART BRINELL
# SKETCH BRINELL

s1 = mdb.models['Model-1'].ConstrainedSketch(name='__profile__', 
    sheetSize=200.0)
g, v, d, c = s1.geometry, s1.vertices, s1.dimensions, s1.constraints
s1.sketchOptions.setValues(viewStyle=AXISYM)
s1.setPrimaryObject(option=STANDALONE)
s1.ConstructionLine(point1=(0.0, -100.0), point2=(0.0, 100.0))
s1.FixedConstraint(entity=g[2])
session.viewports['Viewport: 1'].view.setValues(cameraPosition=(6.21491, 
    5.91238, 94.2809), cameraTarget=(6.21491, 5.91238, 0))
session.viewports['Viewport: 1'].view.setValues(nearPlane=85.7949, 
    farPlane=102.767, width=54.6377, height=71.7468, cameraPosition=(6.0023, 
    6.84719, 94.2809), cameraTarget=(6.0023, 6.84719, 0))
s1.ArcByCenterEnds(center=(0.0, radius), point1=(0.0, 0.0), point2=(radius, radius), 
    direction=COUNTERCLOCKWISE)
s1.CoincidentConstraint(entity1=v[2], entity2=g[2], addUndoState=False)
s1.CoincidentConstraint(entity1=v[0], entity2=g[2], addUndoState=False)
p = mdb.models['Model-1'].Part(name='brinell', dimensionality=AXISYMMETRIC, 
    type=DISCRETE_RIGID_SURFACE)
p = mdb.models['Model-1'].parts['brinell']
p.BaseWire(sketch=s1)
s1.unsetPrimaryObject()
p = mdb.models['Model-1'].parts['brinell']
session.viewports['Viewport: 1'].setValues(displayedObject=p)
del mdb.models['Model-1'].sketches['__profile__']

# SURF MASTER

p = mdb.models['Model-1'].parts['brinell']
s = p.edges
side2Edges = s.getSequenceFromMask(mask=('[#1 ]', ), )
p.Surface(side2Edges=side2Edges, name='surfMaster')

# REFERENCE POINT

v1, e, d1, n = p.vertices, p.edges, p.datums, p.nodes
p.ReferencePoint(point=p.InterestingPoint(edge=e[0], rule=CENTER))

# ASSEMBLY

a = mdb.models['Model-1'].rootAssembly
a.DatumCsysByThreePoints(coordSysType=CYLINDRICAL, origin=(0.0, 0.0, 0.0), 
    point1=(1.0, 0.0, 0.0), point2=(0.0, 0.0, -1.0))
a.Instance(name='Bauteil-1', part=mdb.models['Model-1'].parts['Bauteil'], dependent=ON)
a.Instance(name='brinell-1', part=mdb.models['Model-1'].parts['brinell'], dependent=ON)

# STEP

mdb.models['Model-1'].StaticStep(name='deform', previous='Initial', maxNumInc=10000, nlgeom=ON)
mdb.models['Model-1'].steps['deform'].setValues(timePeriod=deltaT, initialInc=2e-05, 
    minInc=2e-05, maxInc=1)
session.viewports['Viewport: 1'].assemblyDisplay.setValues(step='deform')

# INTERACTION PROPERTY

session.viewports['Viewport: 1'].assemblyDisplay.setValues(interactions=ON, 
    constraints=ON, connectors=ON, engineeringFeatures=ON, 
    adaptiveMeshConstraints=OFF)
mdb.models['Model-1'].ContactProperty('interProp')
mdb.models['Model-1'].interactionProperties['interProp'].TangentialBehavior(
    formulation=PENALTY, directionality=ISOTROPIC, slipRateDependency=OFF, 
    pressureDependency=OFF, temperatureDependency=OFF, dependencies=0, table=((
    frictionCoeff, ), ), shearStressLimit=None, maximumElasticSlip=FRACTION, 
    fraction=0.005, elasticSlipStiffness=None)
mdb.models['Model-1'].interactionProperties['interProp'].NormalBehavior(
    pressureOverclosure=HARD, allowSeparation=ON, 
    constraintEnforcementMethod=DEFAULT)

# INTERACTION

a = mdb.models['Model-1'].rootAssembly
region1=a.instances['brinell-1'].surfaces['surfMaster']
region2=a.instances['Bauteil-1'].surfaces['surfSlave']
mdb.models['Model-1'].SurfaceToSurfaceContactStd(name='interSlaveMaster', 
    createStepName='deform', master=region1, slave=region2, sliding=FINITE, 
    thickness=ON, interactionProperty='interProp', adjustMethod=NONE, 
    initialClearance=OMIT, datumAxis=None, clearanceRegion=None)

# BOUNDARY CONDITIONS

a = mdb.models['Model-1'].rootAssembly
region = a.instances['Bauteil-1'].sets['setUnten']
mdb.models['Model-1'].EncastreBC(name='encast', createStepName='Initial', 
    region=region, localCsys=None)
a = mdb.models['Model-1'].rootAssembly
r1 = a.instances['brinell-1'].referencePoints
refPoints1=(r1[3], )
region = regionToolset.Region(referencePoints=refPoints1)
mdb.models['Model-1'].VelocityBC(name='brinellBC', createStepName='deform', 
    region=region, v1=0.0, v2=bcV2, vr3=0.0, amplitude=UNSET, localCsys=None, 
    distributionType=UNIFORM, fieldName='')
a = mdb.models['Model-1'].rootAssembly
region = a.instances['Bauteil-1'].sets['setLinks']
mdb.models['Model-1'].XsymmBC(name='xSymm', createStepName='Initial', 
    region=region, localCsys=None)

# MESH BAUTEIL

p = mdb.models['Model-1'].parts['Bauteil']
pickedRegions = mdb.models['Model-1'].parts['Bauteil'].faces.getSequenceFromMask(mask=('[#1 ]', ), )
p.setMeshControls(regions=pickedRegions, elemShape=QUAD, technique=STRUCTURED)
p.seedPart(size=meshBauteil[jCounter], deviationFactor=0.1, minSizeFactor=0.1)
p.generateMesh()

# MESH BRINELL

p = mdb.models['Model-1'].parts['brinell']
p.seedPart(size=meshBrinell, deviationFactor=0.1, minSizeFactor=0.1)
p.generateMesh()

# INPUT DATEI SCHREIBEN

#mdb.jobs[jobName].writeInput(consistencyChecking=OFF)

# MODEL AUS INPUT GENERIEREN
#mdb.ModelFromInputFile(name='myJob', inputFileName='C:/temp/myJob.inp')

# JOB
mdb.Job(name=jobName, model='Model-1', description='', type=ANALYSIS, 
    atTime=None, waitMinutes=0, waitHours=0, queue=None, 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=1, 
    numGPUs=0)
#mdb.jobs['myJob'].submit(consistencyChecking=OFF, datacheckJob=True)
#mdb.jobs['myJob'].waitForCompletion()
mdb.jobs[jobName].submit(consistencyChecking=OFF)
mdb.jobs[jobName].waitForCompletion()

# MODELLSPEICHERUNG
#mdb.saveAs(pathName='C:/temp/bspModell')