7import matplotlib.pyplot
as plt
10import matplotlib
as mpl
11import matplotlib.transforms
as mtransforms
13sys.path.append(
"../../build/tools/pyMoDELib/")
15from scipy.signal
import correlate2d
16from scipy.stats
import norm
17from matplotlib
import cm
18from matplotlib.colors
import Normalize
20sys.path.append(
"../../python")
21from modlibUtils
import *
22from pathlib
import Path
26 "dd_file": Path(
"../../Library/DislocationDynamics/DD.txt"),
27 "noise_file": Path(
"../../Library/GlidePlaneNoise/MDStackingFault.txt"),
28 "material_file": Path(
"../../Library/Materials/AlMg5.txt"),
29 "elastic_deformation_file": Path(
30 "../../Library/ElasticDeformation/ElasticDeformation.txt"
32 "mesh": Path(
"../../Library/Meshes/unitCube24.msh"),
33 "microstructure": Path(
34 "../../Library/Microstructures/periodicDipoleIndividual.txt"
38MDStackingFault_parameters = {
41 "type":
"MDStackingFaultNoise",
45 "noiseFile":
"AlMg5_ISF.vtk",
47 "correlationFile": Path(
48 "../../Library/GlidePlaneNoise/AlMg5_Cx_R100_ISF.vtk"
54 "value": np.array([60, 60, 1]),
55 "comment":
"number of grid points in each direction",
58 "value": np.array([1.0e-10, 1.0e-10, 1e-10]),
59 "comment":
"grid spacing in each direction",
62 "copy_to":
"inputFiles/MDStackingFault.txt",
65Material_parameters = {
67 "enabledSlipSystems":
"Shockley",
69 "glidePlaneNoise":
"MDStackingFault.txt",
70 "atomsPerUnitCell":
"1",
71 "dislocationMobilityType":
"default",
73 "copy_to":
"inputFiles/AlMg5.txt",
76Polycrystal_parameters = {
78 "absoluteTemperature": 1,
79 "grain1globalX1": np.array([0, 1, 1]),
80 "grain1globalX3": np.array([-1, 1, -1]),
81 "boxEdges": np.array([[0, 1, 1], [-2, -1, 1], [-1, 1, -1]]),
82 "boxScaling": np.array([200, 200, 200]),
84 "X0": np.array([0.0, 0.0, 0.0]),
85 "periodicFaceIDs": np.array([0, 1, 2, 3, 4, 5]),
86 "gridSpacing_SI": np.array([1.0e-10, 1.0e-10]),
91def processInitialConfigurations() -> None:
93 print(
"\033[1;32mCopying template files...\033[0m")
94 for key, src_path
in file_templates.items():
95 dest = f
"inputFiles/{src_path.name}"
96 shutil.copy2(src_path.resolve(), dest)
98 print(f
"Created {dest}")
105 print(
"\033[1;32mCreating noiseFile\033[0m")
108 MDStackingFault_parameters[
"variables"][
"correlationFile"],
"inputFiles/"
111 for param, value
in MDStackingFault_parameters[
"variables"].items():
112 if "correlationFile" in param:
113 relativePath = f
"{str(value).split('/')[-1]}"
114 setInputVariable(MDStackingFault_parameters[
"copy_to"], param, relativePath)
116 setInputVariable(MDStackingFault_parameters[
"copy_to"], param, str(value))
117 for param, data
in MDStackingFault_parameters[
"vectors"].items():
119 MDStackingFault_parameters[
"copy_to"], param, data[
"value"], data[
"comment"]
123 print(
"\033[1;32mCreating materialFile...\033[0m")
125 matParams = Material_parameters[
"variables"]
127 Material_parameters[
"copy_to"],
128 "enabledSlipSystems",
129 matParams[
"enabledSlipSystems"],
135 Material_parameters[
"copy_to"],
"glidePlaneNoise", matParams[
"glidePlaneNoise"]
139 Material_parameters[
"copy_to"],
141 matParams[
"atomsPerUnitCell"],
144 Material_parameters[
"copy_to"],
145 "dislocationMobilityType",
146 matParams[
"dislocationMobilityType"],
151 pf = PolyCrystalFile(Material_parameters[
"copy_to"].
split(
"/")[-1])
153 pf.meshFile = f
'{str(file_templates["mesh"]).split("/")[-1]}'
154 for param, value
in Polycrystal_parameters[
"parameters"].items():
155 setattr(pf, param, value)
156 pf.write(
"inputFiles")
159def constructDotGrid(NX, NY, unitVec1, unitVec2):
161 firstNearNeighborDist = 2.8
162 dotGrid = np.zeros((NX * NY, 2))
163 vec1 = unitVec1 * firstNearNeighborDist
164 vec2 = unitVec2 * firstNearNeighborDist
165 for yIdx
in range(NY):
166 for xIdx
in range(NX):
167 dotGrid[yIdx * NX + xIdx] = vec1 * xIdx + vec2 * yIdx
171def initUnitVectors(originalCorrVTK: str):
176 with open(originalCorrVTK)
as o:
179 latVector1 = np.array(line.strip().
split(), dtype=float)
182 latVector2 = np.array(line.strip().
split(), dtype=float)
184 elif "VECTORS lattice_basis1 double" in line:
186 elif "VECTORS lattice_basis2 double" in line:
189 unitVec1 = latVector1 / np.linalg.norm(latVector1)
190 unitVec2 = latVector2 / np.linalg.norm(latVector2)
191 unitVec1 = unitVec1[:2]
192 unitVec2 = unitVec2[:2]
193 return unitVec1, unitVec2
196def circularShift(corrArray: np.ndarray, gridSize: np.ndarray) -> np.ndarray:
197 NX, NY = np.squeeze(gridSize[0]), np.squeeze(gridSize[1])
200 tempArr = np.zeros(NX * NY)
201 for y
in np.arange(NY):
202 newY = int((y + shiftY) % NY)
203 for x
in np.arange(NX):
204 newX = int((x + shiftX) % NX)
205 tempArr[newY * NX + newX] += corrArray[y * NX + x]
211 folders = [
"inputFiles"]
214 if os.path.exists(x):
220 processInitialConfigurations()
223 simulationDir = os.path.abspath(
".")
224 ddBase = pyMoDELib.DefectiveCrystalBase(simulationDir)
226 matFile =
"inputFiles/AlMg5.txt"
228 mat = pyMoDELib.PolycrystallineMaterialBase(matFile, absoluteTemp)
229 b_SI = getValueInFile(f
"{matFile}",
"b_SI")
230 mu0_SI = getValueInFile(f
"{matFile}",
"mu0_SI")
231 rho_SI = getValueInFile(f
"{matFile}",
"rho_SI")
234 originalCorrFile =
"inputFiles/AlMg5_Cx_R100_ISF.vtk"
236 gridSize = np.array([100, 100, 1])
237 gridSpacing = np.array([1e-10, 1e-10, 1e-10]) / b_SI
238 latticeBasis = np.array([[1, 1], [1, 1]]).reshape(2, 2)
240 sfNoise = pyMoDELib.MDStackingFaultNoise(
245 gridSize.reshape(3, 1),
246 gridSpacing.reshape(3, 1),
251 sampledNoises = np.array(sfNoise.sampleAverageNoise(realizationNum))
252 std = np.std(sampledNoises)
253 print(f
"std = {std} J/m2")
255 fig, axs = plt.subplots(1, 1, figsize=(8,6), dpi=200)
257 sampledNoises = sampledNoises.ravel()
258 axs.hist(sampledNoises, density=
True, alpha=0.3, bins=
'auto', label=f
"R{realizationNum}")
260 axs.set_title(f
"sampled SF noise")
264 fig.savefig(f
'sampledNoiseDistribution_R{realizationNum}.png')
269if __name__ ==
"__main__":