Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
tutorials/bicrystal/generateInputFiles.py
Go to the documentation of this file.
1"""Generate bicrystal_48 with a prismatic-loop density in both grains."""
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')
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','1') # output frequency
35
36# Replace the template's restart setting and its misleading legacy comment.
37dcPath=Path('inputFiles')/DCfile
38dcLines=dcPath.read_text().splitlines(keepends=True)
39for index, line in enumerate(dcLines):
40 if line.split('=',1)[0].strip()=='startAtTimeStep':
41 dcLines[index]='startAtTimeStep=-1; # Restart step: -1 selects the last recorded step in F/F_0.txt; 0 starts at frame 0; a positive value selects that frame.\n'
42dcPath.write_text(''.join(dcLines))
43
44# Make a local copy of DD parameters file and modify that copy if necessary
45DDfile='DD.txt'
46DDfileTemplate=str(repository)+'/Library/DislocationDynamics/'+DDfile
47print("\033[1;32mCreating DDfile\033[0m")
48shutil.copy2(DDfileTemplate,'inputFiles/'+DDfile)
49setInputVariable('inputFiles/'+DDfile,'timeSteppingMethod','adaptive') # adaptive or fixed
50setInputVariable('inputFiles/'+DDfile,'dxMax','10') # max nodal displacement for when timeSteppingMethod=adaptive
51setInputVariable('inputFiles/'+DDfile,'use_velocityFilter','1') # don't filter velocity if noise is enabled
52setInputVariable('inputFiles/'+DDfile,'alphaLineTension','1.0') # dimensionless scale factor in for line tension forces
53setInputVariable('inputFiles/'+DDfile,'Lmin','25') # min segment length (in Burgers vector units)
54setInputVariable('inputFiles/'+DDfile,'Lmax','150') # max segment length (in Burgers vector units)
55setInputVariable('inputFiles/'+DDfile,'outputQuadraturePoints','0') # output quadrature data
56setInputVariable('inputFiles/'+DDfile,'glideSolverType','Galerkin') # type of glide solver, or none
57setInputVariable('inputFiles/'+DDfile,'climbSolverType','none') # type of clim solver, or none
58setInputVariable('inputFiles/'+DDfile,'crossSlipModel','0') # crossSlipModel
59
60# Make a local copy of material file, and modify that copy if necessary
61materialFile='W.txt';
62materialFileTemplate=str(repository)+'/Library/Materials/'+materialFile;
63print("\033[1;32mCreating materialFile\033[0m")
64shutil.copy2(materialFileTemplate,'inputFiles/'+materialFile)
65#setInputVariable('inputFiles/'+materialFile,'enabledSlipSystems','full<111>{110}')
66b_SI=getValueInFile('inputFiles/'+materialFile,'b_SI')
67
68# Make a local copy of ElasticDeformation file, and modify that copy if necessary
69elasticDeformatinoFile='ElasticDeformation.txt';
70elasticDeformatinoFileTemplate=str(repository)+'/Library/ElasticDeformation/'+elasticDeformatinoFile;
71print("\033[1;32mCreating elasticDeformatinoFile\033[0m")
72shutil.copy2(elasticDeformatinoFileTemplate,'inputFiles/'+elasticDeformatinoFile)
73setInputVector('inputFiles/'+elasticDeformatinoFile,'ExternalStress0',np.zeros(6),'applied stress')
74# Voigt order: 11, 22, 33, 12, 23, 13. Strain rate is per simulation time b/cs.
75strainRate33 = 1e-8
76setInputVector('inputFiles/'+elasticDeformatinoFile, 'ExternalStrainRate',
77 np.array([0.0, 0.0, strainRate33, 0.0, 0.0, 0.0]), 'applied strain rate in the global 33 direction')
78setInputVector('inputFiles/'+elasticDeformatinoFile, 'stiffnessRatio',
79 np.array([0.0, 0.0, 1e20, 0.0, 0.0, 0.0]), 'strain control in 33; zero-stress control in the other components')
80
81# Create polycrystal.txt using local material file
82meshFile='bicrystal_48.msh';
83meshFileTemplate=str(repository)+'/Library/Meshes/'+meshFile;
84print("\033[1;32mCreating polycrystalFile\033[0m")
85shutil.copy2(meshFileTemplate,'inputFiles/'+meshFile)
86pf=PolyCrystalFile(materialFile);
87pf.absoluteTemperature=300;
88pf.meshFile=meshFile
89# Grain 1: crystal and global coordinates aligned.
90pf.grain1globalX1 = np.array([1.0, 0.0, 0.0])
91pf.grain1globalX3 = np.array([0.0, 0.0, 1.0])
92pf.boxScaling=np.array([1e-6,1e-6,1e-6])/b_SI # scale of each mesh coordinate in Burgers vector units
93pf.X0=np.array([0,0,0]) # Mesh nodes X are mapped to x=F*(X-X0)
94pf.periodicFaceIDs=np.array([-1])
95# Grain 2's rational rotation (cos=4/5, sin=3/5) requires the
96# axial BCC repeat counts to be multiples of five for commensurate periods.
97# Preserve the intended approximately 1-micrometer scale in both grains.
98pf.compute()
99repeatCounts = 5 * np.maximum(1, np.round(pf.boxScaling / (5 * pf.boxEdgesLatticeLengths)))
100pf.boxScaling = repeatCounts * pf.boxEdgesLatticeLengths
101pf.write('inputFiles')
102# The mesh contains grains 1 and 2. Grain 2 is rotated 36.87 degrees about Y.
103with open('inputFiles/polycrystal.txt', 'a') as polycrystalFile:
104 polycrystalFile.write('C2G2=0.8 0 0.6\n 0 1 0\n -0.6 0 0.8; # grain 2 crystal-to-global rotation\n')
105
106# Random prismatic loops throughout both grains. Density is total dislocation
107# line length per unit volume; radii are in meters.
108microstructureName = 'prismaticLoopsDensity.txt'
109microstructureFile = 'inputFiles/' + microstructureName
110shutil.copy2(repository / 'Library/Microstructures/prismaticLoopsDensity.txt',
111 microstructureFile)
112setInputVariable(microstructureFile, 'targetDensity_SI', '1e13') # m^-2
113setInputVariable(microstructureFile, 'radiusDistributionMean_SI', '1e-7') # 100 nm
114setInputVariable(microstructureFile, 'radiusDistributionStd_SI', '0') # fixed radius
115setInputVector(microstructureFile, 'allowedGrainIDs', np.array([1, 2]), 'allow placement in both grains')
116setInputVariable(microstructureFile, 'allowedSlipSystemIDs', '-1') # all slip systems
117with open('inputFiles/initialMicrostructure.txt', 'w') as initialMicrostructureFile:
118 initialMicrostructureFile.write('microstructureFile=' + microstructureName + ';\n')
119
120# Generate the populated frame 0 with microstructureGenerator before running DDomp.
121print('Inputs ready: ' + str(Path.cwd()))
122print('Run microstructureGenerator, then DDomp, using this simulation folder.')
setInputVector(fileName, variable, newVal, newCom)
setInputVariable(fileName, variable, newVal)
getValueInFile(fileName, variable)