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]),
92 reader = vtk.vtkGenericDataObjectReader()
93 reader.SetFileName(fname)
94 reader.ReadAllVectorsOn()
95 reader.ReadAllScalarsOn()
99 reader.GetOutput().GetDimensions(dims)
103 pointData = reader.GetOutput().GetPointData()
108 for i
in range(pointData.GetNumberOfArrays()):
109 array = pointData.GetArray(i)
111 if array.GetNumberOfComponents() == 1:
112 scalarArrays.append(np.array(array))
113 noiseScalars = scalarArrays[0]
114 noiseScalars = np.reshape(noiseScalars, shape=(NX, NY))
115 return noiseScalars, dims
120 print(
"\033[1;32mCopying template files...\033[0m")
121 for key, src_path
in file_templates.items():
122 dest = f
"inputFiles/{src_path.name}"
123 shutil.copy2(src_path.resolve(), dest)
125 print(f
"Created {dest}")
132 print(
"\033[1;32mCreating noiseFile\033[0m")
135 MDStackingFault_parameters[
"variables"][
"correlationFile"],
"inputFiles/"
138 for param, value
in MDStackingFault_parameters[
"variables"].items():
139 if "correlationFile" in param:
140 relativePath = f
"{str(value).split('/')[-1]}"
141 setInputVariable(MDStackingFault_parameters[
"copy_to"], param, relativePath)
144 for param, data
in MDStackingFault_parameters[
"vectors"].items():
146 MDStackingFault_parameters[
"copy_to"], param, data[
"value"], data[
"comment"]
150 print(
"\033[1;32mCreating materialFile...\033[0m")
152 matParams = Material_parameters[
"variables"]
154 Material_parameters[
"copy_to"],
155 "enabledSlipSystems",
156 matParams[
"enabledSlipSystems"],
162 Material_parameters[
"copy_to"],
"glidePlaneNoise", matParams[
"glidePlaneNoise"]
166 Material_parameters[
"copy_to"],
168 matParams[
"atomsPerUnitCell"],
171 Material_parameters[
"copy_to"],
172 "dislocationMobilityType",
173 matParams[
"dislocationMobilityType"],
180 pf.meshFile = f
'{str(file_templates["mesh"]).split("/")[-1]}'
181 for param, value
in Polycrystal_parameters[
"parameters"].items():
182 setattr(pf, param, value)
183 pf.write(
"inputFiles")
188 firstNearNeighborDist = 2.8
189 dotGrid = np.zeros((NX * NY, 2))
190 vec1 = unitVec1 * firstNearNeighborDist
191 vec2 = unitVec2 * firstNearNeighborDist
192 for yIdx
in range(NY):
193 for xIdx
in range(NX):
194 dotGrid[yIdx * NX + xIdx] = vec1 * xIdx + vec2 * yIdx
203 with open(originalCorrVTK)
as o:
206 latVector1 = np.array(line.strip().
split(), dtype=float)
209 latVector2 = np.array(line.strip().
split(), dtype=float)
211 elif "VECTORS lattice_basis1 double" in line:
213 elif "VECTORS lattice_basis2 double" in line:
216 unitVec1 = latVector1 / np.linalg.norm(latVector1)
217 unitVec2 = latVector2 / np.linalg.norm(latVector2)
218 unitVec1 = unitVec1[:2]
219 unitVec2 = unitVec2[:2]
220 return unitVec1, unitVec2
223def circularShift(corrArray: np.ndarray, gridSize: np.ndarray) -> np.ndarray:
224 NX, NY = np.squeeze(gridSize[0]), np.squeeze(gridSize[1])
227 tempArr = np.zeros(NX * NY)
228 for y
in np.arange(NY):
229 newY = int((y + shiftY) % NY)
230 for x
in np.arange(NX):
231 newX = int((x + shiftX) % NX)
232 tempArr[newY * NX + newX] += corrArray[y * NX + x]
238 folders = [
"inputFiles"]
241 if os.path.exists(x):
250 simulationDir = os.path.abspath(
".")
251 ddBase = pyMoDELib.DefectiveCrystalBase(simulationDir)
253 matFile =
"inputFiles/AlMg5.txt"
255 mat = pyMoDELib.PolycrystallineMaterialBase(matFile, absoluteTemp)
261 originalCorrFile =
"inputFiles/AlMg5_Cx_R100_ISF.vtk"
263 gridSize = np.array([100, 100, 1])
264 gridSpacing = np.array([1e-10, 1e-10, 1e-10]) / b_SI
265 latticeBasis = np.array([[1, 1], [1, 1]]).reshape(2, 2)
266 sfNoise = pyMoDELib.MDStackingFaultNoise(
271 gridSize.reshape(3, 1),
272 gridSpacing.reshape(3, 1),
277 correlation = sfNoise.averageNoiseCorrelation(realizationNum)
278 correlation = np.squeeze(np.array(correlation))
281 correlation = np.array(correlation).reshape(gridSize[0], gridSize[1])
283 correlation *= (mu0_SI * b_SI) ** 2
287 inputPath =
"./inputFiles/"
289 NX_s, NY_s, NZ_s = gridSize
292 color_map = mpl.colormaps[
"coolwarm"]
296 correlation = correlation.reshape(NY_s * NX_s, 1)
297 c_normalized = (correlation - np.min(correlation.flatten())) / (
298 np.max(correlation.flatten()) - np.min(correlation.flatten())
300 color = color_map(c_normalized)
303 inputCorrelationField, i_dim =
readVTKnoise(originalCorrFile)
304 NX_i, NY_i, NZ_i = i_dim
306 inputCorrelationField = inputCorrelationField.reshape(NY_i * NX_i, 1)
308 inputCorrelationField - np.min(inputCorrelationField.flatten())
310 np.max(inputCorrelationField.flatten())
311 - np.min(inputCorrelationField.flatten())
313 color_i = color_map(c_normalized_i)
316 fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(10, 8.6), dpi=500)
318 axes[0].set_title(
"Input Correlation")
319 axes[0].scatter(dotGrid_i[:, 0], dotGrid_i[:, 1], c=color_i, s=30)
320 axes[1].set_title(f
"Sampled R")
321 axes[1].scatter(dotGrid_s[:, 0], dotGrid_s[:, 1], c=color, s=10)
323 plt.cm.ScalarMappable(
325 np.min(inputCorrelationField), np.max(inputCorrelationField)
329 ax=axes[0], label=
"J/m2"
332 plt.cm.ScalarMappable(
333 norm=Normalize(np.min(correlation), np.max(correlation)), cmap=color_map
335 ax=axes[1], label=
"J/m2"
338 fig.savefig(f
"ensemCorr_R{realizationNum}.png", transparent=
True)
344if __name__ ==
"__main__":
initUnitVectors(str originalCorrVTK)
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)