calphy 1.3.6__py3-none-any.whl → 1.3.8__py3-none-any.whl
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.
- calphy/__init__.py +1 -1
- calphy/input.py +1 -1
- calphy/phase_diagram.py +151 -66
- calphy/scheduler.py +1 -1
- calphy/utils.py +57 -23
- {calphy-1.3.6.dist-info → calphy-1.3.8.dist-info}/METADATA +1 -1
- {calphy-1.3.6.dist-info → calphy-1.3.8.dist-info}/RECORD +11 -11
- {calphy-1.3.6.dist-info → calphy-1.3.8.dist-info}/WHEEL +1 -1
- {calphy-1.3.6.dist-info → calphy-1.3.8.dist-info}/LICENSE +0 -0
- {calphy-1.3.6.dist-info → calphy-1.3.8.dist-info}/entry_points.txt +0 -0
- {calphy-1.3.6.dist-info → calphy-1.3.8.dist-info}/top_level.txt +0 -0
calphy/__init__.py
CHANGED
calphy/input.py
CHANGED
calphy/phase_diagram.py
CHANGED
|
@@ -4,47 +4,58 @@ import pandas as pd
|
|
|
4
4
|
import matplotlib.pyplot as plt
|
|
5
5
|
import warnings
|
|
6
6
|
import itertools
|
|
7
|
+
import math
|
|
7
8
|
|
|
8
9
|
from calphy.integrators import kb
|
|
9
10
|
|
|
10
11
|
from scipy.spatial import ConvexHull
|
|
11
12
|
from scipy.interpolate import splrep, splev
|
|
12
13
|
|
|
13
|
-
colors = ['#a6cee3','#1f78b4','#b2df8a',
|
|
14
|
+
colors = ['#a6cee3','#1f78b4','#b2df8a',
|
|
15
|
+
'#33a02c','#fb9a99','#e31a1c',
|
|
16
|
+
'#fdbf6f','#ff7f00','#cab2d6',
|
|
17
|
+
'#6a3d9a','#ffff99','#b15928']
|
|
14
18
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
tarr = np.array(d[phase]["%.2f"%comp]["temperature"])
|
|
19
|
+
|
|
20
|
+
def _get_temp_arg(tarr, temp, threshold=1E-1):
|
|
21
|
+
if tarr is None:
|
|
22
|
+
return None
|
|
20
23
|
arg = np.argsort(np.abs(tarr-temp))[0]
|
|
24
|
+
|
|
21
25
|
th = np.abs(tarr-temp)[arg]
|
|
22
26
|
if th > threshold:
|
|
23
|
-
|
|
27
|
+
arg = None
|
|
28
|
+
return arg
|
|
29
|
+
|
|
30
|
+
def _is_val_ok(val):
|
|
31
|
+
if val is None:
|
|
32
|
+
return False
|
|
33
|
+
elif math.isnan(val):
|
|
34
|
+
return False
|
|
24
35
|
else:
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
36
|
+
return True
|
|
37
|
+
|
|
38
|
+
def _get_fe_at_args(arr, args):
|
|
39
|
+
fes = []
|
|
40
|
+
for count, x in enumerate(args):
|
|
41
|
+
if _is_val_ok(x):
|
|
42
|
+
fes.append(arr[count][int(x)])
|
|
43
|
+
else:
|
|
44
|
+
fes.append(None)
|
|
45
|
+
return fes
|
|
46
|
+
|
|
47
|
+
def _calculate_configurational_entropy(x, correction=0):
|
|
32
48
|
if correction == 0:
|
|
33
49
|
s = np.array([(c*np.log(c) + (1-c)*np.log(1-c)) if 1 > c > 0 else 0 for c in x])
|
|
34
50
|
else:
|
|
35
51
|
arg = np.argsort(np.abs(x-correction))[0]
|
|
36
52
|
left_side = x[:arg+1]
|
|
37
53
|
right_side = x[arg:]
|
|
38
|
-
#print(len(left_side))
|
|
39
|
-
#print(left_side)
|
|
40
|
-
#print(len(right_side))
|
|
41
|
-
#print(right_side)
|
|
42
54
|
|
|
43
55
|
if len(left_side)>0:
|
|
44
56
|
left_side = left_side/left_side[-1]
|
|
45
57
|
s_left = np.array([(c*np.log(c) + (1-c)*np.log(1-c)) if 1 > c > 0 else 0 for c in left_side])
|
|
46
|
-
|
|
47
|
-
#correct to zero
|
|
58
|
+
|
|
48
59
|
if len(right_side)>0:
|
|
49
60
|
right_side = right_side - right_side[0]
|
|
50
61
|
right_side = right_side/right_side[-1]
|
|
@@ -56,81 +67,122 @@ def calculate_configurational_entropy(x, correction=0):
|
|
|
56
67
|
return s_left
|
|
57
68
|
else:
|
|
58
69
|
return np.concatenate((s_left, s_right[1:]))
|
|
59
|
-
|
|
60
|
-
|
|
61
70
|
return -s
|
|
62
71
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
def get_free_energy_fit(composition, free_energy, fit_order=5):
|
|
72
|
+
def _get_free_energy_fit(composition,
|
|
73
|
+
free_energy,
|
|
74
|
+
fit_order=5,
|
|
75
|
+
end_weight=3,
|
|
76
|
+
end_indices=4):
|
|
70
77
|
"""
|
|
71
78
|
Create splines for free energy, and return them
|
|
72
79
|
"""
|
|
73
80
|
weights = np.ones_like(free_energy)
|
|
74
|
-
weights[0:
|
|
75
|
-
weights[-
|
|
81
|
+
weights[0:end_indices] = end_weight
|
|
82
|
+
weights[-end_indices:] = end_weight
|
|
76
83
|
fit = np.polyfit(composition, free_energy, fit_order, w=weights)
|
|
77
84
|
return fit
|
|
78
85
|
|
|
79
|
-
|
|
80
|
-
|
|
86
|
+
def get_phase_free_energy(df, phase, temp,
|
|
87
|
+
composition_interval=(0, 1),
|
|
81
88
|
ideal_configurational_entropy=False,
|
|
82
89
|
entropy_correction=0.0,
|
|
83
|
-
composition_grid=10000,
|
|
84
90
|
fit_order=5,
|
|
85
|
-
|
|
86
|
-
composition_interval=(0, 1),
|
|
91
|
+
composition_grid=10000,
|
|
87
92
|
composition_cutoff=None,
|
|
88
|
-
reset_value=1
|
|
93
|
+
reset_value=1,
|
|
94
|
+
plot=False):
|
|
89
95
|
"""
|
|
90
|
-
|
|
96
|
+
Get the free energy of a phase as a function of composition.
|
|
97
|
+
|
|
98
|
+
Parameters
|
|
99
|
+
----------
|
|
100
|
+
df: Pandas dataframe
|
|
101
|
+
Dataframe consisting of values from simulation. Should contain at least columns composition, phase, `free_energy` and `temperature`.
|
|
102
|
+
`energy_free` and `temperature` should be arrays of equal length, generally an output from reversible scaling calculation.
|
|
103
|
+
|
|
104
|
+
phase: str
|
|
105
|
+
phase for which calculation is to be done. Should be present in `df`.
|
|
106
|
+
|
|
107
|
+
temp: float
|
|
108
|
+
temperature at which the free energy curves are to be calculated.
|
|
109
|
+
|
|
110
|
+
composition_interval: tuple, optional
|
|
111
|
+
If provided, this composition interval is considered. Default (0, 1)
|
|
112
|
+
|
|
113
|
+
ideal_configuration_entropy: bool, optional\
|
|
114
|
+
If True, add the ideal configurational entropy. See Notes. Default False.
|
|
115
|
+
|
|
116
|
+
entropy_correction: float, optional.
|
|
117
|
+
The composition of the ordered phase. See Notes. Default None.
|
|
118
|
+
|
|
119
|
+
fit_order: int, optional
|
|
120
|
+
Order of the polynomial fit used for fitting free energy as a function of composition. Default 5.
|
|
121
|
+
|
|
122
|
+
composition_grid: int, optional
|
|
123
|
+
Number of composition points to be used for fitting. Default 10000.
|
|
124
|
+
|
|
125
|
+
composition_cutoff: float, optional
|
|
126
|
+
term for correcting incomplete data. If two consecutive composition values are separated by more than `composition_cutoff`,
|
|
127
|
+
it is reset to `reset_value`. Default None.
|
|
128
|
+
|
|
129
|
+
reset_value: float, optional
|
|
130
|
+
see above. Default 1.
|
|
131
|
+
|
|
132
|
+
plot: bool, optional
|
|
133
|
+
If True, plot the calculated free energy curves.
|
|
134
|
+
|
|
135
|
+
Returns
|
|
136
|
+
-------
|
|
137
|
+
result_dict: dict
|
|
138
|
+
contains keys: "phase", "temperature", "composition", "free_energy", and "entropy".
|
|
139
|
+
|
|
140
|
+
Notes
|
|
141
|
+
-----
|
|
142
|
+
To be added
|
|
91
143
|
"""
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
for c in comporg:
|
|
97
|
-
if (composition_interval[0] <= c <= composition_interval[1]):
|
|
98
|
-
f = get_free_energy_at(data, phase, float(c), temp)
|
|
99
|
-
if f is not None:
|
|
100
|
-
fes.append(f)
|
|
101
|
-
comp.append(c)
|
|
144
|
+
df_phase = df.loc[df['phase']==phase]
|
|
145
|
+
#drop Nones
|
|
146
|
+
df_phase = df_phase.sort_values(by="composition")
|
|
147
|
+
df_phase = df_phase[(df_phase['composition'] >= composition_interval[0]) & (df_phase['composition'] <= composition_interval[1])]
|
|
102
148
|
|
|
103
|
-
|
|
104
|
-
|
|
149
|
+
composition = df_phase['composition'].values
|
|
150
|
+
args = df_phase["temperature"].apply(_get_temp_arg, args=(temp,))
|
|
151
|
+
fes = _get_fe_at_args(df_phase["free_energy"].values, args)
|
|
105
152
|
|
|
153
|
+
#print(fes)
|
|
154
|
+
#filter out None values
|
|
155
|
+
composition = np.array([composition[count] for count, x in enumerate(fes) if x is not None])
|
|
156
|
+
fes = np.array([x for x in fes if x is not None])
|
|
157
|
+
|
|
106
158
|
if (len(fes)==0) or (fes is None):
|
|
107
159
|
warnings.warn("Some temperatures could not be found!")
|
|
108
|
-
else:
|
|
160
|
+
else:
|
|
109
161
|
if ideal_configurational_entropy:
|
|
110
|
-
entropy_term = kb*temp*
|
|
162
|
+
entropy_term = kb*temp*_calculate_configurational_entropy(composition,
|
|
163
|
+
correction=entropy_correction)
|
|
111
164
|
fes = fes - entropy_term
|
|
112
165
|
else:
|
|
113
166
|
entropy_term = []
|
|
114
167
|
|
|
115
|
-
fe_fit =
|
|
116
|
-
compfine = np.linspace(np.min(
|
|
117
|
-
|
|
118
|
-
fe = np.polyval(fe_fit, compfine)
|
|
168
|
+
fe_fit = _get_free_energy_fit(composition, fes, fit_order=fit_order)
|
|
169
|
+
compfine = np.linspace(np.min(composition), np.max(composition), composition_grid)
|
|
119
170
|
|
|
120
|
-
#
|
|
171
|
+
#now fit on the comp grid again
|
|
172
|
+
fe = np.polyval(fe_fit, compfine)
|
|
173
|
+
|
|
121
174
|
if composition_cutoff is not None:
|
|
122
|
-
|
|
123
|
-
distances = [np.min(np.abs(c-comp)) for c in compfine]
|
|
175
|
+
distances = [np.min(np.abs(c-composition)) for c in compfine]
|
|
124
176
|
filters = [x for x in range(len(distances)) if distances[x] > composition_cutoff]
|
|
125
177
|
fe[filters] = reset_value
|
|
126
|
-
|
|
178
|
+
|
|
127
179
|
if plot:
|
|
128
|
-
plt.scatter(
|
|
129
|
-
plt.plot(compfine, fe, label=f'{phase}-fit', color=
|
|
180
|
+
plt.scatter(composition, fes, s=4, label=f'{phase}-calc.', color="#e57373")
|
|
181
|
+
plt.plot(compfine, fe, label=f'{phase}-fit', color="#b71c1c")
|
|
130
182
|
plt.xlabel("x")
|
|
131
183
|
plt.ylabel("F (eV/atom)")
|
|
132
184
|
plt.legend()
|
|
133
|
-
|
|
185
|
+
|
|
134
186
|
return {"phase":phase, "temperature": temp, "composition": compfine,
|
|
135
187
|
"free_energy": fe, "entropy": entropy_term}
|
|
136
188
|
return None
|
|
@@ -139,7 +191,14 @@ def get_phase_free_energy(data, phase, temp,
|
|
|
139
191
|
def get_free_energy_mixing(dict_list, threshold=1E-3):
|
|
140
192
|
"""
|
|
141
193
|
Input is a list of dictionaries
|
|
194
|
+
|
|
195
|
+
Get free energy of mixing by subtracting end member values.
|
|
196
|
+
End members are chosen automatically.
|
|
142
197
|
"""
|
|
198
|
+
dict_list = np.atleast_1d(dict_list)
|
|
199
|
+
|
|
200
|
+
dict_list = np.array([dct for dct in dict_list if dct is not None])
|
|
201
|
+
|
|
143
202
|
#we have to get min_comp from all possible values
|
|
144
203
|
min_comp = np.min([np.min(d["composition"]) for d in dict_list])
|
|
145
204
|
max_comp = np.max([np.max(d["composition"]) for d in dict_list])
|
|
@@ -236,13 +295,17 @@ def get_tangent_type(dict_list, tangent, energy):
|
|
|
236
295
|
return phase_str
|
|
237
296
|
|
|
238
297
|
|
|
239
|
-
def get_common_tangents(dict_list,
|
|
298
|
+
def get_common_tangents(dict_list,
|
|
299
|
+
peak_cutoff=0.01,
|
|
300
|
+
plot=False,
|
|
240
301
|
remove_self_tangents_for=[],
|
|
241
302
|
color_dict=None):
|
|
242
303
|
"""
|
|
243
304
|
Get common tangent constructions using convex hull method
|
|
244
305
|
"""
|
|
245
|
-
points = np.vstack([np.column_stack((d["composition"],
|
|
306
|
+
points = np.vstack([np.column_stack((d["composition"],
|
|
307
|
+
d["free_energy_mix"])) for d in dict_list])
|
|
308
|
+
|
|
246
309
|
if color_dict is None:
|
|
247
310
|
color_dict = create_color_list(dict_list)
|
|
248
311
|
|
|
@@ -266,6 +329,7 @@ def get_common_tangents(dict_list, peak_cutoff=0.01, plot=False,
|
|
|
266
329
|
tangents = []
|
|
267
330
|
energies = []
|
|
268
331
|
tangent_colors = []
|
|
332
|
+
phases = []
|
|
269
333
|
|
|
270
334
|
for d in dist:
|
|
271
335
|
t = [convex_x[sargs][d], convex_x[sargs][d+1]]
|
|
@@ -276,6 +340,7 @@ def get_common_tangents(dict_list, peak_cutoff=0.01, plot=False,
|
|
|
276
340
|
tangents.append(t)
|
|
277
341
|
energies.append(e)
|
|
278
342
|
tangent_colors.append(color_dict[phase_str])
|
|
343
|
+
phases.append(phase_str.split("-"))
|
|
279
344
|
|
|
280
345
|
if plot:
|
|
281
346
|
for d in dict_list:
|
|
@@ -283,5 +348,25 @@ def get_common_tangents(dict_list, peak_cutoff=0.01, plot=False,
|
|
|
283
348
|
for t, e in zip(tangents, energies):
|
|
284
349
|
plt.plot(t, e, color="black", ls="dashed")
|
|
285
350
|
plt.ylim(top=0.0)
|
|
286
|
-
|
|
351
|
+
|
|
352
|
+
return np.array(tangents), np.array(energies), np.array(tangent_colors), color_dict, np.array(phases)
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
def plot_phase_diagram(tangents, temperature,
|
|
356
|
+
colors,
|
|
357
|
+
edgecolor="#37474f",
|
|
358
|
+
linewidth=1,
|
|
359
|
+
linestyle='-'):
|
|
360
|
+
|
|
361
|
+
fig, ax = plt.subplots(edgecolor=edgecolor)
|
|
362
|
+
|
|
363
|
+
for count, x in enumerate(tangents):
|
|
364
|
+
for c, a in enumerate(x):
|
|
365
|
+
ax.plot(np.array(a),
|
|
366
|
+
[temperature[count], temperature[count]],
|
|
367
|
+
linestyle,
|
|
368
|
+
lw=linewidth,
|
|
369
|
+
c=colors[count][c],
|
|
370
|
+
)
|
|
371
|
+
return fig
|
|
287
372
|
|
calphy/scheduler.py
CHANGED
calphy/utils.py
CHANGED
|
@@ -4,6 +4,7 @@ from ase.io import read
|
|
|
4
4
|
import numpy as np
|
|
5
5
|
from tqdm.notebook import trange
|
|
6
6
|
import os
|
|
7
|
+
import re
|
|
7
8
|
|
|
8
9
|
try:
|
|
9
10
|
from pyiron_atomistics import Project
|
|
@@ -43,32 +44,65 @@ def create_job_from_inputfile(pr, inputfile, potential, kernel=None):
|
|
|
43
44
|
if os.path.exists(basedir_path):
|
|
44
45
|
#create job and copy files
|
|
45
46
|
try:
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
#make sure that the report file exists
|
|
48
|
+
reportfile = os.path.join(basedir_path, 'report.yaml')
|
|
49
|
+
if os.path.exists(reportfile):
|
|
50
|
+
job = pr.create.job.Calphy(basedir.replace('-', '_'))
|
|
51
|
+
job._job_id = pr.db.add_item_dict(job.db_entry())
|
|
52
|
+
job.refresh_job_status()
|
|
53
|
+
shutil.copytree(basedir_path, job.working_directory, dirs_exist_ok=True)
|
|
50
54
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
#read in structure, assign potential
|
|
56
|
+
Z_of_type = dict([(count+1, calc._element_dict[element]['atomic_number']) for count, element in enumerate(calc.element)])
|
|
57
|
+
structure = read(calc.lattice, format='lammps-data', style='atomic', Z_of_type=Z_of_type)
|
|
58
|
+
job.structure = ase_to_pyiron(structure)
|
|
59
|
+
job.potential = potential
|
|
60
|
+
pr.db.item_update({"ChemicalFormula": job.structure.get_chemical_formula()}, job._job_id)
|
|
57
61
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
+
#collect output
|
|
63
|
+
job.input.mode = calc.mode
|
|
64
|
+
job.status.collect = True
|
|
65
|
+
job.collect_output()
|
|
62
66
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
#populate inputs
|
|
68
|
+
calcdict = calc.model_dump()
|
|
69
|
+
#temporary fix for comp scaling until its introduced in pyiron
|
|
70
|
+
del calcdict['composition_scaling']
|
|
71
|
+
job.input.update(calcdict)
|
|
72
|
+
job._create_calc()
|
|
73
|
+
job.to_hdf()
|
|
74
|
+
job.status.finished = True
|
|
75
|
+
else:
|
|
76
|
+
print(f'parsing {basedir_path} failed, skipping')
|
|
71
77
|
except:
|
|
78
|
+
#delete job
|
|
79
|
+
pr.remove_job(basedir.replace('-', '_'))
|
|
72
80
|
print(f'parsing {basedir_path} failed, skipping')
|
|
73
81
|
else:
|
|
74
|
-
print(f'could not find {basedir_path}, skipping')
|
|
82
|
+
print(f'could not find {basedir_path}, skipping')
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def get_free_energy(job):
|
|
86
|
+
return job["output/energy_free"]
|
|
87
|
+
|
|
88
|
+
def get_temperature(job):
|
|
89
|
+
return job["output/temperature"]
|
|
90
|
+
|
|
91
|
+
def get_phase(job):
|
|
92
|
+
raw = job.name.split('_')
|
|
93
|
+
if raw[-3] == 'liquid':
|
|
94
|
+
phase = 'liquid'
|
|
95
|
+
else:
|
|
96
|
+
phase = raw[1]
|
|
97
|
+
return phase
|
|
98
|
+
|
|
99
|
+
def get_composition(job):
|
|
100
|
+
chem = job.project.db.get_item_by_id(job.id)['chemicalformula']
|
|
101
|
+
comp_split = re.split('(\d+)', chem)[:-1]
|
|
102
|
+
if len(comp_split) == 2:
|
|
103
|
+
if comp_split[0] == 'Al':
|
|
104
|
+
return 0.00
|
|
105
|
+
else:
|
|
106
|
+
return 1.00
|
|
107
|
+
else:
|
|
108
|
+
return int(comp_split[3])/(int(comp_split[1])+int(comp_split[3]))
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
calphy/__init__.py,sha256=
|
|
1
|
+
calphy/__init__.py,sha256=jJPLUeJFKfa7dCVgQ0_d1yXSSgim9KpQLN3LbiBlRws,233
|
|
2
2
|
calphy/alchemy.py,sha256=epv_vJoAMVbj-S1TuPSbBGr4w_a9qEr4EIxKlgwdlSo,12893
|
|
3
3
|
calphy/clitools.py,sha256=oDqaw0s-LJ7tAdW_Njk2SFljVx6K34Rs8sdMz48SNSI,4125
|
|
4
4
|
calphy/composition_transformation.py,sha256=Hh240-iVGC8ATlJ3nQK757qVZIBrE2aw7dsF46mi3oo,15353
|
|
5
5
|
calphy/errors.py,sha256=KN47RWTLbg1H_NZMrhCiJCbqjqJScJ1pgQAuzj1-l84,1268
|
|
6
6
|
calphy/helpers.py,sha256=nj8g53H6ScohQtyV7Enzms8Rv_89PRrDDY1IHjFSZdQ,8292
|
|
7
|
-
calphy/input.py,sha256=
|
|
7
|
+
calphy/input.py,sha256=BNSxEKTvORN-TJs5fqlmUnK-yqv2Iul4wNftUTYbqSo,29533
|
|
8
8
|
calphy/integrators.py,sha256=CcK3oqIwZ3z41v3fh3IvswY_l-ZbLRluWuDNJlXCXfg,20680
|
|
9
9
|
calphy/kernel.py,sha256=rd_-EfCiBhQjkxcVaoLtVJB2_qDgS-g-dQ0BZBTJQ_A,6190
|
|
10
10
|
calphy/liquid.py,sha256=8KH4t0mcpumR1KlOoWHjlr8lcQaWLXQPcA438A08hfM,13450
|
|
11
11
|
calphy/phase.py,sha256=5ZA7tn6ZyZozZW7wMiZSfkRQZAa5Wg9XtIjNofu21cg,44730
|
|
12
|
-
calphy/phase_diagram.py,sha256=
|
|
12
|
+
calphy/phase_diagram.py,sha256=2EwmT_qkT5BEP6Sx0_rm09kPP2RWh5JY4sogIBK_AhA,12992
|
|
13
13
|
calphy/queuekernel.py,sha256=4GMIYnjMiAPipoLNKP5noYcfeEOI_vCqm84zgokk7Xw,5321
|
|
14
14
|
calphy/routines.py,sha256=W6OZEPv6HEG11EYsoIbum2WVrO3Ly36i5UWsYQ4oBdQ,17473
|
|
15
|
-
calphy/scheduler.py,sha256=
|
|
15
|
+
calphy/scheduler.py,sha256=9p1MdMlB2QtMV6-LmjBU9E0GOxx-fdDEvAb3LOVsRPM,8468
|
|
16
16
|
calphy/solid.py,sha256=49gT0wNOP3h8lRDXarULP-bU09lIrnDCTUcyxE7X-UE,19795
|
|
17
17
|
calphy/splines.py,sha256=BGwUVz_qXQxUzpUCuZo6CsELcd5JVNWzI-Ttcz22G_E,61627
|
|
18
|
-
calphy/utils.py,sha256=
|
|
19
|
-
calphy-1.3.
|
|
20
|
-
calphy-1.3.
|
|
21
|
-
calphy-1.3.
|
|
22
|
-
calphy-1.3.
|
|
23
|
-
calphy-1.3.
|
|
24
|
-
calphy-1.3.
|
|
18
|
+
calphy/utils.py,sha256=0UpsYoxjS5N-iGs-cdm0YDMkLF8IHvKO3smXDHrj3eg,3818
|
|
19
|
+
calphy-1.3.8.dist-info/LICENSE,sha256=XIHGB5RZLIhOjjoO1bPf0II-qDbjhP5Cv5HJMRE9v1g,16651
|
|
20
|
+
calphy-1.3.8.dist-info/METADATA,sha256=IczeMseQTEJMkgpGF6A7gNfzwuFiJzzIvfulp-n291c,4215
|
|
21
|
+
calphy-1.3.8.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
22
|
+
calphy-1.3.8.dist-info/entry_points.txt,sha256=W9qq254koyWnAgo1jtfQP9bO5Q7sgZrzc8BMnfo3vf4,386
|
|
23
|
+
calphy-1.3.8.dist-info/top_level.txt,sha256=w871dhMqPwgjjbifBWdkT9_aOnK1ek4Odrh8UnSG3PE,7
|
|
24
|
+
calphy-1.3.8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|