6import matplotlib.pyplot
as plt
8plt.rcParams[
"text.usetex"] =
True
9import matplotlib
as mpl
10import matplotlib.transforms
as mtransforms
12sys.path.append(
"../../build/tools/pyMoDELib/")
14from scipy.signal
import correlate2d
15from scipy.stats
import norm
16from matplotlib
import cm
17from matplotlib.colors
import Normalize
19sys.path.append(
"../../python")
20from modlibUtils
import *
21from pathlib
import Path
25 "dd_file": Path(
"../../Library/DislocationDynamics/DD.txt"),
26 "noise_file": Path(
"../../Library/GlidePlaneNoise/AnalyticalSolidSolutionNoise.txt"),
27 "material_file": Path(
"../../Library/Materials/AlMg5.txt"),
28 "elastic_deformation_file": Path(
29 "../../Library/ElasticDeformation/ElasticDeformation.txt"
31 "mesh": Path(
"../../Library/Meshes/unitCube24.msh"),
32 "microstructure": Path(
33 "../../Library/Microstructures/periodicDipoleIndividual.txt"
37AnalyticalSolidSolution_parameters = {
40 "type":
"AnalyticalSolidSolutionNoise",
49 "value": np.array([100, 100, 1]),
50 "comment":
"number of grid points in each direction",
53 "value": np.array([1.0e-10, 1.0e-10, 1e-10]),
54 "comment":
"grid spacing in each direction",
57 "copy_to":
"inputFiles/AnalyticalSolidSolutionNoise.txt",
60Material_parameters = {
62 "enabledSlipSystems":
"Shockley",
64 "glidePlaneNoise":
"AnalyticalSolidSolutionNoise.txt",
65 "atomsPerUnitCell":
"1",
66 "dislocationMobilityType":
"default",
68 "copy_to":
"inputFiles/AlMg5.txt",
71Polycrystal_parameters = {
73 "absoluteTemperature": 1,
74 "grain1globalX1": np.array([0, 1, 1]),
75 "grain1globalX3": np.array([-1, 1, -1]),
76 "boxEdges": np.array([[0, 1, 1], [-2, -1, 1], [-1, 1, -1]]),
77 "boxScaling": np.array([200, 200, 200]),
79 "X0": np.array([0.0, 0.0, 0.0]),
80 "periodicFaceIDs": np.array([0, 1, 2, 3, 4, 5]),
81 "gridSpacing_SI": np.array([1.0e-10, 1.0e-10]),
87 print(
"\033[1;32mCopying template files...\033[0m")
88 for key, src_path
in file_templates.items():
89 dest = f
"inputFiles/{src_path.name}"
90 shutil.copy2(src_path.resolve(), dest)
92 print(f
"Created {dest}")
99 print(
"\033[1;32mCreating noiseFile\033[0m")
101 for param, value
in AnalyticalSolidSolution_parameters[
"variables"].items():
102 if "correlationFile" in param:
103 relativePath = f
"{str(value).split('/')[-1]}"
104 setInputVariable(AnalyticalSolidSolution_parameters[
"copy_to"], param, relativePath)
106 setInputVariable(AnalyticalSolidSolution_parameters[
"copy_to"], param, str(value))
107 for param, data
in AnalyticalSolidSolution_parameters[
"vectors"].items():
109 AnalyticalSolidSolution_parameters[
"copy_to"], param, data[
"value"], data[
"comment"]
113 print(
"\033[1;32mCreating materialFile...\033[0m")
115 matParams = Material_parameters[
"variables"]
117 Material_parameters[
"copy_to"],
118 "enabledSlipSystems",
119 matParams[
"enabledSlipSystems"],
125 Material_parameters[
"copy_to"],
"glidePlaneNoise", matParams[
"glidePlaneNoise"]
129 Material_parameters[
"copy_to"],
131 matParams[
"atomsPerUnitCell"],
134 Material_parameters[
"copy_to"],
135 "dislocationMobilityType",
136 matParams[
"dislocationMobilityType"],
143 pf.meshFile = f
'{str(file_templates["mesh"]).split("/")[-1]}'
144 for param, value
in Polycrystal_parameters[
"parameters"].items():
145 setattr(pf, param, value)
146 pf.write(
"inputFiles")
151 firstNearNeighborDist = 2.8
152 dotGrid = np.zeros((NX * NY, 2))
153 vec1 = unitVec1 * firstNearNeighborDist
154 vec2 = unitVec2 * firstNearNeighborDist
155 for yIdx
in range(NY):
156 for xIdx
in range(NX):
157 dotGrid[yIdx * NX + xIdx] = vec1 * xIdx + vec2 * yIdx
166 with open(originalCorrVTK)
as o:
169 latVector1 = np.array(line.strip().
split(), dtype=float)
172 latVector2 = np.array(line.strip().
split(), dtype=float)
174 elif "VECTORS lattice_basis1 double" in line:
176 elif "VECTORS lattice_basis2 double" in line:
179 unitVec1 = latVector1 / np.linalg.norm(latVector1)
180 unitVec2 = latVector2 / np.linalg.norm(latVector2)
181 unitVec1 = unitVec1[:2]
182 unitVec2 = unitVec2[:2]
183 return unitVec1, unitVec2
188 fig, axs = plt.subplots(1, 1, figsize=(8, 6), dpi=200)
190 matFile = str(file_templates[
"material_file"]).
split(
"/")[-1]
194 inputPath =
"./inputFiles/"
195 for i, realizationNum
in enumerate(realizationNumbers):
196 data = np.loadtxt(f
"{inputPath}/noiseDistributionR{realizationNum}.txt")
197 data *= mu0_SI * b_SI
198 axs.hist(data, density=
True, alpha=0.3, bins=
"auto", label=f
"R{realizationNum}")
205 f
"R{realizationNum} = STD {std:.3g} J/m2",
206 transform=axs.transAxes,
216 fig.savefig(f
"sampledNoiseDistribution.png")
220def circularShift(corrArray: np.ndarray, gridSize: np.ndarray) -> np.ndarray:
221 NX, NY = np.squeeze(gridSize[0]), np.squeeze(gridSize[1])
224 tempArr = np.zeros(NX * NY)
225 for y
in np.arange(NY):
226 newY = int((y + shiftY) % NY)
227 for x
in np.arange(NX):
228 newX = int((x + shiftX) % NX)
229 tempArr[newY * NX + newX] += corrArray[y * NX + x]
235 folders = [
"inputFiles"]
238 if os.path.exists(x):
246 simulationDir = os.path.abspath(
".")
247 ddBase = pyMoDELib.DefectiveCrystalBase(simulationDir)
249 matFile =
"inputFiles/AlMg5.txt"
251 mat = pyMoDELib.PolycrystallineMaterialBase(matFile, absoluteTemp)
258 gridSize = np.array([256, 256, 64])
259 gridSpacing = np.array([1e-10, 1e-10, 1e-10])/b_SI
260 latticeBasis = np.array([[1, 0], [0, 1]]).reshape(2, 2)
262 msss_SI=0.9e18 /mu0_SI**2;
264 a_cai_SI = 1e-09 /b_SI
266 anssNoise = pyMoDELib.AnalyticalSolidSolutionNoise(
269 gridSize.reshape(3, 1),
270 gridSpacing.reshape(3, 1),
278 corr_xz, corr_yz = np.array(anssNoise.averageNoiseCorrelation(realizationNum)) * mu0_SI**2
282 corr_xz = corr_xz.reshape(gridSize[0], gridSize[1])
283 corr_yz = corr_yz.reshape(gridSize[0], gridSize[1])
285 fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(12, 6), dpi=200)
287 axes[0].set_title(
"corr_xz")
288 im0 = axes[0].imshow(corr_xz, cmap=
"coolwarm", origin=
"lower")
289 fig.colorbar(im0, ax=axes[0], label=
"Noise Amplitude")
290 axes[0].set_xlabel(
"X (grid units)")
291 axes[0].set_ylabel(
"Y (grid units)")
294 axes[1].set_title(
"corr_yz")
295 im1 = axes[1].imshow(corr_yz, cmap=
"coolwarm", origin=
"lower")
296 fig.colorbar(im1, ax=axes[1], label=
"Noise Amplitude")
297 axes[1].set_xlabel(
"X (grid units)")
298 axes[1].set_ylabel(
"Y (grid units)")
300 fig.savefig(f
"ensemCorr_R{realizationNum}.png", transparent=
True)
305if __name__ ==
"__main__":
initUnitVectors(str originalCorrVTK)
plotComparisonHistogram(list realizationNumbers)
np.ndarray circularShift(np.ndarray corrArray, np.ndarray gridSize)
None processInitialConfigurations()
constructDotGrid(NX, NY, unitVec1, unitVec2)
setInputVector(fileName, variable, newVal, newCom)
setInputVariable(fileName, variable, newVal)
getValueInFile(fileName, variable)