Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
tutorials/inclusions/generateInputFiles.py
Go to the documentation of this file.
1"""Generate the uniform-load example with one rotated ellipsoidal inclusion."""
2import argparse
3import os
4from pathlib import Path
5import sys
6
7repository = Path(__file__).resolve().parents[2]
8parser = argparse.ArgumentParser(description=__doc__)
9parser.add_argument("--output-dir", type=Path, default=Path(__file__).resolve().parent,
10 help="Simulation folder (defaults to this tutorial folder).")
11args = parser.parse_args()
12args.output_dir.mkdir(parents=True, exist_ok=True)
13os.chdir(args.output_dir.resolve())
14sys.path.insert(0, str(repository / "python"))
15from modlibUtils import *
16
17
18# Create folder structure
19folders=['config','F','inputFiles']
20for x in folders:
21 if not os.path.exists(x):
22 os.makedirs(x)
23
24# Make a local copy of DefectiveCrystal parameters file and modify that copy if necessary
25DCfile='DefectiveCrystal.txt'
26DCfileTemplate=str(repository)+'/Library/DefectiveCrystal/'+DCfile
27print("\033[1;32mCreating DDfile\033[0m")
28shutil.copy2(DCfileTemplate,'inputFiles/'+DCfile)
29setInputVariable('inputFiles/'+DCfile,'physics','DislocationDynamics ElasticDeformation InclusionMicrostructure')
30setInputVariable('inputFiles/'+DCfile,'useFEM','0')
31setInputVariable('inputFiles/'+DCfile,'Nsteps','10000') # number of simulation steps
32setInputVariable('inputFiles/'+DCfile,'maxResolveSteps','0') # number of simulation steps
33setInputVariable('inputFiles/'+DCfile,'dtMax','1e25')
34setInputVariable('inputFiles/'+DCfile,'outputFrequency','10') # output frequency
35
36# Make a local copy of DD parameters file and modify that copy if necessary
37DDfile='DD.txt'
38DDfileTemplate=str(repository)+'/Library/DislocationDynamics/'+DDfile
39print("\033[1;32mCreating DDfile\033[0m")
40shutil.copy2(DDfileTemplate,'inputFiles/'+DDfile)
41setInputVariable('inputFiles/'+DDfile,'timeSteppingMethod','adaptive') # adaptive or fixed
42setInputVariable('inputFiles/'+DDfile,'dxMax','10') # max nodal displacement for when timeSteppingMethod=adaptive
43setInputVariable('inputFiles/'+DDfile,'use_velocityFilter','1') # don't filter velocity if noise is enabled
44setInputVariable('inputFiles/'+DDfile,'alphaLineTension','1.0') # dimensionless scale factor in for line tension forces
45setInputVariable('inputFiles/'+DDfile,'Lmin','25') # min segment length (in Burgers vector units)
46setInputVariable('inputFiles/'+DDfile,'Lmax','150') # max segment length (in Burgers vector units)
47setInputVariable('inputFiles/'+DDfile,'outputQuadraturePoints','1') # output quadrature data
48setInputVariable('inputFiles/'+DDfile,'glideSolverType','Galerkin') # type of glide solver, or none
49setInputVariable('inputFiles/'+DDfile,'climbSolverType','none') # type of clim solver, or none
50setInputVariable('inputFiles/'+DDfile,'crossSlipModel','0') # crossSlipModel
51
52# Make a local copy of material file, and modify that copy if necessary
53materialFile='W.txt';
54materialFileTemplate=str(repository)+'/Library/Materials/'+materialFile;
55print("\033[1;32mCreating materialFile\033[0m")
56shutil.copy2(materialFileTemplate,'inputFiles/'+materialFile)
57#setInputVariable('inputFiles/'+materialFile,'enabledSlipSystems','full<111>{110}')
58b_SI=getValueInFile('inputFiles/'+materialFile,'b_SI')
59
60# Make a local copy of ElasticDeformation file, and modify that copy if necessary
61elasticDeformatinoFile='ElasticDeformation.txt';
62elasticDeformatinoFileTemplate=str(repository)+'/Library/ElasticDeformation/'+elasticDeformatinoFile;
63print("\033[1;32mCreating elasticDeformatinoFile\033[0m")
64shutil.copy2(elasticDeformatinoFileTemplate,'inputFiles/'+elasticDeformatinoFile)
65setInputVector('inputFiles/'+elasticDeformatinoFile,'ExternalStress0',np.array([0.0,0.0,0.01,0.0,0.0,0.0]),'applied stress')
66
67# Create polycrystal.txt using local material file
68meshFile='unitCube24.msh';
69meshFileTemplate=str(repository)+'/Library/Meshes/'+meshFile;
70print("\033[1;32mCreating polycrystalFile\033[0m")
71shutil.copy2(meshFileTemplate,'inputFiles/'+meshFile)
72pf=PolyCrystalFile(materialFile);
73pf.absoluteTemperature=300;
74pf.meshFile=meshFile
75# Keep crystal and global coordinates aligned: C2G = identity.
76pf.grain1globalX1 = np.array([1.0, 0.0, 0.0])
77pf.grain1globalX3 = np.array([0.0, 0.0, 1.0])
78pf.boxScaling=np.array([1e-6,1e-6,1e-6])/b_SI # length of box edges in Burgers vector units
79pf.X0=np.array([0,0,0]) # Centering unitCube mesh. Mesh nodes X are mapped to x=F*(X-X0)
80pf.periodicFaceIDs=np.array([-1])
81pf.write('inputFiles')
82microstructureFiles = []
83
84microstructureFileID=1;
85microstructureName='prismaticLoopsDensity.txt';
86microstructureFileTemplate=str(repository)+'/Library/Microstructures/'+microstructureName;
87microstructureFileLocal='inputFiles/microstructureFile'+str(microstructureFileID)+'.txt'
88microstructureFiles.append('microstructureFile'+str(microstructureFileID)+'.txt')
89print("\033[1;32mCreating microstructureFile"+str(microstructureFileID)+"\033[0m")
90shutil.copy2(microstructureFileTemplate,microstructureFileLocal) # target filename is /dst/dir/file.ext
91setInputVariable(microstructureFileLocal,'targetDensity_SI','1e12')
92setInputVariable(microstructureFileLocal,'radiusDistributionMean_SI','1e-07')
93setInputVariable(microstructureFileLocal,'radiusDistributionStd_SI','0e-07')
94setInputVector(microstructureFileLocal,'allowedGrainIDs',np.array([-1]),'set of grain IDs where loops are allowed. Use -1 for all grains')
95setInputVector(microstructureFileLocal,'allowedSlipSystemIDs',np.array([-1]),'set of slip system IDs whose Burgers vector are allowed to be the prism axis. Use -1 for all slip systems')
96
97# Arithmetic semiaxis means/std in meters: full diameter 40 nm, thickness 3 nm.
98axesLognormalDistributionMean_SI = np.array([20e-9, 20e-9, 1.5e-9])
99axesLognormalDistributionStd_SI = np.zeros(3) # Circular bases, fixed dimensions.
100principalEigenDistortion = np.array([1e-2, -5e-3, 2e-2])
101# Individual precipitate example (disabled; uncomment to use it instead of density).
102# crystalAxes = np.array([[0., 0., 1.], [1., 0., 0.], [0., 1., 0.]])
103# crystalEigenDistortion = crystalAxes @ np.diag(principalEigenDistortion) @ crystalAxes.T
104# inclusionFile = 'inputFiles/ellipsoidalInclusionIndividual.txt'
105# shutil.copy2(repository / 'Library/Microstructures/ellipsoidalInclusionIndividual.txt',
106# inclusionFile)
107# setInputVector(inclusionFile, 'center', np.zeros(3), '[b] center in simulation coordinates')
108# setInputMatrix(inclusionFile, 'crystalAxes_SI', crystalAxes @ np.diag(axesLognormalDistributionMean_SI))
109# setInputVector(inclusionFile, 'crystalEigenDistortion', crystalEigenDistortion.flatten(),
110# 'dimensionless crystal-frame tensor: 11 12 13 21 22 23 31 32 33')
111# setInputVariable(inclusionFile, 'velocityReductionFactor', '1.0')
112# setInputVariable(inclusionFile, 'phaseID', '0')
113# setInputVariable(inclusionFile, 'allowOverlap', '0')
114# setInputVariable(inclusionFile, 'allowOutside', '0')
115# microstructureFiles.append('ellipsoidalInclusionIndividual.txt')
116
117# Three EllipsoidalInclusionDensitySpecifications, one for each {100} platelet base.
118# Diameter = 40 nm and full thickness = 3 nm (oblate ellipsoids).
119# Zero size spread keeps both in-plane semiaxes exactly equal, hence circular bases.
120totalTargetDensity = 20e19 # [m^-3], split equally among the three families
121patternVector_SI = np.zeros(3) # No positional plane pattern.
122# Columns: first in-plane axis, second in-plane axis, platelet normal.
123plateletFamilies = [
124 ('100', np.array([[0., 0., 1.], [1., 0., 0.], [0., 1., 0.]])),
125 ('010', np.array([[0., 1., 0.], [0., 0., 1.], [1., 0., 0.]])),
126 ('001', np.eye(3)),
127]
128for family, crystalAxes in plateletFamilies:
129 crystalEigenDistortion = crystalAxes @ np.diag(principalEigenDistortion) @ crystalAxes.T
130 inclusionName = 'ellipsoidalInclusionsDensity_' + family + '.txt'
131 inclusionFile = 'inputFiles/' + inclusionName
132 shutil.copy2(repository / 'Library/Microstructures/ellipsoidalInclusionsDensity.txt',
133 inclusionFile)
134 setInputVariable(inclusionFile, 'targetDensity', str(totalTargetDensity / len(plateletFamilies)))
135 setInputMatrix(inclusionFile, 'crystalAxes', crystalAxes)
136 setInputVector(inclusionFile, 'axesLognormalDistributionMean_SI', axesLognormalDistributionMean_SI,
137 '[m] arithmetic mean semiaxis lengths')
138 setInputVector(inclusionFile, 'axesLognormalDistributionStd_SI', axesLognormalDistributionStd_SI,
139 'zero spread: circular 40 nm diameter, 3 nm thickness')
140 setInputVector(inclusionFile, 'patternVector_SI', patternVector_SI, 'zero: no positional pattern')
141 setInputVector(inclusionFile, 'crystalEigenDistortion', crystalEigenDistortion.flatten(),
142 'dimensionless crystal-frame tensor: 11 12 13 21 22 23 31 32 33')
143 setInputVariable(inclusionFile, 'velocityReductionFactor', '1.0')
144 setInputVariable(inclusionFile, 'phaseID', '0')
145 setInputVariable(inclusionFile, 'allowOverlap', '0')
146 setInputVariable(inclusionFile, 'allowOutside', '0')
147 setInputVariable(inclusionFile, 'maxAttempts', '10000')
148 microstructureFiles.append(inclusionName)
149
150print("\033[1;32mCreating initialMicrostructureFile\033[0m")
151with open('inputFiles/initialMicrostructure.txt', "w") as initialMicrostructureFile:
152 for micrFile in microstructureFiles:
153 initialMicrostructureFile.write('microstructureFile='+micrFile+';\n')
setInputVector(fileName, variable, newVal, newCom)
setInputVariable(fileName, variable, newVal)
setInputMatrix(fileName, variable, newVal)