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
@@ -0,0 +1,908 @@
1
+ #!/usr/bin/env python
2
+ # -*-coding: utf-8 -*-
3
+
4
+ #-----------------------------------------------
5
+
6
+ # Name: sedimentary_rocks.py
7
+ # Author: Maximilian A. Beeskow
8
+ # Version: 1.0
9
+ # Date: 16.05.2023
10
+
11
+ #-----------------------------------------------
12
+
13
+ ## MODULES
14
+ import datetime
15
+ import sys
16
+
17
+ import numpy as np
18
+ from numpy import round
19
+ import random as rd
20
+ from modules.oxides import Oxides
21
+ from modules.carbonates import Carbonates
22
+ from modules.silicates import Phyllosilicates
23
+ from modules.silicates import Tectosilicates
24
+ from modules.fluids import Water
25
+ import time
26
+
27
+ #####################
28
+ ## SANDSTONE ROCKS ##
29
+ #####################
30
+ class Sandstone:
31
+ #
32
+ def __init__(self, fluid="water", actualThickness=100):
33
+ self.fluid = fluid
34
+ self.actualThickness = actualThickness
35
+ self.data_quartz = Oxides(impurity="pure", data_type=True).create_quartz()
36
+ self.data_calcite = Carbonates(impurity="pure", data_type=True).create_calcite()
37
+ self.data_hematite = Oxides(impurity="pure", data_type=True).create_hematite()
38
+ self.data_water = Water.water("")
39
+ #
40
+ def create_sandstone(self, number, porosity=None):
41
+ #
42
+ data_alkalifeldspar = Tectosilicates(impurity="pure", data_type=True).create_alkalifeldspar() # variable
43
+ data_plagioclase = Tectosilicates(impurity="pure", data_type=True).create_plagioclase() # variable
44
+ data_chlorite = Phyllosilicates(impurity="pure", data_type=True).create_chlorite() # variable
45
+ #
46
+ assemblage = [self.data_quartz, data_alkalifeldspar, data_plagioclase, self.data_calcite, self.data_hematite,
47
+ data_chlorite]
48
+ #
49
+ amounts_mineralogy = {}
50
+ amounts_chemistry = {}
51
+ bulk_properties = {}
52
+ properties = ["rho_s", "rho", "K", "G", "E", "nu", "vP", "vS", "vPvS", "GR", "PE", "phi"]
53
+ for property in properties:
54
+ bulk_properties[property] = []
55
+ mineral_list = []
56
+ elements = []
57
+ for mineral in assemblage:
58
+ amounts_mineralogy[mineral["mineral"]] = []
59
+ mineral_list.append(mineral["mineral"])
60
+ elements_mineral = list(mineral["chemistry"].keys())
61
+ for element in elements_mineral:
62
+ if element not in elements:
63
+ elements.append(element)
64
+ amounts_chemistry[element] = []
65
+ mineral_list.sort()
66
+ elements.sort()
67
+ #
68
+ n = 0
69
+ amounts_helper = []
70
+ while n < number:
71
+ w_total = 0
72
+ n_minerals = 0
73
+ for mineral in mineral_list:
74
+ if mineral == "Qz":
75
+ if n_minerals < len(mineral_list) - 1:
76
+ value = round(1 - w_total, 4)
77
+ else:
78
+ value = round(1 - w_total, 4)
79
+ if value >= 0.0 and 0.85 <= value <= 1.0:
80
+ amounts_helper.append(value)
81
+ w_total += value
82
+ n_minerals += 1
83
+ elif mineral == "Kfs":
84
+ if n_minerals < len(mineral_list) - 1:
85
+ value = round(rd.uniform(0.0, 0.15), 4)
86
+ else:
87
+ value = round(1 - w_total, 4)
88
+ if value >= 0.0 and 0.0 <= value <= 0.15:
89
+ amounts_helper.append(value)
90
+ w_total += value
91
+ n_minerals += 1
92
+ elif mineral == "Pl":
93
+ if n_minerals < len(mineral_list) - 1:
94
+ value = round(rd.uniform(0.0, 0.15), 4)
95
+ else:
96
+ value = round(1 - w_total, 4)
97
+ if value >= 0.0 and 0.0 <= value <= 0.15:
98
+ amounts_helper.append(value)
99
+ w_total += value
100
+ n_minerals += 1
101
+ elif mineral == "Cal":
102
+ if n_minerals < len(mineral_list) - 1:
103
+ value = round(rd.uniform(0.0, 0.15), 4)
104
+ else:
105
+ value = round(1 - w_total, 4)
106
+ if value >= 0.0 and 0.0 <= value <= 0.15:
107
+ amounts_helper.append(value)
108
+ w_total += value
109
+ n_minerals += 1
110
+ elif mineral == "Chl":
111
+ if n_minerals < len(mineral_list) - 1:
112
+ value = round(rd.uniform(0.0, 0.15), 4)
113
+ else:
114
+ value = round(1 - w_total, 4)
115
+ if value >= 0.0 and 0.0 <= value <= 0.15:
116
+ amounts_helper.append(value)
117
+ w_total += value
118
+ n_minerals += 1
119
+ elif mineral == "Hem":
120
+ if n_minerals < len(mineral_list) - 1:
121
+ value = round(rd.uniform(0.0, 0.05), 4)
122
+ else:
123
+ value = round(1 - w_total, 4)
124
+ if value >= 0.0 and 0.0 <= value <= 0.05:
125
+ amounts_helper.append(value)
126
+ w_total += value
127
+ n_minerals += 1
128
+ #
129
+ if np.sum(amounts_helper) == 1.0 and n_minerals == len(mineral_list):
130
+ for index, mineral in enumerate(mineral_list):
131
+ amounts_mineralogy[mineral].append(amounts_helper[index])
132
+ n += 1
133
+ amounts_helper.clear()
134
+ else:
135
+ n += 0
136
+ amounts_helper.clear()
137
+ #
138
+ n = 0
139
+ amounts_helper = {}
140
+ while n < number:
141
+ w_total = 0
142
+ n_elements = 0
143
+ rho_s_helper = 0
144
+ bulkmod_helper = 0
145
+ shearmod_helper = 0
146
+ gr_helper = 0
147
+ pe_helper = 0
148
+ if porosity == None:
149
+ phi_helper = round(rd.uniform(0.0, 0.05), 4)
150
+ else:
151
+ phi_helper = porosity
152
+ #
153
+ data_alkalifeldspar = Tectosilicates(impurity="pure", data_type=True).create_alkalifeldspar()
154
+ data_plagioclase = Tectosilicates(impurity="pure", data_type=True).create_plagioclase()
155
+ data_chlorite = Phyllosilicates(impurity="pure", data_type=True).create_chlorite()
156
+ #
157
+ for element in elements:
158
+ amounts_helper[element] = 0
159
+ if element in self.data_quartz["chemistry"]:
160
+ if n_elements < len(elements) - 1:
161
+ value = round(amounts_mineralogy["Qz"][n] * self.data_quartz["chemistry"][element], 4)
162
+ else:
163
+ value = round(1 - w_total, 4)
164
+ amounts_helper[element] += value
165
+ w_total += value
166
+ if element in data_alkalifeldspar["chemistry"]:
167
+ if n_elements < len(elements) - 1:
168
+ value = round(amounts_mineralogy["Kfs"][n] * data_alkalifeldspar["chemistry"][element], 4)
169
+ else:
170
+ value = round(1 - w_total, 4)
171
+ amounts_helper[element] += value
172
+ w_total += value
173
+ if element in data_plagioclase["chemistry"]:
174
+ if n_elements < len(elements) - 1:
175
+ value = round(amounts_mineralogy["Pl"][n] * data_plagioclase["chemistry"][element], 4)
176
+ else:
177
+ value = round(1 - w_total, 4)
178
+ amounts_helper[element] += value
179
+ w_total += value
180
+ if element in data_chlorite["chemistry"]:
181
+ if n_elements < len(elements) - 1:
182
+ value = round(amounts_mineralogy["Chl"][n] * data_chlorite["chemistry"][element], 4)
183
+ else:
184
+ value = round(1 - w_total, 4)
185
+ amounts_helper[element] += value
186
+ w_total += value
187
+ if element in self.data_calcite["chemistry"]:
188
+ if n_elements < len(elements) - 1:
189
+ value = round(amounts_mineralogy["Cal"][n] * self.data_calcite["chemistry"][element], 4)
190
+ else:
191
+ value = round(1 - w_total, 4)
192
+ amounts_helper[element] += value
193
+ w_total += value
194
+ if element in self.data_hematite["chemistry"]:
195
+ if n_elements < len(elements) - 1:
196
+ value = round(amounts_mineralogy["Hem"][n] * self.data_hematite["chemistry"][element], 4)
197
+ else:
198
+ value = round(1 - w_total, 4)
199
+ amounts_helper[element] += value
200
+ w_total += value
201
+ #
202
+ n_elements += 1
203
+ #
204
+ shear_factor = 1.0
205
+ #
206
+ if sum(amounts_helper.values()) == 1.0:
207
+ for key, value in amounts_helper.items():
208
+ amounts_chemistry[key].append(round(value, 4))
209
+ for mineral in mineral_list:
210
+ if mineral == "Qz":
211
+ rho_s_helper += round(amounts_mineralogy[mineral][n] * self.data_quartz["rho"], 3)
212
+ bulkmod_helper += round(amounts_mineralogy[mineral][n] * self.data_quartz["K"], 3)
213
+ shearmod_helper += round(shear_factor * amounts_mineralogy[mineral][n] * self.data_quartz["G"], 3)
214
+ gr_helper += round(amounts_mineralogy[mineral][n] * self.data_quartz["GR"], 3)
215
+ pe_helper += round(amounts_mineralogy[mineral][n] * self.data_quartz["PE"], 3)
216
+ elif mineral == "Kfs":
217
+ rho_s_helper += round(amounts_mineralogy[mineral][n] * data_alkalifeldspar["rho"], 3)
218
+ bulkmod_helper += round(amounts_mineralogy[mineral][n] * data_alkalifeldspar["K"], 3)
219
+ shearmod_helper += round(shear_factor * amounts_mineralogy[mineral][n] * data_alkalifeldspar["G"],
220
+ 3)
221
+ gr_helper += round(amounts_mineralogy[mineral][n] * data_alkalifeldspar["GR"], 3)
222
+ pe_helper += round(amounts_mineralogy[mineral][n] * data_alkalifeldspar["PE"], 3)
223
+ elif mineral == "Pl":
224
+ rho_s_helper += round(amounts_mineralogy[mineral][n] * data_plagioclase["rho"], 3)
225
+ bulkmod_helper += round(amounts_mineralogy[mineral][n] * data_plagioclase["K"], 3)
226
+ shearmod_helper += round(shear_factor * amounts_mineralogy[mineral][n] * data_plagioclase["G"], 3)
227
+ gr_helper += round(amounts_mineralogy[mineral][n] * data_plagioclase["GR"], 3)
228
+ pe_helper += round(amounts_mineralogy[mineral][n] * data_plagioclase["PE"], 3)
229
+ elif mineral == "Chl":
230
+ rho_s_helper += round(amounts_mineralogy[mineral][n] * data_chlorite["rho"], 3)
231
+ bulkmod_helper += round(amounts_mineralogy[mineral][n] * data_chlorite["K"], 3)
232
+ shearmod_helper += round(shear_factor * amounts_mineralogy[mineral][n] * data_chlorite["G"], 3)
233
+ gr_helper += round(amounts_mineralogy[mineral][n] * data_chlorite["GR"], 3)
234
+ pe_helper += round(amounts_mineralogy[mineral][n] * data_chlorite["PE"], 3)
235
+ elif mineral == "Cal":
236
+ rho_s_helper += round(amounts_mineralogy[mineral][n] * self.data_calcite["rho"], 3)
237
+ bulkmod_helper += round(amounts_mineralogy[mineral][n] * self.data_calcite["K"], 3)
238
+ shearmod_helper += round(shear_factor * amounts_mineralogy[mineral][n] * self.data_calcite["G"], 3)
239
+ gr_helper += round(amounts_mineralogy[mineral][n] * self.data_calcite["GR"], 3)
240
+ pe_helper += round(amounts_mineralogy[mineral][n] * self.data_calcite["PE"], 3)
241
+ elif mineral == "Hem":
242
+ rho_s_helper += round(amounts_mineralogy[mineral][n] * self.data_hematite["rho"], 3)
243
+ bulkmod_helper += round(amounts_mineralogy[mineral][n] * self.data_hematite["K"], 3)
244
+ shearmod_helper += round(shear_factor * amounts_mineralogy[mineral][n] * self.data_hematite["G"], 3)
245
+ gr_helper += round(amounts_mineralogy[mineral][n] * self.data_hematite["GR"], 3)
246
+ pe_helper += round(amounts_mineralogy[mineral][n] * self.data_hematite["PE"], 3)
247
+ #
248
+ rho_helper = round((1 - phi_helper) * rho_s_helper + phi_helper * self.data_water[2] / 1000, 3)
249
+ youngsmod_helper = round(
250
+ (9 * bulkmod_helper * shearmod_helper) / (3 * bulkmod_helper + shearmod_helper), 3)
251
+ poisson_helper = round(
252
+ (3 * bulkmod_helper - 2 * shearmod_helper) / (6 * bulkmod_helper + 2 * shearmod_helper), 3)
253
+ vP_helper = round(
254
+ ((bulkmod_helper * 10 ** 9 + 4 / 3 * shearmod_helper * 10 ** 9) / (rho_helper)) ** 0.5, 3)
255
+ vS_helper = round(((shearmod_helper * 10 ** 9) / (rho_helper)) ** 0.5, 3)
256
+ vPvS_helper_helper = round(vP_helper / vS_helper, 3)
257
+ #
258
+ bulk_properties["rho_s"].append(round(rho_s_helper, 3))
259
+ bulk_properties["rho"].append(rho_helper)
260
+ bulk_properties["K"].append(round(bulkmod_helper, 3))
261
+ bulk_properties["G"].append(round(shearmod_helper, 3))
262
+ bulk_properties["E"].append(youngsmod_helper)
263
+ bulk_properties["nu"].append(poisson_helper)
264
+ bulk_properties["vP"].append(vP_helper)
265
+ bulk_properties["vS"].append(vS_helper)
266
+ bulk_properties["vPvS"].append(vPvS_helper_helper)
267
+ bulk_properties["GR"].append(round(gr_helper, 3))
268
+ bulk_properties["PE"].append(round(pe_helper, 3))
269
+ bulk_properties["phi"].append(round(phi_helper, 3))
270
+ n += 1
271
+ #
272
+ results = {}
273
+ results["rock"] = "Sandstone"
274
+ if number > 1:
275
+ results["mineralogy"] = amounts_mineralogy
276
+ results["chemistry"] = amounts_chemistry
277
+ results["phi"] = bulk_properties["phi"]
278
+ results["fluid"] = "water"
279
+ results["rho_s"] = bulk_properties["rho_s"]
280
+ results["rho"] = bulk_properties["rho"]
281
+ results["vP"] = bulk_properties["vP"]
282
+ results["vS"] = bulk_properties["vS"]
283
+ results["vP/vS"] = bulk_properties["vPvS"]
284
+ results["K"] = bulk_properties["K"]
285
+ results["G"] = bulk_properties["G"]
286
+ results["E"] = bulk_properties["E"]
287
+ results["nu"] = bulk_properties["nu"]
288
+ results["GR"] = bulk_properties["GR"]
289
+ results["PE"] = bulk_properties["PE"]
290
+ else:
291
+ single_amounts_mineralogy = {}
292
+ single_amounts_chemistry = {}
293
+ for mineral, value in amounts_mineralogy.items():
294
+ single_amounts_mineralogy[mineral] = value[0]
295
+ for element, value in amounts_chemistry.items():
296
+ single_amounts_chemistry[element] = value[0]
297
+ results["mineralogy"] = single_amounts_mineralogy
298
+ results["chemistry"] = single_amounts_chemistry
299
+ results["phi"] = bulk_properties["phi"][0]
300
+ results["fluid"] = "water"
301
+ results["rho_s"] = bulk_properties["rho_s"][0]
302
+ results["rho"] = bulk_properties["rho"][0]
303
+ results["vP"] = bulk_properties["vP"][0]
304
+ results["vS"] = bulk_properties["vS"][0]
305
+ results["vP/vS"] = bulk_properties["vPvS"][0]
306
+ results["K"] = bulk_properties["K"][0]
307
+ results["G"] = bulk_properties["G"][0]
308
+ results["E"] = bulk_properties["E"][0]
309
+ results["nu"] = bulk_properties["nu"][0]
310
+ results["GR"] = bulk_properties["GR"][0]
311
+ results["PE"] = bulk_properties["PE"][0]
312
+ #
313
+ return results
314
+ #
315
+ #############################
316
+ ## OTHER SEDIMENTARY ROCKS ##
317
+ #############################
318
+ class SedimentaryRocks:
319
+ #
320
+ def __init__(self, fluid="water", actualThickness=100):
321
+ # Settings
322
+ self.fluid = fluid
323
+ self.actualThickness = actualThickness
324
+ # Oxide Minerals
325
+ self.data_quartz = Oxides(impurity="pure", data_type=True).create_quartz()
326
+ self.data_hematite = Oxides(impurity="pure", data_type=True).create_hematite()
327
+ # Carbonate Minerals
328
+ self.data_calcite = Carbonates(impurity="pure", data_type=True).create_calcite()
329
+ self.data_dolomite = Carbonates(impurity="pure", data_type=True).create_dolomite()
330
+ # Phyllosilicate Minerals
331
+ self.data_kaolinite = Phyllosilicates(impurity="pure", data_type=True).create_kaolinite()
332
+ # Fluids
333
+ self.data_water = Water.water("")
334
+ #
335
+ def create_marl_alt(self, rock="Marl", number=1, composition=None, classification="Marl", porosity=None):
336
+ #
337
+ results_container = {}
338
+ results_container["rock"] = rock
339
+ results_container["mineralogy"] = {}
340
+ results_container["chemistry"] = {}
341
+ results_container["phi"] = []
342
+ results_container["fluid"] = self.fluid
343
+ results_container["rho_s"] = []
344
+ results_container["rho"] = []
345
+ results_container["vP"] = []
346
+ results_container["vS"] = []
347
+ results_container["vP/vS"] = []
348
+ results_container["K"] = []
349
+ results_container["G"] = []
350
+ results_container["E"] = []
351
+ results_container["nu"] = []
352
+ results_container["GR"] = []
353
+ results_container["PE"] = []
354
+ #
355
+ n = 0
356
+ while n < number:
357
+ data_illite = Phyllosilicates(impurity="pure", data_type=True).create_illite()
358
+ data_plagioclase = Tectosilicates(impurity="pure", data_type=True).create_plagioclase()
359
+ #
360
+ mineralogy = {"Cal": self.data_calcite, "Ilt": data_illite, "Pl": data_plagioclase}
361
+ #
362
+ minerals_list = list(mineralogy.keys())
363
+ #
364
+ if minerals_list[0] not in results_container["mineralogy"]:
365
+ for mineral in minerals_list:
366
+ results_container["mineralogy"][mineral] = []
367
+ #
368
+ condition = False
369
+ #
370
+ while condition == False:
371
+ elements_list = []
372
+ phi_minerals = {}
373
+ w_minerals = {}
374
+ w_elements = {}
375
+ #
376
+ if composition != None:
377
+ phi_cal = composition["Cal"]
378
+ phi_ilt = composition["Ilt"]
379
+ phi_pl = composition["Pl"]
380
+ #
381
+ phi_minerals["Cal"] = phi_cal
382
+ phi_minerals["Ilt"] = phi_ilt
383
+ phi_minerals["Pl"] = phi_pl
384
+ #
385
+ else:
386
+ condition_2 = False
387
+ while condition_2 == False:
388
+ if classification == "Marl":
389
+ cal_limits = [0.35, 0.65]
390
+ ilt_limits = [0.35, 0.65]
391
+ pl_limits = [0.0, 0.3]
392
+ #
393
+ phi_cal = round(rd.uniform(cal_limits[0], cal_limits[1]), 4)
394
+ phi_ilt = round(rd.uniform(ilt_limits[0], (1 - phi_cal)), 4)
395
+ phi_pl = round(1 - phi_cal - phi_ilt, 4)
396
+ #
397
+ phi_total = phi_cal + phi_ilt + phi_pl
398
+ #
399
+ if np.isclose(phi_total, 1.0000) == True:
400
+ if cal_limits[0] <= phi_cal <= cal_limits[1] \
401
+ and ilt_limits[0] <= phi_ilt <= ilt_limits[1] \
402
+ and pl_limits[0] <= phi_pl <= pl_limits[1]:
403
+ condition_2 = True
404
+ #
405
+ phi_minerals["Cal"] = phi_cal
406
+ phi_minerals["Ilt"] = phi_ilt
407
+ phi_minerals["Pl"] = phi_pl
408
+ #
409
+ rho_s = 0
410
+ for key, value in phi_minerals.items():
411
+ rho_s += phi_minerals[key]*mineralogy[key]["rho"]
412
+ #
413
+ for element, value in mineralogy[key]["chemistry"].items():
414
+ if element not in elements_list:
415
+ elements_list.append(element)
416
+ w_elements[element] = 0.0
417
+ #
418
+ if elements_list[0] not in results_container["chemistry"]:
419
+ for element in elements_list:
420
+ results_container["chemistry"][element] = []
421
+ #
422
+ rho_s = round(rho_s, 3)
423
+ for key, value in phi_minerals.items():
424
+ if key == "Urn":
425
+ n_digits = 4
426
+ else:
427
+ n_digits = 4
428
+ #
429
+ w_minerals[key] = round((phi_minerals[key]*mineralogy[key]["rho"])/rho_s, n_digits)
430
+ #
431
+ if porosity == None:
432
+ var_porosity = round(rd.uniform(0.0, 0.1), 4)
433
+ elif type(porosity) == float:
434
+ var_porosity = porosity
435
+ else:
436
+ var_porosity = round(rd.uniform(porosity[0], porosity[1]), 4)
437
+ #
438
+ if self.fluid == "water":
439
+ data_fluid = self.data_water
440
+ #
441
+ old_index = elements_list.index("O")
442
+ elements_list += [elements_list.pop(old_index)]
443
+ #
444
+ w_elements_total = 0.0
445
+ for element in elements_list:
446
+ if element != "O":
447
+ for mineral, w_mineral in w_minerals.items():
448
+ if element in mineralogy[mineral]["chemistry"]:
449
+ if element == "U":
450
+ n_digits = 4
451
+ else:
452
+ n_digits = 4
453
+ #
454
+ value = round(w_mineral*mineralogy[mineral]["chemistry"][element], n_digits)
455
+ w_elements[element] += value
456
+ w_elements_total += value
457
+ #
458
+ w_elements[element] = round(w_elements[element], n_digits)
459
+ elif element == "O":
460
+ w_elements[element] += round(1 - w_elements_total, 4)
461
+ #
462
+ w_elements[element] = round(w_elements[element], 4)
463
+ #
464
+ total_w_minerals = round(sum(w_minerals.values()), 4)
465
+ total_w_elements = round(sum(w_elements.values()), 4)
466
+ if total_w_minerals == 1.0 and total_w_elements == 1.0:
467
+ for key, value in w_minerals.items():
468
+ w_minerals[key] = abs(value)
469
+ #
470
+ for key, value in w_elements.items():
471
+ w_elements[key] = abs(value)
472
+ #
473
+ condition = True
474
+ #
475
+ rho_solid = 0
476
+ velocity_solid = {"vP": 0, "vS": 0}
477
+ gamma_ray = 0.0
478
+ photoelectricity = 0.0
479
+ for key, value in phi_minerals.items():
480
+ rho_solid += phi_minerals[key]*mineralogy[key]["rho"]
481
+ velocity_solid["vP"] += phi_minerals[key]*mineralogy[key]["vP"]
482
+ velocity_solid["vS"] += phi_minerals[key]*mineralogy[key]["vS"]
483
+ gamma_ray += phi_minerals[key]*mineralogy[key]["GR"]
484
+ photoelectricity += phi_minerals[key]*mineralogy[key]["PE"]
485
+ #
486
+ ## Density
487
+ rho_solid = round(rho_solid, 3)
488
+ rho = round((1 - var_porosity)*rho_solid + var_porosity*data_fluid[2]/1000, 3)
489
+ ## Seismic Velocities
490
+ vP_factor = 4/3
491
+ vP = round(velocity_solid["vP"]*(1 - vP_factor*var_porosity), 3)
492
+ vS_factor = 3/2
493
+ vS = round(velocity_solid["vS"]*(1 - vS_factor*var_porosity), 3)
494
+ vPvS = round(vP/vS, 6)
495
+ ## Elastic Parameters
496
+ bulk_modulus = round(rho*(vP**2 - 4/3*vS**2)*10**(-9), 3)
497
+ shear_modulus = round((rho*vS**2)*10**(-9), 3)
498
+ youngs_modulus = round((9*bulk_modulus*shear_modulus)/(3*bulk_modulus + shear_modulus), 3)
499
+ poisson_ratio = round((3*bulk_modulus - 2*shear_modulus)/(6*bulk_modulus + 2*shear_modulus), 4)
500
+ ## Gamma Ray
501
+ gamma_ray = round(gamma_ray, 3)
502
+ ## Photoelectricity
503
+ photoelectricity = round(photoelectricity, 3)
504
+ #
505
+ for key, value in w_minerals.items():
506
+ results_container["mineralogy"][key].append(float(value))
507
+ #
508
+ for key, value in w_elements.items():
509
+ results_container["chemistry"][key].append(float(value))
510
+ #
511
+ results_container["phi"].append(float(var_porosity))
512
+ results_container["rho_s"].append(float(rho_s))
513
+ results_container["rho"].append(float(rho))
514
+ results_container["vP"].append(float(vP))
515
+ results_container["vS"].append(float(vS))
516
+ results_container["vP/vS"].append(float(vPvS))
517
+ results_container["K"].append(float(bulk_modulus))
518
+ results_container["G"].append(float(shear_modulus))
519
+ results_container["E"].append(float(youngs_modulus))
520
+ results_container["nu"].append(float(poisson_ratio))
521
+ results_container["GR"].append(float(gamma_ray))
522
+ results_container["PE"].append(float(photoelectricity))
523
+ #
524
+ n += 1
525
+ #
526
+ return results_container
527
+ #
528
+ def create_marl(self, number, porosity=None):
529
+ #
530
+ data_illite = Phyllosilicates(impurity="pure", data_type=True).create_illite() # variable
531
+ data_plagioclase = Tectosilicates(impurity="pure", data_type=True).create_plagioclase() # variable
532
+ data_chlorite = Phyllosilicates(impurity="pure", data_type=True).create_chlorite() # variable
533
+ data_montmorillonite = Phyllosilicates(impurity="pure", data_type=True).create_montmorillonite() # variable
534
+ #
535
+ assemblage = [self.data_calcite, self.data_dolomite, data_illite, data_chlorite, self.data_kaolinite,
536
+ data_montmorillonite, self.data_quartz, data_plagioclase]
537
+ #
538
+ amounts_mineralogy = {}
539
+ amounts_chemistry = {}
540
+ bulk_properties = {}
541
+ amounts_helper_minerals = {}
542
+ properties = ["rho_s", "rho", "K", "G", "E", "nu", "vP", "vS", "vPvS", "GR", "PE", "phi"]
543
+ for property in properties:
544
+ bulk_properties[property] = []
545
+ mineral_list = []
546
+ elements = []
547
+ for mineral in assemblage:
548
+ amounts_mineralogy[mineral["mineral"]] = []
549
+ mineral_list.append(mineral["mineral"])
550
+ elements_mineral = list(mineral["chemistry"].keys())
551
+ amounts_helper_minerals[mineral["mineral"]] = 0
552
+ for element in elements_mineral:
553
+ if element not in elements:
554
+ elements.append(element)
555
+ amounts_chemistry[element] = []
556
+ mineral_list.sort()
557
+ elements.sort()
558
+ #
559
+ n = 0
560
+ amounts_helper = []
561
+ amounts_fractions_helper = {}
562
+ fraction_list = ["carbonate", "clay", "accessory"]
563
+ fraction_list.sort()
564
+ for fraction in fraction_list:
565
+ amounts_fractions_helper[fraction] = 0
566
+ carbonate_list = ["Cal"]
567
+ clay_list = ["Ilt", "Chl", "Kln", "Mnt"]
568
+ accessory_list = ["Dol", "Pl", "Qz"]
569
+ while n < number:
570
+ w_total_acc = 0
571
+ w_total_clay = 0
572
+ w_total_fractions = 0
573
+ n_minerals = 0
574
+ n_fractions = 0
575
+ for fraction in fraction_list:
576
+ if fraction == "carbonate":
577
+ if n_fractions < len(fraction_list) - 1:
578
+ value_fract = round(rd.uniform(0.35, 0.65), 4)
579
+ else:
580
+ value_fract = round(1 - w_total_fractions, 4)
581
+ if 0.35 <= value_fract <= 0.65:
582
+ amounts_helper_minerals["Cal"] = value_fract
583
+ #
584
+ amounts_fractions_helper[fraction] = value_fract
585
+ w_total_fractions += value_fract
586
+ n_fractions += 1
587
+ n_minerals += 1
588
+ elif fraction == "clay":
589
+ if n_fractions < len(fraction_list) - 1:
590
+ value_fract = round(1 - w_total_fractions, 4)
591
+ else:
592
+ value_fract = round(1 - w_total_fractions, 4)
593
+ if 0.35 <= value_fract <= 0.65:
594
+ for clay_mineral in clay_list:
595
+ if clay_mineral == "Chl":
596
+ if n_minerals < len(mineral_list) - 1:
597
+ value = round(value_fract*rd.uniform(0.0, 1.0), 4)
598
+ else:
599
+ value = round(value_fract(1 - w_total_clay), 4)
600
+ amounts_helper_minerals[clay_mineral] = value
601
+ amounts_helper.append(value)
602
+ w_total_clay += value
603
+ n_minerals += 1
604
+ elif clay_mineral == "Ilt":
605
+ if n_minerals < len(mineral_list) - 1:
606
+ value = round(value_fract*rd.uniform(0.0, 1.0), 4)
607
+ else:
608
+ value = round(value_fract*(1 - w_total_clay), 4)
609
+ amounts_helper_minerals[clay_mineral] = value
610
+ amounts_helper.append(value)
611
+ w_total_clay += value
612
+ n_minerals += 1
613
+ elif clay_mineral == "Kln":
614
+ if n_minerals < len(mineral_list) - 1:
615
+ value = round(value_fract*rd.uniform(0.0, 1.0), 4)
616
+ else:
617
+ value = round(value_fract*(1 - w_total_clay), 4)
618
+ amounts_helper_minerals[clay_mineral] = value
619
+ amounts_helper.append(value)
620
+ w_total_clay += value
621
+ n_minerals += 1
622
+ elif clay_mineral == "Mnt":
623
+ if n_minerals < len(mineral_list) - 1:
624
+ value = round(value_fract - w_total_clay, 4)
625
+ else:
626
+ value = round(value_fract - w_total_clay, 4)
627
+ amounts_helper_minerals[clay_mineral] = value
628
+ amounts_helper.append(value)
629
+ w_total_clay += value
630
+ n_minerals += 1
631
+ #
632
+ amounts_fractions_helper[fraction] = value_fract
633
+ w_total_fractions += value_fract
634
+ n_fractions += 1
635
+ elif fraction == "accessory":
636
+ if n_fractions < len(fraction_list) - 1:
637
+ value_fract = round(rd.uniform(0.0, 0.05), 4)
638
+ else:
639
+ value_fract = round(1 - w_total_fractions, 4)
640
+ if 0.0 <= value_fract <= 0.05:
641
+ for accessory_mineral in accessory_list:
642
+ if accessory_mineral == "Dol":
643
+ if n_minerals < len(mineral_list) - 1:
644
+ value = round(value_fract*rd.uniform(0.0, value_fract), 4)
645
+ else:
646
+ value = round(value_fract - w_total_acc, 4)
647
+ amounts_helper_minerals[accessory_mineral] = value
648
+ amounts_helper.append(value)
649
+ w_total_acc += value
650
+ n_minerals += 1
651
+ elif accessory_mineral == "Pl":
652
+ if n_minerals < len(mineral_list) - 1:
653
+ value = round(value_fract*rd.uniform(0.0, value_fract), 4)
654
+ else:
655
+ value = round(value_fract - w_total_acc, 4)
656
+ amounts_helper_minerals[accessory_mineral] = value
657
+ amounts_helper.append(value)
658
+ w_total_acc += value
659
+ n_minerals += 1
660
+ elif accessory_mineral == "Qz":
661
+ if n_minerals < len(mineral_list) - 1:
662
+ value = round(value_fract - w_total_acc, 4)
663
+ else:
664
+ value = round(value_fract - w_total_acc, 4)
665
+ amounts_helper_minerals[accessory_mineral] = value
666
+ amounts_helper.append(value)
667
+ w_total_acc += value
668
+ n_minerals += 1
669
+ #
670
+ amounts_fractions_helper[fraction] = value_fract
671
+ w_total_fractions += value_fract
672
+ n_fractions += 1
673
+ #
674
+ # print("Fractions:", amounts_fractions_helper)
675
+ # print(np.sum([*amounts_fractions_helper.values()]))
676
+ # print("Mineralogy:", amounts_helper_minerals)
677
+ # print(np.sum([*amounts_helper_minerals.values()]))
678
+ #
679
+ if np.sum([*amounts_helper_minerals.values()]) == 1.0 and n_minerals == len(mineral_list):
680
+ for index, mineral in enumerate(mineral_list):
681
+ amounts_mineralogy[mineral].append(amounts_helper_minerals[mineral])
682
+ n += 1
683
+ amounts_helper_minerals.clear()
684
+ else:
685
+ n += 0
686
+ for mineral in amounts_helper_minerals:
687
+ amounts_helper_minerals[mineral] = 0
688
+ for fraction in amounts_fractions_helper:
689
+ amounts_fractions_helper[fraction] = 0
690
+ #
691
+ n = 0
692
+ amounts_helper = {}
693
+ while n < number:
694
+ w_total = 0
695
+ n_elements = 0
696
+ rho_s_helper = 0
697
+ bulkmod_helper = 0
698
+ shearmod_helper = 0
699
+ gr_helper = 0
700
+ pe_helper = 0
701
+ if porosity == None:
702
+ phi_helper = round(rd.uniform(0.0, 0.25), 4)
703
+ else:
704
+ phi_helper = porosity
705
+ #
706
+ data_chlorite = Phyllosilicates(impurity="pure", data_type=True).create_chlorite()
707
+ data_illite = Phyllosilicates(impurity="pure", data_type=True).create_illite()
708
+ data_montmorillonite = Phyllosilicates(impurity="pure", data_type=True).create_montmorillonite()
709
+ data_plagioclase = Tectosilicates(impurity="pure", data_type=True).create_plagioclase()
710
+ #
711
+ for element in elements:
712
+ amounts_helper[element] = 0
713
+ if element in self.data_calcite["chemistry"]:
714
+ if n_elements < len(elements) - 1:
715
+ value = round(amounts_mineralogy["Cal"][n] * self.data_calcite["chemistry"][element], 4)
716
+ else:
717
+ value = round(1 - w_total, 4)
718
+ amounts_helper[element] += value
719
+ w_total += value
720
+ if element in data_chlorite["chemistry"]:
721
+ if n_elements < len(elements) - 1:
722
+ value = round(amounts_mineralogy["Chl"][n] * data_chlorite["chemistry"][element], 4)
723
+ else:
724
+ value = round(1 - w_total, 4)
725
+ amounts_helper[element] += value
726
+ w_total += value
727
+ if element in self.data_dolomite["chemistry"]:
728
+ if n_elements < len(elements) - 1:
729
+ value = round(amounts_mineralogy["Dol"][n] * self.data_dolomite["chemistry"][element], 4)
730
+ else:
731
+ value = round(1 - w_total, 4)
732
+ amounts_helper[element] += value
733
+ w_total += value
734
+ if element in data_illite["chemistry"]:
735
+ if n_elements < len(elements) - 1:
736
+ value = round(amounts_mineralogy["Ilt"][n] * data_illite["chemistry"][element], 4)
737
+ else:
738
+ value = round(1 - w_total, 4)
739
+ amounts_helper[element] += value
740
+ w_total += value
741
+ if element in self.data_kaolinite["chemistry"]:
742
+ if n_elements < len(elements) - 1:
743
+ value = round(amounts_mineralogy["Kln"][n] * self.data_kaolinite["chemistry"][element], 4)
744
+ else:
745
+ value = round(1 - w_total, 4)
746
+ amounts_helper[element] += value
747
+ w_total += value
748
+ if element in data_montmorillonite["chemistry"]:
749
+ if n_elements < len(elements) - 1:
750
+ value = round(amounts_mineralogy["Mnt"][n] * data_montmorillonite["chemistry"][element], 4)
751
+ else:
752
+ value = round(1 - w_total, 4)
753
+ amounts_helper[element] += value
754
+ w_total += value
755
+ if element in data_plagioclase["chemistry"]:
756
+ if n_elements < len(elements) - 1:
757
+ value = round(amounts_mineralogy["Pl"][n] * data_plagioclase["chemistry"][element], 4)
758
+ else:
759
+ value = round(1 - w_total, 4)
760
+ amounts_helper[element] += value
761
+ w_total += value
762
+ if element in self.data_quartz["chemistry"]:
763
+ if n_elements < len(elements) - 1:
764
+ value = round(amounts_mineralogy["Qz"][n] * self.data_quartz["chemistry"][element], 4)
765
+ else:
766
+ value = round(1 - w_total, 4)
767
+ amounts_helper[element] += value
768
+ w_total += value
769
+ #
770
+ n_elements += 1
771
+ #
772
+ bulk_factor = 0.15
773
+ shear_factor = 0.05
774
+ #
775
+ if sum(amounts_helper.values()) == 1.0:
776
+ for key, value in amounts_helper.items():
777
+ amounts_chemistry[key].append(round(value, 4))
778
+ for mineral in mineral_list:
779
+ if mineral == "Cal":
780
+ rho_s_helper += round(amounts_mineralogy[mineral][n] * self.data_calcite["rho"], 3)
781
+ bulkmod_helper += round(bulk_factor*amounts_mineralogy[mineral][n] * self.data_calcite["K"], 3)
782
+ shearmod_helper += round(shear_factor * amounts_mineralogy[mineral][n] * self.data_calcite["G"], 3)
783
+ gr_helper += round(amounts_mineralogy[mineral][n] * self.data_calcite["GR"], 3)
784
+ pe_helper += round(amounts_mineralogy[mineral][n] * self.data_calcite["PE"], 3)
785
+ elif mineral == "Chl":
786
+ rho_s_helper += round(amounts_mineralogy[mineral][n] * data_chlorite["rho"], 3)
787
+ bulkmod_helper += round(bulk_factor*amounts_mineralogy[mineral][n] * data_chlorite["K"], 3)
788
+ shearmod_helper += round(shear_factor * amounts_mineralogy[mineral][n] * data_chlorite["G"], 3)
789
+ gr_helper += round(amounts_mineralogy[mineral][n] * data_chlorite["GR"], 3)
790
+ pe_helper += round(amounts_mineralogy[mineral][n] * data_chlorite["PE"], 3)
791
+ elif mineral == "Dol":
792
+ rho_s_helper += round(amounts_mineralogy[mineral][n] * self.data_dolomite["rho"], 3)
793
+ bulkmod_helper += round(bulk_factor*amounts_mineralogy[mineral][n] * self.data_dolomite["K"], 3)
794
+ shearmod_helper += round(shear_factor * amounts_mineralogy[mineral][n] * self.data_dolomite["G"], 3)
795
+ gr_helper += round(amounts_mineralogy[mineral][n] * self.data_dolomite["GR"], 3)
796
+ pe_helper += round(amounts_mineralogy[mineral][n] * self.data_dolomite["PE"], 3)
797
+ elif mineral == "Ilt":
798
+ rho_s_helper += round(amounts_mineralogy[mineral][n] * data_illite["rho"], 3)
799
+ bulkmod_helper += round(bulk_factor*amounts_mineralogy[mineral][n] * data_illite["K"], 3)
800
+ shearmod_helper += round(shear_factor * amounts_mineralogy[mineral][n] * data_illite["G"], 3)
801
+ gr_helper += round(amounts_mineralogy[mineral][n] * data_illite["GR"], 3)
802
+ pe_helper += round(amounts_mineralogy[mineral][n] * data_illite["PE"], 3)
803
+ elif mineral == "Kln":
804
+ rho_s_helper += round(amounts_mineralogy[mineral][n] * self.data_kaolinite["rho"], 3)
805
+ bulkmod_helper += round(bulk_factor*amounts_mineralogy[mineral][n] * self.data_kaolinite["K"], 3)
806
+ shearmod_helper += round(shear_factor * amounts_mineralogy[mineral][n] * self.data_kaolinite["G"], 3)
807
+ gr_helper += round(amounts_mineralogy[mineral][n] * self.data_kaolinite["GR"], 3)
808
+ pe_helper += round(amounts_mineralogy[mineral][n] * self.data_kaolinite["PE"], 3)
809
+ elif mineral == "Mnt":
810
+ rho_s_helper += round(amounts_mineralogy[mineral][n] * data_montmorillonite["rho"], 3)
811
+ bulkmod_helper += round(bulk_factor*amounts_mineralogy[mineral][n] * data_montmorillonite["K"], 3)
812
+ shearmod_helper += round(shear_factor * amounts_mineralogy[mineral][n] * data_montmorillonite["G"], 3)
813
+ gr_helper += round(amounts_mineralogy[mineral][n] * data_montmorillonite["GR"], 3)
814
+ pe_helper += round(amounts_mineralogy[mineral][n] * data_montmorillonite["PE"], 3)
815
+ elif mineral == "Pl":
816
+ rho_s_helper += round(amounts_mineralogy[mineral][n] * data_plagioclase["rho"], 3)
817
+ bulkmod_helper += round(bulk_factor*amounts_mineralogy[mineral][n] * data_plagioclase["K"], 3)
818
+ shearmod_helper += round(shear_factor * amounts_mineralogy[mineral][n] * data_plagioclase["G"], 3)
819
+ gr_helper += round(amounts_mineralogy[mineral][n] * data_plagioclase["GR"], 3)
820
+ pe_helper += round(amounts_mineralogy[mineral][n] * data_plagioclase["PE"], 3)
821
+ elif mineral == "Qz":
822
+ rho_s_helper += round(amounts_mineralogy[mineral][n] * self.data_quartz["rho"], 3)
823
+ bulkmod_helper += round(bulk_factor*amounts_mineralogy[mineral][n] * self.data_quartz["K"], 3)
824
+ shearmod_helper += round(shear_factor * amounts_mineralogy[mineral][n] * self.data_quartz["G"], 3)
825
+ gr_helper += round(amounts_mineralogy[mineral][n] * self.data_quartz["GR"], 3)
826
+ pe_helper += round(amounts_mineralogy[mineral][n] * self.data_quartz["PE"], 3)
827
+ #
828
+ rho_helper = round((1 - phi_helper) * rho_s_helper + phi_helper * self.data_water[2] / 1000, 3)
829
+ youngsmod_helper = round(
830
+ (9 * bulkmod_helper * shearmod_helper) / (3 * bulkmod_helper + shearmod_helper), 3)
831
+ poisson_helper = round(
832
+ (3 * bulkmod_helper - 2 * shearmod_helper) / (6 * bulkmod_helper + 2 * shearmod_helper), 3)
833
+ vP_helper = round(
834
+ ((bulkmod_helper * 10 ** 9 + 4 / 3 * shearmod_helper * 10 ** 9) / (rho_helper)) ** 0.5, 3)
835
+ vS_helper = round(((shearmod_helper * 10 ** 9) / (rho_helper)) ** 0.5, 3)
836
+ vPvS_helper_helper = round(vP_helper / vS_helper, 3)
837
+ #
838
+ bulk_properties["rho_s"].append(round(rho_s_helper, 3))
839
+ bulk_properties["rho"].append(rho_helper)
840
+ bulk_properties["K"].append(round(bulkmod_helper, 3))
841
+ bulk_properties["G"].append(round(shearmod_helper, 3))
842
+ bulk_properties["E"].append(youngsmod_helper)
843
+ bulk_properties["nu"].append(poisson_helper)
844
+ bulk_properties["vP"].append(vP_helper)
845
+ bulk_properties["vS"].append(vS_helper)
846
+ bulk_properties["vPvS"].append(vPvS_helper_helper)
847
+ bulk_properties["GR"].append(round(gr_helper, 3))
848
+ bulk_properties["PE"].append(round(pe_helper, 3))
849
+ bulk_properties["phi"].append(round(phi_helper, 3))
850
+ n += 1
851
+ #
852
+ results = {}
853
+ results["rock"] = "Marl"
854
+ if number > 1:
855
+ results["mineralogy"] = amounts_mineralogy
856
+ results["chemistry"] = amounts_chemistry
857
+ results["phi"] = bulk_properties["phi"]
858
+ results["fluid"] = "water"
859
+ results["rho_s"] = bulk_properties["rho_s"]
860
+ results["rho"] = bulk_properties["rho"]
861
+ results["vP"] = bulk_properties["vP"]
862
+ results["vS"] = bulk_properties["vS"]
863
+ results["vP/vS"] = bulk_properties["vPvS"]
864
+ results["K"] = bulk_properties["K"]
865
+ results["G"] = bulk_properties["G"]
866
+ results["E"] = bulk_properties["E"]
867
+ results["nu"] = bulk_properties["nu"]
868
+ results["GR"] = bulk_properties["GR"]
869
+ results["PE"] = bulk_properties["PE"]
870
+ else:
871
+ single_amounts_mineralogy = {}
872
+ single_amounts_chemistry = {}
873
+ for mineral, value in amounts_mineralogy.items():
874
+ single_amounts_mineralogy[mineral] = value[0]
875
+ for element, value in amounts_chemistry.items():
876
+ single_amounts_chemistry[element] = value[0]
877
+ results["mineralogy"] = single_amounts_mineralogy
878
+ results["chemistry"] = single_amounts_chemistry
879
+ results["phi"] = bulk_properties["phi"][0]
880
+ results["fluid"] = "water"
881
+ results["rho_s"] = bulk_properties["rho_s"][0]
882
+ results["rho"] = bulk_properties["rho"][0]
883
+ results["vP"] = bulk_properties["vP"][0]
884
+ results["vS"] = bulk_properties["vS"][0]
885
+ results["vP/vS"] = bulk_properties["vPvS"][0]
886
+ results["K"] = bulk_properties["K"][0]
887
+ results["G"] = bulk_properties["G"][0]
888
+ results["E"] = bulk_properties["E"][0]
889
+ results["nu"] = bulk_properties["nu"][0]
890
+ results["GR"] = bulk_properties["GR"][0]
891
+ results["PE"] = bulk_properties["PE"][0]
892
+ #
893
+ return results
894
+ #
895
+ ## TEST
896
+ # print("Test: Marl")
897
+ # start = time.process_time()
898
+ # print(SedimentaryRocks(fluid="water", actualThickness=0).create_marl(number=1))
899
+ # end = time.process_time()
900
+ # print("Time:", round(end - start, 3))
901
+ # start = time.process_time()
902
+ # print(SedimentaryRocks(fluid="water", actualThickness=0).create_marl(number=10))
903
+ # end = time.process_time()
904
+ # print("Time:", round(end - start, 3))
905
+ # start = time.process_time()
906
+ # print(SedimentaryRocks(fluid="water", actualThickness=0).create_marl(number=100))
907
+ # end = time.process_time()
908
+ # print("Time:", round(end - start, 3))