Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
periodicFields/test.py
Go to the documentation of this file.
1# /opt/local/bin/python3.12 test.py
2import sys, string, os
3import numpy as np
4import matplotlib.pyplot as plt
5plt.rcParams['text.usetex'] = True
6sys.path.append("../../python")
7from modlibUtils import *
8sys.path.append("../../build/tools/pyMoDELib")
9import pyMoDELib
10
11compute=True
12#periodicImageCases=np.array([[1,1,1,0],[1,1,1,1],[2,2,2,2],[4,4,4,2]])
13periodicImageCases=np.array([[4,4,4,2]])
14
15if compute:
16
18 folders=['config','F','inputFiles']
19 for x in folders:
20 if not os.path.exists(x):
21 os.makedirs(x)
22
23 # Make a local copy of DD parameters file and modify that copy if necessary
24 DDfile='DD.txt'
25 DDfileTemplate='../../Library/DislocationDynamics/'+DDfile
26 print("\033[1;32mCreating DDfile\033[0m")
27 shutil.copy2(DDfileTemplate,'inputFiles/'+DDfile)
28 setInputVariable('inputFiles/'+DDfile,'useFEM','0')
29 setInputVariable('inputFiles/'+DDfile,'useDislocations','1')
30 setInputVariable('inputFiles/'+DDfile,'useInclusions','0')
31 setInputVariable('inputFiles/'+DDfile,'useElasticDeformation','0')
32 setInputVariable('inputFiles/'+DDfile,'useClusterDynamics','0')
33 setInputVariable('inputFiles/'+DDfile,'timeSteppingMethod','adaptive') # adaptive or fixed
34 setInputVariable('inputFiles/'+DDfile,'dtMax','1e25')
35 setInputVariable('inputFiles/'+DDfile,'dxMax','1') # max nodal displacement for when timeSteppingMethod=adaptive
36 setInputVariable('inputFiles/'+DDfile,'alphaLineTension','0.1') # dimensionless scale factor in for line tension forces
37 setInputVariable('inputFiles/'+DDfile,'Lmin','5') # min segment length (in Burgers vector units)
38 setInputVariable('inputFiles/'+DDfile,'Lmax','20') # max segment length (in Burgers vector units)
39 setInputVariable('inputFiles/'+DDfile,'maxJunctionIterations','1') # max segment length (in Burgers vector units)
40 setInputVariable('inputFiles/'+DDfile,'remeshFrequency','0') # max segment length (in Burgers vector units)
41 setInputVariable('inputFiles/'+DDfile,'outputFrequency','1') # output frequency
42 setInputVariable('inputFiles/'+DDfile,'quadPerLength','0.05') # output quadrature data
43 setInputVariable('inputFiles/'+DDfile,'outputQuadraturePoints','1') # output quadrature data
44 setInputVariable('inputFiles/'+DDfile,'computeElasticEnergyPerLength','1') # output quadrature data
45 setInputVariable('inputFiles/'+DDfile,'glideSolverType','Galerkin') # type of glide solver, or none
46 setInputVariable('inputFiles/'+DDfile,'climbSolverType','none') # type of clim solver, or none
47 setInputVariable('inputFiles/'+DDfile,'Nsteps','1') # number of simulation steps
48
49 # Make a local copy of material file, and modify that copy if necessary
50 materialFile='Cu.txt';
51 materialFileTemplate='../../Library/Materials/'+materialFile;
52 print("\033[1;32mCreating materialFile\033[0m")
53 shutil.copy2(materialFileTemplate,'inputFiles/'+materialFile)
54 setInputVariable('inputFiles/'+materialFile,'enabledSlipSystems','Shockley')
55 setInputVariable('inputFiles/'+materialFile,'glidePlaneNoise','none')
56 b_SI=getValueInFile('inputFiles/'+materialFile,'b_SI')
57
58 # Create polycrystal.txt using local material file
59 meshFile='unitCube24.msh';
60 meshFileTemplate='../../Library/Meshes/'+meshFile;
61 print("\033[1;32mCreating polycrystalFile\033[0m")
62 shutil.copy2(meshFileTemplate,'inputFiles/'+meshFile)
63 pf=PolyCrystalFile(materialFile);
64 pf.absoluteTemperature=300;
65 pf.meshFile=meshFile
66 pf.alignToSlipSystem0=1;
67 pf.boxScaling=np.array([300e-10,180e-10,400e-10])/b_SI # length of box edges in Burgers vector units
68 pf.periodicFaceIDs=np.array([-1])
69 pf.write('inputFiles')
70
71
73 simulationDir=os.path.abspath(".")
74
75 for k in range(0,np.size(periodicImageCases,0)):
76 fFile=file_path = "F/F_0.txt"
77 if os.path.exists(fFile):
78 os.remove(fFile)
79 fLabes=file_path = "F/F_labels.txt"
80 if os.path.exists(fLabes):
81 os.remove(fLabes)
82 periodicImageSize=np.array(periodicImageCases[k,:3]).astype(int)
83 EwaldLengthFactor=periodicImageCases[k,3]
84 setInputVariable('inputFiles/'+DDfile,'EwaldLengthFactor',str(EwaldLengthFactor))
85 setInputVector('inputFiles/'+DDfile,'periodicImageSize',periodicImageSize,'number of periodic images along each period vector')
86 print("BEFORE DDBASE")
87 ddBase=pyMoDELib.DefectiveCrystalBase(simulationDir)
88 mesh=ddBase.mesh
89 xMax=mesh.xMax()
90 xMin=mesh.xMin()
91 xCenter=mesh.xCenter()
92 print("BEFORE defectiveCrystal")
93 defectiveCrystal=pyMoDELib.DefectiveCrystal(ddBase)
94 print("AFTER defectiveCrystal")
95
96
97 spec=pyMoDELib.PeriodicDipoleIndividualSpecification()
98 spec.slipSystemIDs=[0,1]
99 spec.exitFaceIDs=[1,1]
100 spec.dipoleCenters=np.array([xCenter,xCenter])
101 spec.dipoleHeights=[60,60]
102 spec.nodesPerLine=[0,0]
103
104 X=np.linspace(0, 150, num=100)
105 S11=X*0.0;
106 S12=X*0.0;
107 S13=X*0.0;
108 S22=X*0.0;
109 S23=X*0.0;
110 S33=X*0.0;
111 j=0
112 print("BEFORE FOR LOOP")
113 for x in X:
114 spec.glideSteps=[x,x+7]
115 print("BEFORE MICROSTRUCTURE")
116 microstructureGenerator=pyMoDELib.MicrostructureGenerator(ddBase)
117 print("AFTER MICROSTRUCTURE")
118 microstructureGenerator.addPeriodicDipoleIndividual(spec)
119 print("DONE MICROSTRUCTURE")
120# if j==0:
121# microstructureGenerator.writeConfigFiles(0) # write evel_0.txt (optional)
122 defectiveCrystal.initializeConfiguration(microstructureGenerator.configIO)
123 defectiveCrystal.runSingleStep()
124 aux =readAUXtxt('config/ddAux_'+str(j))
125 S11[j]=np.mean(aux.gaussPoints[:,10])
126 S12[j]=np.mean(aux.gaussPoints[:,11])
127 S13[j]=np.mean(aux.gaussPoints[:,12])
128 S22[j]=np.mean(aux.gaussPoints[:,14])
129 S23[j]=np.mean(aux.gaussPoints[:,15])
130 S33[j]=np.mean(aux.gaussPoints[:,18])
131 j=j+1
132 print("AFTER FOR LOOP")
133 # Store results
134 F,Flabels=readFfile('./F')
135 E=getFarray(F,Flabels,'dislocation elastic energy [mu b^3]')
136 data=np.empty([np.size(X),8])
137 data[:,0]=X
138 data[:,1]=E
139 data[:,2]=S11
140 data[:,3]=S22
141 data[:,4]=S33
142 data[:,5]=S23
143 data[:,6]=S13
144 data[:,7]=S12
145 outFileName='data'+'_'+str(periodicImageSize[0])+'_'+str(periodicImageSize[1])+'_'+str(periodicImageSize[2])+'_'+str(EwaldLengthFactor)+'.txt'
146 np.savetxt(outFileName, data)
147
148
150dataDict=dict()
151for k in range(0,np.size(periodicImageCases,0)):
152 periodicImageSize=np.array(periodicImageCases[k,:3]).astype(int)
153 EwaldLengthFactor=periodicImageCases[k,3]
154 key=str(periodicImageSize[0])+'_'+str(periodicImageSize[1])+'_'+str(periodicImageSize[2])+'_'+str(EwaldLengthFactor)
155 FileName='data_'+key+'.txt'
156 dataDict[key]=np.loadtxt(FileName);
157
158fields=['energy','sigma11','sigma22','sigma33','sigma23','sigma13','sigma12']
159fieldLabels=['elastic energy $[\mu b^3]$','$\sigma_{11}$ $[\mu]$','$\sigma_{22}$ $[\mu]$','$\sigma_{33}$ $[\mu]$','$\sigma_{23}$ $[\mu]$','$\sigma_{13}$ $[\mu]$','$\sigma_{12}$ $[\mu]$']
160for k in range(0,len(fields)):
161 # plots with centered images
162 fig1 = plt.figure()
163 ax1=plt.subplot(1,1,1)
164 for key in dataDict:
165 data=dataDict[key]
166 ax1.plot(data[:,0], data[:,k+1],label=key)
167 ax1.grid()
168 ax1.legend()
169 plt.xlabel('dipole distance $[b]$')
170 plt.ylabel(fieldLabels[k])
171 fig1.savefig(fields[k], bbox_inches='tight')
setInputVector(fileName, variable, newVal, newCom)
readFfile(folder)
setInputVariable(fileName, variable, newVal)
getFarray(F, Flabels, label)
readAUXtxt(filename)
getValueInFile(fileName, variable)