DavidMercier / NIMS

A Matlab toolbox to plot and to analyze nanoindentation data (with conical indenters)

Home Page:http://nims.readthedocs.org/en/latest/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Film Thickness in FEA Python Script and Abaqus in different

qmrphd opened this issue · comments

Hi David,

I have noticed in tutorials/examples included in NIMS is that it does not return layer thickness what we put in MATLAB GUI e.g If put t1=200nm , t0=1500 and rest is the substrate and generates python script. When I visualize results in Abaqus it appears that film thickness are changed. Could you please have a look at it. I have tried to replace T0 and T1 but it does help. Please see below Images.

Kind Regards,

Qamar

GUI-nims
Abaqus_6 14_Picture-1
Abaqus_6 14_Picture-2

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Python script for use with Abaqus

#====================================================================================================================

AUTHOR: Qamar Hayat

DATE: Apr.27,2021 09:50

GENERATED WITH: NIMS_3.2 written by D. Mercier

See https://github.com/DavidMercier/NIMS

or http://fr.mathworks.com/matlabcentral/fileexchange/43392-davidmercier-nims

Modelling of indentation experiments with a (sphero-)conical indenter performed on a multilayer system

To run this procedure Python script, open Abaqus, then ==> File/Run Script

Units: Displacement in nm, Young's modulus in GPa ==> Load in nN.

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

NEW MODEL

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
from abaqus import *
from abaqusConstants import *
from caeModules import *
from driverUtils import executeOnCaeStartup

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

cliCommand("""session.journalOptions.setValues(replayGeometry=COORDINATE, recoverGeometry=COORDINATE)""")
backwardCompatibility.setValues(includeDeprecated=True, reportDeprecated=False)
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

PARAMETERS

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
myModel = mdb.Model(name='multilayer_model_2021-04-27')
indenter_used = 'Berko_Example'
h_ind = 0.100000
r_ind = 0.241421
a_ind = 45
sheet_Size = 9000.000000
step_Load = 'Loading'
ind_h = -200.000000
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

PARTS

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Analytical rigid indenter

s = myModel.ConstrainedSketch(name='profile', sheetSize=sheet_Size)
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])
s.ArcByCenterEnds(center=(0.0, r_ind), point1=(0.170711 , 0.070711), point2=(0.0, 0.0),direction=CLOCKWISE)
s.Line(point1=(0.170711 , 0.070711), point2=(3182.151226 , 3182.051226))
s.TangentConstraint(entity1=g[3], entity2=g[4])
p = myModel.Part(name=indenter_used, dimensionality=AXISYMMETRIC, type=ANALYTIC_RIGID_SURFACE)
p = myModel.parts[indenter_used]
p.AnalyticRigidSurf2DPlanar(sketch=s)
s.unsetPrimaryObject()
p = myModel.parts[indenter_used]
session.viewports['Viewport: 1'].setValues(displayedObject=p)
del myModel.sketches['profile']
p = myModel.parts[indenter_used]
v1, e, d1, n = p.vertices, p.edges, p.datums, p.nodes
p.ReferencePoint(point=v1.findAt(coordinates=(0.0, 0.0, 0.0)))

-------------------------------------------------------------------------------------------------------------------

Multilayer sample

s = myModel.ConstrainedSketch(name='profile', sheetSize=sheet_Size)
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])
s.rectangle(point1=(0.0, 0.000000), point2=(9000.000000, -500.000000))
s.CoincidentConstraint(entity1=v[0], entity2=g[2], addUndoState=False)
p = myModel.Part(name='Film_3', dimensionality=AXISYMMETRIC, type=DEFORMABLE_BODY)
p = myModel.parts['Film_3']
p.BaseShell(sketch=s)
s.unsetPrimaryObject()
p = myModel.parts['Film_3']
s = p.edges
side1Edges = s.findAt(((4500.000000, 0.000000, 0.0), ))
p.Surface(side1Edges=side1Edges, name='Surf-Top')
side1Edges = s.findAt(((4500.000000, -500.000000, 0.0), ))
p.Surface(side1Edges=side1Edges, name='Surf-Bottom')
a = myModel.rootAssembly
a.regenerate()
s = myModel.ConstrainedSketch(name='profile', sheetSize=sheet_Size)
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])
s.rectangle(point1=(0.0, -500.000000), point2=(9000.000000, -700.000000))
s.CoincidentConstraint(entity1=v[0], entity2=g[2], addUndoState=False)
p = myModel.Part(name='Film_2', dimensionality=AXISYMMETRIC, type=DEFORMABLE_BODY)
p = myModel.parts['Film_2']
p.BaseShell(sketch=s)
s.unsetPrimaryObject()
p = myModel.parts['Film_2']
s = p.edges
side1Edges = s.findAt(((4500.000000, -500.000000, 0.0), ))
p.Surface(side1Edges=side1Edges, name='Surf-Top')
side1Edges = s.findAt(((4500.000000, -700.000000, 0.0), ))
p.Surface(side1Edges=side1Edges, name='Surf-Bottom')
a = myModel.rootAssembly
a.regenerate()
s = myModel.ConstrainedSketch(name='profile', sheetSize=sheet_Size)
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])
s.rectangle(point1=(0.0, -700.000000), point2=(9000.000000, -2200.000000))
s.CoincidentConstraint(entity1=v[0], entity2=g[2], addUndoState=False)
p = myModel.Part(name='Film_1', dimensionality=AXISYMMETRIC, type=DEFORMABLE_BODY)
p = myModel.parts['Film_1']
p.BaseShell(sketch=s)
s.unsetPrimaryObject()
p = myModel.parts['Film_1']
s = p.edges
side1Edges = s.findAt(((4500.000000, -700.000000, 0.0), ))
p.Surface(side1Edges=side1Edges, name='Surf-Top')
side1Edges = s.findAt(((4500.000000, -2200.000000, 0.0), ))
p.Surface(side1Edges=side1Edges, name='Surf-Bottom')
a = myModel.rootAssembly
a.regenerate()
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

MATERIALS

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
myModel.Material(name='Diamond')
myModel.materials['Diamond'].Density(table=((1.0, ), ))
myModel.materials['Diamond'].Elastic(temperatureDependency=False,table=((1070.000000, 0.070000), ))
myModel.Material(name='Material_1')
myModel.materials['Material_1'].Density(table=((1.0, ), ))
myModel.materials['Material_1'].Elastic(temperatureDependency=False,table=((211.000000, 0.300000), ))
myModel.Material(name='Material_2')
myModel.materials['Material_2'].Density(table=((1.0, ), ))
myModel.materials['Material_2'].Elastic(temperatureDependency=False,table=((211.000000, 0.300000), ))
myModel.Material(name='Material_3')
myModel.materials['Material_3'].Density(table=((1.0, ), ))
myModel.materials['Material_3'].Elastic(temperatureDependency=False,table=((211.000000, 0.300000), ))
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

SECTIONS

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mySection = myModel.HomogeneousSolidSection(name='Section_indenter',material='Diamond')
mySection = myModel.HomogeneousSolidSection(name='Section_material_1',material='Material_1')
mySection = myModel.HomogeneousSolidSection(name='Section_material_2',material='Material_2')
mySection = myModel.HomogeneousSolidSection(name='Section_material_3',material='Material_3')
myModel.rootAssembly.regenerate()
p = myModel.parts['Film_3']
session.viewports['Viewport: 1'].setValues(displayedObject=p)
p = myModel.parts['Film_3']
f = p.faces
faces = f.findAt(((4500.000000, -250.000000, 0.0), ))
region = p.Set(faces=faces, name='Set_1')
p = myModel.parts['Film_3']
p.SectionAssignment(region=region, sectionName='Section_material_3', offset=0.0, offsetType=MIDDLE_SURFACE, offsetField='', thicknessAssignment=FROM_SECTION)
p = myModel.parts['Film_2']
session.viewports['Viewport: 1'].setValues(displayedObject=p)
p = myModel.parts['Film_2']
f = p.faces
faces = f.findAt(((4500.000000, -600.000000, 0.0), ))
region = p.Set(faces=faces, name='Set_1')
p = myModel.parts['Film_2']
p.SectionAssignment(region=region, sectionName='Section_material_2', offset=0.0, offsetType=MIDDLE_SURFACE, offsetField='', thicknessAssignment=FROM_SECTION)
p = myModel.parts['Film_1']
session.viewports['Viewport: 1'].setValues(displayedObject=p)
p = myModel.parts['Film_1']
f = p.faces
faces = f.findAt(((4500.000000, -1450.000000, 0.0), ))
region = p.Set(faces=faces, name='Set_1')
p = myModel.parts['Film_1']
p.SectionAssignment(region=region, sectionName='Section_material_1', offset=0.0, offsetType=MIDDLE_SURFACE, offsetField='', thicknessAssignment=FROM_SECTION)
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

ASSEMBLY

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
myAssembly = myModel.rootAssembly
p = myModel.parts['Film_1']
myAssembly.Instance(name='Film_1', part=p, dependent=OFF)
myAssembly = myModel.rootAssembly
p = myModel.parts['Film_2']
myAssembly.Instance(name='Film_2', part=p, dependent=OFF)
myAssembly = myModel.rootAssembly
p = myModel.parts['Film_3']
myAssembly.Instance(name='Film_3', part=p, dependent=OFF)
myAssembly = myModel.rootAssembly
p = myModel.parts[indenter_used]
myAssembly.Instance(name=indenter_used, part=p, dependent=OFF)
myAssembly = myModel.rootAssembly
myAssembly.regenerate()
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

STEPS

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
session.viewports['Viewport: 1'].setValues(displayedObject=myAssembly)
session.viewports['Viewport: 1'].assemblyDisplay.setValues(step='Initial')
myModel.StaticStep(name=step_Load, previous='Initial', description='Indentation step', maxNumInc=100000, initialInc=0.0001, minInc=1e-30, maxInc=0.02)
myModel.steps[step_Load].setValues(nlgeom=ON)
session.viewports['Viewport: 1'].assemblyDisplay.setValues(step=step_Load)
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

MESH

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
session.viewports['Viewport: 1'].assemblyDisplay.setValues(mesh=ON)
session.viewports['Viewport: 1'].assemblyDisplay.meshOptions.setValues(meshTechnique=ON)
a = myModel.rootAssembly
e1 = a.instances['Film_3'].edges
pickedEdges = e1.findAt(((0.0, -250.000000, 0.0), ))
a.seedEdgeByNumber(edges=pickedEdges, number=int(50.000000), constraint=FINER)
pickedEdges = e1.findAt(((9000.000000, -250.000000, 0.0), ))
a.seedEdgeByNumber(edges=pickedEdges, number=int(50.000000), constraint=FINER)
pickedEdges = e1.findAt(((4500.000000, 0.000000, 0.0), ))
a.seedEdgeByNumber(edges=pickedEdges, number=int(900.000000), constraint=FINER)
f = a.instances['Film_3'].faces
pickedRegions = f.findAt(((4500.000000, -250.000000, 0.0), ))
a.setMeshControls(regions=pickedRegions, elemShape=QUAD_DOMINATED)
e2 = a.instances['Film_2'].edges
pickedEdges = e2.findAt(((0.0, -600.000000, 0.0), ))
a.seedEdgeByNumber(edges=pickedEdges, number=int(20.000000), constraint=FINER)
pickedEdges = e2.findAt(((9000.000000, -600.000000, 0.0), ))
a.seedEdgeByNumber(edges=pickedEdges, number=int(20.000000), constraint=FINER)
pickedEdges = e2.findAt(((4500.000000, -500.000000, 0.0), ))
a.seedEdgeByNumber(edges=pickedEdges, number=int(900.000000), constraint=FINER)
f = a.instances['Film_2'].faces
pickedRegions = f.findAt(((4500.000000, -600.000000, 0.0), ))
a.setMeshControls(regions=pickedRegions, elemShape=QUAD_DOMINATED)
e3 = a.instances['Film_1'].edges
pickedEdges = e3.findAt(((0.0, -1450.000000, 0.0), ))
a.seedEdgeByNumber(edges=pickedEdges, number=int(150.000000), constraint=FINER)
pickedEdges = e3.findAt(((9000.000000, -1450.000000, 0.0), ))
a.seedEdgeByNumber(edges=pickedEdges, number=int(150.000000), constraint=FINER)
pickedEdges = e3.findAt(((4500.000000, -700.000000, 0.0), ))
a.seedEdgeByNumber(edges=pickedEdges, number=int(900.000000), constraint=FINER)
f = a.instances['Film_1'].faces
pickedRegions = f.findAt(((4500.000000, -1450.000000, 0.0), ))
a.setMeshControls(regions=pickedRegions, elemShape=QUAD_DOMINATED)
pickedEdges = e3.findAt(((4500.000000, -2200.000000, 0.0), ))
a.seedEdgeByNumber(edges=pickedEdges, number=int(900.000000), constraint=FINER)
partInstances =(a.instances['Film_1'], )
a.generateMesh(regions=partInstances)
partInstances =(a.instances['Film_2'], )
a.generateMesh(regions=partInstances)
partInstances =(a.instances['Film_3'], )
a.generateMesh(regions=partInstances)
elemType1 = mesh.ElemType(elemCode=CAX8R, elemLibrary=STANDARD)
elemType2 = mesh.ElemType(elemCode=CAX6M, elemLibrary=STANDARD)
f = a.instances['Film_3'].faces
faces = f.findAt(((4500.000000, -250.000000, 0.0), ))
pickedRegions =(faces, )
a.setElementType(regions=pickedRegions, elemTypes=(elemType1, elemType2))
f = a.instances['Film_2'].faces
faces = f.findAt(((4500.000000, -600.000000, 0.0), ))
pickedRegions =(faces, )
a.setElementType(regions=pickedRegions, elemTypes=(elemType1, elemType2))
f = a.instances['Film_1'].faces
faces = f.findAt(((4500.000000, -1450.000000, 0.0), ))
pickedRegions =(faces, )
a.setElementType(regions=pickedRegions, elemTypes=(elemType1, elemType2))
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

INTERACTIONS INDENTER-FILM

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
myModel.ContactProperty('Indenter-Film')
myModel.interactionProperties['Indenter-Film'].TangentialBehavior(formulation=FRICTIONLESS)
myModel.interactionProperties['Indenter-Film'].NormalBehavior(pressureOverclosure=HARD, allowSeparation=OFF, constraintEnforcementMethod=DEFAULT)
a = myModel.rootAssembly
s1 = a.instances[indenter_used].edges
side2Edges1 = s1.findAt(((0.170711, 0.070711, 0.0), ))
region1=regionToolset.Region(side2Edges=side2Edges1)
s1 = a.instances['Film_3'].edges
side1Edges1 = s1.findAt(((4500.000000, 0.0, 0.0), ))
region2=regionToolset.Region(side1Edges=side1Edges1)
myModel.SurfaceToSurfaceContactStd(name='Interaction_Indenter-Film', createStepName=step_Load, master=region1, slave=region2, sliding=FINITE, thickness=ON, interactionProperty='Indenter-Film', adjustMethod=NONE, initialClearance=OMIT, datumAxis=None, clearanceRegion=None)
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

INTERACTIONS FILM-FILM

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
myModel.ContactProperty('Film-Film')
myModel.interactionProperties['Film-Film'].TangentialBehavior(formulation=ROUGH)
myModel.interactionProperties['Film-Film'].NormalBehavior(pressureOverclosure=HARD, allowSeparation=OFF, constraintEnforcementMethod=DEFAULT)
a = myModel.rootAssembly
region1=a.instances['Film_3'].surfaces['Surf-Bottom']
region2=a.instances['Film_2'].surfaces['Surf-Top']
myModel.SurfaceToSurfaceContactStd(name='Interaction_Film3-Film2', createStepName=step_Load, master=region1, slave=region2, sliding=FINITE, thickness=ON, interactionProperty='Film-Film', adjustMethod=NONE, initialClearance=OMIT, datumAxis=None, clearanceRegion=None)
a = myModel.rootAssembly
region1=a.instances['Film_2'].surfaces['Surf-Bottom']
region2=a.instances['Film_1'].surfaces['Surf-Top']
myModel.SurfaceToSurfaceContactStd(name='Interaction_Film2-Film1', createStepName=step_Load, master=region1, slave=region2, sliding=FINITE, thickness=ON, interactionProperty='Film-Film', adjustMethod=NONE, initialClearance=OMIT, datumAxis=None, clearanceRegion=None)
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

BOUNDARIES CONDITIONS

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
session.viewports['Viewport: 1'].assemblyDisplay.setValues(loads=ON, bcs=ON, predefinedFields=ON, interactions=OFF, constraints=OFF, connectors=ON, engineeringFeatures=OFF)
a = myModel.rootAssembly
e1 = a.instances['Film_3'].edges
edges1 = e1.findAt(((0.0, -250.000000, 0.0), ))
region = regionToolset.Region(edges=edges1)
myModel.DisplacementBC(name='BC_Film_3', createStepName=step_Load, region=region, u1=0.0, u2=UNSET, ur3=UNSET, amplitude=UNSET, fixed=OFF, distributionType=UNIFORM, fieldName='', localCsys=None)
e1 = a.instances['Film_2'].edges
edges1 = e1.findAt(((0.0, -600.000000, 0.0), ))
region = regionToolset.Region(edges=edges1)
myModel.DisplacementBC(name='BC_Film_2', createStepName=step_Load, region=region, u1=0.0, u2=UNSET, ur3=UNSET, amplitude=UNSET, fixed=OFF, distributionType=UNIFORM, fieldName='', localCsys=None)
e1 = a.instances['Film_1'].edges
edges1 = e1.findAt(((0.0, -1450.000000, 0.0), ))
region = regionToolset.Region(edges=edges1)
myModel.DisplacementBC(name='BC_Film_1', createStepName=step_Load, region=region, u1=0.0, u2=UNSET, ur3=UNSET, amplitude=UNSET, fixed=OFF, distributionType=UNIFORM, fieldName='', localCsys=None)
e1 = a.instances['Film_1'].edges
edges1 = e1.findAt(((4500.000000, -2200.000000, 0.0), ))
region = regionToolset.Region(edges=edges1)
myModel.DisplacementBC(name='BC_Film_1_2', createStepName=step_Load, region=region, u1=0.0, u2=0.0, ur3=UNSET, amplitude=UNSET, fixed=OFF, distributionType=UNIFORM, fieldName='', localCsys=None)

-------------------------------------------------------------------------------------------------------------------

Indentation displacement

r1 = a.instances[indenter_used].referencePoints
refPoints1=(r1[2], )
region = regionToolset.Region(referencePoints=refPoints1)
myModel.DisplacementBC(name='BC_Indentation_step', createStepName=step_Load, region=region, u1=0.0, u2=ind_h, ur3=0.0, amplitude=UNSET, fixed=OFF, distributionType=UNIFORM, fieldName='', localCsys=None)
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

JOB

#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
session.viewports['Viewport: 1'].assemblyDisplay.setValues(loads=OFF, bcs=OFF, predefinedFields=OFF, connectors=OFF)
mdb.Job(name='Job1', model='multilayer_model_2021-04-27', description='Indentation of multilayer sample', 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='', multiprocessingMode=DEFAULT, numCpus=1, numDomains=2)

Thanks for reporting this bug. I updated the matlab script to generate python script for FE model. Please let me know if OK now.

it works perfectly now... thank you very much