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
gebpy/modules/ore.py ADDED
@@ -0,0 +1,1648 @@
1
+ #!/usr/bin/env python
2
+ # -*-coding: utf-8 -*-
3
+
4
+ # -----------------------------------------------
5
+
6
+ # Name: ore.py
7
+ # Author: Maximilian A. Beeskow
8
+ # Version: 1.0
9
+ # Date: 20.12.2024
10
+
11
+ # -----------------------------------------------
12
+
13
+ # MODULES
14
+ import time
15
+ import numpy as np
16
+ import random as rd
17
+ # internal
18
+ try:
19
+ from gebpy.modules.silicates import (Phyllosilicates, Tectosilicates, Nesosilicates, Sorosilicates, Inosilicates,
20
+ Cyclosilicates)
21
+ from gebpy.modules.oxides import Oxides
22
+ from gebpy.modules.carbonates import Carbonates
23
+ from gebpy.modules.sulfides import Sulfides
24
+ from gebpy.modules.phosphates import Phosphates
25
+ from gebpy.modules import fluids
26
+ from gebpy.modules.fluids import Water
27
+ from gebpy.modules.geophysics import Elasticity as elast
28
+ from gebpy.modules.chemistry import PeriodicSystem, OxideCompounds
29
+ from gebpy.modules.minerals import CrystalPhysics
30
+ from gebpy.modules.geophysics import BoreholeGeophysics as bg
31
+ from gebpy.modules.geophysics import WellLog as wg
32
+ from gebpy.modules.geochemistry import MineralChemistry
33
+ from gebpy.modules.pyllosilicates import Pyllosilicates
34
+ from gebpy.modules.petrophysics import SeismicVelocities
35
+ except:
36
+ from modules.silicates import (Phyllosilicates, Tectosilicates, Nesosilicates, Sorosilicates, Inosilicates,
37
+ Cyclosilicates)
38
+ from modules.oxides import Oxides
39
+ from modules.carbonates import Carbonates
40
+ from modules.sulfides import Sulfides
41
+ from modules.phosphates import Phosphates
42
+ from modules import fluids
43
+ from modules.fluids import Water
44
+ from modules.geophysics import Elasticity as elast
45
+ from modules.chemistry import PeriodicSystem, OxideCompounds
46
+ from modules.minerals import CrystalPhysics
47
+ from modules.geophysics import BoreholeGeophysics as bg
48
+ from modules.geophysics import WellLog as wg
49
+ from modules.geochemistry import MineralChemistry
50
+ from modules.pyllosilicates import Pyllosilicates
51
+ from modules.petrophysics import SeismicVelocities
52
+
53
+ class OreRocks:
54
+ #
55
+ def __init__(self, fluid, actual_thickness, porosity):
56
+ ## Settings
57
+ self.fluid = fluid
58
+ self.actual_thickness = actual_thickness
59
+ self.porosity = porosity
60
+ #
61
+ ## Minerals
62
+ self.data_quartz = Oxides(data_type=True).create_quartz()
63
+ self.data_magnetite = Oxides(data_type=True).create_magnetite()
64
+ self.data_hematite = Oxides(data_type=True).create_hematite()
65
+ self.data_goethite = Oxides(data_type=True).create_goethite()
66
+ self.data_gibbsite = Oxides(data_type=True).create_gibbsite()
67
+ self.data_boehmite = Oxides(data_type=True).create_boehmite()
68
+ self.data_anatase = Oxides(data_type=True).create_anatase()
69
+ self.data_calcite = Carbonates(data_type=True).create_calcite()
70
+ self.data_siderite = Carbonates(data_type=True).create_siderite()
71
+ self.data_kaolinite = Phyllosilicates(impurity="pure", data_type=True).create_kaolinite()
72
+ self.data_pyrite = Sulfides(impurity="pure", data_type=True).create_pyrite()
73
+ #
74
+ ## Fluids
75
+ #
76
+ self.data_water = Water.water("")
77
+ #
78
+ def create_siliciclastic_itabirite(self, rock="Itabirite", number=1, composition=None, classification="Itabirite"):
79
+ #
80
+ results_container = {}
81
+ results_container["rock"] = rock
82
+ results_container["mineralogy"] = {}
83
+ results_container["chemistry"] = {}
84
+ results_container["compounds"] = {}
85
+ results_container["phi"] = []
86
+ results_container["fluid"] = self.fluid
87
+ results_container["rho_s"] = []
88
+ results_container["rho"] = []
89
+ results_container["vP"] = []
90
+ results_container["vS"] = []
91
+ results_container["vP/vS"] = []
92
+ results_container["K"] = []
93
+ results_container["G"] = []
94
+ results_container["E"] = []
95
+ results_container["nu"] = []
96
+ results_container["GR"] = []
97
+ results_container["PE"] = []
98
+
99
+ n = 0
100
+
101
+ classification = rock
102
+
103
+ while n < number:
104
+ data_biotite = Phyllosilicates(impurity="pure", data_type=True).create_biotite()
105
+ #
106
+ mineralogy = {"Hem": self.data_hematite, "Goe": self.data_goethite, "Kln": self.data_kaolinite,
107
+ "Qz": self.data_quartz, "Mag": self.data_magnetite, "Gbs": self.data_gibbsite,
108
+ "Bt": data_biotite}
109
+ #
110
+ minerals_list = list(mineralogy.keys())
111
+ #
112
+ if minerals_list[0] not in results_container["mineralogy"]:
113
+ for mineral in minerals_list:
114
+ results_container["mineralogy"][mineral] = []
115
+ #
116
+ condition = False
117
+ #
118
+ while condition == False:
119
+ elements_list = []
120
+ phi_minerals = {}
121
+ w_minerals = {}
122
+ w_elements = {}
123
+ #
124
+ if composition != None:
125
+ phi_hem = composition["Hem"]
126
+ phi_goe = composition["Goe"]
127
+ phi_kln = composition["Kln"]
128
+ phi_qz = composition["Qz"]
129
+ phi_mag = composition["Mag"]
130
+ phi_gbs = composition["Gbs"]
131
+ phi_bt = composition["Bt"]
132
+ #
133
+ phi_minerals["Hem"] = phi_hem
134
+ phi_minerals["Goe"] = phi_goe
135
+ phi_minerals["Kln"] = phi_kln
136
+ phi_minerals["Qz"] = phi_qz
137
+ phi_minerals["Mag"] = phi_mag
138
+ phi_minerals["Gbs"] = phi_gbs
139
+ phi_minerals["Bt"] = phi_bt
140
+ #
141
+ else:
142
+ condition_2 = False
143
+ while condition_2 == False:
144
+ if classification == "Itabirite":
145
+ gbs_limits = [0.0, 0.05]
146
+ qz_limits = [0.0, 0.4]
147
+ mag_limits = [0.0, 0.05]
148
+ hem_limits = [0.3, 0.7]
149
+ goe_limits = [0.05, 0.26]
150
+ kln_limits = [0.0, 0.14]
151
+ bt_limits = [0.0, 0.05]
152
+ elif classification == "Banded Iron Formation":
153
+ gbs_limits = [0.0, 0.05]
154
+ qz_limits = [0.4, 0.75]
155
+ mag_limits = [0.15, 0.4]
156
+ hem_limits = [0.05, 0.20]
157
+ goe_limits = [0.0, 0.05]
158
+ kln_limits = [0.0, 0.15]
159
+ bt_limits = [0.0, 0.05]
160
+ elif classification == "Compact Hematite":
161
+ gbs_limits = [0.0, 0.05]
162
+ qz_limits = [0.0, 0.05]
163
+ mag_limits = [0.0, 0.05]
164
+ hem_limits = [0.7, 0.8]
165
+ goe_limits = [0.05, 0.15]
166
+ kln_limits = [0.0, 0.1]
167
+ bt_limits = [0.0, 0.05]
168
+ elif classification == "Friable Hematite":
169
+ gbs_limits = [0.0, 0.02]
170
+ qz_limits = [0.0, 0.02]
171
+ mag_limits = [0.0, 0.02]
172
+ hem_limits = [0.85, 0.95]
173
+ goe_limits = [0.04, 0.06]
174
+ kln_limits = [0.0, 0.02]
175
+ bt_limits = [0.0, 0.02]
176
+ elif classification == "Goethite Hematite":
177
+ gbs_limits = [0.05, 0.09]
178
+ qz_limits = [0.0, 0.02]
179
+ mag_limits = [0.0, 0.02]
180
+ hem_limits = [0.66, 0.72]
181
+ goe_limits = [0.18, 0.22]
182
+ kln_limits = [0.0, 0.02]
183
+ bt_limits = [0.0, 0.02]
184
+ elif classification == "Al-rich Itabirite":
185
+ gbs_limits = [0.0, 0.02]
186
+ qz_limits = [0.0, 0.08]
187
+ mag_limits = [0.0, 0.05]
188
+ hem_limits = [0.6, 0.67]
189
+ goe_limits = [0.1, 0.18]
190
+ kln_limits = [0.1, 0.18]
191
+ bt_limits = [0.0, 0.02]
192
+ elif classification == "Compact Quartz Itabirite":
193
+ gbs_limits = [0.0, 0.02]
194
+ qz_limits = [0.42, 0.5]
195
+ mag_limits = [0.0, 0.05]
196
+ hem_limits = [0.42, 0.5]
197
+ goe_limits = [0.0, 0.05]
198
+ kln_limits = [0.0, 0.02]
199
+ bt_limits = [0.0, 0.02]
200
+ elif classification == "Friable Quartz Itabirite":
201
+ gbs_limits = [0.0, 0.02]
202
+ qz_limits = [0.3, 0.38]
203
+ mag_limits = [0.0, 0.05]
204
+ hem_limits = [0.54, 0.62]
205
+ goe_limits = [0.0, 0.05]
206
+ kln_limits = [0.0, 0.02]
207
+ bt_limits = [0.0, 0.02]
208
+ elif classification == "Goethite Itabirite":
209
+ gbs_limits = [0.0, 0.05]
210
+ qz_limits = [0.18, 0.28]
211
+ mag_limits = [0.0, 0.05]
212
+ hem_limits = [0.32, 0.4]
213
+ goe_limits = [0.3, 0.38]
214
+ kln_limits = [0.0, 0.02]
215
+ bt_limits = [0.0, 0.02]
216
+ #
217
+ phi_hem = round(rd.uniform(hem_limits[0], hem_limits[1]), 4)
218
+ phi_goe = round(rd.uniform(goe_limits[0], (1 - phi_hem)), 4)
219
+ phi_kln = round(rd.uniform(kln_limits[0], (1 - phi_hem - phi_goe)), 4)
220
+ phi_qz = round(rd.uniform(qz_limits[0], (1 - phi_hem - phi_goe - phi_kln)), 4)
221
+ phi_mag = round(rd.uniform(mag_limits[0], (1 - phi_hem - phi_goe - phi_kln - phi_qz)), 4)
222
+ phi_gbs = round(rd.uniform(gbs_limits[0], (1 - phi_hem - phi_goe - phi_kln - phi_qz
223
+ - phi_mag)), 4)
224
+ phi_bt = round(1 - phi_hem - phi_goe - phi_kln - phi_qz - phi_mag - phi_gbs, 4)
225
+ #
226
+ phi_total = phi_hem + phi_goe + phi_kln + phi_qz + phi_mag + phi_gbs + phi_bt
227
+ #
228
+ if np.isclose(phi_total, 1.0000) == True:
229
+ if hem_limits[0] <= phi_hem <= hem_limits[1] \
230
+ and goe_limits[0] <= phi_goe <= goe_limits[1] \
231
+ and kln_limits[0] <= phi_kln <= kln_limits[1] \
232
+ and qz_limits[0] <= phi_qz <= qz_limits[1] \
233
+ and mag_limits[0] <= phi_mag <= mag_limits[1] \
234
+ and gbs_limits[0] <= phi_gbs <= gbs_limits[1] \
235
+ and bt_limits[0] <= phi_bt <= bt_limits[1]:
236
+ condition_2 = True
237
+ #
238
+ phi_minerals["Hem"] = phi_hem
239
+ phi_minerals["Goe"] = phi_goe
240
+ phi_minerals["Kln"] = phi_kln
241
+ phi_minerals["Qz"] = phi_qz
242
+ phi_minerals["Mag"] = phi_mag
243
+ phi_minerals["Gbs"] = phi_gbs
244
+ phi_minerals["Bt"] = phi_bt
245
+ #
246
+ rho_s = 0
247
+ for key, value in phi_minerals.items():
248
+ rho_s += phi_minerals[key]*mineralogy[key]["rho"]
249
+ for element, value in mineralogy[key]["chemistry"].items():
250
+ if element not in elements_list:
251
+ elements_list.append(element)
252
+ w_elements[element] = 0.0
253
+ #
254
+ if elements_list[0] not in results_container["chemistry"]:
255
+ for element in elements_list:
256
+ results_container["chemistry"][element] = []
257
+ #
258
+ rho_s = round(rho_s, 3)
259
+ for key, value in phi_minerals.items():
260
+ if key == "Urn":
261
+ n_digits = 4
262
+ else:
263
+ n_digits = 4
264
+ #
265
+ w_minerals[key] = round((phi_minerals[key]*mineralogy[key]["rho"])/rho_s, n_digits)
266
+ #
267
+ if self.porosity == None:
268
+ var_porosity = round(rd.uniform(0.0, 0.1), 4)
269
+ else:
270
+ var_porosity = round(rd.uniform(self.porosity[0], self.porosity[1]), 4)
271
+ #
272
+ if self.fluid == "water":
273
+ data_fluid = self.data_water
274
+ #
275
+ rho = round((1 - var_porosity)*rho_s + var_porosity*data_fluid[2]/1000, 3)
276
+ #
277
+ old_index = elements_list.index("O")
278
+ elements_list += [elements_list.pop(old_index)]
279
+ #
280
+ w_elements_total = 0.0
281
+ for element in elements_list:
282
+ if element != "O":
283
+ for mineral, w_mineral in w_minerals.items():
284
+ if element in mineralogy[mineral]["chemistry"]:
285
+ if element == "U":
286
+ n_digits = 4
287
+ else:
288
+ n_digits = 4
289
+ #
290
+ value = round(w_mineral*mineralogy[mineral]["chemistry"][element], n_digits)
291
+ w_elements[element] += value
292
+ w_elements_total += value
293
+ #
294
+ w_elements[element] = round(w_elements[element], n_digits)
295
+ elif element == "O":
296
+ w_elements[element] += round(1 - w_elements_total, 4)
297
+ #
298
+ w_elements[element] = round(w_elements[element], 4)
299
+ #
300
+ total_w_minerals = round(sum(w_minerals.values()), 4)
301
+ total_w_elements = round(sum(w_elements.values()), 4)
302
+ if total_w_minerals == 1.0 and total_w_elements == 1.0:
303
+ for key, value in w_minerals.items():
304
+ w_minerals[key] = abs(value)
305
+ #
306
+ for key, value in w_elements.items():
307
+ w_elements[key] = abs(value)
308
+ #
309
+ condition = True
310
+ #
311
+ gamma_ray = 0.0
312
+ photoelectricity = 0.0
313
+ #
314
+ K_list = []
315
+ G_list = []
316
+ phi_list = []
317
+ for key, value in phi_minerals.items():
318
+ gamma_ray += phi_minerals[key]*mineralogy[key]["GR"]
319
+ photoelectricity += phi_minerals[key]*mineralogy[key]["PE"]
320
+ #
321
+ gamma_ray = round(gamma_ray, 3)
322
+ photoelectricity = round(photoelectricity, 3)
323
+ #
324
+ K_list.append(round(phi_minerals[key]*mineralogy[key]["K"], 3))
325
+ G_list.append(round(phi_minerals[key]*mineralogy[key]["G"], 3))
326
+ phi_list.append(phi_minerals[key])
327
+ #
328
+ K_geo = elast.calc_geometric_mean(self, phi_list, K_list)
329
+ G_geo = elast.calc_geometric_mean(self, phi_list, G_list)
330
+ #
331
+ anisotropic_factor = 1.0
332
+ #
333
+ bulk_mod = K_geo/anisotropic_factor
334
+ shear_mod = G_geo/anisotropic_factor
335
+ #
336
+ youngs_mod = round((9*bulk_mod*shear_mod)/(3*bulk_mod + shear_mod), 3)
337
+ poisson_rat = round((3*bulk_mod - 2*shear_mod)/(6*bulk_mod + 2*shear_mod), 6)
338
+ vP = round(((bulk_mod*10**9 + 4/3*shear_mod*10**9)/(rho))**0.5, 3)
339
+ vS = round(((shear_mod*10**9)/(rho))**0.5, 3)
340
+ vPvS = round(vP/vS, 6)
341
+ #
342
+ for key, value in w_minerals.items():
343
+ results_container["mineralogy"][key].append(value)
344
+
345
+ amounts = []
346
+ for key, value in w_elements.items():
347
+ results_container["chemistry"][key].append(value)
348
+ chem_data = PeriodicSystem(name=key).get_data()
349
+ amounts.append([key, chem_data[1], value])
350
+
351
+ list_elements = list(w_elements.keys())
352
+ list_oxides = OxideCompounds(var_list_elements=list_elements).find_oxides()
353
+ composition_oxides = {}
354
+ for var_oxide in list_oxides:
355
+ oxide_data = OxideCompounds(var_compound=var_oxide, var_amounts=amounts).get_composition()
356
+ composition_oxides[var_oxide] = round(oxide_data["Oxide"][1], 4)
357
+
358
+ if list_oxides[0] not in results_container["compounds"]:
359
+ for oxide in list_oxides:
360
+ results_container["compounds"][oxide] = []
361
+
362
+ for key, value in composition_oxides.items():
363
+ results_container["compounds"][key].append(value)
364
+
365
+ results_container["mineralogy"] = dict(sorted(
366
+ results_container["mineralogy"].items(), key=lambda item: sum(item[1])/len(item[1]), reverse=True))
367
+ results_container["chemistry"] = dict(sorted(
368
+ results_container["chemistry"].items(), key=lambda item: sum(item[1])/len(item[1]), reverse=True))
369
+ results_container["compounds"] = dict(sorted(
370
+ results_container["compounds"].items(), key=lambda item: sum(item[1])/len(item[1]), reverse=True))
371
+
372
+ results_container["phi"].append(var_porosity)
373
+ results_container["rho_s"].append(rho_s)
374
+ results_container["rho"].append(rho)
375
+ results_container["vP"].append(vP)
376
+ results_container["vS"].append(vS)
377
+ results_container["vP/vS"].append(vPvS)
378
+ results_container["K"].append(bulk_mod)
379
+ results_container["G"].append(shear_mod)
380
+ results_container["E"].append(youngs_mod)
381
+ results_container["nu"].append(poisson_rat)
382
+ results_container["GR"].append(gamma_ray)
383
+ results_container["PE"].append(photoelectricity)
384
+ #
385
+ n += 1
386
+ #
387
+ return results_container
388
+
389
+ def create_bandedironformation(self, rock="Banded Iron Formation", number=1, composition=None, mode="random"):
390
+ results_container = {}
391
+ results_container["rock"] = rock
392
+ results_container["mineralogy"] = {}
393
+ results_container["chemistry"] = {}
394
+ results_container["compounds"] = {}
395
+ results_container["phi"] = []
396
+ results_container["phi_true"] = []
397
+ results_container["fluid"] = self.fluid
398
+ results_container["rho_s"] = []
399
+ results_container["rho"] = []
400
+ results_container["vP"] = []
401
+ results_container["vS"] = []
402
+ results_container["vP/vS"] = []
403
+ results_container["K"] = []
404
+ results_container["G"] = []
405
+ results_container["E"] = []
406
+ results_container["nu"] = []
407
+ results_container["GR"] = []
408
+ results_container["PE"] = []
409
+
410
+ n = 0
411
+ w_last = None
412
+ list_ore_values = np.around(np.linspace(0.25, 0.5, number), 4)
413
+ list_ore_values_reverse = sorted(list_ore_values, reverse=True)
414
+ while n < number:
415
+ data_apatite = Phosphates(data_type=True).create_aptite()
416
+ mineralogy = {
417
+ "Qz": self.data_quartz, "Mag": self.data_magnetite, "Hem": self.data_hematite,
418
+ "Kln": self.data_kaolinite, "Ap": data_apatite}
419
+ minerals_list = list(mineralogy.keys())
420
+
421
+ if minerals_list[0] not in results_container["mineralogy"]:
422
+ for mineral in minerals_list:
423
+ results_container["mineralogy"][mineral] = []
424
+
425
+ condition = False
426
+ while condition == False:
427
+ elements_list = []
428
+ phi_minerals = {}
429
+ w_minerals = {}
430
+ w_elements = {}
431
+
432
+ if composition != None:
433
+ phi_qz = composition["Qz"]
434
+ phi_mag = composition["Mag"]
435
+ phi_hem = composition["Hem"]
436
+ phi_kln = composition["Kln"]
437
+ phi_ap = composition["Ap"]
438
+
439
+ phi_minerals["Qz"] = phi_qz
440
+ phi_minerals["Mag"] = phi_mag
441
+ phi_minerals["Hem"] = phi_hem
442
+ phi_minerals["Kln"] = phi_kln
443
+ phi_minerals["Ap"] = phi_ap
444
+
445
+ else:
446
+ condition_2 = False
447
+ while condition_2 == False:
448
+ if mode == "random":
449
+ amount_ore = round(rd.uniform(0.25, 0.5), 4)
450
+ elif mode == "increasing ore":
451
+ amount_ore = list_ore_values[n]
452
+ elif mode == "decreasing ore":
453
+ amount_ore = list_ore_values_reverse[n]
454
+
455
+ amount_residuals = round(1 - amount_ore, 4)
456
+ amount_mag = round(rd.uniform(0.6, 0.8), 4)
457
+ amount_qz = round(rd.uniform(0.6, 1.0), 4)
458
+
459
+ qz_limits = [0.4, 0.75]
460
+ mag_limits = [0.15, 0.4]
461
+ hem_limits = [0.05, 0.20]
462
+ kln_limits = [0.0, 0.15]
463
+ ap_limits = [0.0, 0.025]
464
+ # Ore minerals
465
+ phi_mag = round(amount_ore*amount_mag, 4)
466
+ phi_hem = round(amount_ore - phi_mag, 4)
467
+ # Other minerals
468
+ phi_qz = round(amount_residuals*amount_qz, 4)
469
+ phi_ap = round(amount_residuals*rd.uniform(0, (1 - amount_qz)), 4)
470
+ phi_kln = round(1 - phi_qz - phi_mag - phi_hem - phi_ap, 4)
471
+
472
+ phi_total = phi_qz + phi_mag + phi_hem + phi_kln + phi_ap
473
+
474
+ if np.isclose(phi_total, 1.0000) == True:
475
+ if (qz_limits[0] <= phi_qz <= qz_limits[1] \
476
+ and mag_limits[0] <= phi_mag <= mag_limits[1] \
477
+ and hem_limits[0] <= phi_hem <= hem_limits[1] \
478
+ and kln_limits[0] <= phi_kln <= kln_limits[1]
479
+ and ap_limits[0] <= phi_ap <= ap_limits[1]):
480
+ condition_2 = True
481
+
482
+ phi_minerals["Qz"] = phi_qz
483
+ phi_minerals["Mag"] = phi_mag
484
+ phi_minerals["Hem"] = phi_hem
485
+ phi_minerals["Kln"] = phi_kln
486
+ phi_minerals["Ap"] = phi_ap
487
+
488
+ rho_s = 0
489
+ for key, value in phi_minerals.items():
490
+ rho_s += phi_minerals[key]*mineralogy[key]["rho"]
491
+ for element, value in mineralogy[key]["chemistry"].items():
492
+ if element not in elements_list:
493
+ elements_list.append(element)
494
+ w_elements[element] = 0.0
495
+
496
+ if elements_list[0] not in results_container["chemistry"]:
497
+ for element in elements_list:
498
+ results_container["chemistry"][element] = []
499
+
500
+ rho_s = round(rho_s, 3)
501
+ for key, value in phi_minerals.items():
502
+ if key == "Urn":
503
+ n_digits = 4
504
+ else:
505
+ n_digits = 4
506
+
507
+ w_minerals[key] = round((phi_minerals[key]*mineralogy[key]["rho"])/rho_s, n_digits)
508
+
509
+ if self.fluid == "water":
510
+ data_fluid = self.data_water
511
+
512
+ old_index = elements_list.index("O")
513
+ elements_list += [elements_list.pop(old_index)]
514
+
515
+ w_elements_total = 0.0
516
+ for element in elements_list:
517
+ if element != "O":
518
+ for mineral, w_mineral in w_minerals.items():
519
+ if element in mineralogy[mineral]["chemistry"]:
520
+ if element == "U":
521
+ n_digits = 4
522
+ else:
523
+ n_digits = 4
524
+
525
+ value = round(w_mineral*mineralogy[mineral]["chemistry"][element], n_digits)
526
+ w_elements[element] += value
527
+ w_elements_total += value
528
+ w_elements[element] = round(w_elements[element], n_digits)
529
+ elif element == "O":
530
+ w_elements[element] += round(1 - w_elements_total, 4)
531
+ w_elements[element] = round(w_elements[element], 4)
532
+
533
+ total_w_minerals = round(sum(w_minerals.values()), 4)
534
+ total_w_elements = round(sum(w_elements.values()), 4)
535
+ if total_w_minerals == 1.0 and total_w_elements == 1.0:
536
+ for key, value in w_minerals.items():
537
+ w_minerals[key] = abs(value)
538
+ for key, value in w_elements.items():
539
+ w_elements[key] = abs(value)
540
+ condition = True
541
+
542
+ velocity_solid = {"vP": 0, "vS": 0}
543
+ gamma_ray = 0.0
544
+ photoelectricity = 0.0
545
+ for key, value in phi_minerals.items():
546
+ velocity_solid["vP"] += phi_minerals[key]*mineralogy[key]["vP"]
547
+ velocity_solid["vS"] += phi_minerals[key]*mineralogy[key]["vS"]
548
+ gamma_ray += phi_minerals[key]*mineralogy[key]["GR"]
549
+ photoelectricity += phi_minerals[key]*mineralogy[key]["PE"]
550
+
551
+ ## Bulk Density, Porosity, Seismic Velocities
552
+ rho_solid = round(rho_s, 3)
553
+ vP, vS, vPvS, rho, var_porosity = SeismicVelocities(
554
+ rho_solid=rho_solid, rho_fluid=self.data_water[2]).calculate_seismic_velocities(
555
+ rho_limits=[3000, 4500], vP_limits=[2500, 5000], vS_limits=[1500, 3000], delta=0.05,
556
+ porosity=self.porosity)
557
+ phi_neutron = round((1900/rho)*0.15, 4)
558
+ ## Elastic Parameters
559
+ bulk_modulus, shear_modulus, youngs_modulus, poisson_ratio = SeismicVelocities(
560
+ rho_solid=None, rho_fluid=None).calculate_elastic_properties(
561
+ rho=rho, vP=vP, vS=vS)
562
+ ## Gamma Ray
563
+ gamma_ray = round(gamma_ray, 3)
564
+ ## Photoelectricity
565
+ photoelectricity = round(photoelectricity, 3)
566
+
567
+ for key, value in w_minerals.items():
568
+ results_container["mineralogy"][key].append(value)
569
+ # for key, value in w_elements.items():
570
+ # results_container["chemistry"][key].append(value)
571
+ # w_last = w_minerals
572
+
573
+ amounts = []
574
+ for key, value in w_elements.items():
575
+ results_container["chemistry"][key].append(value)
576
+ chem_data = PeriodicSystem(name=key).get_data()
577
+ amounts.append([key, chem_data[1], value])
578
+
579
+ list_elements = list(w_elements.keys())
580
+ list_oxides = OxideCompounds(var_list_elements=list_elements).find_oxides()
581
+ composition_oxides = {}
582
+ for var_oxide in list_oxides:
583
+ oxide_data = OxideCompounds(var_compound=var_oxide, var_amounts=amounts).get_composition()
584
+ composition_oxides[var_oxide] = round(oxide_data["Oxide"][1], 4)
585
+
586
+ if list_oxides[0] not in results_container["compounds"]:
587
+ for oxide in list_oxides:
588
+ results_container["compounds"][oxide] = []
589
+
590
+ for key, value in composition_oxides.items():
591
+ results_container["compounds"][key].append(value)
592
+
593
+ results_container["mineralogy"] = dict(sorted(
594
+ results_container["mineralogy"].items(), key=lambda item: sum(item[1])/len(item[1]), reverse=True))
595
+ results_container["chemistry"] = dict(sorted(
596
+ results_container["chemistry"].items(), key=lambda item: sum(item[1])/len(item[1]), reverse=True))
597
+ results_container["compounds"] = dict(sorted(
598
+ results_container["compounds"].items(), key=lambda item: sum(item[1])/len(item[1]), reverse=True))
599
+
600
+ # Results
601
+ results_container["phi"].append(phi_neutron)
602
+ results_container["phi_true"].append(var_porosity)
603
+ results_container["rho_s"].append(rho_s)
604
+ results_container["rho"].append(rho)
605
+ results_container["vP"].append(vP)
606
+ results_container["vS"].append(vS)
607
+ results_container["vP/vS"].append(vPvS)
608
+ results_container["K"].append(bulk_modulus)
609
+ results_container["G"].append(shear_modulus)
610
+ results_container["E"].append(youngs_modulus)
611
+ results_container["nu"].append(poisson_ratio)
612
+ results_container["GR"].append(gamma_ray)
613
+ results_container["PE"].append(photoelectricity)
614
+ n += 1
615
+
616
+ return results_container
617
+
618
+ def create_bauxite(self, rock="Bauxite", number=1, composition=None, mode="random"):
619
+ results_container = {}
620
+ results_container["rock"] = rock
621
+ results_container["mineralogy"] = {}
622
+ results_container["chemistry"] = {}
623
+ results_container["compounds"] = {}
624
+ results_container["phi"] = []
625
+ results_container["phi_true"] = []
626
+ results_container["fluid"] = self.fluid
627
+ results_container["rho_s"] = []
628
+ results_container["rho"] = []
629
+ results_container["vP"] = []
630
+ results_container["vS"] = []
631
+ results_container["vP/vS"] = []
632
+ results_container["K"] = []
633
+ results_container["G"] = []
634
+ results_container["E"] = []
635
+ results_container["nu"] = []
636
+ results_container["GR"] = []
637
+ results_container["PE"] = []
638
+
639
+ mineralogy = {
640
+ "Gbs": self.data_gibbsite, "Bhm": self.data_boehmite, "Goe": self.data_goethite, "Hem": self.data_hematite,
641
+ "Kln": self.data_kaolinite, "Anat": self.data_anatase}
642
+ minerals_list = list(mineralogy.keys())
643
+ if minerals_list[0] not in results_container["mineralogy"]:
644
+ for mineral in minerals_list:
645
+ results_container["mineralogy"][mineral] = []
646
+
647
+ n = 0
648
+ w_last = None
649
+ list_ore_values = np.around(np.linspace(0.25, 0.5, number), 4)
650
+ list_ore_values_reverse = sorted(list_ore_values, reverse=True)
651
+ while n < number:
652
+ condition = False
653
+ while condition == False:
654
+ elements_list = []
655
+ phi_minerals = {}
656
+ w_minerals = {}
657
+ w_elements = {}
658
+
659
+ if composition != None:
660
+ phi_gbs = composition["Gbs"]
661
+ phi_bhm = composition["Bhm"]
662
+ phi_goe = composition["Goe"]
663
+ phi_hem = composition["Hem"]
664
+ phi_kln = composition["Kln"]
665
+ phi_anat = composition["Anat"]
666
+
667
+ phi_minerals["Gbs"] = phi_gbs
668
+ phi_minerals["Bhm"] = phi_bhm
669
+ phi_minerals["Goe"] = phi_goe
670
+ phi_minerals["Hem"] = phi_hem
671
+ phi_minerals["Kln"] = phi_kln
672
+ phi_minerals["Anat"] = phi_anat
673
+
674
+ else:
675
+ condition_2 = False
676
+ while condition_2 == False:
677
+ if mode == "random":
678
+ amount_al_ore = round(rd.uniform(0.35, 0.65), 4)
679
+ elif mode == "increasing ore":
680
+ amount_al_ore = list_ore_values[n]
681
+ elif mode == "decreasing ore":
682
+ amount_al_ore = list_ore_values_reverse[n]
683
+
684
+ amount_fe_ore = round(rd.uniform(0.10, (1 - amount_al_ore)), 4)
685
+ amount_residuals = round(1 - amount_al_ore - amount_fe_ore, 4)
686
+ amount_gbs = round(rd.uniform(0.2, 0.8), 4)
687
+ amount_goe = round(rd.uniform(0.7, 0.9), 4)
688
+ amount_kln = round(rd.uniform(0.4, 0.9), 4)
689
+
690
+ # Al ore minerals
691
+ phi_gbs = round(amount_al_ore*amount_gbs, 4)
692
+ phi_bhm = round(amount_al_ore - phi_gbs, 4)
693
+ # Fe ore minerals
694
+ phi_goe = round(amount_fe_ore*amount_goe, 4)
695
+ phi_hem = round(amount_fe_ore - phi_goe, 4)
696
+ # Other minerals
697
+
698
+ phi_kln = round(amount_residuals*amount_kln, 4)
699
+ phi_anat = round(1 - phi_gbs - phi_bhm - phi_goe - phi_hem - phi_kln, 4)
700
+
701
+ phi_total = phi_gbs + phi_bhm + phi_goe + phi_hem + phi_kln + phi_anat
702
+
703
+ gbs_limits = [0.2, 0.8]
704
+ bhm_limits = [0.2, 0.6]
705
+ goe_limits = [0.2, 0.5]
706
+ hem_limits = [0.0, 0.25]
707
+ kln_limits = [0.0, 0.3]
708
+ anat_limits = [0.0, 0.10]
709
+
710
+ if np.isclose(phi_total, 1.0000) == True:
711
+ if (gbs_limits[0] <= phi_gbs <= gbs_limits[1] \
712
+ and bhm_limits[0] <= phi_bhm <= bhm_limits[1] \
713
+ and goe_limits[0] <= phi_goe <= goe_limits[1] \
714
+ and hem_limits[0] <= phi_hem <= hem_limits[1] \
715
+ and kln_limits[0] <= phi_kln <= kln_limits[1] \
716
+ and anat_limits[0] <= phi_kln <= anat_limits[1]):
717
+ condition_2 = True
718
+
719
+ phi_minerals["Gbs"] = phi_gbs
720
+ phi_minerals["Bhm"] = phi_bhm
721
+ phi_minerals["Goe"] = phi_goe
722
+ phi_minerals["Hem"] = phi_hem
723
+ phi_minerals["Kln"] = phi_kln
724
+ phi_minerals["Anat"] = phi_anat
725
+
726
+ rho_s = 0
727
+ for key, value in phi_minerals.items():
728
+ rho_s += phi_minerals[key]*mineralogy[key]["rho"]
729
+ for element, value in mineralogy[key]["chemistry"].items():
730
+ if element not in elements_list:
731
+ elements_list.append(element)
732
+ w_elements[element] = 0.0
733
+
734
+ if elements_list[0] not in results_container["chemistry"]:
735
+ for element in elements_list:
736
+ results_container["chemistry"][element] = []
737
+
738
+ rho_s = round(rho_s, 3)
739
+ for key, value in phi_minerals.items():
740
+ if key == "Urn":
741
+ n_digits = 4
742
+ else:
743
+ n_digits = 4
744
+
745
+ w_minerals[key] = round((phi_minerals[key]*mineralogy[key]["rho"])/rho_s, n_digits)
746
+
747
+ if self.fluid == "water":
748
+ data_fluid = self.data_water
749
+
750
+ old_index = elements_list.index("O")
751
+ elements_list += [elements_list.pop(old_index)]
752
+
753
+ w_elements_total = 0.0
754
+ for element in elements_list:
755
+ if element != "O":
756
+ for mineral, w_mineral in w_minerals.items():
757
+ if element in mineralogy[mineral]["chemistry"]:
758
+ if element == "U":
759
+ n_digits = 4
760
+ else:
761
+ n_digits = 4
762
+
763
+ value = round(w_mineral*mineralogy[mineral]["chemistry"][element], n_digits)
764
+ w_elements[element] += value
765
+ w_elements_total += value
766
+ w_elements[element] = round(w_elements[element], n_digits)
767
+ elif element == "O":
768
+ w_elements[element] += round(1 - w_elements_total, 4)
769
+ w_elements[element] = round(w_elements[element], 4)
770
+
771
+ total_w_minerals = round(sum(w_minerals.values()), 4)
772
+ total_w_elements = round(sum(w_elements.values()), 4)
773
+ if total_w_minerals == 1.0 and total_w_elements == 1.0:
774
+ for key, value in w_minerals.items():
775
+ w_minerals[key] = abs(value)
776
+ for key, value in w_elements.items():
777
+ w_elements[key] = abs(value)
778
+ condition = True
779
+
780
+ velocity_solid = {"vP": 0, "vS": 0}
781
+ gamma_ray = 0.0
782
+ photoelectricity = 0.0
783
+ for key, value in phi_minerals.items():
784
+ velocity_solid["vP"] += phi_minerals[key]*mineralogy[key]["vP"]
785
+ velocity_solid["vS"] += phi_minerals[key]*mineralogy[key]["vS"]
786
+ gamma_ray += phi_minerals[key]*mineralogy[key]["GR"]
787
+ photoelectricity += phi_minerals[key]*mineralogy[key]["PE"]
788
+
789
+ ## Bulk Density, Porosity, Seismic Velocities
790
+ rho_solid = round(rho_s, 3)
791
+ vP, vS, vPvS, rho, var_porosity = SeismicVelocities(
792
+ rho_solid=rho_solid, rho_fluid=self.data_water[2]).calculate_seismic_velocities(
793
+ rho_limits=[2500, 4000], vP_limits=[3000, 5000], vS_limits=[1500, 3000], delta=0.05,
794
+ porosity=self.porosity)
795
+ phi_neutron = round((1900/rho)*0.15, 4)
796
+ ## Elastic Parameters
797
+ bulk_modulus, shear_modulus, youngs_modulus, poisson_ratio = SeismicVelocities(
798
+ rho_solid=None, rho_fluid=None).calculate_elastic_properties(
799
+ rho=rho, vP=vP, vS=vS)
800
+ ## Gamma Ray
801
+ gamma_ray = round(gamma_ray, 3)
802
+ ## Photoelectricity
803
+ photoelectricity = round(photoelectricity, 3)
804
+ # Composition data
805
+ for key, value in w_minerals.items():
806
+ results_container["mineralogy"][key].append(value)
807
+
808
+ amounts = []
809
+ for key, value in w_elements.items():
810
+ results_container["chemistry"][key].append(value)
811
+ chem_data = PeriodicSystem(name=key).get_data()
812
+ amounts.append([key, chem_data[1], value])
813
+
814
+ list_elements = list(w_elements.keys())
815
+ list_oxides = OxideCompounds(var_list_elements=list_elements).find_oxides()
816
+ composition_oxides = {}
817
+ for var_oxide in list_oxides:
818
+ oxide_data = OxideCompounds(var_compound=var_oxide, var_amounts=amounts).get_composition()
819
+ composition_oxides[var_oxide] = round(oxide_data["Oxide"][1], 4)
820
+
821
+ if list_oxides[0] not in results_container["compounds"]:
822
+ for oxide in list_oxides:
823
+ results_container["compounds"][oxide] = []
824
+
825
+ for key, value in composition_oxides.items():
826
+ results_container["compounds"][key].append(value)
827
+ # Results
828
+ results_container["phi"].append(phi_neutron)
829
+ results_container["phi_true"].append(var_porosity)
830
+ results_container["rho_s"].append(rho_s)
831
+ results_container["rho"].append(rho)
832
+ results_container["vP"].append(vP)
833
+ results_container["vS"].append(vS)
834
+ results_container["vP/vS"].append(vPvS)
835
+ results_container["K"].append(bulk_modulus)
836
+ results_container["G"].append(shear_modulus)
837
+ results_container["E"].append(youngs_modulus)
838
+ results_container["nu"].append(poisson_ratio)
839
+ results_container["GR"].append(gamma_ray)
840
+ results_container["PE"].append(photoelectricity)
841
+ n += 1
842
+
843
+ return results_container
844
+
845
+ class Ores:
846
+ #
847
+ def __init__(self, fluid, actualThickness, porosity=None, data_type=False):
848
+ self.fluid = fluid
849
+ self.actualThickness = actualThickness
850
+ self.porosity = porosity
851
+ self.data_type = data_type
852
+ self.data_water = Water.water("")
853
+ #
854
+ def create_kupferschiefer(self, w_Cu=None, amounts=None):
855
+ #
856
+ results = {}
857
+ results["rock"] = "Kupferschiefer"
858
+ #
859
+ self.w_Cu = w_Cu
860
+ self.amounts = amounts
861
+ #
862
+ # Mineralogy
863
+ quartz = Oxides(data_type=True).create_quartz()
864
+ calcite = Carbonates(data_type=True).create_calcite()
865
+ pyrite = Sulfides(impurity="pure", data_type=True).create_pyrite()
866
+ chalcopyrite = Sulfides(impurity="pure", data_type=True).create_chalcopyrite()
867
+ galena = Sulfides(impurity="pure", data_type=True).create_galena()
868
+ bornite = Sulfides(impurity="pure", data_type=True).create_bornite()
869
+ sphalerite = Sulfides(impurity="pure", data_type=True).create_sphalerite()
870
+ chalcocite = Sulfides(impurity="pure", data_type=True).create_chalcocite()
871
+ covellite = Sulfides(impurity="pure", data_type=True).create_covellite()
872
+ digenite = Sulfides(impurity="pure", data_type=True).create_digenite()
873
+ illite = Pyllosilicates(impurity="pure", dict=True).create_illite()
874
+ kaolinite = Pyllosilicates(impurity="pure", dict=True).create_kaolinite()
875
+ montmorillonite = Pyllosilicates(impurity="pure", dict=True).create_montmorillonite()
876
+ #
877
+ mineralogy = [illite, kaolinite, montmorillonite, quartz, calcite, chalcopyrite, bornite, chalcocite, covellite,
878
+ digenite, galena, sphalerite, pyrite]
879
+ #
880
+ water = fluids.Water.water("")
881
+ #
882
+ data = []
883
+ #
884
+ cond = False
885
+ composition = []
886
+ while cond == False:
887
+ if self.w_Cu == None and self.amounts == None:
888
+ w_clay = round(rd.uniform(0.4, 0.6), 4)
889
+ w_ore = round(rd.uniform(0.4, (1-w_clay)), 4)
890
+ w_misc = round(rd.uniform(0.0, (1-w_clay-w_ore)), 4)
891
+ #
892
+ w_ilt = round(w_clay*rd.uniform(0.5, 1), 4)
893
+ w_kln = round(w_clay*rd.uniform(0, (1-w_ilt)), 4)
894
+ w_mnt = round(w_clay-w_ilt-w_kln, 4)
895
+ #
896
+ magicnumber = rd.randint(1, 7)
897
+ if magicnumber == 1:
898
+ w_cv = round(w_ore*rd.uniform(0.5, 1), 4)
899
+ w_bn = round(w_ore*rd.uniform(0, (1-w_cv)), 4)
900
+ w_cc = round(w_ore*rd.uniform(0, (1-w_cv-w_bn)), 4)
901
+ w_ccp = round(w_ore*rd.uniform(0, (1-w_cv-w_bn-w_cc)), 4)
902
+ w_dg = round(w_ore-w_cv-w_bn-w_cc-w_ccp, 4)
903
+ #
904
+ w_gn = 0.0
905
+ w_py = 0.0
906
+ w_sp = 0.0
907
+ elif magicnumber == 2:
908
+ w_bn = round(w_ore*rd.uniform(0.5, 1), 4)
909
+ w_ccp = round(w_ore*rd.uniform(0, (1-w_bn)), 4)
910
+ w_sp = round(w_ore*rd.uniform(0, (1-w_bn-w_ccp)), 4)
911
+ w_dg = round(w_ore-w_bn-w_ccp-w_sp, 4)
912
+ #
913
+ w_cv = 0.0
914
+ w_cc = 0.0
915
+ w_gn = 0.0
916
+ w_py = 0.0
917
+ w_dg = 0.0
918
+ elif magicnumber == 3:
919
+ w_cc = round(w_ore*rd.uniform(0.5, 1), 4)
920
+ w_gn = round(w_ore*rd.uniform(0, (1-w_cc)), 4)
921
+ w_sp = round(w_ore-w_cc-w_gn, 4)
922
+ #
923
+ w_cv = 0.0
924
+ w_bn = 0.0
925
+ w_ccp = 0.0
926
+ w_py = 0.0
927
+ w_dg = 0.0
928
+ elif magicnumber == 4:
929
+ w_gn = round(w_ore*rd.uniform(0.33, 0.67), 4)
930
+ w_ccp = round(w_ore*rd.uniform(0.05, (1-w_gn)), 4)
931
+ w_py = round(w_ore*rd.uniform(0, (1-w_gn-w_ccp)), 4)
932
+ w_sp = round(w_ore-w_gn-w_ccp-w_py, 4)
933
+ #
934
+ w_cv = 0.0
935
+ w_bn = 0.0
936
+ w_cc = 0.0
937
+ w_dg = 0.0
938
+ elif magicnumber == 5:
939
+ w_py = round(w_ore*rd.uniform(0.33, 0.67), 4)
940
+ w_gn = round(w_ore*rd.uniform(0, (1-w_py)), 4)
941
+ w_sp = round(w_ore*rd.uniform(0, (1-w_py-w_gn)), 4)
942
+ w_ccp = round(w_ore-w_py-w_gn-w_sp, 4)
943
+ #
944
+ w_cv = 0.0
945
+ w_bn = 0.0
946
+ w_cc = 0.0
947
+ w_dg = 0.0
948
+ elif magicnumber == 6:
949
+ w_sp = round(w_ore*rd.uniform(0.33, 0.67), 4)
950
+ w_ccp = round(w_ore*rd.uniform(0.05, (1-w_sp)), 4)
951
+ w_gn = round(w_ore*rd.uniform(0, (1-w_sp-w_ccp)), 4)
952
+ w_py = round(w_ore-w_sp-w_ccp-w_gn, 4)
953
+ #
954
+ w_cv = 0.0
955
+ w_bn = 0.0
956
+ w_cc = 0.0
957
+ w_dg = 0.0
958
+ elif magicnumber == 7:
959
+ w_dg = round(w_ore*rd.uniform(0.5, 1), 4)
960
+ w_cv = round(w_ore*rd.uniform(0, (1-w_dg)), 4)
961
+ w_bn = round(w_ore*rd.uniform(0, (1-w_dg-w_cv)), 4)
962
+ w_cc = round(w_ore*rd.uniform(0, (1-w_dg-w_cv-w_bn)), 4)
963
+ w_ccp = round(w_ore-w_dg-w_cv-w_bn-w_cc, 4)
964
+ #
965
+ w_gn = 0.0
966
+ w_py = 0.0
967
+ w_sp = 0.0
968
+ #
969
+ w_qz = round(w_misc*rd.uniform(0, 1), 4)
970
+ w_cal = round(1 - w_clay - w_ore - w_qz, 4)
971
+ elif self.w_Cu != None:
972
+ w_clay = round(rd.uniform(0.33, 0.67), 4)
973
+ w_ore = round(rd.uniform(0.33, (1-w_clay)), 4)
974
+ w_misc = round(rd.uniform(0.0, (1-w_clay-w_ore)), 4)
975
+ #
976
+ w_ilt = round(w_clay*rd.uniform(0, 1), 4)
977
+ w_kln = round(w_clay*rd.uniform(0, (1-w_ilt)), 4)
978
+ w_mnt = round(w_clay-w_ilt-w_kln, 4)
979
+ #
980
+ w_cv = round(w_ore*rd.uniform(0, 1), 4)
981
+ w_bn = round(w_ore*rd.uniform(0, (1-w_cv)), 4)
982
+ w_cc = round(w_ore*rd.uniform(0, (1-w_cv-w_bn)), 4)
983
+ w_ccp = round(w_ore*rd.uniform(0, (1-w_cv-w_bn-w_cc)), 4)
984
+ w_gn = round(w_ore*rd.uniform(0, (1-w_cv-w_bn-w_cc-w_ccp)), 4)
985
+ w_py = round(w_ore*rd.uniform(0, (1-w_cv-w_bn-w_cc-w_ccp-w_gn)), 4)
986
+ w_dg = round(w_ore*rd.uniform(0, (1-w_cv-w_bn-w_cc-w_ccp-w_gn-w_py)), 4)
987
+ w_sp = round(w_ore-w_cv-w_bn-w_cc-w_ccp-w_gn-w_py-w_dg, 4)
988
+ #
989
+ w_qz = round(w_misc*rd.uniform(0, 1), 4)
990
+ w_cal = 1 - w_clay - w_ore - w_qz
991
+ elif type(self.amounts) is list:
992
+ w_hl = round(abs(np.random.normal(self.amounts[0], 0.025)), 4)
993
+ w_anh = round(abs(np.random.normal(self.amounts[1], 0.025)), 4)
994
+ w_gp = round(abs(np.random.normal(self.amounts[2], 0.025)), 4)
995
+ w_syl = round(1-w_hl-w_anh-w_gp, 4)
996
+ #
997
+ if w_ilt >= 0.0 and w_kln >= 0.0 and w_mnt >= 0.0 and w_cv >= 0.0 and w_bn >= 0.0 and w_cc >= 0.0 \
998
+ and w_ccp >= 0.0 and w_gn >= 0.0 and w_py >= 0.0 and w_dg >= 0.0 and w_sp >= 0.0 and w_qz >= 0.0 \
999
+ and w_cal >= 0.0:
1000
+ sumMin = round(w_ilt + w_kln + w_mnt + w_cv + w_bn + w_cc + w_ccp + w_gn + w_py + w_dg + w_sp + w_qz + w_cal, 4)
1001
+ else:
1002
+ sumMin = 0
1003
+ #
1004
+ w_H = round(w_ilt*illite["chemistry"]["H"] + w_kln*kaolinite["chemistry"]["H"] + w_mnt*montmorillonite["chemistry"]["H"], 4)
1005
+ w_C = round(w_cal*calcite["chemistry"]["C"], 4)
1006
+ w_Na = round(w_mnt*montmorillonite["chemistry"]["Na"], 4)
1007
+ w_Mg = round(w_ilt*illite["chemistry"]["Mg"] + w_mnt*montmorillonite["chemistry"]["Mg"], 4)
1008
+ w_Al = round(w_ilt*illite["chemistry"]["Al"] + w_kln*kaolinite["chemistry"]["Al"] + w_mnt*montmorillonite["chemistry"]["Al"], 4)
1009
+ w_Si = round(w_ilt*illite["chemistry"]["Si"] + w_kln*kaolinite["chemistry"]["Si"] + w_mnt*montmorillonite["chemistry"]["Si"] + w_qz*quartz["chemistry"]["Si"], 4)
1010
+ w_S = round(w_cv*covellite["chemistry"]["S"] + w_bn*bornite["chemistry"]["S"] + w_cc*chalcocite["chemistry"]["S"] + w_ccp*chalcopyrite["chemistry"]["S"] + w_gn*galena["chemistry"]["S"] + w_py*pyrite["chemistry"]["S"] + w_sp*sphalerite["chemistry"]["S"] + w_dg*digenite["chemistry"]["S"], 4)
1011
+ w_K = round(w_ilt*illite["chemistry"]["K"], 4)
1012
+ w_Ca = round(w_mnt*montmorillonite["chemistry"]["Ca"] + w_cal*calcite["chemistry"]["Ca"], 4)
1013
+ w_Fe = round(w_ilt*illite["chemistry"]["Fe"] + w_bn*bornite["chemistry"]["Fe"] + w_ccp*chalcopyrite["chemistry"]["Fe"] + w_py*pyrite["chemistry"]["Fe"], 4)
1014
+ w_Cu = round(w_cv*covellite["chemistry"]["Cu"] + w_bn*bornite["chemistry"]["Cu"] + w_cc*chalcocite["chemistry"]["Cu"] + w_ccp*chalcopyrite["chemistry"]["Cu"] + w_dg*digenite["chemistry"]["Cu"], 4)
1015
+ w_Zn = round(w_sp*sphalerite["chemistry"]["Zn"], 4)
1016
+ w_Pb = round(w_gn*galena["chemistry"]["Pb"], 4)
1017
+ w_O = round(1 - w_H - w_C - w_Na - w_Mg - w_Al - w_Si - w_S - w_K - w_Ca - w_Fe - w_Cu - w_Zn - w_Pb, 4)
1018
+ sumConc = round(w_H + w_C + w_O + w_Na + w_Mg + w_Al + w_Si + w_S + w_K + w_Ca + w_Fe + w_Cu + w_Zn + w_Pb, 4)
1019
+ #print("Amount:", sumMin, "C:", sumConc)
1020
+ #
1021
+ if sumMin == 1 and sumConc == 1:
1022
+ cond = True
1023
+ composition.extend((["Ilt", "Kln", "Mnt", "Qz", "Cal", "Ccp", "Bn", "Cc", "Cv", "Dg", "Gn", "Sp", "Py"]))
1024
+ concentrations = [w_H, w_C, w_O, w_Na, w_Mg, w_Al, w_Si, w_S, w_K, w_Ca, w_Fe, w_Cu, w_Zn, w_Pb]
1025
+ amounts = [w_ilt, w_kln, w_mnt, w_qz, w_cal, w_ccp, w_bn, w_cc, w_cv, w_dg, w_gn, w_sp, w_py]
1026
+ else:
1027
+ cond = False
1028
+ #
1029
+ element_list = ["H", "C", "O", "Na", "Mg", "Al", "Si", "S", "K", "Ca", "Fe", "Cu", "Zn", "Pb"]
1030
+ mineral_list = ["Ilt", "Kln", "Mnt", "Qz", "Cal", "Ccp", "Bn", "Cc", "Cv", "Dg", "Gn", "Sp", "Py"]
1031
+ data.append(composition)
1032
+ results["chemistry"] = {}
1033
+ results["mineralogy"] = {}
1034
+ for index, element in enumerate(element_list, start=0):
1035
+ results["chemistry"][element] = concentrations[index]
1036
+ for index, mineral in enumerate(mineral_list, start=0):
1037
+ results["mineralogy"][mineral] = amounts[index]
1038
+ #
1039
+ rhoSolid = (w_ilt*illite["rho"] + w_kln*kaolinite["rho"] + w_mnt*montmorillonite["rho"] + w_qz*quartz["rho"]
1040
+ + w_cal*calcite["rho"] + w_ccp*chalcopyrite["rho"] + w_bn*bornite["rho"] + w_cc*chalcocite["rho"]
1041
+ + w_cv*covellite["rho"] + w_dg*digenite["rho"] + w_gn*galena["rho"] + w_sp*sphalerite["rho"]
1042
+ + w_py*pyrite["rho"]) / 1000
1043
+ X = [w_ilt, w_kln, w_mnt, w_qz, w_cal, w_ccp, w_bn, w_cc, w_cv, w_dg, w_gn, w_sp, w_py]
1044
+ K_list = [mineralogy[i]["K"] for i in range(len(mineralogy))]
1045
+ G_list = [mineralogy[i]["G"] for i in range(len(mineralogy))]
1046
+ K_geo = elast.calc_geometric_mean(self, X, K_list)
1047
+ G_geo = elast.calc_geometric_mean(self, X, G_list)
1048
+ K_solid = K_geo
1049
+ G_solid = G_geo
1050
+ vP_solid = np.sqrt((K_solid*10**9+4/3*G_solid*10**9)/(rhoSolid*10**3))
1051
+ vS_solid = np.sqrt((G_solid*10**9)/(rhoSolid*10**3))
1052
+ #
1053
+ if self.porosity == None:
1054
+ if self.actualThickness <= 1000:
1055
+ phi = rd.uniform(0.0, 0.1)
1056
+ elif self.actualThickness > 1000 and self.actualThickness <= 2000:
1057
+ phi = rd.uniform(0.0, 0.075)
1058
+ elif self.actualThickness > 2000 and self.actualThickness <= 3000:
1059
+ phi = rd.uniform(0.0, 0.05)
1060
+ elif self.actualThickness > 3000 and self.actualThickness <= 4000:
1061
+ phi = rd.uniform(0.0, 0.025)
1062
+ elif self.actualThickness > 4000:
1063
+ phi = rd.uniform(0.0, 0.0125)
1064
+ else:
1065
+ phi = self.porosity
1066
+ #
1067
+ results["phi"] = phi
1068
+ results["fluid"] = self.fluid
1069
+ #
1070
+ rho = (1 - phi) * rhoSolid + phi * water[2] / 1000
1071
+ vP = (1-phi)*vP_solid + phi*water[4][0]
1072
+ vS = (1 - phi) * vS_solid
1073
+ G_bulk = vS**2 * rho
1074
+ K_bulk = vP**2 * rho - 4/3*G_bulk
1075
+ E_bulk = (9*K_bulk*G_bulk)/(3*K_bulk+G_bulk)
1076
+ phiD = (rhoSolid - rho) / (rhoSolid - water[2] / 1000)
1077
+ phiN = (2 * phi ** 2 - phiD ** 2) ** (0.5)
1078
+ GR = w_ilt*illite["GR"] + w_kln*kaolinite["GR"] + w_mnt*montmorillonite["GR"] + w_qz*quartz["GR"] \
1079
+ + w_cal*calcite["GR"] + w_ccp*chalcopyrite["GR"] + w_bn*bornite["GR"] + w_cc*chalcocite["GR"] \
1080
+ + w_cv*covellite["GR"] + w_dg*digenite["GR"] + w_gn*galena["GR"] + w_sp*sphalerite["GR"] + w_py*pyrite["GR"]
1081
+ PE = w_ilt*illite["PE"] + w_kln*kaolinite["PE"] + w_mnt*montmorillonite["PE"] + w_qz*quartz["PE"] \
1082
+ + w_cal*calcite["PE"] + w_ccp*chalcopyrite["PE"] + w_bn*bornite["PE"] + w_cc*chalcocite["PE"] \
1083
+ + w_cv*covellite["PE"] + w_dg*digenite["PE"] + w_gn*galena["PE"] + w_sp*sphalerite["PE"] + w_py*pyrite["PE"]
1084
+ poisson_seismic = 0.5*(vP**2 - 2*vS**2)/(vP**2 - vS**2)
1085
+ poisson_elastic = (3*K_bulk - 2*G_bulk)/(6*K_bulk + 2*G_bulk)
1086
+ poisson_mineralogical = w_ilt*illite["nu"] + w_kln*kaolinite["nu"] + w_mnt*montmorillonite["nu"] + w_qz*quartz["nu"] \
1087
+ + w_cal*calcite["nu"] + w_ccp*chalcopyrite["nu"] + w_bn*bornite["nu"] + w_cc*chalcocite["nu"] \
1088
+ + w_cv*covellite["nu"] + w_dg*digenite["nu"] + w_gn*galena["nu"] + w_sp*sphalerite["nu"] + w_py*pyrite["nu"]
1089
+ #
1090
+ if self.data_type == False:
1091
+ #
1092
+ data.append([round(rho, 3), round(rhoSolid, 3), round(water[2] / 1000, 6)])
1093
+ data.append([round(K_bulk*10**(-6), 2), round(G_bulk*10**(-6), 2), round(E_bulk*10**(-6), 2), round(poisson_mineralogical, 3)])
1094
+ data.append([round(vP, 2), round(vS, 2), round(vP_solid, 2), round(water[4][0], 2)])
1095
+ data.append([round(phi, 3), round(phiD, 3), round(phiN, 3)])
1096
+ data.append("water")
1097
+ data.append([round(GR, 3), round(PE, 3)])
1098
+ data.append(concentrations)
1099
+ data.append(amounts)
1100
+ #
1101
+ return data
1102
+ else:
1103
+ #
1104
+ results["rho"] = round(rho*1000, 4)
1105
+ results["rho_s"] = round(rhoSolid*1000, 4)
1106
+ results["vP"] = round(vP, 4)
1107
+ results["vS"] = round(vS, 4)
1108
+ results["vP/vS"] = round(vP/vS, 4)
1109
+ results["G"] = round(G_bulk*10**(-6), 4)
1110
+ results["K"] = round(K_bulk*10**(-6), 4)
1111
+ results["E"] = round(E_bulk*10**(-6), 4)
1112
+ results["nu"] = round(poisson_mineralogical, 4)
1113
+ results["GR"] = round(GR, 4)
1114
+ results["PE"] = round(PE, 4)
1115
+ #
1116
+ return results
1117
+ #
1118
+ def create_compact_hematite_ore(self, number, porosity=None):
1119
+ #
1120
+ data_quartz = Oxides(impurity="pure", data_type=True).create_quartz() # fixed
1121
+ data_hematite = Oxides(impurity="pure", data_type=True).create_hematite() # fixed
1122
+ data_magnetite = Oxides(impurity="pure", data_type=True).create_magnetite() # fixed
1123
+ data_pyrite = Sulfides(impurity="pure", data_type=True).create_pyrite() # fixed
1124
+ data_rutile = Oxides(impurity="pure", data_type=True).create_rutile() # fixed
1125
+ #
1126
+ assemblage_minerals = [data_quartz, data_hematite, data_magnetite, data_pyrite, data_rutile]
1127
+ #
1128
+ amounts_mineralogy = {}
1129
+ amounts_chemistry = {}
1130
+ bulk_properties = {}
1131
+ properties = ["rho_s", "rho", "K", "G", "E", "nu", "vP", "vS", "vPvS", "GR", "PE", "phi"]
1132
+ for property in properties:
1133
+ bulk_properties[property] = []
1134
+ mineral_list = []
1135
+ elements = []
1136
+ for mineral in assemblage_minerals:
1137
+ amounts_mineralogy[mineral["mineral"]] = []
1138
+ mineral_list.append(mineral["mineral"])
1139
+ elements_mineral = list(mineral["chemistry"].keys())
1140
+ for element in elements_mineral:
1141
+ if element not in elements:
1142
+ elements.append(element)
1143
+ amounts_chemistry[element] = []
1144
+ mineral_list.sort()
1145
+ elements.sort()
1146
+ #
1147
+ n = 0
1148
+ amounts_helper = []
1149
+ while n < number:
1150
+ w_total = 0
1151
+ n_minerals = 0
1152
+ for mineral in mineral_list:
1153
+ if mineral == "Qz":
1154
+ if n_minerals < len(mineral_list)-1:
1155
+ value = round(rd.uniform(0.10, 0.35), 4)
1156
+ else:
1157
+ value = round(1-w_total, 4)
1158
+ if value >= 0.0 and 0.10 <= value <= 0.35:
1159
+ amounts_helper.append(value)
1160
+ w_total += value
1161
+ n_minerals += 1
1162
+ elif mineral == "Hem":
1163
+ if n_minerals < len(mineral_list)-1:
1164
+ value = round(rd.uniform(0.45, 0.80), 4)
1165
+ else:
1166
+ value = round(1-w_total, 4)
1167
+ if value >= 0.0 and 0.45 <= value <= 0.80:
1168
+ amounts_helper.append(value)
1169
+ w_total += value
1170
+ n_minerals += 1
1171
+ elif mineral == "Mag":
1172
+ if n_minerals < len(mineral_list)-1:
1173
+ value = round(rd.uniform(0.10, 0.20), 4)
1174
+ else:
1175
+ value = round(1-w_total, 4)
1176
+ if value >= 0.0 and 0.10 <= value <= 0.20:
1177
+ amounts_helper.append(value)
1178
+ w_total += value
1179
+ n_minerals += 1
1180
+ elif mineral == "Py":
1181
+ if n_minerals < len(mineral_list)-1:
1182
+ value = round(rd.uniform(0.0, 0.10), 4)
1183
+ else:
1184
+ value = round(1-w_total, 4)
1185
+ if value >= 0.0 and 0.0 <= value <= 0.10:
1186
+ amounts_helper.append(value)
1187
+ w_total += value
1188
+ n_minerals += 1
1189
+ elif mineral == "Rt":
1190
+ if n_minerals < len(mineral_list)-1:
1191
+ value = round(1-w_total, 4)
1192
+ else:
1193
+ value = round(1-w_total, 4)
1194
+ if value >= 0.0 and 0.0 <= value <= 0.05:
1195
+ amounts_helper.append(value)
1196
+ w_total += value
1197
+ n_minerals += 1
1198
+ #
1199
+ if np.sum(amounts_helper) == 1.0 and n_minerals == len(mineral_list):
1200
+ for index, mineral in enumerate(mineral_list):
1201
+ amounts_mineralogy[mineral].append(amounts_helper[index])
1202
+ n += 1
1203
+ amounts_helper.clear()
1204
+ else:
1205
+ n += 0
1206
+ amounts_helper.clear()
1207
+ #
1208
+ n = 0
1209
+ amounts_helper = {}
1210
+ while n < number:
1211
+ amounts_helper.clear()
1212
+ w_total = 0
1213
+ n_elements = 0
1214
+ rho_s_helper = 0
1215
+ bulkmod_helper = 0
1216
+ shearmod_helper = 0
1217
+ gr_helper = 0
1218
+ pe_helper = 0
1219
+ if porosity == None:
1220
+ phi_helper = round(rd.uniform(0.0, 0.05), 4)
1221
+ else:
1222
+ phi_helper = porosity
1223
+ #
1224
+ for element in elements:
1225
+ amounts_helper[element] = 0
1226
+ if element in data_quartz["chemistry"]:
1227
+ if n_elements < len(elements)-1:
1228
+ value = amounts_mineralogy["Qz"][n]*data_quartz["chemistry"][element]
1229
+ else:
1230
+ value = 1-w_total
1231
+ amounts_helper[element] += round(value, 4)
1232
+ w_total += round(value, 4)
1233
+ if element in data_hematite["chemistry"]:
1234
+ if n_elements < len(elements)-1:
1235
+ value = amounts_mineralogy["Hem"][n]*data_hematite["chemistry"][element]
1236
+ else:
1237
+ value = 1-w_total
1238
+ amounts_helper[element] += round(value, 4)
1239
+ w_total += round(value, 4)
1240
+ if element in data_magnetite["chemistry"]:
1241
+ if n_elements < len(elements)-1:
1242
+ value = amounts_mineralogy["Mag"][n]*data_magnetite["chemistry"][element]
1243
+ else:
1244
+ value = 1-w_total
1245
+ amounts_helper[element] += round(value, 4)
1246
+ w_total += round(value, 4)
1247
+ if element in data_pyrite["chemistry"]:
1248
+ if n_elements < len(elements)-1:
1249
+ value = amounts_mineralogy["Py"][n]*data_pyrite["chemistry"][element]
1250
+ else:
1251
+ value = 1-w_total
1252
+ amounts_helper[element] += round(value, 4)
1253
+ w_total += round(value, 4)
1254
+ if element in data_rutile["chemistry"]:
1255
+ if n_elements < len(elements)-1:
1256
+ value = amounts_mineralogy["Rt"][n]*data_rutile["chemistry"][element]
1257
+ else:
1258
+ value = 1-w_total
1259
+ amounts_helper[element] += round(value, 4)
1260
+ w_total += round(value, 4)
1261
+ #
1262
+ n_elements += 1
1263
+ #
1264
+ value_total = 0
1265
+ for element, value in amounts_helper.items():
1266
+ amounts_helper[element] = round(value, 4)
1267
+ value_total += int(round(amounts_helper[element]*10000, 4))
1268
+ value_total = int(value_total)
1269
+ if value_total == 10000:
1270
+ condition_sum = True
1271
+ else:
1272
+ condition_sum = False
1273
+ if sum(amounts_helper.values()) == 1.0 or condition_sum == True or w_total == 1.0:
1274
+ for key, value in amounts_helper.items():
1275
+ amounts_chemistry[key].append(round(value, 4))
1276
+ for mineral in mineral_list:
1277
+ if mineral == "Qz":
1278
+ rho_s_helper += round(amounts_mineralogy[mineral][n]*data_quartz["rho"], 3)
1279
+ bulkmod_helper += round(amounts_mineralogy[mineral][n]*data_quartz["K"], 3)
1280
+ shearmod_helper += round(0.67*amounts_mineralogy[mineral][n]*data_quartz["G"], 3)
1281
+ gr_helper += round(amounts_mineralogy[mineral][n]*data_quartz["GR"], 3)
1282
+ pe_helper += round(amounts_mineralogy[mineral][n]*data_quartz["PE"], 3)
1283
+ elif mineral == "Hem":
1284
+ rho_s_helper += round(amounts_mineralogy[mineral][n]*data_hematite["rho"], 3)
1285
+ bulkmod_helper += round(amounts_mineralogy[mineral][n]*data_hematite["K"], 3)
1286
+ shearmod_helper += round(0.67*amounts_mineralogy[mineral][n]*data_hematite["G"], 3)
1287
+ gr_helper += round(amounts_mineralogy[mineral][n]*data_hematite["GR"], 3)
1288
+ pe_helper += round(amounts_mineralogy[mineral][n]*data_hematite["PE"], 3)
1289
+ elif mineral == "Mag":
1290
+ rho_s_helper += round(amounts_mineralogy[mineral][n]*data_magnetite["rho"], 3)
1291
+ bulkmod_helper += round(amounts_mineralogy[mineral][n]*data_magnetite["K"], 3)
1292
+ shearmod_helper += round(0.67*amounts_mineralogy[mineral][n]*data_magnetite["G"], 3)
1293
+ gr_helper += round(amounts_mineralogy[mineral][n]*data_magnetite["GR"], 3)
1294
+ pe_helper += round(amounts_mineralogy[mineral][n]*data_magnetite["PE"], 3)
1295
+ elif mineral == "Py":
1296
+ rho_s_helper += round(amounts_mineralogy[mineral][n]*data_pyrite["rho"], 3)
1297
+ bulkmod_helper += round(amounts_mineralogy[mineral][n]*data_pyrite["K"], 3)
1298
+ shearmod_helper += round(0.67*amounts_mineralogy[mineral][n]*data_pyrite["G"], 3)
1299
+ gr_helper += round(amounts_mineralogy[mineral][n]*data_pyrite["GR"], 3)
1300
+ pe_helper += round(amounts_mineralogy[mineral][n]*data_pyrite["PE"], 3)
1301
+ elif mineral == "Rt":
1302
+ rho_s_helper += round(amounts_mineralogy[mineral][n]*data_rutile["rho"], 3)
1303
+ bulkmod_helper += round(amounts_mineralogy[mineral][n]*data_rutile["K"], 3)
1304
+ shearmod_helper += round(0.67*amounts_mineralogy[mineral][n]*data_rutile["G"], 3)
1305
+ gr_helper += round(amounts_mineralogy[mineral][n]*data_rutile["GR"], 3)
1306
+ pe_helper += round(amounts_mineralogy[mineral][n]*data_rutile["PE"], 3)
1307
+ #
1308
+ rho_helper = round((1-phi_helper)*rho_s_helper + phi_helper*self.data_water[2]/1000, 3)
1309
+ youngsmod_helper = round((9*bulkmod_helper*shearmod_helper)/(3*bulkmod_helper + shearmod_helper), 3)
1310
+ poisson_helper = round((3*bulkmod_helper - 2*shearmod_helper)/(6*bulkmod_helper + 2*shearmod_helper), 3)
1311
+ vP_helper = round(((bulkmod_helper*10**9 + 4/3*shearmod_helper*10**9)/(rho_helper))**0.5, 3)
1312
+ vS_helper = round(((shearmod_helper*10**9)/(rho_helper))**0.5, 3)
1313
+ vPvS_helper_helper = round(vP_helper/vS_helper, 3)
1314
+ #
1315
+ bulk_properties["rho_s"].append(round(rho_s_helper, 3))
1316
+ bulk_properties["rho"].append(rho_helper)
1317
+ bulk_properties["K"].append(round(bulkmod_helper, 3))
1318
+ bulk_properties["G"].append(round(shearmod_helper, 3))
1319
+ bulk_properties["E"].append(youngsmod_helper)
1320
+ bulk_properties["nu"].append(poisson_helper)
1321
+ bulk_properties["vP"].append(vP_helper)
1322
+ bulk_properties["vS"].append(vS_helper)
1323
+ bulk_properties["vPvS"].append(vPvS_helper_helper)
1324
+ bulk_properties["GR"].append(round(gr_helper, 3))
1325
+ bulk_properties["PE"].append(round(pe_helper, 3))
1326
+ bulk_properties["phi"].append(round(phi_helper, 3))
1327
+ n += 1
1328
+ #else:
1329
+ # break
1330
+ #
1331
+ results = {}
1332
+ results["rock"] = "Compact Hematite Ore"
1333
+ if number > 1:
1334
+ results["mineralogy"] = amounts_mineralogy
1335
+ results["chemistry"] = amounts_chemistry
1336
+ results["phi"] = bulk_properties["phi"]
1337
+ results["fluid"] = "water"
1338
+ results["rho_s"] = bulk_properties["rho_s"]
1339
+ results["rho"] = bulk_properties["rho"]
1340
+ results["vP"] = bulk_properties["vP"]
1341
+ results["vS"] = bulk_properties["vS"]
1342
+ results["vP/vS"] = bulk_properties["vPvS"]
1343
+ results["K"] = bulk_properties["K"]
1344
+ results["G"] = bulk_properties["G"]
1345
+ results["E"] = bulk_properties["E"]
1346
+ results["nu"] = bulk_properties["nu"]
1347
+ results["GR"] = bulk_properties["GR"]
1348
+ results["PE"] = bulk_properties["PE"]
1349
+ else:
1350
+ single_amounts_mineralogy = {}
1351
+ single_amounts_chemistry = {}
1352
+ for mineral, value in amounts_mineralogy.items():
1353
+ single_amounts_mineralogy[mineral] = value[0]
1354
+ for element, value in amounts_chemistry.items():
1355
+ single_amounts_chemistry[element] = value[0]
1356
+ results["mineralogy"] = single_amounts_mineralogy
1357
+ results["chemistry"] = single_amounts_chemistry
1358
+ results["phi"] = bulk_properties["phi"][0]
1359
+ results["fluid"] = "water"
1360
+ results["rho_s"] = bulk_properties["rho_s"][0]
1361
+ results["rho"] = bulk_properties["rho"][0]
1362
+ results["vP"] = bulk_properties["vP"][0]
1363
+ results["vS"] = bulk_properties["vS"][0]
1364
+ results["vP/vS"] = bulk_properties["vPvS"][0]
1365
+ results["K"] = bulk_properties["K"][0]
1366
+ results["G"] = bulk_properties["G"][0]
1367
+ results["E"] = bulk_properties["E"][0]
1368
+ results["nu"] = bulk_properties["nu"][0]
1369
+ results["GR"] = bulk_properties["GR"][0]
1370
+ results["PE"] = bulk_properties["PE"][0]
1371
+ #
1372
+ return results
1373
+
1374
+ #
1375
+ def create_banded_iron_formation(self, number, porosity=None):
1376
+ #
1377
+ data_quartz = Oxides(impurity="pure", data_type=True).create_quartz() # fixed
1378
+ data_hematite = Oxides(impurity="pure", data_type=True).create_hematite() # fixed
1379
+ data_magnetite = Oxides(impurity="pure", data_type=True).create_magnetite() # fixed
1380
+ data_kaolinite = Phyllosilicates(impurity="pure", data_type=True).create_kaolinite() # fixed
1381
+ data_goethite = Oxides(impurity="pure", data_type=True).create_goethite() # fixed
1382
+ #
1383
+ assemblage_minerals = [data_quartz, data_hematite, data_magnetite, data_kaolinite, data_goethite]
1384
+ #
1385
+ amounts_mineralogy = {}
1386
+ amounts_chemistry = {}
1387
+ bulk_properties = {}
1388
+ properties = ["rho_s", "rho", "K", "G", "E", "nu", "vP", "vS", "vPvS", "GR", "PE", "phi"]
1389
+ for property in properties:
1390
+ bulk_properties[property] = []
1391
+ mineral_list = []
1392
+ elements = []
1393
+ for mineral in assemblage_minerals:
1394
+ amounts_mineralogy[mineral["mineral"]] = []
1395
+ mineral_list.append(mineral["mineral"])
1396
+ elements_mineral = list(mineral["chemistry"].keys())
1397
+ for element in elements_mineral:
1398
+ if element not in elements:
1399
+ elements.append(element)
1400
+ amounts_chemistry[element] = []
1401
+ mineral_list.sort()
1402
+ elements.sort()
1403
+ #
1404
+ n = 0
1405
+ amounts_helper = []
1406
+ while n < number:
1407
+ w_total = 0
1408
+ n_minerals = 0
1409
+ for mineral in mineral_list:
1410
+ if mineral == "Qz":
1411
+ if n_minerals < len(mineral_list) - 1:
1412
+ value = round(1 - w_total, 4)
1413
+ else:
1414
+ value = round(1 - w_total, 4)
1415
+ if value >= 0.0 and 0.10 <= value <= 0.35:
1416
+ amounts_helper.append(value)
1417
+ w_total += value
1418
+ n_minerals += 1
1419
+ elif mineral == "Hem":
1420
+ if n_minerals < len(mineral_list) - 1:
1421
+ value = round(rd.uniform(0.25, 0.70), 4)
1422
+ else:
1423
+ value = round(1 - w_total, 4)
1424
+ if value >= 0.0 and 0.25 <= value <= 0.70:
1425
+ amounts_helper.append(value)
1426
+ w_total += value
1427
+ n_minerals += 1
1428
+ elif mineral == "Mag":
1429
+ if n_minerals < len(mineral_list) - 1:
1430
+ value = round(rd.uniform(0.10, 0.25), 4)
1431
+ else:
1432
+ value = round(1 - w_total, 4)
1433
+ if value >= 0.0 and 0.10 <= value <= 0.15:
1434
+ amounts_helper.append(value)
1435
+ w_total += value
1436
+ n_minerals += 1
1437
+ elif mineral == "Kln":
1438
+ if n_minerals < len(mineral_list) - 1:
1439
+ value = round(rd.uniform(0.10, 0.25), 4)
1440
+ else:
1441
+ value = round(1 - w_total, 4)
1442
+ if value >= 0.0 and 0.10 <= value <= 0.25:
1443
+ amounts_helper.append(value)
1444
+ w_total += value
1445
+ n_minerals += 1
1446
+ elif mineral == "Goe":
1447
+ if n_minerals < len(mineral_list) - 1:
1448
+ value = round(rd.uniform(0.05, 0.25), 4)
1449
+ else:
1450
+ value = round(1 - w_total, 4)
1451
+ if value >= 0.0 and 0.05 <= value <= 0.25:
1452
+ amounts_helper.append(value)
1453
+ w_total += value
1454
+ n_minerals += 1
1455
+ #
1456
+ if np.sum(amounts_helper) == 1.0 and n_minerals == len(mineral_list):
1457
+ for index, mineral in enumerate(mineral_list):
1458
+ amounts_mineralogy[mineral].append(amounts_helper[index])
1459
+ n += 1
1460
+ amounts_helper.clear()
1461
+ else:
1462
+ n += 0
1463
+ amounts_helper.clear()
1464
+ #
1465
+ n = 0
1466
+ amounts_helper = {}
1467
+ while n < number:
1468
+ amounts_helper.clear()
1469
+ w_total = 0
1470
+ n_elements = 0
1471
+ rho_s_helper = 0
1472
+ bulkmod_helper = 0
1473
+ shearmod_helper = 0
1474
+ gr_helper = 0
1475
+ pe_helper = 0
1476
+ if porosity == None:
1477
+ phi_helper = round(rd.uniform(0.0, 0.05), 4)
1478
+ else:
1479
+ phi_helper = porosity
1480
+ #
1481
+ for element in elements:
1482
+ amounts_helper[element] = 0
1483
+ if element in data_quartz["chemistry"]:
1484
+ if n_elements < len(elements) - 1:
1485
+ value = amounts_mineralogy["Qz"][n] * data_quartz["chemistry"][element]
1486
+ else:
1487
+ value = 1 - w_total
1488
+ amounts_helper[element] += round(value, 4)
1489
+ w_total += round(value, 4)
1490
+ if element in data_hematite["chemistry"]:
1491
+ if n_elements < len(elements) - 1:
1492
+ value = amounts_mineralogy["Hem"][n] * data_hematite["chemistry"][element]
1493
+ else:
1494
+ value = 1 - w_total
1495
+ amounts_helper[element] += round(value, 4)
1496
+ w_total += round(value, 4)
1497
+ if element in data_magnetite["chemistry"]:
1498
+ if n_elements < len(elements) - 1:
1499
+ value = amounts_mineralogy["Mag"][n] * data_magnetite["chemistry"][element]
1500
+ else:
1501
+ value = 1 - w_total
1502
+ amounts_helper[element] += round(value, 4)
1503
+ w_total += round(value, 4)
1504
+ if element in data_kaolinite["chemistry"]:
1505
+ if n_elements < len(elements) - 1:
1506
+ value = amounts_mineralogy["Kln"][n] * data_kaolinite["chemistry"][element]
1507
+ else:
1508
+ value = 1 - w_total
1509
+ amounts_helper[element] += round(value, 4)
1510
+ w_total += round(value, 4)
1511
+ if element in data_goethite["chemistry"]:
1512
+ if n_elements < len(elements) - 1:
1513
+ value = amounts_mineralogy["Goe"][n] * data_goethite["chemistry"][element]
1514
+ else:
1515
+ value = 1 - w_total
1516
+ amounts_helper[element] += round(value, 4)
1517
+ w_total += round(value, 4)
1518
+ #
1519
+ n_elements += 1
1520
+ #
1521
+ value_total = 0
1522
+ for element, value in amounts_helper.items():
1523
+ amounts_helper[element] = round(value, 4)
1524
+ value_total += int(round(amounts_helper[element] * 10000, 4))
1525
+ value_total = int(value_total)
1526
+ if value_total == 10000:
1527
+ condition_sum = True
1528
+ else:
1529
+ condition_sum = False
1530
+ if sum(amounts_helper.values()) == 1.0 or condition_sum == True or w_total == 1.0:
1531
+ for key, value in amounts_helper.items():
1532
+ amounts_chemistry[key].append(round(value, 4))
1533
+ for mineral in mineral_list:
1534
+ if mineral == "Qz":
1535
+ rho_s_helper += round(amounts_mineralogy[mineral][n] * data_quartz["rho"], 3)
1536
+ bulkmod_helper += round(amounts_mineralogy[mineral][n] * data_quartz["K"], 3)
1537
+ shearmod_helper += round(0.67 * amounts_mineralogy[mineral][n] * data_quartz["G"], 3)
1538
+ gr_helper += round(amounts_mineralogy[mineral][n] * data_quartz["GR"], 3)
1539
+ pe_helper += round(amounts_mineralogy[mineral][n] * data_quartz["PE"], 3)
1540
+ elif mineral == "Hem":
1541
+ rho_s_helper += round(amounts_mineralogy[mineral][n] * data_hematite["rho"], 3)
1542
+ bulkmod_helper += round(amounts_mineralogy[mineral][n] * data_hematite["K"], 3)
1543
+ shearmod_helper += round(0.67 * amounts_mineralogy[mineral][n] * data_hematite["G"], 3)
1544
+ gr_helper += round(amounts_mineralogy[mineral][n] * data_hematite["GR"], 3)
1545
+ pe_helper += round(amounts_mineralogy[mineral][n] * data_hematite["PE"], 3)
1546
+ elif mineral == "Mag":
1547
+ rho_s_helper += round(amounts_mineralogy[mineral][n] * data_magnetite["rho"], 3)
1548
+ bulkmod_helper += round(amounts_mineralogy[mineral][n] * data_magnetite["K"], 3)
1549
+ shearmod_helper += round(0.67 * amounts_mineralogy[mineral][n] * data_magnetite["G"], 3)
1550
+ gr_helper += round(amounts_mineralogy[mineral][n] * data_magnetite["GR"], 3)
1551
+ pe_helper += round(amounts_mineralogy[mineral][n] * data_magnetite["PE"], 3)
1552
+ elif mineral == "Kln":
1553
+ rho_s_helper += round(amounts_mineralogy[mineral][n] * data_kaolinite["rho"], 3)
1554
+ bulkmod_helper += round(amounts_mineralogy[mineral][n] * data_kaolinite["K"], 3)
1555
+ shearmod_helper += round(0.67 * amounts_mineralogy[mineral][n] * data_kaolinite["G"], 3)
1556
+ gr_helper += round(amounts_mineralogy[mineral][n] * data_kaolinite["GR"], 3)
1557
+ pe_helper += round(amounts_mineralogy[mineral][n] * data_kaolinite["PE"], 3)
1558
+ elif mineral == "Goe":
1559
+ rho_s_helper += round(amounts_mineralogy[mineral][n] * data_goethite["rho"], 3)
1560
+ bulkmod_helper += round(amounts_mineralogy[mineral][n] * data_goethite["K"], 3)
1561
+ shearmod_helper += round(0.67 * amounts_mineralogy[mineral][n] * data_goethite["G"], 3)
1562
+ gr_helper += round(amounts_mineralogy[mineral][n] * data_goethite["GR"], 3)
1563
+ pe_helper += round(amounts_mineralogy[mineral][n] * data_goethite["PE"], 3)
1564
+ #
1565
+ rho_helper = round((1 - phi_helper) * rho_s_helper + phi_helper * self.data_water[2] / 1000, 3)
1566
+ youngsmod_helper = round(
1567
+ (9 * bulkmod_helper * shearmod_helper) / (3 * bulkmod_helper + shearmod_helper), 3)
1568
+ poisson_helper = round(
1569
+ (3 * bulkmod_helper - 2 * shearmod_helper) / (6 * bulkmod_helper + 2 * shearmod_helper), 3)
1570
+ vP_helper = round(
1571
+ ((bulkmod_helper * 10 ** 9 + 4 / 3 * shearmod_helper * 10 ** 9) / (rho_helper)) ** 0.5, 3)
1572
+ vS_helper = round(((shearmod_helper * 10 ** 9) / (rho_helper)) ** 0.5, 3)
1573
+ vPvS_helper_helper = round(vP_helper / vS_helper, 3)
1574
+ #
1575
+ bulk_properties["rho_s"].append(round(rho_s_helper, 3))
1576
+ bulk_properties["rho"].append(rho_helper)
1577
+ bulk_properties["K"].append(round(bulkmod_helper, 3))
1578
+ bulk_properties["G"].append(round(shearmod_helper, 3))
1579
+ bulk_properties["E"].append(youngsmod_helper)
1580
+ bulk_properties["nu"].append(poisson_helper)
1581
+ bulk_properties["vP"].append(vP_helper)
1582
+ bulk_properties["vS"].append(vS_helper)
1583
+ bulk_properties["vPvS"].append(vPvS_helper_helper)
1584
+ bulk_properties["GR"].append(round(gr_helper, 3))
1585
+ bulk_properties["PE"].append(round(pe_helper, 3))
1586
+ bulk_properties["phi"].append(round(phi_helper, 3))
1587
+ n += 1
1588
+ #else:
1589
+ # break
1590
+ #
1591
+ results = {}
1592
+ results["rock"] = "Banded Iron Formation"
1593
+ if number > 1:
1594
+ results["mineralogy"] = amounts_mineralogy
1595
+ results["chemistry"] = amounts_chemistry
1596
+ results["phi"] = bulk_properties["phi"]
1597
+ results["fluid"] = "water"
1598
+ results["rho_s"] = bulk_properties["rho_s"]
1599
+ results["rho"] = bulk_properties["rho"]
1600
+ results["vP"] = bulk_properties["vP"]
1601
+ results["vS"] = bulk_properties["vS"]
1602
+ results["vP/vS"] = bulk_properties["vPvS"]
1603
+ results["K"] = bulk_properties["K"]
1604
+ results["G"] = bulk_properties["G"]
1605
+ results["E"] = bulk_properties["E"]
1606
+ results["nu"] = bulk_properties["nu"]
1607
+ results["GR"] = bulk_properties["GR"]
1608
+ results["PE"] = bulk_properties["PE"]
1609
+ else:
1610
+ single_amounts_mineralogy = {}
1611
+ single_amounts_chemistry = {}
1612
+ for mineral, value in amounts_mineralogy.items():
1613
+ single_amounts_mineralogy[mineral] = value[0]
1614
+ for element, value in amounts_chemistry.items():
1615
+ single_amounts_chemistry[element] = value[0]
1616
+ results["mineralogy"] = single_amounts_mineralogy
1617
+ results["chemistry"] = single_amounts_chemistry
1618
+ results["phi"] = bulk_properties["phi"][0]
1619
+ results["fluid"] = "water"
1620
+ results["rho_s"] = bulk_properties["rho_s"][0]
1621
+ results["rho"] = bulk_properties["rho"][0]
1622
+ results["vP"] = bulk_properties["vP"][0]
1623
+ results["vS"] = bulk_properties["vS"][0]
1624
+ results["vP/vS"] = bulk_properties["vPvS"][0]
1625
+ results["K"] = bulk_properties["K"][0]
1626
+ results["G"] = bulk_properties["G"][0]
1627
+ results["E"] = bulk_properties["E"][0]
1628
+ results["nu"] = bulk_properties["nu"][0]
1629
+ results["GR"] = bulk_properties["GR"][0]
1630
+ results["PE"] = bulk_properties["PE"][0]
1631
+ #
1632
+ return results
1633
+ #
1634
+ ## TEST
1635
+ # print("Test: Compact Hematite Ore")
1636
+ # start = time.process_time()
1637
+ # data = []
1638
+ # for i in range(100):
1639
+ # data.append(Ores(fluid="water", actualThickness=0).create_compact_hematite_ore(number=1))
1640
+ # # print(Ores(fluid="water", actualThickness=0).create_compact_hematite_ore(number=1))
1641
+ # print(data)
1642
+ # end1 = time.process_time() - start
1643
+ # print(end1)
1644
+ # start = time.process_time()
1645
+ # print(Ores(fluid="water", actualThickness=0).create_compact_hematite_ore(number=100))
1646
+ # end2 = time.process_time() - start
1647
+ # print(end2)
1648
+ # print(end2/end1)