Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
tutorials/clusterDynamicsFEM/generateInputFiles.py
Go to the documentation of this file.
1import sys
2import os
3from pathlib import Path
4
5tutorial = Path(__file__).resolve().parent
6repository = tutorial.parents[1]
7os.chdir(tutorial)
8sys.path.insert(0, str(repository / "python"))
9from modlibUtils import *
10
11# Cluster-dynamics-only input generator (current MoDELib input layout, fully XYZ-periodic ten-grain example)
12
13# Create folder structure
14folders=['config','F','inputFiles']
15for x in folders:
16 if not os.path.exists(x):
17 os.makedirs(x)
18
19# Make a local copy of DefectiveCrystal parameters file and modify that copy if necessary
20DCfile='DefectiveCrystal.txt'
21DCfileTemplate='../../Library/DefectiveCrystal/'+DCfile
22print("\033[1;32mCreating DCfile\033[0m")
23shutil.copy2(DCfileTemplate,'inputFiles/'+DCfile)
24setInputVariable('inputFiles/'+DCfile,'physics','ClusterDynamics') # add 'ElasticDeformation' and/or 'DislocationDynamics' to couple
25setInputVariable('inputFiles/'+DCfile,'useFEM','1') # required for spatial (FEM) cluster dynamics
26setInputVariable('inputFiles/'+DCfile,'Nsteps','120') # number of simulation steps
27setInputVariable('inputFiles/'+DCfile,'maxResolveSteps','0') # no re-solve needed with cluster dynamics alone
28setInputVariable('inputFiles/'+DCfile,'dtMax','3.4e18') # time step (in b/cs); CD-only runs always use dtMax
29setInputVariable('inputFiles/'+DCfile,'outputFrequency','1') # output frequency
30
31# Make a local copy of material file, and modify that copy if necessary
32materialFile='Zr4_Fitted.txt';
33materialFileTemplate='../../Library/Materials/'+materialFile;
34print("\033[1;32mCreating materialFile\033[0m")
35shutil.copy2(materialFileTemplate,'inputFiles/'+materialFile)
36setInputVariable('inputFiles/'+materialFile,'enabledSlipSystems','<a>{basal} <a>{prismatic}')
37
38# Make a local copy of ClusterDynamics file, and modify that copy if necessary
39clusterDynamicsFile='ClusterDynamics.txt';
40clusterDynamicsFileTemplate='../../Library/ClusterDynamics/'+clusterDynamicsFile;
41print("\033[1;32mCreating clusterDynamicsFile\033[0m")
42shutil.copy2(clusterDynamicsFileTemplate,'inputFiles/'+clusterDynamicsFile)
43setInputVariable('inputFiles/'+clusterDynamicsFile,'useClusterDynamicsFEM','1') # 1=spatial FEM solver, 0=uniform controllers
44
45# Create polycrystal.txt using local material file
46meshFile='poly10_periodicXYZ.msh';
47meshFileTemplate='../../Library/Meshes/'+meshFile;
48print("\033[1;32mCreating polycrystalFile\033[0m")
49shutil.copy2(meshFileTemplate,'inputFiles/'+meshFile)
50pf=PolyCrystalFile(materialFile);
51pf.absoluteTemperature=553;
52pf.meshFile=meshFile
53pf.grain1globalX1=np.array([1,0,0]) # global x1 axis. Overwritten if alignToSlipSystem0=true
54pf.grain1globalX3=np.array([0,0,1]) # global x3 axis. Overwritten if alignToSlipSystem0=true
55pf.boxEdges=np.array([[1,0,0],[0,1,0],[0,0,1]]) # i-throw is the direction of i-th box edge
56pf.boxScaling=np.array([3093,3093,3093]) # must be a vector of integers
57pf.X0=np.array([0,0,0]) # Centering unitCube mesh. Mesh nodes X are mapped to x=F*(X-X0)
58pf.periodicFaceIDs=np.array([-1]) # activate all three detected periodic directions
59pf.write('inputFiles')
60# Keep the original crystal orientation in every grain. Grain IDs still define
61# internal and cross-grain periodic GB sinks; same-grain seams are not sinks.
62with open('inputFiles/polycrystal.txt', 'a') as polycrystal:
63 for grain in range(2, 11):
64 polycrystal.write(f'C2G{grain}=1 0 0\n 0 1 0\n 0 0 1;\n')
65
66# No discrete dislocation microstructure for a cluster-dynamics-only run
67print("\033[1;32mCreating initialMicrostructureFile\033[0m")
68with open('inputFiles/initialMicrostructure.txt', "w") as initialMicrostructureFile:
69 initialMicrostructureFile.write('')
setInputVariable(fileName, variable, newVal)