gebpy 1.1.3__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.
Files changed (254) hide show
  1. gebpy/__init__.py +55 -0
  2. gebpy/__pycache__/__init__.cpython-310.pyc +0 -0
  3. gebpy/adapters/__init__.py +0 -0
  4. gebpy/cli/__init__.py +0 -0
  5. gebpy/core/__init__.py +0 -0
  6. gebpy/core/chemistry/__init__.py +0 -0
  7. gebpy/core/chemistry/common.py +1369 -0
  8. gebpy/core/chemistry/elements.py +317 -0
  9. gebpy/core/chemistry/geochemistry.py +1728 -0
  10. gebpy/core/fluids/__init__.py +0 -0
  11. gebpy/core/io/__init__.py +0 -0
  12. gebpy/core/mathematics/__init__.py +0 -0
  13. gebpy/core/minerals/__init__.py +0 -0
  14. gebpy/core/minerals/carbonates.py +412 -0
  15. gebpy/core/minerals/common.py +555 -0
  16. gebpy/core/minerals/config.py +77 -0
  17. gebpy/core/minerals/cyclosilicates.py +0 -0
  18. gebpy/core/minerals/halides.py +0 -0
  19. gebpy/core/minerals/inosilicates.py +0 -0
  20. gebpy/core/minerals/nesosilicates.py +0 -0
  21. gebpy/core/minerals/organics.py +0 -0
  22. gebpy/core/minerals/oxides.py +589 -0
  23. gebpy/core/minerals/phosphates.py +0 -0
  24. gebpy/core/minerals/phospides.py +0 -0
  25. gebpy/core/minerals/phyllosilicates.py +436 -0
  26. gebpy/core/minerals/sorosilicates.py +0 -0
  27. gebpy/core/minerals/sulfates.py +0 -0
  28. gebpy/core/minerals/sulfides.py +459 -0
  29. gebpy/core/minerals/synthesis.py +201 -0
  30. gebpy/core/minerals/tectosilicates.py +433 -0
  31. gebpy/core/physics/__init__.py +0 -0
  32. gebpy/core/physics/common.py +53 -0
  33. gebpy/core/physics/geophysics.py +351 -0
  34. gebpy/core/rocks/__init__.py +0 -0
  35. gebpy/core/rocks/anisotropic_rocks.py +395 -0
  36. gebpy/core/rocks/common.py +95 -0
  37. gebpy/core/rocks/config.py +77 -0
  38. gebpy/core/rocks/isotropic_rocks.py +395 -0
  39. gebpy/core/rocks/sedimentary.py +385 -0
  40. gebpy/core/subsurface/__init__.py +0 -0
  41. gebpy/data_minerals/__init__.py +0 -0
  42. gebpy/data_minerals/albite.yaml +59 -0
  43. gebpy/data_minerals/anatase.yaml +43 -0
  44. gebpy/data_minerals/ankerite.yaml +47 -0
  45. gebpy/data_minerals/annite.yaml +57 -0
  46. gebpy/data_minerals/anorthite.yaml +59 -0
  47. gebpy/data_minerals/antigorite.yaml +53 -0
  48. gebpy/data_minerals/aragonite.yaml +48 -0
  49. gebpy/data_minerals/argutite.yaml +43 -0
  50. gebpy/data_minerals/arsenolite.yaml +40 -0
  51. gebpy/data_minerals/au3oxide.yaml +46 -0
  52. gebpy/data_minerals/avicennite.yaml +40 -0
  53. gebpy/data_minerals/azurite.yaml +53 -0
  54. gebpy/data_minerals/baddeleyite.yaml +49 -0
  55. gebpy/data_minerals/bismite.yaml +49 -0
  56. gebpy/data_minerals/boehmite.yaml +48 -0
  57. gebpy/data_minerals/brookite.yaml +46 -0
  58. gebpy/data_minerals/brucite.yaml +45 -0
  59. gebpy/data_minerals/bunsenite.yaml +40 -0
  60. gebpy/data_minerals/calcite.yaml +45 -0
  61. gebpy/data_minerals/cassiterite.yaml +43 -0
  62. gebpy/data_minerals/cerussite.yaml +48 -0
  63. gebpy/data_minerals/chamosite.yaml +56 -0
  64. gebpy/data_minerals/chlorite.yaml +75 -0
  65. gebpy/data_minerals/chromite.yaml +42 -0
  66. gebpy/data_minerals/chrysotile.yaml +53 -0
  67. gebpy/data_minerals/claudetite.yaml +49 -0
  68. gebpy/data_minerals/clinochlore.yaml +55 -0
  69. gebpy/data_minerals/cochromite.yaml +42 -0
  70. gebpy/data_minerals/corundum.yaml +43 -0
  71. gebpy/data_minerals/crocoite.yaml +51 -0
  72. gebpy/data_minerals/cuprite.yaml +40 -0
  73. gebpy/data_minerals/cuprospinel.yaml +42 -0
  74. gebpy/data_minerals/diaspore.yaml +48 -0
  75. gebpy/data_minerals/dolomite.yaml +47 -0
  76. gebpy/data_minerals/eastonite.yaml +57 -0
  77. gebpy/data_minerals/eskolaite.yaml +43 -0
  78. gebpy/data_minerals/fechlorite.yaml +61 -0
  79. gebpy/data_minerals/fecolumbite.yaml +48 -0
  80. gebpy/data_minerals/ferberite.yaml +51 -0
  81. gebpy/data_minerals/fetantalite.yaml +48 -0
  82. gebpy/data_minerals/franklinite.yaml +42 -0
  83. gebpy/data_minerals/gahnite.yaml +42 -0
  84. gebpy/data_minerals/galaxite.yaml +42 -0
  85. gebpy/data_minerals/geikielite.yaml +45 -0
  86. gebpy/data_minerals/gibbsite.yaml +51 -0
  87. gebpy/data_minerals/glauconite.yaml +69 -0
  88. gebpy/data_minerals/goethite.yaml +48 -0
  89. gebpy/data_minerals/groutite.yaml +48 -0
  90. gebpy/data_minerals/hematite.yaml +43 -0
  91. gebpy/data_minerals/hercynite.yaml +42 -0
  92. gebpy/data_minerals/huebnerite.yaml +51 -0
  93. gebpy/data_minerals/ikaite.yaml +53 -0
  94. gebpy/data_minerals/illite.yaml +55 -0
  95. gebpy/data_minerals/ilmenite.yaml +45 -0
  96. gebpy/data_minerals/jacobsite.yaml +42 -0
  97. gebpy/data_minerals/kalsilite.yaml +47 -0
  98. gebpy/data_minerals/kaolinite.yaml +59 -0
  99. gebpy/data_minerals/karelianite.yaml +43 -0
  100. gebpy/data_minerals/lime.yaml +40 -0
  101. gebpy/data_minerals/litharge.yaml +43 -0
  102. gebpy/data_minerals/magnesiochromite.yaml +42 -0
  103. gebpy/data_minerals/magnesioferrite.yaml +42 -0
  104. gebpy/data_minerals/magnesite.yaml +45 -0
  105. gebpy/data_minerals/magnetite.yaml +41 -0
  106. gebpy/data_minerals/malachite.yaml +53 -0
  107. gebpy/data_minerals/manganite.yaml +51 -0
  108. gebpy/data_minerals/manganochromite.yaml +42 -0
  109. gebpy/data_minerals/manganosite.yaml +40 -0
  110. gebpy/data_minerals/marialite.yaml +49 -0
  111. gebpy/data_minerals/massicot.yaml +46 -0
  112. gebpy/data_minerals/meionite.yaml +49 -0
  113. gebpy/data_minerals/mgchlorite.yaml +61 -0
  114. gebpy/data_minerals/mgcolumbite.yaml +48 -0
  115. gebpy/data_minerals/mgtantalite.yaml +48 -0
  116. gebpy/data_minerals/microcline.yaml +59 -0
  117. gebpy/data_minerals/minium.yaml +44 -0
  118. gebpy/data_minerals/mnchlorite.yaml +61 -0
  119. gebpy/data_minerals/mncolumbite.yaml +48 -0
  120. gebpy/data_minerals/mntantalite.yaml +48 -0
  121. gebpy/data_minerals/monteponite.yaml +40 -0
  122. gebpy/data_minerals/montmorillonite.yaml +77 -0
  123. gebpy/data_minerals/muscovite.yaml +55 -0
  124. gebpy/data_minerals/nanepheline.yaml +47 -0
  125. gebpy/data_minerals/nichlorite.yaml +61 -0
  126. gebpy/data_minerals/nichromite.yaml +42 -0
  127. gebpy/data_minerals/nimite.yaml +55 -0
  128. gebpy/data_minerals/nontronite.yaml +73 -0
  129. gebpy/data_minerals/orthoclase.yaml +53 -0
  130. gebpy/data_minerals/paratellurite.yaml +43 -0
  131. gebpy/data_minerals/pennantite.yaml +61 -0
  132. gebpy/data_minerals/periclase.yaml +40 -0
  133. gebpy/data_minerals/phlogopite.yaml +57 -0
  134. gebpy/data_minerals/plattnerite.yaml +43 -0
  135. gebpy/data_minerals/powellite.yaml +45 -0
  136. gebpy/data_minerals/pyrite.yaml +40 -0
  137. gebpy/data_minerals/pyrolusite.yaml +43 -0
  138. gebpy/data_minerals/pyrophanite.yaml +45 -0
  139. gebpy/data_minerals/pyrophyllite.yaml +59 -0
  140. gebpy/data_minerals/quartz.yaml +43 -0
  141. gebpy/data_minerals/rhodochrosite.yaml +45 -0
  142. gebpy/data_minerals/rutile.yaml +43 -0
  143. gebpy/data_minerals/saponite.yaml +77 -0
  144. gebpy/data_minerals/scheelite.yaml +45 -0
  145. gebpy/data_minerals/scrutinyite.yaml +46 -0
  146. gebpy/data_minerals/senarmontite.yaml +40 -0
  147. gebpy/data_minerals/siderite.yaml +45 -0
  148. gebpy/data_minerals/siderophyllite.yaml +57 -0
  149. gebpy/data_minerals/smithsonite.yaml +45 -0
  150. gebpy/data_minerals/spinel.yaml +42 -0
  151. gebpy/data_minerals/stishovite.yaml +43 -0
  152. gebpy/data_minerals/stolzite.yaml +45 -0
  153. gebpy/data_minerals/talc.yaml +53 -0
  154. gebpy/data_minerals/tistarite.yaml +43 -0
  155. gebpy/data_minerals/trevorite.yaml +42 -0
  156. gebpy/data_minerals/ulvoespinel.yaml +42 -0
  157. gebpy/data_minerals/uraninite.yaml +40 -0
  158. gebpy/data_minerals/valentinite.yaml +46 -0
  159. gebpy/data_minerals/vermiculite.yaml +69 -0
  160. gebpy/data_minerals/wulfenite.yaml +45 -0
  161. gebpy/data_minerals/wustite.yaml +40 -0
  162. gebpy/data_minerals/zincite.yaml +43 -0
  163. gebpy/data_minerals/zincochromite.yaml +42 -0
  164. gebpy/data_rocks/__init__.py +0 -0
  165. gebpy/data_rocks/dolostone.yaml +40 -0
  166. gebpy/data_rocks/limestone.yaml +40 -0
  167. gebpy/data_rocks/marl.yaml +50 -0
  168. gebpy/data_rocks/sandstone.yaml +39 -0
  169. gebpy/data_rocks/shale.yaml +50 -0
  170. gebpy/gebpy_app.py +8732 -0
  171. gebpy/gui/__init__.py +0 -0
  172. gebpy/lib/images/GebPy_Header.png +0 -0
  173. gebpy/lib/images/GebPy_Icon.png +0 -0
  174. gebpy/lib/images/GebPy_Logo.png +0 -0
  175. gebpy/main.py +29 -0
  176. gebpy/modules/__init__.py +0 -0
  177. gebpy/modules/__pycache__/__init__.cpython-310.pyc +0 -0
  178. gebpy/modules/__pycache__/metamorphics.cpython-310.pyc +0 -0
  179. gebpy/modules/__pycache__/silicates.cpython-310.pyc +0 -0
  180. gebpy/modules/carbonates.py +2658 -0
  181. gebpy/modules/chemistry.py +1369 -0
  182. gebpy/modules/core.py +1805 -0
  183. gebpy/modules/elements.py +317 -0
  184. gebpy/modules/evaporites.py +1299 -0
  185. gebpy/modules/exploration.py +1145 -0
  186. gebpy/modules/fluids.py +339 -0
  187. gebpy/modules/geochemistry.py +1727 -0
  188. gebpy/modules/geophysics.py +351 -0
  189. gebpy/modules/gui.py +9093 -0
  190. gebpy/modules/gui_elements.py +145 -0
  191. gebpy/modules/halides.py +485 -0
  192. gebpy/modules/igneous.py +2241 -0
  193. gebpy/modules/metamorphics.py +3222 -0
  194. gebpy/modules/mineralogy.py +442 -0
  195. gebpy/modules/minerals.py +7954 -0
  196. gebpy/modules/ore.py +1648 -0
  197. gebpy/modules/organics.py +530 -0
  198. gebpy/modules/oxides.py +9057 -0
  199. gebpy/modules/petrophysics.py +98 -0
  200. gebpy/modules/phosphates.py +589 -0
  201. gebpy/modules/phospides.py +194 -0
  202. gebpy/modules/plotting.py +619 -0
  203. gebpy/modules/pyllosilicates.py +380 -0
  204. gebpy/modules/sedimentary_rocks.py +908 -0
  205. gebpy/modules/sequences.py +2166 -0
  206. gebpy/modules/series.py +1625 -0
  207. gebpy/modules/silicates.py +11102 -0
  208. gebpy/modules/siliciclastics.py +1846 -0
  209. gebpy/modules/subsurface_2d.py +179 -0
  210. gebpy/modules/sulfates.py +1629 -0
  211. gebpy/modules/sulfides.py +4786 -0
  212. gebpy/plotting/__init__.py +0 -0
  213. gebpy/ui_nb/__init__.py +0 -0
  214. gebpy/user_data/.gitkeep +0 -0
  215. gebpy-1.1.3.dist-info/LICENSE +165 -0
  216. gebpy-1.1.3.dist-info/METADATA +207 -0
  217. gebpy-1.1.3.dist-info/RECORD +254 -0
  218. gebpy-1.1.3.dist-info/WHEEL +5 -0
  219. gebpy-1.1.3.dist-info/entry_points.txt +2 -0
  220. gebpy-1.1.3.dist-info/top_level.txt +1 -0
  221. modules/__init__.py +0 -0
  222. modules/carbonates.py +2658 -0
  223. modules/chemistry.py +1369 -0
  224. modules/core.py +1805 -0
  225. modules/elements.py +317 -0
  226. modules/evaporites.py +1299 -0
  227. modules/exploration.py +765 -0
  228. modules/fluids.py +339 -0
  229. modules/geochemistry.py +1727 -0
  230. modules/geophysics.py +337 -0
  231. modules/gui.py +9093 -0
  232. modules/gui_elements.py +145 -0
  233. modules/halides.py +485 -0
  234. modules/igneous.py +2196 -0
  235. modules/metamorphics.py +2699 -0
  236. modules/mineralogy.py +442 -0
  237. modules/minerals.py +7954 -0
  238. modules/ore.py +1628 -0
  239. modules/organics.py +530 -0
  240. modules/oxides.py +9057 -0
  241. modules/petrophysics.py +98 -0
  242. modules/phosphates.py +589 -0
  243. modules/phospides.py +194 -0
  244. modules/plotting.py +619 -0
  245. modules/pyllosilicates.py +380 -0
  246. modules/sedimentary_rocks.py +908 -0
  247. modules/sequences.py +2166 -0
  248. modules/series.py +1625 -0
  249. modules/silicates.py +11102 -0
  250. modules/siliciclastics.py +1830 -0
  251. modules/subsurface_2d.py +179 -0
  252. modules/sulfates.py +1629 -0
  253. modules/sulfides.py +4786 -0
  254. notebooks/__init__.py +0 -0
modules/sulfates.py ADDED
@@ -0,0 +1,1629 @@
1
+ #!/usr/bin/env python
2
+ # -*-coding: utf-8 -*-
3
+
4
+ # -----------------------------------------------
5
+
6
+ # Name: sulfates.py
7
+ # Author: Maximilian A. Beeskow
8
+ # Version: 1.0
9
+ # Date: 20.09.2022
10
+
11
+ # -----------------------------------------------
12
+
13
+ # MODULES
14
+ import numpy as np
15
+ import random as rd
16
+ from modules.chemistry import PeriodicSystem
17
+ from modules.minerals import CrystalPhysics
18
+ from modules.geophysics import WellLog as wg
19
+ from modules.geochemistry import MineralChemistry
20
+
21
+ # OXIDES
22
+ class Sulfates():
23
+ """ Class that generates geophysical and geochemical data of sulfate minerals"""
24
+ #
25
+ def __init__(self, traces_list=[], impurity="pure", data_type=False, mineral=None):
26
+ self.traces_list = traces_list
27
+ self.impurity = impurity
28
+ self.data_type = data_type
29
+ self.mineral = mineral
30
+ #
31
+ def get_data(self, number=1): # ["Alunite", "Anglesite", "Anhydrite", "Barite", "Celestite", "Chalcanthite", "Gypsum", "Hanksite", "Jarosite", "Kieserite", "Scheelite"]
32
+ if self.mineral in ["Al", "Alunite"]:
33
+ if number > 1:
34
+ data = [self.create_alunite() for n in range(number)]
35
+ else:
36
+ data = self.create_alunite()
37
+ elif self.mineral in ["Ang", "Anglesite"]:
38
+ if number > 1:
39
+ data = [self.create_anglesite() for n in range(number)]
40
+ else:
41
+ data = self.create_anglesite()
42
+ elif self.mineral in ["Anh", "Anhydrite"]:
43
+ if number > 1:
44
+ data = [self.create_anhydrite() for n in range(number)]
45
+ else:
46
+ data = self.create_anhydrite()
47
+ elif self.mineral in ["Bar", "Barite"]:
48
+ if number > 1:
49
+ data = [self.create_barite() for n in range(number)]
50
+ else:
51
+ data = self.create_barite()
52
+ elif self.mineral in ["Cls", "Celestine"]:
53
+ if number > 1:
54
+ data = [self.create_celestine() for n in range(number)]
55
+ else:
56
+ data = self.create_celestine()
57
+ elif self.mineral in ["Chc", "Chalcanthite"]:
58
+ if number > 1:
59
+ data = [self.create_chalcanthite() for n in range(number)]
60
+ else:
61
+ data = self.create_chalcanthite()
62
+ elif self.mineral in ["Gp", "Gypsum"]:
63
+ if number > 1:
64
+ data = [self.create_gypsum() for n in range(number)]
65
+ else:
66
+ data = self.create_gypsum()
67
+ elif self.mineral in ["Han", "Hanksite"]:
68
+ if number > 1:
69
+ data = [self.create_hanksite() for n in range(number)]
70
+ else:
71
+ data = self.create_hanksite()
72
+ elif self.mineral in ["Jar", "Jarosite"]:
73
+ if number > 1:
74
+ data = [self.create_jarosite() for n in range(number)]
75
+ else:
76
+ data = self.create_jarosite()
77
+ elif self.mineral in ["Kie", "Kieserite"]:
78
+ if number > 1:
79
+ data = [self.create_kieserite() for n in range(number)]
80
+ else:
81
+ data = self.create_kieserite()
82
+ elif self.mineral in ["Sch", "Scheelite"]:
83
+ if number > 1:
84
+ data = [self.create_scheelite() for n in range(number)]
85
+ else:
86
+ data = self.create_scheelite()
87
+ #
88
+ return data
89
+ #
90
+ def generate_dataset(self, number):
91
+ dataset = {}
92
+ #
93
+ for index in range(number):
94
+ if self.mineral == "Barite":
95
+ data_mineral = self.create_barite()
96
+ elif self.mineral == "Celestite":
97
+ data_mineral = self.create_celestine()
98
+ elif self.mineral == "Anglesite":
99
+ data_mineral = self.create_anglesite()
100
+ elif self.mineral == "Anhydrite":
101
+ data_mineral = self.create_anhydrite()
102
+ elif self.mineral == "Hanksite":
103
+ data_mineral = self.create_hanksite()
104
+ elif self.mineral == "Gypsum":
105
+ data_mineral = self.create_gypsum()
106
+ elif self.mineral == "Alunite":
107
+ data_mineral = self.create_alunite()
108
+ elif self.mineral == "Jarosite":
109
+ data_mineral = self.create_jarosite()
110
+ elif self.mineral == "Chalcanthite":
111
+ data_mineral = self.create_chalcanthite()
112
+ elif self.mineral == "Kieserite":
113
+ data_mineral = self.create_kieserite()
114
+ elif self.mineral == "Scheelite":
115
+ data_mineral = self.create_scheelite()
116
+ elif self.mineral == "Hexahydrite":
117
+ data_mineral = self.create_hexahydrite()
118
+ elif self.mineral == "Kainite":
119
+ data_mineral = self.create_kainite()
120
+ #
121
+ for key, value in data_mineral.items():
122
+ if key in ["M", "rho", "rho_e", "V", "vP", "vS", "vP/vS", "K", "G", "E", "nu", "GR", "PE", "U",
123
+ "p"]:
124
+ if key not in dataset:
125
+ dataset[key] = [value]
126
+ else:
127
+ dataset[key].append(value)
128
+ elif key in ["mineral", "state", "trace elements"] and key not in dataset:
129
+ dataset[key] = value
130
+ elif key in ["chemistry"]:
131
+ if key not in dataset:
132
+ dataset[key] = {}
133
+ for key_2, value_2 in value.items():
134
+ dataset[key][key_2] = [value_2]
135
+ else:
136
+ for key_2, value_2 in value.items():
137
+ dataset[key][key_2].append(value_2)
138
+ #
139
+ return dataset
140
+ #
141
+ def create_anhydrite(self):
142
+ # Major elements
143
+ oxygen = PeriodicSystem(name="O").get_data()
144
+ sulfur = PeriodicSystem(name="S").get_data()
145
+ calcium = PeriodicSystem(name="Ca").get_data()
146
+ majors_name = ["O", "S", "Ca"]
147
+ majors_data = np.array([["O", oxygen[1], 4, oxygen[2]], ["S", sulfur[1], 1, sulfur[2]],
148
+ ["Ca", calcium[1], 1, calcium[2]]], dtype=object)
149
+ # Minor elements
150
+ traces_data = []
151
+ if len(self.traces_list) > 0:
152
+ self.impurity = "impure"
153
+ if self.impurity == "pure":
154
+ var_state = "fixed"
155
+ else:
156
+ var_state = "variable"
157
+ if self.impurity == "random":
158
+ self.traces_list = []
159
+ minors = ["Sr", "Ba", "H"]
160
+ n = rd.randint(1, len(minors))
161
+ while len(self.traces_list) < n:
162
+ selection = rd.choice(minors)
163
+ if selection not in self.traces_list and selection not in majors_name:
164
+ self.traces_list.append(selection)
165
+ else:
166
+ continue
167
+ traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
168
+ x_traces = [round(rd.uniform(0., 0.001), 6) for i in range(len(self.traces_list))]
169
+ for i in range(len(self.traces_list)):
170
+ traces_data.append([str(self.traces_list[i]), int(traces[i][1]), float(x_traces[i])])
171
+ if len(traces_data) > 0:
172
+ traces_data = np.array(traces_data, dtype=object)
173
+ traces_data = traces_data[traces_data[:, 1].argsort()]
174
+ #
175
+ data = []
176
+ mineral = "Anh"
177
+ #
178
+ # Molar mass
179
+ molar_mass_pure = calcium[2] + sulfur[2] + 4*oxygen[2]
180
+ molar_mass, amounts = MineralChemistry(w_traces=traces_data, molar_mass_pure=molar_mass_pure,
181
+ majors=majors_data).calculate_molar_mass()
182
+ element = [PeriodicSystem(name=amounts[i][0]).get_data() for i in range(len(amounts))]
183
+ # Density
184
+ crystalsystem = "orthorhombic"
185
+ dataV = CrystalPhysics([[6.245, 6.995, 6.993], [], crystalsystem])
186
+ V = dataV.calculate_volume()
187
+ Z = 4
188
+ V_m = MineralChemistry().calculate_molar_volume(volume_cell=V, z=Z)
189
+ dataRho = CrystalPhysics([molar_mass, Z, V])
190
+ rho = dataRho.calculate_bulk_density()
191
+ rho_e = wg(amounts=amounts, elements=element, rho_b=rho).calculate_electron_density()
192
+ # Bulk modulus
193
+ K = 93.14*10**9
194
+ # Shear modulus
195
+ G = 50.15*10**9
196
+ # Young's modulus
197
+ E = (9*K*G)/(3*K + G)
198
+ # Poisson's ratio
199
+ nu = (3*K - 2*G)/(2*(3*K + G))
200
+ # vP/vS
201
+ vPvS = ((K + 4/3*G)/G)**0.5
202
+ # P-wave velocity
203
+ vP = ((K + 4/3*G)/rho)**0.5
204
+ # S-wave velocity
205
+ vS = (G/rho)**0.5
206
+ # Gamma ray
207
+ gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
208
+ # Photoelectricity
209
+ pe = wg(amounts=amounts, elements=element).calculate_pe()
210
+ U = pe*rho_e*10**(-3)
211
+ # Electrical resistivity
212
+ p = None
213
+ #
214
+ if self.data_type == False:
215
+ data.append(mineral)
216
+ data.append(round(molar_mass, 3))
217
+ data.append(round(rho, 2))
218
+ data.append([round(K*10**(-9), 2), round(G*10**(-9), 2), round(E*10**(-9), 2), round(nu, 4)])
219
+ data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
220
+ data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
221
+ data.append(amounts)
222
+ #
223
+ return data
224
+ else:
225
+ #
226
+ results = {}
227
+ results["mineral"] = mineral
228
+ results["M"] = molar_mass
229
+ results["state"] = var_state
230
+ element_list = np.array(amounts)[:, 0]
231
+ results["chemistry"] = {}
232
+ for index, element in enumerate(element_list, start=0):
233
+ results["chemistry"][element] = amounts[index][2]
234
+ results["rho"] = round(rho, 4)
235
+ results["rho_e"] = round(rho_e, 4)
236
+ results["V"] = round(V_m, 4)
237
+ results["vP"] = round(vP, 4)
238
+ results["vS"] = round(vS, 4)
239
+ results["vP/vS"] = round(vPvS, 4)
240
+ results["G"] = round(G*10**(-9), 4)
241
+ results["K"] = round(K*10**(-9), 4)
242
+ results["E"] = round(E*10**(-9), 4)
243
+ results["nu"] = round(nu, 4)
244
+ results["GR"] = round(gamma_ray, 4)
245
+ results["PE"] = round(pe, 4)
246
+ results["U"] = round(U, 4)
247
+ if p != None:
248
+ results["p"] = round(p, 4)
249
+ else:
250
+ results["p"] = p
251
+ #
252
+ return results
253
+ #
254
+ def create_gypsum(self):
255
+ # Major elements
256
+ hydrogen = PeriodicSystem(name="H").get_data()
257
+ oxygen = PeriodicSystem(name="O").get_data()
258
+ sulfur = PeriodicSystem(name="S").get_data()
259
+ calcium = PeriodicSystem(name="Ca").get_data()
260
+ majors_name = ["H", "O", "S", "Ca"]
261
+ majors_data = np.array([["H", oxygen[1], 4, oxygen[2]], ["O", oxygen[1], 6, oxygen[2]], ["S", sulfur[1], 1, sulfur[2]],
262
+ ["Ca", calcium[1], 1, calcium[2]]], dtype=object)
263
+ # Minor elements
264
+ traces_data = []
265
+ if len(self.traces_list) > 0:
266
+ self.impurity = "impure"
267
+ if self.impurity == "pure":
268
+ var_state = "fixed"
269
+ else:
270
+ var_state = "variable"
271
+ if self.impurity == "random":
272
+ self.traces_list = []
273
+ minors = ["Sr", "Ba"]
274
+ n = rd.randint(1, len(minors))
275
+ while len(self.traces_list) < n:
276
+ selection = rd.choice(minors)
277
+ if selection not in self.traces_list and selection not in majors_name:
278
+ self.traces_list.append(selection)
279
+ else:
280
+ continue
281
+ traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
282
+ x_traces = [round(rd.uniform(0., 0.001), 6) for i in range(len(self.traces_list))]
283
+ for i in range(len(self.traces_list)):
284
+ traces_data.append([str(self.traces_list[i]), int(traces[i][1]), float(x_traces[i])])
285
+ if len(traces_data) > 0:
286
+ traces_data = np.array(traces_data, dtype=object)
287
+ traces_data = traces_data[traces_data[:, 1].argsort()]
288
+ #
289
+ data = []
290
+ mineral = "Gp"
291
+ #
292
+ # Molar mass
293
+ molar_mass_pure = calcium[2] + sulfur[2] + 4*oxygen[2] + 2*(2*hydrogen[2] + oxygen[2])
294
+ molar_mass, amounts = MineralChemistry(w_traces=traces_data, molar_mass_pure=molar_mass_pure,
295
+ majors=majors_data).calculate_molar_mass()
296
+ element = [PeriodicSystem(name=amounts[i][0]).get_data() for i in range(len(amounts))]
297
+ # Density
298
+ crystalsystem = "monoclinic"
299
+ dataV = CrystalPhysics([[5.68, 15.18, 6.29], [113.83], crystalsystem])
300
+ V = dataV.calculate_volume()
301
+ Z = 4
302
+ V_m = MineralChemistry().calculate_molar_volume(volume_cell=V, z=Z)
303
+ dataRho = CrystalPhysics([molar_mass, Z, V])
304
+ rho = dataRho.calculate_bulk_density()
305
+ rho_e = wg(amounts=amounts, elements=element, rho_b=rho).calculate_electron_density()
306
+ # Bulk modulus
307
+ K = 80.74*10**9
308
+ # Shear modulus
309
+ G = 40.69*10**9
310
+ # Young's modulus
311
+ E = (9*K*G)/(3*K + G)
312
+ # Poisson's ratio
313
+ nu = (3*K - 2*G)/(2*(3*K + G))
314
+ # vP/vS
315
+ vPvS = ((K + 4/3*G)/G)**0.5
316
+ # P-wave velocity
317
+ vP = ((K + 4/3*G)/rho)**0.5
318
+ # S-wave velocity
319
+ vS = (G/rho)**0.5
320
+ # Gamma ray
321
+ gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
322
+ # Photoelectricity
323
+ pe = wg(amounts=amounts, elements=element).calculate_pe()
324
+ U = pe*rho_e*10**(-3)
325
+ # Electrical resistivity
326
+ p = None
327
+ #
328
+ if self.data_type == False:
329
+ data.append(mineral)
330
+ data.append(round(molar_mass, 3))
331
+ data.append(round(rho, 2))
332
+ data.append([round(K*10**(-9), 2), round(G*10**(-9), 2), round(E*10**(-9), 2), round(nu, 4)])
333
+ data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
334
+ data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
335
+ data.append(amounts)
336
+ #
337
+ return data
338
+ else:
339
+ #
340
+ results = {}
341
+ results["mineral"] = mineral
342
+ results["M"] = molar_mass
343
+ results["state"] = var_state
344
+ element_list = np.array(amounts)[:, 0]
345
+ results["chemistry"] = {}
346
+ for index, element in enumerate(element_list, start=0):
347
+ results["chemistry"][element] = amounts[index][2]
348
+ results["rho"] = round(rho, 4)
349
+ results["rho_e"] = round(rho_e, 4)
350
+ results["V"] = round(V_m, 4)
351
+ results["vP"] = round(vP, 4)
352
+ results["vS"] = round(vS, 4)
353
+ results["vP/vS"] = round(vPvS, 4)
354
+ results["G"] = round(G*10**(-9), 4)
355
+ results["K"] = round(K*10**(-9), 4)
356
+ results["E"] = round(E*10**(-9), 4)
357
+ results["nu"] = round(nu, 4)
358
+ results["GR"] = round(gamma_ray, 4)
359
+ results["PE"] = round(pe, 4)
360
+ results["U"] = round(U, 4)
361
+ if p != None:
362
+ results["p"] = round(p, 4)
363
+ else:
364
+ results["p"] = p
365
+ #
366
+ return results
367
+ #
368
+ def create_scheelite(self):
369
+ # Major elements
370
+ oxygen = PeriodicSystem(name="O").get_data()
371
+ calcium = PeriodicSystem(name="Ca").get_data()
372
+ tungsten = PeriodicSystem(name="W").get_data()
373
+ majors_name = ["O", "Ca", "W"]
374
+ majors_data = np.array([["O", oxygen[1], 4, oxygen[2]], ["Ca", calcium[1], 1, calcium[2]],
375
+ ["W", tungsten[1], 1, tungsten[2]]], dtype=object)
376
+ # Minor elements
377
+ traces_data = []
378
+ if len(self.traces_list) > 0:
379
+ self.impurity = "impure"
380
+ if self.impurity == "pure":
381
+ var_state = "fixed"
382
+ else:
383
+ var_state = "variable"
384
+ if self.impurity == "random":
385
+ self.traces_list = []
386
+ minors = ["Mo", "Nb", "Ta"]
387
+ n = rd.randint(1, len(minors))
388
+ while len(self.traces_list) < n:
389
+ selection = rd.choice(minors)
390
+ if selection not in self.traces_list and selection not in majors_name:
391
+ self.traces_list.append(selection)
392
+ else:
393
+ continue
394
+ traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
395
+ x_traces = [round(rd.uniform(0., 0.001), 6) for i in range(len(self.traces_list))]
396
+ for i in range(len(self.traces_list)):
397
+ traces_data.append([str(self.traces_list[i]), int(traces[i][1]), float(x_traces[i])])
398
+ if len(traces_data) > 0:
399
+ traces_data = np.array(traces_data, dtype=object)
400
+ traces_data = traces_data[traces_data[:, 1].argsort()]
401
+ #
402
+ data = []
403
+ mineral = "Sch"
404
+ #
405
+ # Molar mass
406
+ molar_mass_pure = calcium[2] + tungsten[2] + 4*oxygen[2]
407
+ molar_mass, amounts = MineralChemistry(w_traces=traces_data, molar_mass_pure=molar_mass_pure,
408
+ majors=majors_data).calculate_molar_mass()
409
+ element = [PeriodicSystem(name=amounts[i][0]).get_data() for i in range(len(amounts))]
410
+ # Density
411
+ crystalsystem = "tetragonal"
412
+ dataV = CrystalPhysics([[5.242, 11.372], [], crystalsystem])
413
+ V = dataV.calculate_volume()
414
+ Z = 4
415
+ V_m = MineralChemistry().calculate_molar_volume(volume_cell=V, z=Z)
416
+ dataRho = CrystalPhysics([molar_mass, Z, V])
417
+ rho = dataRho.calculate_bulk_density()
418
+ rho_e = wg(amounts=amounts, elements=element, rho_b=rho).calculate_electron_density()
419
+ # Bulk modulus
420
+ K = 117.44*10**9
421
+ # Shear modulus
422
+ G = 51.64*10**9
423
+ # Young's modulus
424
+ E = (9*K*G)/(3*K + G)
425
+ # Poisson's ratio
426
+ nu = (3*K - 2*G)/(2*(3*K + G))
427
+ # vP/vS
428
+ vPvS = ((K + 4/3*G)/G)**0.5
429
+ # P-wave velocity
430
+ vP = ((K + 4/3*G)/rho)**0.5
431
+ # S-wave velocity
432
+ vS = (G/rho)**0.5
433
+ # Gamma ray
434
+ gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
435
+ # Photoelectricity
436
+ pe = wg(amounts=amounts, elements=element).calculate_pe()
437
+ U = pe*rho_e*10**(-3)
438
+ # Electrical resistivity
439
+ p = None
440
+ #
441
+ if self.data_type == False:
442
+ data.append(mineral)
443
+ data.append(round(molar_mass, 3))
444
+ data.append(round(rho, 2))
445
+ data.append([round(K*10**(-9), 2), round(G*10**(-9), 2), round(E*10**(-9), 2), round(nu, 4)])
446
+ data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
447
+ data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
448
+ data.append(amounts)
449
+ #
450
+ return data
451
+ else:
452
+ #
453
+ results = {}
454
+ results["mineral"] = mineral
455
+ results["M"] = molar_mass
456
+ results["state"] = var_state
457
+ element_list = np.array(amounts)[:, 0]
458
+ results["chemistry"] = {}
459
+ for index, element in enumerate(element_list, start=0):
460
+ results["chemistry"][element] = amounts[index][2]
461
+ results["rho"] = round(rho, 4)
462
+ results["rho_e"] = round(rho_e, 4)
463
+ results["V"] = round(V_m, 4)
464
+ results["vP"] = round(vP, 4)
465
+ results["vS"] = round(vS, 4)
466
+ results["vP/vS"] = round(vPvS, 4)
467
+ results["G"] = round(G*10**(-9), 4)
468
+ results["K"] = round(K*10**(-9), 4)
469
+ results["E"] = round(E*10**(-9), 4)
470
+ results["nu"] = round(nu, 4)
471
+ results["GR"] = round(gamma_ray, 4)
472
+ results["PE"] = round(pe, 4)
473
+ results["U"] = round(U, 4)
474
+ if p != None:
475
+ results["p"] = round(p, 4)
476
+ else:
477
+ results["p"] = p
478
+ #
479
+ return results
480
+ #
481
+ def create_barite(self):
482
+ # Major elements
483
+ oxygen = PeriodicSystem(name="O").get_data()
484
+ sulfur = PeriodicSystem(name="S").get_data()
485
+ barium = PeriodicSystem(name="Ba").get_data()
486
+ majors_name = ["O", "S", "Ba"]
487
+ majors_data = np.array([["O", oxygen[1], 4, oxygen[2]], ["S", sulfur[1], 1, sulfur[2]],
488
+ ["Ba", barium[1], 1, barium[2]]], dtype=object)
489
+ # Minor elements
490
+ traces_data = []
491
+ if len(self.traces_list) > 0:
492
+ self.impurity = "impure"
493
+ if self.impurity == "pure":
494
+ var_state = "fixed"
495
+ else:
496
+ var_state = "variable"
497
+ if self.impurity == "random":
498
+ self.traces_list = []
499
+ minors = [None]
500
+ n = rd.randint(1, len(minors))
501
+ while len(self.traces_list) < n:
502
+ selection = rd.choice(minors)
503
+ if selection not in self.traces_list and selection not in majors_name:
504
+ self.traces_list.append(selection)
505
+ else:
506
+ continue
507
+ traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
508
+ x_traces = [round(rd.uniform(0., 0.001), 6) for i in range(len(self.traces_list))]
509
+ for i in range(len(self.traces_list)):
510
+ traces_data.append([str(self.traces_list[i]), int(traces[i][1]), float(x_traces[i])])
511
+ if len(traces_data) > 0:
512
+ traces_data = np.array(traces_data, dtype=object)
513
+ traces_data = traces_data[traces_data[:, 1].argsort()]
514
+ #
515
+ data = []
516
+ mineral = "Bar"
517
+ #
518
+ # Molar mass
519
+ molar_mass_pure = barium[2] + sulfur[2] + 4*oxygen[2]
520
+ molar_mass, amounts = MineralChemistry(w_traces=traces_data, molar_mass_pure=molar_mass_pure,
521
+ majors=majors_data).calculate_molar_mass()
522
+ element = [PeriodicSystem(name=amounts[i][0]).get_data() for i in range(len(amounts))]
523
+ # Density
524
+ crystalsystem = "orthorhombic"
525
+ dataV = CrystalPhysics([[8.878, 5.45, 7.152], [], crystalsystem])
526
+ V = dataV.calculate_volume()
527
+ Z = 4
528
+ V_m = MineralChemistry().calculate_molar_volume(volume_cell=V, z=Z)
529
+ dataRho = CrystalPhysics([molar_mass, Z, V])
530
+ rho = dataRho.calculate_bulk_density()
531
+ rho_e = wg(amounts=amounts, elements=element, rho_b=rho).calculate_electron_density()
532
+ # Bulk modulus
533
+ K = 52*10**9
534
+ # Shear modulus
535
+ G = 19*10**9
536
+ # Young's modulus
537
+ E = (9*K*G)/(3*K + G)
538
+ # Poisson's ratio
539
+ nu = (3*K - 2*G)/(2*(3*K + G))
540
+ # vP/vS
541
+ vPvS = ((K + 4/3*G)/G)**0.5
542
+ # P-wave velocity
543
+ vP = ((K + 4/3*G)/rho)**0.5
544
+ # S-wave velocity
545
+ vS = (G/rho)**0.5
546
+ # Gamma ray
547
+ gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
548
+ # Photoelectricity
549
+ pe = wg(amounts=amounts, elements=element).calculate_pe()
550
+ U = pe*rho_e*10**(-3)
551
+ # Electrical resistivity
552
+ p = None
553
+ #
554
+ if self.data_type == False:
555
+ data.append(mineral)
556
+ data.append(round(molar_mass, 3))
557
+ data.append(round(rho, 2))
558
+ data.append([round(K*10**(-9), 2), round(G*10**(-9), 2), round(E*10**(-9), 2), round(nu, 4)])
559
+ data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
560
+ data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
561
+ data.append(amounts)
562
+ #
563
+ return data
564
+ else:
565
+ #
566
+ results = {}
567
+ results["mineral"] = mineral
568
+ results["M"] = molar_mass
569
+ results["state"] = var_state
570
+ element_list = np.array(amounts)[:, 0]
571
+ results["chemistry"] = {}
572
+ for index, element in enumerate(element_list, start=0):
573
+ results["chemistry"][element] = amounts[index][2]
574
+ results["rho"] = round(rho, 4)
575
+ results["rho_e"] = round(rho_e, 4)
576
+ results["V"] = round(V_m, 4)
577
+ results["vP"] = round(vP, 4)
578
+ results["vS"] = round(vS, 4)
579
+ results["vP/vS"] = round(vPvS, 4)
580
+ results["G"] = round(G*10**(-9), 4)
581
+ results["K"] = round(K*10**(-9), 4)
582
+ results["E"] = round(E*10**(-9), 4)
583
+ results["nu"] = round(nu, 4)
584
+ results["GR"] = round(gamma_ray, 4)
585
+ results["PE"] = round(pe, 4)
586
+ results["U"] = round(U, 4)
587
+ if p != None:
588
+ results["p"] = round(p, 4)
589
+ else:
590
+ results["p"] = p
591
+ #
592
+ return results
593
+ #
594
+ def create_celestine(self):
595
+ # Major elements
596
+ oxygen = PeriodicSystem(name="O").get_data()
597
+ sulfur = PeriodicSystem(name="S").get_data()
598
+ strontium = PeriodicSystem(name="Sr").get_data()
599
+ majors_name = ["O", "S", "Sr"]
600
+ majors_data = np.array([["O", oxygen[1], 4, oxygen[2]], ["S", sulfur[1], 1, sulfur[2]],
601
+ ["Sr", strontium[1], 1, strontium[2]]], dtype=object)
602
+ # Minor elements
603
+ traces_data = []
604
+ if len(self.traces_list) > 0:
605
+ self.impurity = "impure"
606
+ if self.impurity == "pure":
607
+ var_state = "fixed"
608
+ else:
609
+ var_state = "variable"
610
+ if self.impurity == "random":
611
+ self.traces_list = []
612
+ minors = [None]
613
+ n = rd.randint(1, len(minors))
614
+ while len(self.traces_list) < n:
615
+ selection = rd.choice(minors)
616
+ if selection not in self.traces_list and selection not in majors_name:
617
+ self.traces_list.append(selection)
618
+ else:
619
+ continue
620
+ traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
621
+ x_traces = [round(rd.uniform(0., 0.001), 6) for i in range(len(self.traces_list))]
622
+ for i in range(len(self.traces_list)):
623
+ traces_data.append([str(self.traces_list[i]), int(traces[i][1]), float(x_traces[i])])
624
+ if len(traces_data) > 0:
625
+ traces_data = np.array(traces_data, dtype=object)
626
+ traces_data = traces_data[traces_data[:, 1].argsort()]
627
+ #
628
+ data = []
629
+ mineral = "Cls"
630
+ #
631
+ # Molar mass
632
+ molar_mass_pure = strontium[2] + sulfur[2] + 4*oxygen[2]
633
+ molar_mass, amounts = MineralChemistry(w_traces=traces_data, molar_mass_pure=molar_mass_pure,
634
+ majors=majors_data).calculate_molar_mass()
635
+ element = [PeriodicSystem(name=amounts[i][0]).get_data() for i in range(len(amounts))]
636
+ # Density
637
+ crystalsystem = "orthorhombic"
638
+ dataV = CrystalPhysics([[8.359, 5.352, 6.866], [], crystalsystem])
639
+ V = dataV.calculate_volume()
640
+ Z = 4
641
+ V_m = MineralChemistry().calculate_molar_volume(volume_cell=V, z=Z)
642
+ dataRho = CrystalPhysics([molar_mass, Z, V])
643
+ rho = dataRho.calculate_bulk_density()
644
+ rho_e = wg(amounts=amounts, elements=element, rho_b=rho).calculate_electron_density()
645
+ # Bulk modulus
646
+ K = 59*10**9
647
+ # Shear modulus
648
+ G = 24*10**9
649
+ # Young's modulus
650
+ E = (9*K*G)/(3*K + G)
651
+ # Poisson's ratio
652
+ nu = (3*K - 2*G)/(2*(3*K + G))
653
+ # vP/vS
654
+ vPvS = ((K + 4/3*G)/G)**0.5
655
+ # P-wave velocity
656
+ vP = ((K + 4/3*G)/rho)**0.5
657
+ # S-wave velocity
658
+ vS = (G/rho)**0.5
659
+ # Gamma ray
660
+ gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
661
+ # Photoelectricity
662
+ pe = wg(amounts=amounts, elements=element).calculate_pe()
663
+ U = pe*rho_e*10**(-3)
664
+ # Electrical resistivity
665
+ p = None
666
+ #
667
+ if self.data_type == False:
668
+ data.append(mineral)
669
+ data.append(round(molar_mass, 3))
670
+ data.append(round(rho, 2))
671
+ data.append([round(K*10**(-9), 2), round(G*10**(-9), 2), round(E*10**(-9), 2), round(nu, 4)])
672
+ data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
673
+ data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
674
+ data.append(amounts)
675
+ #
676
+ return data
677
+ else:
678
+ #
679
+ results = {}
680
+ results["mineral"] = mineral
681
+ results["M"] = molar_mass
682
+ results["state"] = var_state
683
+ element_list = np.array(amounts)[:, 0]
684
+ results["chemistry"] = {}
685
+ for index, element in enumerate(element_list, start=0):
686
+ results["chemistry"][element] = amounts[index][2]
687
+ results["rho"] = round(rho, 4)
688
+ results["rho_e"] = round(rho_e, 4)
689
+ results["V"] = round(V_m, 4)
690
+ results["vP"] = round(vP, 4)
691
+ results["vS"] = round(vS, 4)
692
+ results["vP/vS"] = round(vPvS, 4)
693
+ results["G"] = round(G*10**(-9), 4)
694
+ results["K"] = round(K*10**(-9), 4)
695
+ results["E"] = round(E*10**(-9), 4)
696
+ results["nu"] = round(nu, 4)
697
+ results["GR"] = round(gamma_ray, 4)
698
+ results["PE"] = round(pe, 4)
699
+ results["U"] = round(U, 4)
700
+ if p != None:
701
+ results["p"] = round(p, 4)
702
+ else:
703
+ results["p"] = p
704
+ #
705
+ return results
706
+ #
707
+ def create_anglesite(self):
708
+ # Major elements
709
+ oxygen = PeriodicSystem(name="O").get_data()
710
+ sulfur = PeriodicSystem(name="S").get_data()
711
+ lead = PeriodicSystem(name="Pb").get_data()
712
+ majors_name = ["O", "S", "Pb"]
713
+ majors_data = np.array([["O", oxygen[1], 4, oxygen[2]], ["S", sulfur[1], 1, sulfur[2]],
714
+ ["Pb", lead[1], 1, lead[2]]], dtype=object)
715
+ # Minor elements
716
+ traces_data = []
717
+ if len(self.traces_list) > 0:
718
+ self.impurity = "impure"
719
+ if self.impurity == "pure":
720
+ var_state = "fixed"
721
+ else:
722
+ var_state = "variable"
723
+ if self.impurity == "random":
724
+ self.traces_list = []
725
+ minors = ["Ba", "Cu"]
726
+ n = rd.randint(1, len(minors))
727
+ while len(self.traces_list) < n:
728
+ selection = rd.choice(minors)
729
+ if selection not in self.traces_list and selection not in majors_name:
730
+ self.traces_list.append(selection)
731
+ else:
732
+ continue
733
+ traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
734
+ x_traces = [round(rd.uniform(0., 0.001), 6) for i in range(len(self.traces_list))]
735
+ for i in range(len(self.traces_list)):
736
+ traces_data.append([str(self.traces_list[i]), int(traces[i][1]), float(x_traces[i])])
737
+ if len(traces_data) > 0:
738
+ traces_data = np.array(traces_data, dtype=object)
739
+ traces_data = traces_data[traces_data[:, 1].argsort()]
740
+ #
741
+ data = []
742
+ mineral = "Ang"
743
+ #
744
+ # Molar mass
745
+ molar_mass_pure = lead[2] + sulfur[2] + 4*oxygen[2]
746
+ molar_mass, amounts = MineralChemistry(w_traces=traces_data, molar_mass_pure=molar_mass_pure,
747
+ majors=majors_data).calculate_molar_mass()
748
+ element = [PeriodicSystem(name=amounts[i][0]).get_data() for i in range(len(amounts))]
749
+ # Density
750
+ crystalsystem = "orthorhombic"
751
+ dataV = CrystalPhysics([[8.48, 5.398, 6.958], [], crystalsystem])
752
+ V = dataV.calculate_volume()
753
+ Z = 4
754
+ V_m = MineralChemistry().calculate_molar_volume(volume_cell=V, z=Z)
755
+ dataRho = CrystalPhysics([molar_mass, Z, V])
756
+ rho = dataRho.calculate_bulk_density()
757
+ rho_e = wg(amounts=amounts, elements=element, rho_b=rho).calculate_electron_density()
758
+ # Bulk modulus
759
+ K = 40*10**9
760
+ # Shear modulus
761
+ G = 18*10**9
762
+ # Young's modulus
763
+ E = (9*K*G)/(3*K + G)
764
+ # Poisson's ratio
765
+ nu = (3*K - 2*G)/(2*(3*K + G))
766
+ # vP/vS
767
+ vPvS = ((K + 4/3*G)/G)**0.5
768
+ # P-wave velocity
769
+ vP = ((K + 4/3*G)/rho)**0.5
770
+ # S-wave velocity
771
+ vS = (G/rho)**0.5
772
+ # Gamma ray
773
+ gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
774
+ # Photoelectricity
775
+ pe = wg(amounts=amounts, elements=element).calculate_pe()
776
+ U = pe*rho_e*10**(-3)
777
+ # Electrical resistivity
778
+ p = None
779
+ #
780
+ if self.data_type == False:
781
+ data.append(mineral)
782
+ data.append(round(molar_mass, 3))
783
+ data.append(round(rho, 2))
784
+ data.append([round(K*10**(-9), 2), round(G*10**(-9), 2), round(E*10**(-9), 2), round(nu, 4)])
785
+ data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
786
+ data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
787
+ data.append(amounts)
788
+ #
789
+ return data
790
+ else:
791
+ #
792
+ results = {}
793
+ results["mineral"] = mineral
794
+ results["M"] = molar_mass
795
+ results["state"] = var_state
796
+ element_list = np.array(amounts)[:, 0]
797
+ results["chemistry"] = {}
798
+ for index, element in enumerate(element_list, start=0):
799
+ results["chemistry"][element] = amounts[index][2]
800
+ results["rho"] = round(rho, 4)
801
+ results["rho_e"] = round(rho_e, 4)
802
+ results["V"] = round(V_m, 4)
803
+ results["vP"] = round(vP, 4)
804
+ results["vS"] = round(vS, 4)
805
+ results["vP/vS"] = round(vPvS, 4)
806
+ results["G"] = round(G*10**(-9), 4)
807
+ results["K"] = round(K*10**(-9), 4)
808
+ results["E"] = round(E*10**(-9), 4)
809
+ results["nu"] = round(nu, 4)
810
+ results["GR"] = round(gamma_ray, 4)
811
+ results["PE"] = round(pe, 4)
812
+ results["U"] = round(U, 4)
813
+ if p != None:
814
+ results["p"] = round(p, 4)
815
+ else:
816
+ results["p"] = p
817
+ #
818
+ return results
819
+ #
820
+ def create_hanksite(self):
821
+ # Major elements
822
+ carbon = PeriodicSystem(name="C").get_data()
823
+ oxygen = PeriodicSystem(name="O").get_data()
824
+ sodium = PeriodicSystem(name="Na").get_data()
825
+ sulfur = PeriodicSystem(name="S").get_data()
826
+ chlorine = PeriodicSystem(name="Cl").get_data()
827
+ potassium = PeriodicSystem(name="K").get_data()
828
+ majors_name = ["C", "O", "Na", "S", "Cl", "K"]
829
+ majors_data = np.array([["C", carbon[1], 2, carbon[2]], ["O", oxygen[1], 42, oxygen[2]],
830
+ ["Na", sodium[1], 22, sodium[2]], ["S", sulfur[1], 9, sulfur[2]],
831
+ ["Cl", chlorine[1], 1, chlorine[2]], ["K", potassium[1], 1, potassium[2]]],
832
+ dtype=object)
833
+ # Minor elements
834
+ traces_data = []
835
+ if len(self.traces_list) > 0:
836
+ self.impurity = "impure"
837
+ if self.impurity == "pure":
838
+ var_state = "fixed"
839
+ else:
840
+ var_state = "variable"
841
+ if self.impurity == "random":
842
+ self.traces_list = []
843
+ minors = [None]
844
+ n = rd.randint(1, len(minors))
845
+ while len(self.traces_list) < n:
846
+ selection = rd.choice(minors)
847
+ if selection not in self.traces_list and selection not in majors_name:
848
+ self.traces_list.append(selection)
849
+ else:
850
+ continue
851
+ traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
852
+ x_traces = [round(rd.uniform(0., 0.001), 6) for i in range(len(self.traces_list))]
853
+ for i in range(len(self.traces_list)):
854
+ traces_data.append([str(self.traces_list[i]), int(traces[i][1]), float(x_traces[i])])
855
+ if len(traces_data) > 0:
856
+ traces_data = np.array(traces_data, dtype=object)
857
+ traces_data = traces_data[traces_data[:, 1].argsort()]
858
+ #
859
+ data = []
860
+ mineral = "Han"
861
+ #
862
+ # Molar mass
863
+ molar_mass_pure = 22*sodium[2] + potassium[2] + 9*(sulfur[2]+4*oxygen[2]) + 2*(carbon[2]+3*oxygen[2]) + chlorine[2]
864
+ molar_mass, amounts = MineralChemistry(w_traces=traces_data, molar_mass_pure=molar_mass_pure,
865
+ majors=majors_data).calculate_molar_mass()
866
+ element = [PeriodicSystem(name=amounts[i][0]).get_data() for i in range(len(amounts))]
867
+ # Density
868
+ crystalsystem = "hexagonal"
869
+ dataV = CrystalPhysics([[10.47, 21.2], [], crystalsystem])
870
+ V = dataV.calculate_volume()
871
+ Z = 2
872
+ V_m = MineralChemistry().calculate_molar_volume(volume_cell=V, z=Z)
873
+ dataRho = CrystalPhysics([molar_mass, Z, V*10**(6)])
874
+ rho = dataRho.calculate_bulk_density()
875
+ rho_e = wg(amounts=amounts, elements=element, rho_b=rho).calculate_electron_density()
876
+ # Bulk modulus
877
+ K = 66.29*10**9
878
+ # Shear modulus
879
+ G = 39.73*10**9
880
+ # Young's modulus
881
+ E = (9*K*G)/(3*K + G)
882
+ # Poisson's ratio
883
+ nu = (3*K - 2*G)/(2*(3*K + G))
884
+ # vP/vS
885
+ vPvS = ((K + 4/3*G)/G)**0.5
886
+ # P-wave velocity
887
+ vP = ((K + 4/3*G)/rho)**0.5
888
+ # S-wave velocity
889
+ vS = (G/rho)**0.5
890
+ # Gamma ray
891
+ gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
892
+ # Photoelectricity
893
+ pe = wg(amounts=amounts, elements=element).calculate_pe()
894
+ U = pe*rho_e*10**(-3)
895
+ # Electrical resistivity
896
+ p = None
897
+ #
898
+ if self.data_type == False:
899
+ data.append(mineral)
900
+ data.append(round(molar_mass, 3))
901
+ data.append(round(rho, 2))
902
+ data.append([round(K*10**(-9), 2), round(G*10**(-9), 2), round(E*10**(-9), 2), round(nu, 4)])
903
+ data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
904
+ data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
905
+ data.append(amounts)
906
+ #
907
+ return data
908
+ else:
909
+ #
910
+ results = {}
911
+ results["mineral"] = mineral
912
+ results["M"] = molar_mass
913
+ results["state"] = var_state
914
+ element_list = np.array(amounts)[:, 0]
915
+ results["chemistry"] = {}
916
+ for index, element in enumerate(element_list, start=0):
917
+ results["chemistry"][element] = amounts[index][2]
918
+ results["rho"] = round(rho, 4)
919
+ results["rho_e"] = round(rho_e, 4)
920
+ results["V"] = round(V_m, 4)
921
+ results["vP"] = round(vP, 4)
922
+ results["vS"] = round(vS, 4)
923
+ results["vP/vS"] = round(vPvS, 4)
924
+ results["G"] = round(G*10**(-9), 4)
925
+ results["K"] = round(K*10**(-9), 4)
926
+ results["E"] = round(E*10**(-9), 4)
927
+ results["nu"] = round(nu, 4)
928
+ results["GR"] = round(gamma_ray, 4)
929
+ results["PE"] = round(pe, 4)
930
+ results["U"] = round(U, 4)
931
+ if p != None:
932
+ results["p"] = round(p, 4)
933
+ else:
934
+ results["p"] = p
935
+ #
936
+ return results
937
+ #
938
+ def create_chalcanthite(self):
939
+ # Major elements
940
+ hydrogen = PeriodicSystem(name="H").get_data()
941
+ oxygen = PeriodicSystem(name="O").get_data()
942
+ sulfur = PeriodicSystem(name="S").get_data()
943
+ copper = PeriodicSystem(name="Cu").get_data()
944
+ majors_name = ["H", "O", "S", "Cu"]
945
+ majors_data = np.array([["H", hydrogen[1], 10, hydrogen[2]], ["O", oxygen[1], 9, oxygen[2]],
946
+ ["S", sulfur[1], 1, sulfur[2]], ["Cu", copper[1], 1, copper[2]]], dtype=object)
947
+ # Minor elements
948
+ traces_data = []
949
+ if len(self.traces_list) > 0:
950
+ self.impurity = "impure"
951
+ if self.impurity == "pure":
952
+ var_state = "fixed"
953
+ else:
954
+ var_state = "variable"
955
+ if self.impurity == "random":
956
+ self.traces_list = []
957
+ minors = ["Fe", "Mg", "Co"]
958
+ n = rd.randint(1, len(minors))
959
+ while len(self.traces_list) < n:
960
+ selection = rd.choice(minors)
961
+ if selection not in self.traces_list and selection not in majors_name:
962
+ self.traces_list.append(selection)
963
+ else:
964
+ continue
965
+ traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
966
+ x_traces = [round(rd.uniform(0., 0.001), 6) for i in range(len(self.traces_list))]
967
+ for i in range(len(self.traces_list)):
968
+ traces_data.append([str(self.traces_list[i]), int(traces[i][1]), float(x_traces[i])])
969
+ if len(traces_data) > 0:
970
+ traces_data = np.array(traces_data, dtype=object)
971
+ traces_data = traces_data[traces_data[:, 1].argsort()]
972
+ #
973
+ data = []
974
+ mineral = "Chc"
975
+ #
976
+ # Molar mass
977
+ molar_mass_pure = copper[2] + sulfur[2] + 4*oxygen[2] + 5*(2*hydrogen[2]+oxygen[2])
978
+ molar_mass, amounts = MineralChemistry(w_traces=traces_data, molar_mass_pure=molar_mass_pure,
979
+ majors=majors_data).calculate_molar_mass()
980
+ element = [PeriodicSystem(name=amounts[i][0]).get_data() for i in range(len(amounts))]
981
+ # Density
982
+ crystalsystem = "triclinic"
983
+ dataV = CrystalPhysics([[6.12, 10.7, 5.97], [97.583, 107.167, 77.55], crystalsystem])
984
+ V = dataV.calculate_volume()
985
+ Z = 2
986
+ V_m = MineralChemistry().calculate_molar_volume(volume_cell=V, z=Z)
987
+ dataRho = CrystalPhysics([molar_mass, Z, V])
988
+ rho = dataRho.calculate_bulk_density()
989
+ rho_e = wg(amounts=amounts, elements=element, rho_b=rho).calculate_electron_density()
990
+ # Bulk modulus
991
+ K = 62.12*10**9
992
+ # Shear modulus
993
+ G = 28.68*10**9
994
+ # Young's modulus
995
+ E = (9*K*G)/(3*K + G)
996
+ # Poisson's ratio
997
+ nu = (3*K - 2*G)/(2*(3*K + G))
998
+ # vP/vS
999
+ vPvS = ((K + 4/3*G)/G)**0.5
1000
+ # P-wave velocity
1001
+ vP = ((K + 4/3*G)/rho)**0.5
1002
+ # S-wave velocity
1003
+ vS = (G/rho)**0.5
1004
+ # Gamma ray
1005
+ gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
1006
+ # Photoelectricity
1007
+ pe = wg(amounts=amounts, elements=element).calculate_pe()
1008
+ U = pe*rho_e*10**(-3)
1009
+ # Electrical resistivity
1010
+ p = None
1011
+ #
1012
+ if self.data_type == False:
1013
+ data.append(mineral)
1014
+ data.append(round(molar_mass, 3))
1015
+ data.append(round(rho, 2))
1016
+ data.append([round(K*10**(-9), 2), round(G*10**(-9), 2), round(E*10**(-9), 2), round(nu, 4)])
1017
+ data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
1018
+ data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
1019
+ data.append(amounts)
1020
+ #
1021
+ return data
1022
+ else:
1023
+ #
1024
+ results = {}
1025
+ results["mineral"] = mineral
1026
+ results["M"] = molar_mass
1027
+ results["state"] = var_state
1028
+ element_list = np.array(amounts)[:, 0]
1029
+ results["chemistry"] = {}
1030
+ for index, element in enumerate(element_list, start=0):
1031
+ results["chemistry"][element] = amounts[index][2]
1032
+ results["rho"] = round(rho, 4)
1033
+ results["rho_e"] = round(rho_e, 4)
1034
+ results["V"] = round(V_m, 4)
1035
+ results["vP"] = round(vP, 4)
1036
+ results["vS"] = round(vS, 4)
1037
+ results["vP/vS"] = round(vPvS, 4)
1038
+ results["G"] = round(G*10**(-9), 4)
1039
+ results["K"] = round(K*10**(-9), 4)
1040
+ results["E"] = round(E*10**(-9), 4)
1041
+ results["nu"] = round(nu, 4)
1042
+ results["GR"] = round(gamma_ray, 4)
1043
+ results["PE"] = round(pe, 4)
1044
+ results["U"] = round(U, 4)
1045
+ if p != None:
1046
+ results["p"] = round(p, 4)
1047
+ else:
1048
+ results["p"] = p
1049
+ #
1050
+ return results
1051
+ #
1052
+ def create_kieserite(self):
1053
+ # Major elements
1054
+ hydrogen = PeriodicSystem(name="H").get_data()
1055
+ oxygen = PeriodicSystem(name="O").get_data()
1056
+ magnesium = PeriodicSystem(name="Mg").get_data()
1057
+ sulfur = PeriodicSystem(name="S").get_data()
1058
+ majors_name = ["H", "O", "Mg", "S"]
1059
+ majors_data = np.array([["H", hydrogen[1], 2, hydrogen[2]], ["O", oxygen[1], 5, oxygen[2]],
1060
+ ["Mg", magnesium[1], 1, magnesium[2]], ["S", sulfur[1], 1, sulfur[2]]], dtype=object)
1061
+ # Minor elements
1062
+ traces_data = []
1063
+ if len(self.traces_list) > 0:
1064
+ self.impurity = "impure"
1065
+ if self.impurity == "pure":
1066
+ var_state = "fixed"
1067
+ else:
1068
+ var_state = "variable"
1069
+ if self.impurity == "random":
1070
+ self.traces_list = []
1071
+ minors = [None]
1072
+ n = rd.randint(1, len(minors))
1073
+ while len(self.traces_list) < n:
1074
+ selection = rd.choice(minors)
1075
+ if selection not in self.traces_list and selection not in majors_name:
1076
+ self.traces_list.append(selection)
1077
+ else:
1078
+ continue
1079
+ traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
1080
+ x_traces = [round(rd.uniform(0., 0.001), 6) for i in range(len(self.traces_list))]
1081
+ for i in range(len(self.traces_list)):
1082
+ traces_data.append([str(self.traces_list[i]), int(traces[i][1]), float(x_traces[i])])
1083
+ if len(traces_data) > 0:
1084
+ traces_data = np.array(traces_data, dtype=object)
1085
+ traces_data = traces_data[traces_data[:, 1].argsort()]
1086
+ #
1087
+ data = []
1088
+ mineral = "Kie"
1089
+ #
1090
+ # Molar mass
1091
+ molar_mass_pure = magnesium[2] + sulfur[2] + 4*oxygen[2] + 2*hydrogen[2]+oxygen[2]
1092
+ molar_mass, amounts = MineralChemistry(w_traces=traces_data, molar_mass_pure=molar_mass_pure,
1093
+ majors=majors_data).calculate_molar_mass()
1094
+ element = [PeriodicSystem(name=amounts[i][0]).get_data() for i in range(len(amounts))]
1095
+ # Density
1096
+ crystalsystem = "monoclinic"
1097
+ dataV = CrystalPhysics([[6.9, 7.71, 7.54], [116.17], crystalsystem])
1098
+ V = dataV.calculate_volume()
1099
+ Z = 4
1100
+ V_m = MineralChemistry().calculate_molar_volume(volume_cell=V, z=Z)
1101
+ dataRho = CrystalPhysics([molar_mass, Z, V])
1102
+ rho = dataRho.calculate_bulk_density()
1103
+ rho_e = wg(amounts=amounts, elements=element, rho_b=rho).calculate_electron_density()
1104
+ # Bulk modulus
1105
+ K = 96.40*10**9
1106
+ # Shear modulus
1107
+ G = 44.77*10**9
1108
+ # Young's modulus
1109
+ E = (9*K*G)/(3*K + G)
1110
+ # Poisson's ratio
1111
+ nu = (3*K - 2*G)/(2*(3*K + G))
1112
+ # vP/vS
1113
+ vPvS = ((K + 4/3*G)/G)**0.5
1114
+ # P-wave velocity
1115
+ vP = ((K + 4/3*G)/rho)**0.5
1116
+ # S-wave velocity
1117
+ vS = (G/rho)**0.5
1118
+ # Gamma ray
1119
+ gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
1120
+ # Photoelectricity
1121
+ pe = wg(amounts=amounts, elements=element).calculate_pe()
1122
+ U = pe*rho_e*10**(-3)
1123
+ # Electrical resistivity
1124
+ p = None
1125
+ #
1126
+ if self.data_type == False:
1127
+ data.append(mineral)
1128
+ data.append(round(molar_mass, 3))
1129
+ data.append(round(rho, 2))
1130
+ data.append([round(K*10**(-9), 2), round(G*10**(-9), 2), round(E*10**(-9), 2), round(nu, 4)])
1131
+ data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
1132
+ data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
1133
+ data.append(amounts)
1134
+ #
1135
+ return data
1136
+ else:
1137
+ #
1138
+ results = {}
1139
+ results["mineral"] = mineral
1140
+ results["M"] = molar_mass
1141
+ results["state"] = var_state
1142
+ element_list = np.array(amounts)[:, 0]
1143
+ results["chemistry"] = {}
1144
+ for index, element in enumerate(element_list, start=0):
1145
+ results["chemistry"][element] = amounts[index][2]
1146
+ results["rho"] = round(rho, 4)
1147
+ results["rho_e"] = round(rho_e, 4)
1148
+ results["V"] = round(V_m, 4)
1149
+ results["vP"] = round(vP, 4)
1150
+ results["vS"] = round(vS, 4)
1151
+ results["vP/vS"] = round(vPvS, 4)
1152
+ results["G"] = round(G*10**(-9), 4)
1153
+ results["K"] = round(K*10**(-9), 4)
1154
+ results["E"] = round(E*10**(-9), 4)
1155
+ results["nu"] = round(nu, 4)
1156
+ results["GR"] = round(gamma_ray, 4)
1157
+ results["PE"] = round(pe, 4)
1158
+ results["U"] = round(U, 4)
1159
+ if p != None:
1160
+ results["p"] = round(p, 4)
1161
+ else:
1162
+ results["p"] = p
1163
+ #
1164
+ return results
1165
+ #
1166
+ def create_jarosite(self):
1167
+ # Major elements
1168
+ hydrogen = PeriodicSystem(name="H").get_data()
1169
+ oxygen = PeriodicSystem(name="O").get_data()
1170
+ sulfur = PeriodicSystem(name="S").get_data()
1171
+ potassium = PeriodicSystem(name="K").get_data()
1172
+ iron = PeriodicSystem(name="Fe").get_data()
1173
+ majors_name = ["H", "O", "S", "K", "Fe"]
1174
+ majors_data = np.array([["H", hydrogen[1], 6, hydrogen[2]], ["O", oxygen[1], 14, oxygen[2]],
1175
+ ["S", sulfur[1], 2, sulfur[2]], ["K", potassium[1], 1, potassium[2]],
1176
+ ["Fe", iron[1], 3, iron[2]]], dtype=object)
1177
+ # Minor elements
1178
+ traces_data = []
1179
+ if len(self.traces_list) > 0:
1180
+ self.impurity = "impure"
1181
+ if self.impurity == "pure":
1182
+ var_state = "fixed"
1183
+ else:
1184
+ var_state = "variable"
1185
+ if self.impurity == "random":
1186
+ self.traces_list = []
1187
+ minors = ["Na", "Ag", "Pb"]
1188
+ n = rd.randint(1, len(minors))
1189
+ while len(self.traces_list) < n:
1190
+ selection = rd.choice(minors)
1191
+ if selection not in self.traces_list and selection not in majors_name:
1192
+ self.traces_list.append(selection)
1193
+ else:
1194
+ continue
1195
+ traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
1196
+ x_traces = [round(rd.uniform(0., 0.001), 6) for i in range(len(self.traces_list))]
1197
+ for i in range(len(self.traces_list)):
1198
+ traces_data.append([str(self.traces_list[i]), int(traces[i][1]), float(x_traces[i])])
1199
+ if len(traces_data) > 0:
1200
+ traces_data = np.array(traces_data, dtype=object)
1201
+ traces_data = traces_data[traces_data[:, 1].argsort()]
1202
+ #
1203
+ data = []
1204
+ mineral = "Jar"
1205
+ #
1206
+ # Molar mass
1207
+ molar_mass_pure = potassium[2] + 3*iron[2] + 2*(sulfur[2] + 4*oxygen[2]) + 6*(hydrogen[2]+oxygen[2])
1208
+ molar_mass, amounts = MineralChemistry(w_traces=traces_data, molar_mass_pure=molar_mass_pure,
1209
+ majors=majors_data).calculate_molar_mass()
1210
+ element = [PeriodicSystem(name=amounts[i][0]).get_data() for i in range(len(amounts))]
1211
+ # Density
1212
+ crystalsystem = "trigonal"
1213
+ dataV = CrystalPhysics([[7.21, 17.03], [], crystalsystem])
1214
+ V = dataV.calculate_volume()
1215
+ Z = 3
1216
+ V_m = MineralChemistry().calculate_molar_volume(volume_cell=V, z=Z)
1217
+ dataRho = CrystalPhysics([molar_mass, Z, V])
1218
+ rho = dataRho.calculate_bulk_density()
1219
+ rho_e = wg(amounts=amounts, elements=element, rho_b=rho).calculate_electron_density()
1220
+ # Bulk modulus
1221
+ K = 33.29*10**9
1222
+ # Shear modulus
1223
+ G = 11.89*10**9
1224
+ # Young's modulus
1225
+ E = (9*K*G)/(3*K + G)
1226
+ # Poisson's ratio
1227
+ nu = (3*K - 2*G)/(2*(3*K + G))
1228
+ # vP/vS
1229
+ vPvS = ((K + 4/3*G)/G)**0.5
1230
+ # P-wave velocity
1231
+ vP = ((K + 4/3*G)/rho)**0.5
1232
+ # S-wave velocity
1233
+ vS = (G/rho)**0.5
1234
+ # Gamma ray
1235
+ gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
1236
+ # Photoelectricity
1237
+ pe = wg(amounts=amounts, elements=element).calculate_pe()
1238
+ U = pe*rho_e*10**(-3)
1239
+ # Electrical resistivity
1240
+ p = None
1241
+ #
1242
+ if self.data_type == False:
1243
+ data.append(mineral)
1244
+ data.append(round(molar_mass, 3))
1245
+ data.append(round(rho, 2))
1246
+ data.append([round(K*10**(-9), 2), round(G*10**(-9), 2), round(E*10**(-9), 2), round(nu, 4)])
1247
+ data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
1248
+ data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
1249
+ data.append(amounts)
1250
+ #
1251
+ return data
1252
+ else:
1253
+ #
1254
+ results = {}
1255
+ results["mineral"] = mineral
1256
+ results["M"] = molar_mass
1257
+ results["state"] = var_state
1258
+ element_list = np.array(amounts)[:, 0]
1259
+ results["chemistry"] = {}
1260
+ for index, element in enumerate(element_list, start=0):
1261
+ results["chemistry"][element] = amounts[index][2]
1262
+ results["rho"] = round(rho, 4)
1263
+ results["rho_e"] = round(rho_e, 4)
1264
+ results["V"] = round(V_m, 4)
1265
+ results["vP"] = round(vP, 4)
1266
+ results["vS"] = round(vS, 4)
1267
+ results["vP/vS"] = round(vPvS, 4)
1268
+ results["G"] = round(G*10**(-9), 4)
1269
+ results["K"] = round(K*10**(-9), 4)
1270
+ results["E"] = round(E*10**(-9), 4)
1271
+ results["nu"] = round(nu, 4)
1272
+ results["GR"] = round(gamma_ray, 4)
1273
+ results["PE"] = round(pe, 4)
1274
+ results["U"] = round(U, 4)
1275
+ if p != None:
1276
+ results["p"] = round(p, 4)
1277
+ else:
1278
+ results["p"] = p
1279
+ #
1280
+ return results
1281
+ #
1282
+ def create_alunite(self):
1283
+ # Major elements
1284
+ hydrogen = PeriodicSystem(name="H").get_data()
1285
+ oxygen = PeriodicSystem(name="O").get_data()
1286
+ aluminium = PeriodicSystem(name="Al").get_data()
1287
+ sulfur = PeriodicSystem(name="S").get_data()
1288
+ potassium = PeriodicSystem(name="K").get_data()
1289
+ majors_name = ["H", "O", "Al", "S", "K"]
1290
+ majors_data = np.array([["H", hydrogen[1], 6, hydrogen[2]], ["O", oxygen[1], 14, oxygen[2]],
1291
+ ["Al", aluminium[1], 3, aluminium[2]], ["S", sulfur[1], 2, sulfur[2]],
1292
+ ["K", potassium[1], 1, potassium[2]]], dtype=object)
1293
+ # Minor elements
1294
+ traces_data = []
1295
+ if len(self.traces_list) > 0:
1296
+ self.impurity = "impure"
1297
+ if self.impurity == "pure":
1298
+ var_state = "fixed"
1299
+ else:
1300
+ var_state = "variable"
1301
+ if self.impurity == "random":
1302
+ self.traces_list = []
1303
+ minors = ["Na", "Fe"]
1304
+ n = rd.randint(1, len(minors))
1305
+ while len(self.traces_list) < n:
1306
+ selection = rd.choice(minors)
1307
+ if selection not in self.traces_list and selection not in majors_name:
1308
+ self.traces_list.append(selection)
1309
+ else:
1310
+ continue
1311
+ traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
1312
+ x_traces = [round(rd.uniform(0., 0.001), 6) for i in range(len(self.traces_list))]
1313
+ for i in range(len(self.traces_list)):
1314
+ traces_data.append([str(self.traces_list[i]), int(traces[i][1]), float(x_traces[i])])
1315
+ if len(traces_data) > 0:
1316
+ traces_data = np.array(traces_data, dtype=object)
1317
+ traces_data = traces_data[traces_data[:, 1].argsort()]
1318
+ #
1319
+ data = []
1320
+ mineral = "Al"
1321
+ #
1322
+ # Molar mass
1323
+ molar_mass_pure = potassium[2] + 3*aluminium[2] + 2*(sulfur[2] + 4*oxygen[2]) + 6*(hydrogen[2]+oxygen[2])
1324
+ molar_mass, amounts = MineralChemistry(w_traces=traces_data, molar_mass_pure=molar_mass_pure,
1325
+ majors=majors_data).calculate_molar_mass()
1326
+ element = [PeriodicSystem(name=amounts[i][0]).get_data() for i in range(len(amounts))]
1327
+ # Density
1328
+ crystalsystem = "trigonal"
1329
+ dataV = CrystalPhysics([[6.97, 17.38], [], crystalsystem])
1330
+ V = dataV.calculate_volume()
1331
+ Z = 4
1332
+ V_m = MineralChemistry().calculate_molar_volume(volume_cell=V, z=Z)
1333
+ dataRho = CrystalPhysics([molar_mass, Z, V])
1334
+ rho = dataRho.calculate_bulk_density()
1335
+ rho_e = wg(amounts=amounts, elements=element, rho_b=rho).calculate_electron_density()
1336
+ # Bulk modulus
1337
+ K = 63*10**9
1338
+ # Shear modulus
1339
+ G = 49*10**9
1340
+ # Young's modulus
1341
+ E = (9*K*G)/(3*K + G)
1342
+ # Poisson's ratio
1343
+ nu = (3*K - 2*G)/(2*(3*K + G))
1344
+ # vP/vS
1345
+ vPvS = ((K + 4/3*G)/G)**0.5
1346
+ # P-wave velocity
1347
+ vP = ((K + 4/3*G)/rho)**0.5
1348
+ # S-wave velocity
1349
+ vS = (G/rho)**0.5
1350
+ # Gamma ray
1351
+ gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
1352
+ # Photoelectricity
1353
+ pe = wg(amounts=amounts, elements=element).calculate_pe()
1354
+ U = pe*rho_e*10**(-3)
1355
+ # Electrical resistivity
1356
+ p = None
1357
+ #
1358
+ if self.data_type == False:
1359
+ data.append(mineral)
1360
+ data.append(round(molar_mass, 3))
1361
+ data.append(round(rho, 2))
1362
+ data.append([round(K*10**(-9), 2), round(G*10**(-9), 2), round(E*10**(-9), 2), round(nu, 4)])
1363
+ data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
1364
+ data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
1365
+ data.append(amounts)
1366
+ #
1367
+ return data
1368
+ else:
1369
+ #
1370
+ results = {}
1371
+ results["mineral"] = mineral
1372
+ results["M"] = molar_mass
1373
+ results["state"] = var_state
1374
+ element_list = np.array(amounts)[:, 0]
1375
+ results["chemistry"] = {}
1376
+ for index, element in enumerate(element_list, start=0):
1377
+ results["chemistry"][element] = amounts[index][2]
1378
+ results["rho"] = round(rho, 4)
1379
+ results["rho_e"] = round(rho_e, 4)
1380
+ results["V"] = round(V_m, 4)
1381
+ results["vP"] = round(vP, 4)
1382
+ results["vS"] = round(vS, 4)
1383
+ results["vP/vS"] = round(vPvS, 4)
1384
+ results["G"] = round(G*10**(-9), 4)
1385
+ results["K"] = round(K*10**(-9), 4)
1386
+ results["E"] = round(E*10**(-9), 4)
1387
+ results["nu"] = round(nu, 4)
1388
+ results["GR"] = round(gamma_ray, 4)
1389
+ results["PE"] = round(pe, 4)
1390
+ results["U"] = round(U, 4)
1391
+ if p != None:
1392
+ results["p"] = round(p, 4)
1393
+ else:
1394
+ results["p"] = p
1395
+ #
1396
+ return results
1397
+ #
1398
+ def create_hexahydrite(self): # MgSO4 * 6*(H2O)
1399
+ # Major elements
1400
+ hydrogen = PeriodicSystem(name="H").get_data()
1401
+ oxygen = PeriodicSystem(name="O").get_data()
1402
+ magnesium = PeriodicSystem(name="Mg").get_data()
1403
+ sulfur = PeriodicSystem(name="S").get_data()
1404
+ majors_name = ["H", "O", "Mg", "S"]
1405
+ majors_data = np.array([["H", hydrogen[1], 12, hydrogen[2]], ["O", oxygen[1], 10, oxygen[2]],
1406
+ ["Mg", magnesium[1], 1, magnesium[2]], ["S", sulfur[1], 1, sulfur[2]]], dtype=object)
1407
+ # Minor elements
1408
+ traces_data = []
1409
+ if len(self.traces_list) > 0:
1410
+ self.impurity = "impure"
1411
+ if self.impurity == "pure":
1412
+ var_state = "fixed"
1413
+ else:
1414
+ var_state = "variable"
1415
+ if self.impurity == "random":
1416
+ self.traces_list = []
1417
+ minors = [None]
1418
+ n = rd.randint(1, len(minors))
1419
+ while len(self.traces_list) < n:
1420
+ selection = rd.choice(minors)
1421
+ if selection not in self.traces_list and selection not in majors_name:
1422
+ self.traces_list.append(selection)
1423
+ else:
1424
+ continue
1425
+ traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
1426
+ x_traces = [round(rd.uniform(0., 0.001), 6) for i in range(len(self.traces_list))]
1427
+ for i in range(len(self.traces_list)):
1428
+ traces_data.append([str(self.traces_list[i]), int(traces[i][1]), float(x_traces[i])])
1429
+ if len(traces_data) > 0:
1430
+ traces_data = np.array(traces_data, dtype=object)
1431
+ traces_data = traces_data[traces_data[:, 1].argsort()]
1432
+ #
1433
+ data = []
1434
+ mineral = "Hxh"
1435
+ #
1436
+ # Molar mass
1437
+ molar_mass_pure = magnesium[2] + (sulfur[2] + 4*oxygen[2]) + 6*(2*hydrogen[2]+oxygen[2])
1438
+ molar_mass, amounts = MineralChemistry(w_traces=traces_data, molar_mass_pure=molar_mass_pure,
1439
+ majors=majors_data).calculate_molar_mass()
1440
+ element = [PeriodicSystem(name=amounts[i][0]).get_data() for i in range(len(amounts))]
1441
+ # Density
1442
+ dataV = CrystalPhysics([[24.442, 7.216, 10.119], [98.28], "monoclinic"])
1443
+ V = dataV.calculate_volume()
1444
+ Z = 8
1445
+ V_m = MineralChemistry().calculate_molar_volume(volume_cell=V, z=Z)
1446
+ dataRho = CrystalPhysics([molar_mass, Z, V])
1447
+ rho = dataRho.calculate_bulk_density()
1448
+ rho_e = wg(amounts=amounts, elements=element, rho_b=rho).calculate_electron_density()
1449
+ # Bulk modulus
1450
+ K = 48.98*10**9
1451
+ # Shear modulus
1452
+ G = 24.17*10**9
1453
+ # Young's modulus
1454
+ E = (9*K*G)/(3*K + G)
1455
+ # Poisson's ratio
1456
+ nu = (3*K - 2*G)/(2*(3*K + G))
1457
+ # vP/vS
1458
+ vPvS = ((K + 4/3*G)/G)**0.5
1459
+ # P-wave velocity
1460
+ vP = ((K + 4/3*G)/rho)**0.5
1461
+ # S-wave velocity
1462
+ vS = (G/rho)**0.5
1463
+ # Gamma ray
1464
+ gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
1465
+ # Photoelectricity
1466
+ pe = wg(amounts=amounts, elements=element).calculate_pe()
1467
+ U = pe*rho_e*10**(-3)
1468
+ # Electrical resistivity
1469
+ p = None
1470
+ #
1471
+ if self.data_type == False:
1472
+ data.append(mineral)
1473
+ data.append(round(molar_mass, 3))
1474
+ data.append(round(rho, 2))
1475
+ data.append([round(K*10**(-9), 2), round(G*10**(-9), 2), round(E*10**(-9), 2), round(nu, 4)])
1476
+ data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
1477
+ data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
1478
+ data.append(amounts)
1479
+ #
1480
+ return data
1481
+ else:
1482
+ #
1483
+ results = {}
1484
+ results["mineral"] = mineral
1485
+ results["M"] = molar_mass
1486
+ results["state"] = var_state
1487
+ element_list = np.array(amounts)[:, 0]
1488
+ results["chemistry"] = {}
1489
+ for index, element in enumerate(element_list, start=0):
1490
+ results["chemistry"][element] = amounts[index][2]
1491
+ results["rho"] = round(rho, 4)
1492
+ results["rho_e"] = round(rho_e, 4)
1493
+ results["V"] = round(V_m, 4)
1494
+ results["vP"] = round(vP, 4)
1495
+ results["vS"] = round(vS, 4)
1496
+ results["vP/vS"] = round(vPvS, 4)
1497
+ results["G"] = round(G*10**(-9), 4)
1498
+ results["K"] = round(K*10**(-9), 4)
1499
+ results["E"] = round(E*10**(-9), 4)
1500
+ results["nu"] = round(nu, 4)
1501
+ results["GR"] = round(gamma_ray, 4)
1502
+ results["PE"] = round(pe, 4)
1503
+ results["U"] = round(U, 4)
1504
+ if p != None:
1505
+ results["p"] = round(p, 4)
1506
+ else:
1507
+ results["p"] = p
1508
+ #
1509
+ return results
1510
+ #
1511
+ def create_kainite(self):
1512
+ # Major elements
1513
+ hydrogen = PeriodicSystem(name="H").get_data()
1514
+ oxygen = PeriodicSystem(name="O").get_data()
1515
+ magnesium = PeriodicSystem(name="Mg").get_data()
1516
+ sulfur = PeriodicSystem(name="S").get_data()
1517
+ chlorine = PeriodicSystem(name="Cl").get_data()
1518
+ potassium = PeriodicSystem(name="K").get_data()
1519
+ majors_name = ["H", "O", "Mg", "S", "Cl", "K"]
1520
+ majors_data = np.array(
1521
+ [["H", hydrogen[1], 6, hydrogen[2]], ["O", oxygen[1], 7, oxygen[2]], ["Mg", magnesium[1], 1, magnesium[2]],
1522
+ ["S", sulfur[1], 1, sulfur[2]], ["Cl", chlorine[1], 1, chlorine[2]], ["K", potassium[1], 1, potassium[2]]],
1523
+ dtype=object)
1524
+ # Minor elements
1525
+ traces_data = []
1526
+ if len(self.traces_list) > 0:
1527
+ self.impurity = "impure"
1528
+ if self.impurity == "pure":
1529
+ var_state = "fixed"
1530
+ else:
1531
+ var_state = "variable"
1532
+ if self.impurity == "random":
1533
+ self.traces_list = []
1534
+ minors = [None]
1535
+ n = rd.randint(1, len(minors))
1536
+ while len(self.traces_list) < n:
1537
+ selection = rd.choice(minors)
1538
+ if selection not in self.traces_list and selection not in majors_name:
1539
+ self.traces_list.append(selection)
1540
+ else:
1541
+ continue
1542
+ traces = [PeriodicSystem(name=i).get_data() for i in self.traces_list]
1543
+ x_traces = [round(rd.uniform(0., 0.001), 6) for i in range(len(self.traces_list))]
1544
+ for i in range(len(self.traces_list)):
1545
+ traces_data.append([str(self.traces_list[i]), int(traces[i][1]), float(x_traces[i])])
1546
+ if len(traces_data) > 0:
1547
+ traces_data = np.array(traces_data, dtype=object)
1548
+ traces_data = traces_data[traces_data[:, 1].argsort()]
1549
+ #
1550
+ data = []
1551
+ mineral = "Ka"
1552
+ #
1553
+ # Molar mass
1554
+ molar_mass_pure = potassium[2] + magnesium[2] + (sulfur[2] + 4*oxygen[2]) + chlorine[2] \
1555
+ + 3*(2*hydrogen[2] + oxygen[2])
1556
+ molar_mass, amounts = MineralChemistry(
1557
+ w_traces=traces_data, molar_mass_pure=molar_mass_pure, majors=majors_data).calculate_molar_mass()
1558
+ element = [PeriodicSystem(name=amounts[i][0]).get_data() for i in range(len(amounts))]
1559
+ # Density
1560
+ crystalsystem = "monoclinic"
1561
+ dataV = CrystalPhysics([[19.72, 16.23, 9.53], [94.92], crystalsystem])
1562
+ V = dataV.calculate_volume()
1563
+ Z = 16
1564
+ V_m = MineralChemistry().calculate_molar_volume(volume_cell=V, z=Z)
1565
+ dataRho = CrystalPhysics([molar_mass, Z, V])
1566
+ rho = dataRho.calculate_bulk_density()
1567
+ rho_e = wg(amounts=amounts, elements=element, rho_b=rho).calculate_electron_density()
1568
+ # Bulk modulus
1569
+ K = 96.40*10**9 # no data found, but kieserite seems to be similar
1570
+ # Shear modulus
1571
+ G = 44.77*10**9 # no data found, but kieserite seems to be similar
1572
+ # Young's modulus
1573
+ E = (9*K*G)/(3*K + G)
1574
+ # Poisson's ratio
1575
+ nu = (3*K - 2*G)/(2*(3*K + G))
1576
+ # vP/vS
1577
+ vPvS = ((K + 4/3*G)/G)**0.5
1578
+ # P-wave velocity
1579
+ vP = ((K + 4/3*G)/rho)**0.5
1580
+ # S-wave velocity
1581
+ vS = (G/rho)**0.5
1582
+ # Gamma ray
1583
+ gamma_ray = wg(amounts=amounts, elements=element).calculate_gr()
1584
+ # Photoelectricity
1585
+ pe = wg(amounts=amounts, elements=element).calculate_pe()
1586
+ U = pe*rho_e*10**(-3)
1587
+ # Electrical resistivity
1588
+ p = None
1589
+ #
1590
+ if self.data_type == False:
1591
+ data.append(mineral)
1592
+ data.append(round(molar_mass, 3))
1593
+ data.append(round(rho, 2))
1594
+ data.append([round(K*10**(-9), 2), round(G*10**(-9), 2), round(E*10**(-9), 2), round(nu, 4)])
1595
+ data.append([round(vP, 2), round(vS, 2), round(vPvS, 2)])
1596
+ data.append([round(gamma_ray, 2), round(pe, 2), round(U, 2), p])
1597
+ data.append(amounts)
1598
+ #
1599
+ return data
1600
+ else:
1601
+ #
1602
+ results = {}
1603
+ results["mineral"] = mineral
1604
+ results["M"] = molar_mass
1605
+ results["state"] = var_state
1606
+ element_list = np.array(amounts)[:, 0]
1607
+ results["chemistry"] = {}
1608
+ for index, element in enumerate(element_list, start=0):
1609
+ results["chemistry"][element] = amounts[index][2]
1610
+ results["rho"] = round(rho, 4)
1611
+ results["rho_e"] = round(rho_e, 4)
1612
+ results["V"] = round(V_m, 4)
1613
+ results["vP"] = round(vP, 4)
1614
+ results["vS"] = round(vS, 4)
1615
+ results["vP/vS"] = round(vPvS, 4)
1616
+ results["G"] = round(G*10**(-9), 4)
1617
+ results["K"] = round(K*10**(-9), 4)
1618
+ results["E"] = round(E*10**(-9), 4)
1619
+ results["nu"] = round(nu, 4)
1620
+ results["GR"] = round(gamma_ray, 4)
1621
+ results["PE"] = round(pe, 4)
1622
+ results["U"] = round(U, 4)
1623
+ if p != None:
1624
+ results["p"] = round(p, 4)
1625
+ else:
1626
+ results["p"] = p
1627
+ #
1628
+ return results
1629
+ #