peritheos 0.1.0__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.
@@ -0,0 +1,527 @@
1
+ """
2
+ Original thermal pressure equation of states formalisms from Sokolova et al. 2016.
3
+ """
4
+
5
+ import numpy as np
6
+
7
+
8
+ def P_thermal(
9
+ n,
10
+ z,
11
+ Vo,
12
+ Ko,
13
+ kk,
14
+ Tr,
15
+ x,
16
+ expp,
17
+ V,
18
+ QBo,
19
+ d,
20
+ mb,
21
+ QB1o,
22
+ d1,
23
+ mb1,
24
+ QE1o,
25
+ mE1,
26
+ QE2o,
27
+ mE2,
28
+ TK,
29
+ gamVo,
30
+ beta,
31
+ gb,
32
+ ao,
33
+ m,
34
+ mm,
35
+ ae,
36
+ ):
37
+ """
38
+ Original thermal pressure equation from sokolova et al. 2016.
39
+
40
+ Parameters
41
+ ----------
42
+ n : float
43
+ Number of atoms in the chemical formula
44
+ z : float
45
+ Atomic number of the chemical formula unit
46
+ Vo : float
47
+ Reference volume in [JBar^-1] (same as [cm^3/mol]/10)
48
+ Ko : float
49
+ Bulk modulus at reference volume [kbar]
50
+ kk : float
51
+ Bulk modulus derivative at reference volume
52
+ Tr : float
53
+ Reference temperature in [K] for the EOS (typically 298.15 K)
54
+ x : float
55
+ Fractional volume (V/Vo)
56
+ expp : float
57
+ unused in function
58
+ V : float
59
+ Volume in [JBar^-1] (same as [cm^3/mol]/10)
60
+ QBo : float
61
+ should be 1
62
+ d : float
63
+ should be 1
64
+ mb : float
65
+ should be 0
66
+ QB1o : float
67
+ should be 1
68
+ d1 : float
69
+ should be 1
70
+ mb1 : float
71
+ should be 0
72
+ QE1o : float
73
+ Einstein characteristic temperature, Theta_1 in [K]
74
+ mE1 : float
75
+ The first Einstein number
76
+ QE2o : float
77
+ Einstain characteristic temperature, Theta_02 in [K]
78
+ mE2 : float
79
+ The second Einstein number
80
+ TK : float
81
+ Temperature in [K]
82
+ gamVo : float
83
+ Additive normalizing constant for the Gruneisen parameter, (given as delta in Sokolova et al. 2016)
84
+ beta : float
85
+ Should be 0
86
+ gb : float
87
+ Generalized Gruneisen parameter, given as t in Sokolova et al. 2016
88
+ ao : float
89
+ Intrinsic anharmonicity parameter (10e-6 [K]), given as a_0 in Sokolova et al. 2016
90
+ m : float
91
+ Anharmonic analogue of the Grüneisen parameter
92
+ mm : float
93
+ Electronic analogue of the Grüneisen parameter, given as g in Sokolova et al. 2016
94
+ ae : float
95
+ Free electrons parameter (10e-6 [K]), given as e_0 in Sokolova et al. 2016
96
+
97
+ Returns
98
+ -------
99
+ Pth : float
100
+ Thermal pressure in [bar]
101
+ """
102
+ R = 8.31451
103
+
104
+ fw = -np.log(3 * Ko / 10 / (1003.6 * (z * n / (Vo * 10)) ** (5 / 3)))
105
+ ff = x ** (1 / 3)
106
+ aa = 1.5 * (kk - 3) - fw
107
+ Px = (
108
+ 3
109
+ * Ko
110
+ * 1000
111
+ * np.exp(fw * (1 - ff))
112
+ * (1 / ff**5 - 1 / ff**4)
113
+ * (1 + aa * ff - aa * ff**2)
114
+ )
115
+ KT = (
116
+ Ko
117
+ * 1000
118
+ / ff**6
119
+ * np.exp(fw * (1 - ff))
120
+ * (
121
+ (-5 / ff**2 + 4 / ff) * (1 + aa * ff - aa * ff**2)
122
+ + (1 / ff - 1) * (1 + aa * ff - aa * ff**2) * (-fw)
123
+ + (1 / ff - 1) * (aa - 2 * aa * ff)
124
+ )
125
+ * (-x)
126
+ )
127
+ ex = (
128
+ 3
129
+ / ff**4
130
+ * Ko
131
+ * 1000
132
+ * np.exp(fw * (1 - ff))
133
+ * (
134
+ (-5 / ff**2 + 4 / ff) * (1 + aa * ff - aa * ff**2)
135
+ - (1 / ff - 1) * (1 + aa * ff - aa * ff**2) * fw
136
+ + (1 / ff - 1) * (aa - 2 * aa * ff)
137
+ )
138
+ )
139
+ ex1 = (
140
+ 1
141
+ / ff**3
142
+ * Ko
143
+ * 1000
144
+ * np.exp(fw * (1 - ff))
145
+ * fw
146
+ * (
147
+ (-5 / ff**2 + 4 / ff) * (1 + aa * ff - aa * ff**2)
148
+ - (1 / ff - 1) * (1 + aa * ff - aa * ff**2) * fw
149
+ + (1 / ff - 1) * (aa - 2 * aa * ff)
150
+ )
151
+ )
152
+ ex2 = (
153
+ Ko
154
+ * 1000
155
+ * np.exp(fw * (1 - ff))
156
+ * (
157
+ (10 / ff**3 - 4 / ff**2) * (1 + aa * ff - aa * ff**2)
158
+ + (-5 / ff**2 + 4 / ff) * (aa - 2 * aa * ff)
159
+ + fw / ff**2 * (1 + aa * ff - aa * ff**2)
160
+ - (1 / ff - 1) * (aa - 2 * aa * ff) * fw
161
+ - (aa - 2 * aa * ff) / ff**2
162
+ - 2 * aa * (1 / ff - 1)
163
+ )
164
+ / ff**3
165
+ )
166
+ kkx = (ex + ex1 - ex2) / (-KT / ff) / 3
167
+
168
+ gt = gb - beta * x ** (1 / 3)
169
+ gtx = -beta / 3 * x ** (-2 / 3)
170
+ gamV = (-3 * KT + 2 * Px * gt + 9 * KT * kkx - 6 * gt * KT) / 6 / (
171
+ 3 * KT - 2 * Px * gt
172
+ ) + gamVo
173
+ ff2 = (x + 0.00001) ** (1 / 3)
174
+ KT2 = (
175
+ Ko
176
+ * 1000
177
+ / ff2**6
178
+ * np.exp(fw * (1 - ff2))
179
+ * (
180
+ (-5 / ff2**2 + 4 / ff2) * (1 + aa * ff2 - aa * ff2**2)
181
+ + (1 / ff2 - 1) * (1 + aa * ff2 - aa * ff2**2) * (-fw)
182
+ + (1 / ff2 - 1) * (aa - 2 * aa * ff2)
183
+ )
184
+ * (-(x + 0.00001))
185
+ )
186
+ ex = (
187
+ 3
188
+ / ff2**4
189
+ * Ko
190
+ * 1000
191
+ * np.exp(fw * (1 - ff2))
192
+ * (
193
+ (-5 / ff2**2 + 4 / ff2) * (1 + aa * ff2 - aa * ff2**2)
194
+ - (1 / ff2 - 1) * (1 + aa * ff2 - aa * ff2**2) * fw
195
+ + (1 / ff2 - 1) * (aa - 2 * aa * ff2)
196
+ )
197
+ )
198
+ ex1 = (
199
+ 1
200
+ / ff2**3
201
+ * Ko
202
+ * 1000
203
+ * np.exp(fw * (1 - ff2))
204
+ * fw
205
+ * (
206
+ (-5 / ff2**2 + 4 / ff2) * (1 + aa * ff2 - aa * ff2**2)
207
+ - (1 / ff2 - 1) * (1 + aa * ff2 - aa * ff2**2) * fw
208
+ + (1 / ff2 - 1) * (aa - 2 * aa * ff2)
209
+ )
210
+ )
211
+ ex2 = (
212
+ Ko
213
+ * 1000
214
+ * np.exp(fw * (1 - ff2))
215
+ * (
216
+ (10 / ff2**3 - 4 / ff2**2) * (1 + aa * ff2 - aa * ff2**2)
217
+ + (-5 / ff2**2 + 4 / ff2) * (aa - 2 * aa * ff2)
218
+ + fw / ff2**2 * (1 + aa * ff2 - aa * ff2**2)
219
+ - (1 / ff2 - 1) * (aa - 2 * aa * ff2) * fw
220
+ - (aa - 2 * aa * ff2) / ff2**2
221
+ - 2 * aa * (1 / ff2 - 1)
222
+ )
223
+ / ff2**3
224
+ )
225
+ kkx2 = (ex + ex1 - ex2) / (-KT2 / ff2) / 3
226
+ ff1 = (x - 0.00001) ** (1 / 3)
227
+ KT1 = (
228
+ Ko
229
+ * 1000
230
+ / ff1**6
231
+ * np.exp(fw * (1 - ff1))
232
+ * (
233
+ (-5 / ff1**2 + 4 / ff1) * (1 + aa * ff1 - aa * ff1**2)
234
+ + (1 / ff1 - 1) * (1 + aa * ff1 - aa * ff1**2) * (-fw)
235
+ + (1 / ff1 - 1) * (aa - 2 * aa * ff1)
236
+ )
237
+ * (-(x - 0.00001))
238
+ )
239
+ ex = (
240
+ 3
241
+ / ff1**4
242
+ * Ko
243
+ * 1000
244
+ * np.exp(fw * (1 - ff1))
245
+ * (
246
+ (-5 / ff1**2 + 4 / ff1) * (1 + aa * ff1 - aa * ff1**2)
247
+ - (1 / ff1 - 1) * (1 + aa * ff1 - aa * ff1**2) * fw
248
+ + (1 / ff1 - 1) * (aa - 2 * aa * ff1)
249
+ )
250
+ )
251
+ ex1 = (
252
+ 1
253
+ / ff1**3
254
+ * Ko
255
+ * 1000
256
+ * np.exp(fw * (1 - ff1))
257
+ * fw
258
+ * (
259
+ (-5 / ff1**2 + 4 / ff1) * (1 + aa * ff1 - aa * ff1**2)
260
+ - (1 / ff1 - 1) * (1 + aa * ff1 - aa * ff1**2) * fw
261
+ + (1 / ff1 - 1) * (aa - 2 * aa * ff1)
262
+ )
263
+ )
264
+ ex2 = (
265
+ Ko
266
+ * 1000
267
+ * np.exp(fw * (1 - ff1))
268
+ * (
269
+ (10 / ff1**3 - 4 / ff1**2) * (1 + aa * ff1 - aa * ff1**2)
270
+ + (-5 / ff1**2 + 4 / ff1) * (aa - 2 * aa * ff1)
271
+ + fw / ff1**2 * (1 + aa * ff1 - aa * ff1**2)
272
+ - (1 / ff1 - 1) * (aa - 2 * aa * ff1) * fw
273
+ - (aa - 2 * aa * ff1) / ff1**2
274
+ - 2 * aa * (1 / ff1 - 1)
275
+ )
276
+ / ff1**3
277
+ )
278
+ kkx1 = (ex + ex1 - ex2) / (-KT1 / ff1) / 3
279
+
280
+ dkkdx = (kkx2 - kkx1) / (0.00002)
281
+
282
+ qV = (
283
+ -1
284
+ / 2
285
+ * (
286
+ -6 * KT * kkx**2 * Px * gt / x
287
+ + 6 * KT * dkkdx * Px * gt
288
+ + 6 * KT * kkx * KT * gt / x
289
+ - 6 * KT * kkx * Px * gtx
290
+ + 4 * gt**2 * KT * kkx * Px / x
291
+ - 4 * gt**2 * KT**2 / x
292
+ - 9 * KT**2 * dkkdx
293
+ + 6 * gtx * KT**2
294
+ )
295
+ / (3 * KT - 2 * Px * gt) ** 2
296
+ * x
297
+ / gamV
298
+ )
299
+ a = ao / 1000000 * x**m
300
+
301
+ QB = QBo * expp
302
+ QB1 = QB1o * expp
303
+ QE1 = QE1o * expp
304
+ QE2 = QE2o * expp
305
+
306
+ ggr = d * np.log(1 + QB / Tr / d)
307
+ br = 1 / (np.exp(ggr) - 1)
308
+ ex1r = np.exp(QB / Tr)
309
+ PBr = (
310
+ mb * R * ((QB * (d - 1) / 2 / d + Tr * QB * d * br / (Tr * d + QB)) * gamV / V)
311
+ )
312
+
313
+ gg = d * np.log(1 + QB / TK / d)
314
+ b = 1 / (np.exp(gg) - 1)
315
+ ex1 = np.exp(QB / TK)
316
+ PB = mb * R * ((QB * (d - 1) / 2 / d + TK * QB * d * b / (TK * d + QB)) * gamV / V)
317
+
318
+ gg1r = d1 * np.log(1 + QB1 / Tr / d1)
319
+ b1r = 1 / (np.exp(gg1r) - 1)
320
+ ex2r = np.exp(QB1 / Tr)
321
+ PB1r = (
322
+ mb1
323
+ * R
324
+ * ((QB1 * (d1 - 1) / 2 / d1 + Tr * QB1 * d1 * b1r / (Tr * d1 + QB1)) * gamV / V)
325
+ )
326
+
327
+ gg1 = d1 * np.log(1 + QB1 / TK / d1)
328
+ b1 = 1 / (np.exp(gg1) - 1)
329
+ ex2 = np.exp(QB1 / TK)
330
+ PB1 = (
331
+ mb1
332
+ * R
333
+ * ((QB1 * (d1 - 1) / 2 / d1 + TK * QB1 * d1 * b1 / (TK * d1 + QB1)) * gamV / V)
334
+ )
335
+
336
+ e1 = np.exp(QE1 / TK)
337
+ PE1 = mE1 * R * ((QE1 / 2 + QE1 / (e1 - 1)) * gamV / V)
338
+
339
+ e2 = np.exp(QE2 / TK)
340
+ PE2 = mE2 * R * ((QE2 / 2 + QE2 / (e2 - 1)) * gamV / V)
341
+
342
+ e1r = np.exp(QE1 / Tr)
343
+ PE1r = mE1 * R * ((QE1 / 2 + QE1 / (e1r - 1)) * gamV / V)
344
+
345
+ e2r = np.exp(QE2 / Tr)
346
+ PE2r = mE2 * R * ((QE2 / 2 + QE2 / (e2r - 1)) * gamV / V)
347
+ Pea = 3 / 2 * n * R * ao / 1000000 * x ** (m) * (m) / V * (TK**2 - Tr**2)
348
+ Pee = 3 / 2 * n * R * ae / 1000000 * x ** (mm) * (mm) / V * (TK**2 - Tr**2)
349
+
350
+ Pth = PB + PB1 + PE1 + PE2 - PBr - PB1r - PE1r - PE2r + Pee + Pea
351
+ return Pth
352
+
353
+
354
+ def I_gamV(z, n, b, Vo, Ko, kk, gamVo, gb, beta, e=0.001):
355
+ """
356
+ Integral of the Gruneisen parameter over the volume.
357
+
358
+ Parameters
359
+ ----------
360
+ z : float
361
+ Atomic number of the chemical formula unit
362
+ n : float
363
+ Number of atoms in the chemical formula
364
+ b : float
365
+ Fractional volume (V/V0)
366
+ Vo : float
367
+ Reference volume in [JBar^-1] (same as [cm^3/mol]/10)
368
+ Ko : float
369
+ Bulk modulus at reference volume [kbar]
370
+ kk : float
371
+ Bulk modulus derivative at reference volume
372
+ gamVo : float
373
+ Additive normalizing constant for the Gruneisen parameter, (given as delta in Sokolova et al. 2016)
374
+ gb : float
375
+ Generalized Gruneisen parameter, given as t in Sokolova et al. 2016
376
+ beta : float
377
+ Anharmonic analogue of the Grüneisen parameter
378
+ e : float
379
+ Tolerance for the integration
380
+
381
+ Returns
382
+ -------
383
+ I_gamV : float
384
+ Integral of the Gruneisen parameter over the volume
385
+
386
+ """
387
+ # check whether b is greater than 1
388
+ a = min(b, 1)
389
+ b = max(b, 1)
390
+
391
+ # calculate the integral using the trapezoidal rule
392
+ s2 = 1
393
+ h = b - a
394
+ S = f_gamV(a, n, z, Vo, Ko, kk, gamVo, gb, beta) + f_gamV(
395
+ b, n, z, Vo, Ko, kk, gamVo, gb, beta
396
+ )
397
+
398
+ while True:
399
+ s3 = s2
400
+ h /= 2
401
+ s1 = 0
402
+ x = a + h
403
+
404
+ while x < b:
405
+ s1 += 2 * f_gamV(x, n, z, Vo, Ko, kk, gamVo, gb, beta)
406
+ x += 2 * h
407
+
408
+ S += s1
409
+ s2 = (S + s1) * h / 3
410
+ error = abs(s3 - s2) / 15
411
+
412
+ if error < e:
413
+ break
414
+
415
+ return -s2 if b > 1 else s2
416
+
417
+
418
+ def f_gamV(x, n, z, Vo, Ko, kk, gamVo, gb, beta):
419
+ """
420
+ Helper function to calculate the Gruneisen parameter at a given temperature and pressure.
421
+
422
+ Parameters
423
+ ----------
424
+ x : float
425
+ Fractional volume (V/Vo)
426
+ n : float
427
+ Number of atoms in the chemical formula
428
+ z : float
429
+ Atomic number of the chemical formula unit
430
+ Vo : float
431
+ Reference volume in [JBar^-1] (same as [cm^3/mol]/10)
432
+ Ko : float
433
+ Bulk modulus at reference volume [kbar]
434
+ kk : float
435
+ Bulk modulus derivative at reference volume
436
+ gamVo : float
437
+ Additive normalizing constant for the Gruneisen parameter, (given as delta in Sokolova et al. 2016)
438
+ gb : float
439
+ Generalized Gruneisen parameter, given as t in Sokolova et al. 2016
440
+ beta : float
441
+ Anharmonic analogue of the Grüneisen parameter
442
+
443
+ Returns
444
+ -------
445
+ f_gamV_value : float
446
+ Gruneisen parameter at a given temperature and pressure
447
+ """
448
+ fw = -np.log(3 * Ko / 10 / (1003.6 * (z * n / (Vo * 10)) ** (5 / 3)))
449
+ ff = x ** (1 / 3)
450
+ aa = 1.5 * (kk - 3) - fw
451
+
452
+ KT = (
453
+ Ko
454
+ * 1000
455
+ / ff**6
456
+ * np.exp(fw * (1 - ff))
457
+ * (
458
+ (-5 / ff**2 + 4 / ff) * (1 + aa * ff - aa * ff**2)
459
+ + (1 / ff - 1) * (1 + aa * ff - aa * ff**2) * (-fw)
460
+ + (1 / ff - 1) * (aa - 2 * aa * ff)
461
+ )
462
+ * (-x)
463
+ )
464
+
465
+ Px = (
466
+ 3
467
+ * Ko
468
+ * 1000
469
+ * np.exp(fw * (1 - ff))
470
+ * (1 / ff**5 - 1 / ff**4)
471
+ * (1 + aa * ff - aa * ff**2)
472
+ )
473
+
474
+ ex = (
475
+ 3
476
+ / ff**4
477
+ * Ko
478
+ * 1000
479
+ * np.exp(fw * (1 - ff))
480
+ * (
481
+ (-5 / ff**2 + 4 / ff) * (1 + aa * ff - aa * ff**2)
482
+ - (1 / ff - 1) * (1 + aa * ff - aa * ff**2) * fw
483
+ + (1 / ff - 1) * (aa - 2 * aa * ff)
484
+ )
485
+ )
486
+
487
+ ex1 = (
488
+ 1
489
+ / ff**3
490
+ * Ko
491
+ * 1000
492
+ * np.exp(fw * (1 - ff))
493
+ * fw
494
+ * (
495
+ (-5 / ff**2 + 4 / ff) * (1 + aa * ff - aa * ff**2)
496
+ - (1 / ff - 1) * (1 + aa * ff - aa * ff**2) * fw
497
+ + (1 / ff - 1) * (aa - 2 * aa * ff)
498
+ )
499
+ )
500
+
501
+ ex2 = (
502
+ Ko
503
+ * 1000
504
+ * np.exp(fw * (1 - ff))
505
+ * (
506
+ (10 / ff**3 - 4 / ff**2) * (1 + aa * ff - aa * ff**2)
507
+ + (-5 / ff**2 + 4 / ff) * (aa - 2 * aa * ff)
508
+ + fw / ff**2 * (1 + aa * ff - aa * ff**2)
509
+ - (1 / ff - 1) * (aa - 2 * aa * ff) * fw
510
+ - (aa - 2 * aa * ff) / ff**2
511
+ - 2 * aa * (1 / ff - 1)
512
+ )
513
+ / ff**3
514
+ )
515
+
516
+ kkx = (ex + ex1 - ex2) / (-KT / ff) / 3
517
+
518
+ gt = gb - beta * x ** (1 / 3)
519
+ gtx = -beta / 3 * x ** (-2 / 3)
520
+
521
+ f_gamV_value = (
522
+ gamVo
523
+ + (-3 * KT + 2 * Px * gt + 9 * KT * kkx - 6 * gt * KT)
524
+ / (6 * (3 * KT - 2 * Px * gt))
525
+ ) / x
526
+
527
+ return f_gamV_value
@@ -0,0 +1,7 @@
1
+ """
2
+ This module contains the room temperature equations of state (EOS) implementations.
3
+ """
4
+
5
+ from .holzapfel import Holzapfel
6
+ from .bm import BM2, BM3, BM4
7
+ from .vinet import Vinet