Chemical-Pressure-Plotter 0.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chemical_pressure_plotter-0.6/Chemical Pressure Plotting/Plotting Chemical Pressures.py +307 -0
- chemical_pressure_plotter-0.6/Chemical_Pressure_Plotter.egg-info/PKG-INFO +31 -0
- chemical_pressure_plotter-0.6/Chemical_Pressure_Plotter.egg-info/SOURCES.txt +10 -0
- chemical_pressure_plotter-0.6/Chemical_Pressure_Plotter.egg-info/dependency_links.txt +1 -0
- chemical_pressure_plotter-0.6/Chemical_Pressure_Plotter.egg-info/requires.txt +2 -0
- chemical_pressure_plotter-0.6/Chemical_Pressure_Plotter.egg-info/top_level.txt +1 -0
- chemical_pressure_plotter-0.6/LICENSE +21 -0
- chemical_pressure_plotter-0.6/PKG-INFO +31 -0
- chemical_pressure_plotter-0.6/README.md +6 -0
- chemical_pressure_plotter-0.6/setup.cfg +7 -0
- chemical_pressure_plotter-0.6/setup.py +30 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import pyvista as pv
|
|
2
|
+
import numpy as np
|
|
3
|
+
|
|
4
|
+
plotter = pv.Plotter()
|
|
5
|
+
#File Names must be input here
|
|
6
|
+
Filenameroot=''
|
|
7
|
+
Filenamexyz=f'{Filenameroot}_static_o_DS2_DEN.xyz'
|
|
8
|
+
Filenamecoeff=f'{Filenameroot}_static-coeff'
|
|
9
|
+
Filenamecell=f'{Filenameroot}_static-cell'
|
|
10
|
+
Filenamegeo=f'{Filenameroot}_static-geo'
|
|
11
|
+
|
|
12
|
+
#=======================================================================
|
|
13
|
+
#=================Preferred Methods Of Scaling==========================
|
|
14
|
+
#=======================================================================
|
|
15
|
+
#Both of ScaleLobe and Scaleatom are controlled by sliders in the rendered chemical pressure
|
|
16
|
+
ScaleLobe=100 #Scales the size of the chemical pressure lobes. Default is 100
|
|
17
|
+
Scaleatom=1 #Can adjust for the size of atoms. Default is 1,
|
|
18
|
+
|
|
19
|
+
unitcelllinewidth=5 #Default is 5
|
|
20
|
+
|
|
21
|
+
#Notes
|
|
22
|
+
# This code works for 4 element compounds
|
|
23
|
+
# This code does not work for compounds with more than 4 elements
|
|
24
|
+
# For help with this code contact the Fredrickson Group at UW Madison
|
|
25
|
+
|
|
26
|
+
#Reading xyz from the xyz file.
|
|
27
|
+
def ReadTxt(Filenamexyz):
|
|
28
|
+
with open(f"{Filenamexyz}", 'r') as f:
|
|
29
|
+
lines = f.readlines()
|
|
30
|
+
nameofatoms = []
|
|
31
|
+
for i, line in enumerate(lines):
|
|
32
|
+
line = line.strip().split()
|
|
33
|
+
line= [var.split("'") for var in line]
|
|
34
|
+
line=[element for var in line for element in var if element != '']
|
|
35
|
+
if i == 0:
|
|
36
|
+
num_atoms =int(line[0])
|
|
37
|
+
xyz= np.zeros((num_atoms,3))
|
|
38
|
+
elif i ==1:
|
|
39
|
+
continue
|
|
40
|
+
else:
|
|
41
|
+
coords = line[1:]
|
|
42
|
+
xyz[i-2, :] = np.array([float(coord) for coord in coords])
|
|
43
|
+
nameofatoms.append(line[0])
|
|
44
|
+
del(nameofatoms[0])
|
|
45
|
+
return xyz,nameofatoms
|
|
46
|
+
xyz,nameofatoms=ReadTxt(Filenamexyz)
|
|
47
|
+
atom1=nameofatoms[0]
|
|
48
|
+
atom2=0
|
|
49
|
+
|
|
50
|
+
#This finds and labels each atom in the system
|
|
51
|
+
atoms={}
|
|
52
|
+
count=0
|
|
53
|
+
for thing in nameofatoms:
|
|
54
|
+
if thing not in atoms.keys():
|
|
55
|
+
atoms[thing] = count
|
|
56
|
+
count+=1
|
|
57
|
+
|
|
58
|
+
#This converts the strings in the nameofatoms list to numbers in order to be read below.
|
|
59
|
+
#Converts atom1 to 0, atom2 to 1, atom3 to 2, and atom4 to 3
|
|
60
|
+
numberofatoms=[]
|
|
61
|
+
numberofatoms = [atoms[s] for s in nameofatoms]
|
|
62
|
+
|
|
63
|
+
#Getting coeff out of the coeff file
|
|
64
|
+
def ReadTxt2(Filenamecoeff):
|
|
65
|
+
with open(f"{Filenamecoeff}", 'r') as f:
|
|
66
|
+
lines = f.readlines()
|
|
67
|
+
coeffvalues = []
|
|
68
|
+
for i, line in enumerate(lines):
|
|
69
|
+
line = line.strip().split()
|
|
70
|
+
line= [var.split("'") for var in line]
|
|
71
|
+
line=[element for var in line for element in var if element != '']
|
|
72
|
+
del(line[0])
|
|
73
|
+
line = [float(s) for s in line]
|
|
74
|
+
coeffvalues.append(line[0])
|
|
75
|
+
return coeffvalues
|
|
76
|
+
coeffvalues=ReadTxt2(Filenamecoeff)
|
|
77
|
+
|
|
78
|
+
#Changing Coeff to be a list of lists for the next step
|
|
79
|
+
CPcoeff_temporary = []
|
|
80
|
+
for i in range(len(coeffvalues) // 49):
|
|
81
|
+
CPcoeff_temporary.append([])
|
|
82
|
+
for j in range(49):
|
|
83
|
+
CPcoeff_temporary[i].append(coeffvalues[49 * i + j])
|
|
84
|
+
|
|
85
|
+
coeffvalues = CPcoeff_temporary
|
|
86
|
+
|
|
87
|
+
#Getting cell out of the cell file
|
|
88
|
+
def ReadTxt3(Filenamecell):
|
|
89
|
+
cellvalues = []
|
|
90
|
+
with open(Filenamecell, 'r') as f:
|
|
91
|
+
for line in f:
|
|
92
|
+
parts = line.strip().split()
|
|
93
|
+
if len(parts) != 3:
|
|
94
|
+
raise ValueError("Each line must contain exactly 3 numbers")
|
|
95
|
+
cellvalues.append([float(x) for x in parts])
|
|
96
|
+
return np.array(cellvalues)
|
|
97
|
+
cellvalues= ReadTxt3(Filenamecell)
|
|
98
|
+
|
|
99
|
+
#getting the geo out of the file
|
|
100
|
+
def ReadTxt4(filename):
|
|
101
|
+
geoelements = []
|
|
102
|
+
geovalues = []
|
|
103
|
+
with open(filename, 'r') as f:
|
|
104
|
+
for i, line in enumerate(f, start=1):
|
|
105
|
+
parts = line.strip().split()
|
|
106
|
+
|
|
107
|
+
if len(parts) != 4:
|
|
108
|
+
raise ValueError(f"Line {i} does not contain exactly 4 values")
|
|
109
|
+
|
|
110
|
+
numbers = [float(parts[1]), float(parts[2]), float(parts[3])]
|
|
111
|
+
|
|
112
|
+
geoelements.append(parts[0])
|
|
113
|
+
geovalues.append(numbers)
|
|
114
|
+
|
|
115
|
+
return geoelements, np.array(geovalues, dtype=float)
|
|
116
|
+
geoelements, geovalues=ReadTxt4(Filenamegeo)
|
|
117
|
+
|
|
118
|
+
#This generates the chemical pressure values
|
|
119
|
+
def Chemicalpressure(coeffvalues):
|
|
120
|
+
Geo_Cps =[]
|
|
121
|
+
for val in coeffvalues:
|
|
122
|
+
scale=1 #Use the scales at the top of the code this scales unpredictably
|
|
123
|
+
|
|
124
|
+
positive_surf = pv.ParametricEllipsoid(xradius = 1, yradius = 1, zradius = 1,)
|
|
125
|
+
negative_surf = pv.ParametricEllipsoid(xradius = 1, yradius = 1, zradius = 1,)
|
|
126
|
+
for i in range(len(positive_surf.points)):
|
|
127
|
+
r=0
|
|
128
|
+
x = positive_surf.points[i][0]
|
|
129
|
+
y = positive_surf.points[i][1]
|
|
130
|
+
z = positive_surf.points[i][2]
|
|
131
|
+
theta = np.arccos(z)
|
|
132
|
+
|
|
133
|
+
phi=0
|
|
134
|
+
if((theta > 0) and (theta < 3.14159)):
|
|
135
|
+
if(x/np.sin(theta) > 1):
|
|
136
|
+
phi = 0
|
|
137
|
+
elif(x/np.sin(theta) < -1):
|
|
138
|
+
phi = np.pi
|
|
139
|
+
else:
|
|
140
|
+
phi = np.arccos(x/np.sin(theta))
|
|
141
|
+
|
|
142
|
+
if y < 0:
|
|
143
|
+
phi = -phi
|
|
144
|
+
#This is a Legendre Polynomial expansion. It goes to L=4 this can be expanded
|
|
145
|
+
#for additional quality.
|
|
146
|
+
|
|
147
|
+
#L = 0
|
|
148
|
+
r += scale * 0.5 * (1 / np.pi)**0.5 * val[0]
|
|
149
|
+
|
|
150
|
+
#L = 1
|
|
151
|
+
r += scale * 0.5 * (3 / np.pi)**0.5 * np.cos(theta) * val[1]
|
|
152
|
+
r += -scale * (3 / (8 * np.pi))**0.5 * np.sin(theta) * np.cos(phi) * np.sqrt(2) * val[2]
|
|
153
|
+
r += -scale * (3 / (8 * np.pi))**0.5 * np.sin(theta) * np.sin(phi) * np.sqrt(2) * val[3]
|
|
154
|
+
|
|
155
|
+
#L = 2
|
|
156
|
+
r += scale * 0.25 * (5 / np.pi)**0.5 * (3*np.cos(theta)**2 - 1) * val[4]
|
|
157
|
+
r += -scale * 0.5 * (15 / np.pi)**0.5 * np.sin(theta) * np.cos(phi) * np.cos(theta) * val[5]
|
|
158
|
+
r += -scale * 0.5 * (15 / np.pi)**0.5 * np.sin(theta) * np.sin(phi) * np.cos(theta) * val[6]
|
|
159
|
+
r += scale * 0.25 * (15 / np.pi)**0.5 * np.sin(theta)**2 * np.cos(2*phi) * val[7]
|
|
160
|
+
r += scale * 0.25 * (15 / np.pi)**0.5 * np.sin(theta)**2 * np.sin(2*phi) * val[8]
|
|
161
|
+
|
|
162
|
+
#L = 3
|
|
163
|
+
r += scale * 0.25 * (7 / np.pi)**0.5 * (5*np.cos(theta)**3 - 3*np.cos(theta)) * val[9]
|
|
164
|
+
r += -scale * 0.125 * (21 / np.pi)**0.5 * np.sin(theta) * (5*np.cos(theta)**2 - 1) * np.cos(phi) * np.sqrt(2) * val[10]
|
|
165
|
+
r += -scale * 0.125 * (21 / np.pi)**0.5 * np.sin(theta) * (5*np.cos(theta)**2 - 1) * np.sin(phi) * np.sqrt(2) * val[11]
|
|
166
|
+
r += scale * 0.25 * (105 / (2*np.pi))**0.5 * np.sin(theta)**2 * np.cos(theta) * np.cos(2*phi) * np.sqrt(2) * val[12]
|
|
167
|
+
r += scale * 0.25 * (105 / (2*np.pi))**0.5 * np.sin(theta)**2 * np.cos(theta) * np.sin(2*phi) * np.sqrt(2) * val[13]
|
|
168
|
+
r += -scale * 0.125 * (35 / np.pi)**0.5 * np.sin(theta)**3 * np.cos(3*phi) * np.sqrt(2) * val[14]
|
|
169
|
+
r += -scale * 0.125 * (35 / np.pi)**0.5 * np.sin(theta)**3 * np.sin(3*phi) * np.sqrt(2) * val[15]
|
|
170
|
+
|
|
171
|
+
#L = 4
|
|
172
|
+
r += scale * (3/16) * (1 / np.pi)**0.5 * (35*np.cos(theta)**4 - 30*np.cos(theta)**2 + 3) * val[16]
|
|
173
|
+
r += -scale * (3/8) * (5 / np.pi)**0.5 * np.sin(theta) * (7*np.cos(theta)**3 - 3*np.cos(theta)) * np.cos(phi) * np.sqrt(2) * val[17]
|
|
174
|
+
r += -scale * (3/8) * (5 / np.pi)**0.5 * np.sin(theta) * (7*np.cos(theta)**3 - 3*np.cos(theta)) * np.sin(phi) * np.sqrt(2) * val[18]
|
|
175
|
+
r += scale * (3/8) * (5 / (2*np.pi))**0.5 * np.sin(theta)**2 * (7*np.cos(theta)**2 - 1) * np.cos(2*phi) * np.sqrt(2) * val[19]
|
|
176
|
+
r += scale * (3/8) * (5 / (2*np.pi))**0.5 * np.sin(theta)**2 * (7*np.cos(theta)**2 - 1) * np.sin(2*phi) * np.sqrt(2) * val[20]
|
|
177
|
+
r += -scale * (3/8) * (35 / np.pi)**0.5 * np.sin(theta)**3 * np.cos(theta) * np.cos(3*phi) * np.sqrt(2) * val[21]
|
|
178
|
+
r += -scale * (3/8) * (35 / np.pi)**0.5 * np.sin(theta)**3 * np.cos(theta) * np.sin(3*phi) * np.sqrt(2) * val[22]
|
|
179
|
+
r += scale * (3/16) * (35 / (2*np.pi))**0.5 * np.sin(theta)**4 * np.cos(4*phi) * np.sqrt(2) * val[23]
|
|
180
|
+
r += scale * (3/16) * (35 / (2*np.pi))**0.5 * np.sin(theta)**4 * np.sin(4*phi) * np.sqrt(2) * val[24]
|
|
181
|
+
|
|
182
|
+
r *= 4 * np.pi
|
|
183
|
+
|
|
184
|
+
if r < 0:
|
|
185
|
+
positive_surf.points[i] = np.zeros(3).copy()
|
|
186
|
+
negative_surf.points[i]= np.array([ r * np.sin(theta) * np.cos(phi),
|
|
187
|
+
r * np.sin(theta) * np.sin(phi),
|
|
188
|
+
r * np.cos(theta)]).copy()
|
|
189
|
+
else:
|
|
190
|
+
negative_surf.points[i] = np.zeros(3).copy()
|
|
191
|
+
positive_surf.points[i]= np.array([ r * np.sin(theta) * np.cos(phi),
|
|
192
|
+
r * np.sin(theta) * np.sin(phi),
|
|
193
|
+
r * np.cos(theta)]).copy()
|
|
194
|
+
Geo_Cps.append([positive_surf,negative_surf])
|
|
195
|
+
|
|
196
|
+
return Geo_Cps
|
|
197
|
+
|
|
198
|
+
Geo_Cps = Chemicalpressure(coeffvalues)
|
|
199
|
+
atom_data = []
|
|
200
|
+
#Graphing the spheres just the atom location
|
|
201
|
+
for i, coords in enumerate(xyz):
|
|
202
|
+
Sphere = pv.Sphere()
|
|
203
|
+
orig_pts = Sphere.points.copy()
|
|
204
|
+
Sphere.points *=Scaleatom
|
|
205
|
+
Sphere=Sphere.translate(coords, inplace=True)
|
|
206
|
+
if numberofatoms[i] == 0:
|
|
207
|
+
plotter.add_mesh(Sphere, color='blue')
|
|
208
|
+
elif numberofatoms[i] == 1:
|
|
209
|
+
plotter.add_mesh(Sphere, color='red')
|
|
210
|
+
elif numberofatoms[i] == 2:
|
|
211
|
+
plotter.add_mesh(Sphere, color='orange')
|
|
212
|
+
else: #If more than 4 atoms are needed increase the size of this section to the number of atoms needed
|
|
213
|
+
plotter.add_mesh(Sphere, color='green')
|
|
214
|
+
atom_data.append((Sphere, orig_pts, np.array(coords)))
|
|
215
|
+
|
|
216
|
+
#Needed for scaling
|
|
217
|
+
lobe_data = []
|
|
218
|
+
|
|
219
|
+
#Appling the chemical presure lobe
|
|
220
|
+
def apply_CP(geovalues, cellvalues, Geo_Cps, xyz):
|
|
221
|
+
natoms_geo = len(geovalues)
|
|
222
|
+
natoms_coords = len(xyz)
|
|
223
|
+
for j1 in range(-4, 5):
|
|
224
|
+
for j2 in range(-4, 5):
|
|
225
|
+
for j3 in range(-4, 5):
|
|
226
|
+
for k1 in range(natoms_geo):
|
|
227
|
+
for k2 in range(natoms_coords):
|
|
228
|
+
x1 = (geovalues[k1][0] + cellvalues[0][0]*j1 +cellvalues[1][0]*j2 +cellvalues[2][0]*j3)
|
|
229
|
+
y1 = (geovalues[k1][1] + cellvalues[0][1]*j1 + cellvalues[1][1]*j2 + cellvalues[2][1]*j3)
|
|
230
|
+
z1 = (geovalues[k1][2] + cellvalues[0][2]*j1 + cellvalues[1][2]*j2 + cellvalues[2][2]*j3)
|
|
231
|
+
x2 = xyz[k2][0]
|
|
232
|
+
y2 = xyz[k2][1]
|
|
233
|
+
z2 = xyz[k2][2]
|
|
234
|
+
dist = ((x1-x2)**2 + (y1-y2)**2 + (z1-z2)**2)**0.5 #This filters out all objects that are on top of other objects should filter to the number of atoms past this point
|
|
235
|
+
if(dist < 0.1):
|
|
236
|
+
for i in range(0,1):
|
|
237
|
+
ScaleXYZ=1 #This can be ignored do not change from 1,
|
|
238
|
+
#this changes how much the chemical pressures scale if changed from 1
|
|
239
|
+
#only use for bug fixes
|
|
240
|
+
xyztemp=[x2/ScaleXYZ,y2/ScaleXYZ,z2/ScaleXYZ]
|
|
241
|
+
ellipsoid1 = Geo_Cps[k1][1].copy() # negative lobe
|
|
242
|
+
ellipsoid2 = Geo_Cps[k1][0].copy() # positive lobe
|
|
243
|
+
|
|
244
|
+
orig_pts1 = ellipsoid1.points.copy()
|
|
245
|
+
orig_pts2 = ellipsoid2.points.copy()
|
|
246
|
+
|
|
247
|
+
ellipsoid1.points *= ScaleLobe
|
|
248
|
+
ellipsoid2.points *= ScaleLobe
|
|
249
|
+
|
|
250
|
+
ellipsoid1.translate(xyztemp, inplace=True)
|
|
251
|
+
ellipsoid2.translate(xyztemp, inplace=True)
|
|
252
|
+
|
|
253
|
+
lobe_data.append((ellipsoid1, orig_pts1,xyztemp))
|
|
254
|
+
lobe_data.append((ellipsoid2, orig_pts2,xyztemp))
|
|
255
|
+
|
|
256
|
+
plotter.add_mesh(ellipsoid1, style='surface', color='black') #Black in website code, Negative
|
|
257
|
+
plotter.add_mesh(ellipsoid2, style='surface', color='white') #White in website code, Positive
|
|
258
|
+
|
|
259
|
+
CreateCPs = apply_CP(geovalues, cellvalues, Geo_Cps, xyz)
|
|
260
|
+
#Sliders that scaleatoms and scale the chemical pressure lobes
|
|
261
|
+
def Scale_lobes(value):
|
|
262
|
+
for mesh, orig_pts, center in lobe_data:
|
|
263
|
+
mesh.points = orig_pts *value +center
|
|
264
|
+
plotter.render()
|
|
265
|
+
|
|
266
|
+
plotter.add_slider_widget(
|
|
267
|
+
callback=Scale_lobes,
|
|
268
|
+
rng = [1,300],
|
|
269
|
+
value = ScaleLobe,
|
|
270
|
+
title= 'Scaling Lobes',
|
|
271
|
+
pointa=(0,0.1),
|
|
272
|
+
pointb=(0.4,0.1),
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
def scale_atoms(value):
|
|
276
|
+
for mesh, orig_pts, center in atom_data:
|
|
277
|
+
mesh.points = orig_pts *value +center
|
|
278
|
+
plotter.render()
|
|
279
|
+
|
|
280
|
+
plotter.add_slider_widget(
|
|
281
|
+
callback=scale_atoms,
|
|
282
|
+
rng = [0.01,3],
|
|
283
|
+
value = Scaleatom,
|
|
284
|
+
title= 'Scaling Atoms',
|
|
285
|
+
pointa=(0,0.25),
|
|
286
|
+
pointb=(0.4,0.25),
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
#Creates points for the unit cell
|
|
290
|
+
cellvalue0=cellvalues[0]
|
|
291
|
+
cellvalue1=cellvalues[1]
|
|
292
|
+
cellvalue2=cellvalues[2]
|
|
293
|
+
|
|
294
|
+
Zero= np.array([0,0,0])
|
|
295
|
+
cellvalue01 = cellvalue0 + cellvalue1
|
|
296
|
+
cellvalue02 = cellvalue0 + cellvalue2
|
|
297
|
+
cellvalue12 = cellvalue1 + cellvalue2
|
|
298
|
+
cellvalue012 = cellvalue0 + cellvalue1 + cellvalue2
|
|
299
|
+
|
|
300
|
+
unitcellpoints = np.array([Zero,cellvalue0,Zero,cellvalue1,cellvalue0,cellvalue01,cellvalue1,cellvalue01, #Bottom Face
|
|
301
|
+
Zero,cellvalue2,cellvalue0,cellvalue02,cellvalue1,cellvalue12,cellvalue01,cellvalue012, #Vertical Edges
|
|
302
|
+
cellvalue2,cellvalue02,cellvalue2,cellvalue12,cellvalue02,cellvalue012,cellvalue12,cellvalue012], #Top Face
|
|
303
|
+
dtype=float)
|
|
304
|
+
|
|
305
|
+
#Create lines for unit cell
|
|
306
|
+
plotter.add_lines(unitcellpoints, color = 'green', width = unitcelllinewidth,) #The value for the width can be changed at the top of the code
|
|
307
|
+
plotter.show()
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: Chemical-Pressure-Plotter
|
|
3
|
+
Version: 0.6
|
|
4
|
+
Summary: Uses python to plot chemical pressures of atomic compounds
|
|
5
|
+
Home-page: https://github.com/ajsmits2/Chemical-Pressure/
|
|
6
|
+
Download-URL: https://github.com/ajsmits2/Chemical-Pressure/archive/refs/tags/Chemistry.tar.gz
|
|
7
|
+
Author: Alexander Smits
|
|
8
|
+
Author-email: ajsmits2@wisc.edu
|
|
9
|
+
License: MIT
|
|
10
|
+
Keywords: Chemistry,Pressure,Chemical
|
|
11
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.4
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.5
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.6
|
|
19
|
+
License-File: LICENSE
|
|
20
|
+
Requires-Dist: numpy
|
|
21
|
+
Requires-Dist: pyvista
|
|
22
|
+
Dynamic: author
|
|
23
|
+
Dynamic: author-email
|
|
24
|
+
Dynamic: classifier
|
|
25
|
+
Dynamic: download-url
|
|
26
|
+
Dynamic: home-page
|
|
27
|
+
Dynamic: keywords
|
|
28
|
+
Dynamic: license
|
|
29
|
+
Dynamic: license-file
|
|
30
|
+
Dynamic: requires-dist
|
|
31
|
+
Dynamic: summary
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
setup.cfg
|
|
4
|
+
setup.py
|
|
5
|
+
Chemical Pressure Plotting/Plotting Chemical Pressures.py
|
|
6
|
+
Chemical_Pressure_Plotter.egg-info/PKG-INFO
|
|
7
|
+
Chemical_Pressure_Plotter.egg-info/SOURCES.txt
|
|
8
|
+
Chemical_Pressure_Plotter.egg-info/dependency_links.txt
|
|
9
|
+
Chemical_Pressure_Plotter.egg-info/requires.txt
|
|
10
|
+
Chemical_Pressure_Plotter.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Chemical Pressure Plotting
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 ajsmits2
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: Chemical-Pressure-Plotter
|
|
3
|
+
Version: 0.6
|
|
4
|
+
Summary: Uses python to plot chemical pressures of atomic compounds
|
|
5
|
+
Home-page: https://github.com/ajsmits2/Chemical-Pressure/
|
|
6
|
+
Download-URL: https://github.com/ajsmits2/Chemical-Pressure/archive/refs/tags/Chemistry.tar.gz
|
|
7
|
+
Author: Alexander Smits
|
|
8
|
+
Author-email: ajsmits2@wisc.edu
|
|
9
|
+
License: MIT
|
|
10
|
+
Keywords: Chemistry,Pressure,Chemical
|
|
11
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.4
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.5
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.6
|
|
19
|
+
License-File: LICENSE
|
|
20
|
+
Requires-Dist: numpy
|
|
21
|
+
Requires-Dist: pyvista
|
|
22
|
+
Dynamic: author
|
|
23
|
+
Dynamic: author-email
|
|
24
|
+
Dynamic: classifier
|
|
25
|
+
Dynamic: download-url
|
|
26
|
+
Dynamic: home-page
|
|
27
|
+
Dynamic: keywords
|
|
28
|
+
Dynamic: license
|
|
29
|
+
Dynamic: license-file
|
|
30
|
+
Dynamic: requires-dist
|
|
31
|
+
Dynamic: summary
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
This code plots chemical pressures in crystals.
|
|
2
|
+
It will work with a maximum of 4 distinct atoms by default, although this can be changed.
|
|
3
|
+
Black lobes represent negative chemical pressures while white lobes represent positive chemical pressures.
|
|
4
|
+
The code requires a optimized crystal strucutre and the following files; a .xyz file, a coeff file, a cell file and a geo file.
|
|
5
|
+
|
|
6
|
+
For help with this code contact the Fredrickson Group at the University of Wisconsin Madison
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from distutils.core import setup
|
|
2
|
+
setup(
|
|
3
|
+
name = 'Chemical-Pressure-Plotter', # How you named your package folder (MyLib)
|
|
4
|
+
packages = ['Chemical Pressure Plotting'], # Chose the same as "name"
|
|
5
|
+
version = '0.6', # Start with a small number and increase it with every change you make
|
|
6
|
+
license='MIT', # Chose a license from here: https://help.github.com/articles/licensing-a-repository
|
|
7
|
+
description = 'Uses python to plot chemical pressures of atomic compounds', # Give a short description about your library
|
|
8
|
+
author = 'Alexander Smits', # Type in your name
|
|
9
|
+
author_email = 'ajsmits2@wisc.edu', # Type in your E-Mail
|
|
10
|
+
url = 'https://github.com/ajsmits2/Chemical-Pressure/', # Provide either the link to your github or to your website
|
|
11
|
+
download_url = 'https://github.com/ajsmits2/Chemical-Pressure/archive/refs/tags/Chemistry.tar.gz', # I explain this later on
|
|
12
|
+
keywords = ['Chemistry', 'Pressure', 'Chemical'], # Keywords that define your package best
|
|
13
|
+
install_requires=[ # I get to this in a second
|
|
14
|
+
'numpy',
|
|
15
|
+
'pyvista',
|
|
16
|
+
],
|
|
17
|
+
classifiers=[
|
|
18
|
+
'Development Status :: 5 - Production/Stable', # Chose either "3 - Alpha", "4 - Beta" or "5 - Production/Stable" as the current state of your package
|
|
19
|
+
|
|
20
|
+
'Intended Audience :: Developers', # Define that your audience are developers
|
|
21
|
+
'Topic :: Software Development :: Build Tools',
|
|
22
|
+
|
|
23
|
+
'License :: OSI Approved :: MIT License', # Again, pick a license
|
|
24
|
+
|
|
25
|
+
'Programming Language :: Python :: 3', #Specify which pyhton versions that you want to support
|
|
26
|
+
'Programming Language :: Python :: 3.4',
|
|
27
|
+
'Programming Language :: Python :: 3.5',
|
|
28
|
+
'Programming Language :: Python :: 3.6',
|
|
29
|
+
],
|
|
30
|
+
)
|