rock-physics-open 0.3.2__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 (145) hide show
  1. rock_physics_open/__init__.py +0 -0
  2. rock_physics_open/equinor_utilities/__init__.py +0 -0
  3. rock_physics_open/equinor_utilities/anisotropy.py +211 -0
  4. rock_physics_open/equinor_utilities/classification_functions/__init__.py +17 -0
  5. rock_physics_open/equinor_utilities/classification_functions/class_stats.py +68 -0
  6. rock_physics_open/equinor_utilities/classification_functions/lin_class.py +53 -0
  7. rock_physics_open/equinor_utilities/classification_functions/mahal_class.py +63 -0
  8. rock_physics_open/equinor_utilities/classification_functions/norm_class.py +73 -0
  9. rock_physics_open/equinor_utilities/classification_functions/poly_class.py +45 -0
  10. rock_physics_open/equinor_utilities/classification_functions/post_prob.py +27 -0
  11. rock_physics_open/equinor_utilities/classification_functions/two_step_classification.py +60 -0
  12. rock_physics_open/equinor_utilities/conversions.py +10 -0
  13. rock_physics_open/equinor_utilities/gen_utilities/__init__.py +11 -0
  14. rock_physics_open/equinor_utilities/gen_utilities/dict_to_float.py +38 -0
  15. rock_physics_open/equinor_utilities/gen_utilities/dim_check_vector.py +113 -0
  16. rock_physics_open/equinor_utilities/gen_utilities/filter_input.py +131 -0
  17. rock_physics_open/equinor_utilities/gen_utilities/filter_output.py +88 -0
  18. rock_physics_open/equinor_utilities/machine_learning_utilities/__init__.py +15 -0
  19. rock_physics_open/equinor_utilities/machine_learning_utilities/base_pressure_model.py +170 -0
  20. rock_physics_open/equinor_utilities/machine_learning_utilities/dummy_vars.py +53 -0
  21. rock_physics_open/equinor_utilities/machine_learning_utilities/exponential_model.py +137 -0
  22. rock_physics_open/equinor_utilities/machine_learning_utilities/import_ml_models.py +77 -0
  23. rock_physics_open/equinor_utilities/machine_learning_utilities/polynomial_model.py +132 -0
  24. rock_physics_open/equinor_utilities/machine_learning_utilities/run_regression.py +209 -0
  25. rock_physics_open/equinor_utilities/machine_learning_utilities/sigmoidal_model.py +241 -0
  26. rock_physics_open/equinor_utilities/optimisation_utilities/__init__.py +19 -0
  27. rock_physics_open/equinor_utilities/optimisation_utilities/opt_subst_utilities.py +455 -0
  28. rock_physics_open/equinor_utilities/snapshot_test_utilities/__init__.py +10 -0
  29. rock_physics_open/equinor_utilities/snapshot_test_utilities/compare_snapshots.py +184 -0
  30. rock_physics_open/equinor_utilities/snapshot_test_utilities/snapshots.py +97 -0
  31. rock_physics_open/equinor_utilities/std_functions/__init__.py +43 -0
  32. rock_physics_open/equinor_utilities/std_functions/backus_ave.py +68 -0
  33. rock_physics_open/equinor_utilities/std_functions/dvorkin_nur.py +77 -0
  34. rock_physics_open/equinor_utilities/std_functions/gassmann.py +165 -0
  35. rock_physics_open/equinor_utilities/std_functions/hashin_shtrikman.py +224 -0
  36. rock_physics_open/equinor_utilities/std_functions/hertz_mindlin.py +51 -0
  37. rock_physics_open/equinor_utilities/std_functions/moduli_velocity.py +67 -0
  38. rock_physics_open/equinor_utilities/std_functions/reflection_eq.py +120 -0
  39. rock_physics_open/equinor_utilities/std_functions/rho.py +69 -0
  40. rock_physics_open/equinor_utilities/std_functions/voigt_reuss_hill.py +149 -0
  41. rock_physics_open/equinor_utilities/std_functions/walton.py +45 -0
  42. rock_physics_open/equinor_utilities/std_functions/wood_brie.py +94 -0
  43. rock_physics_open/equinor_utilities/various_utilities/Equinor_logo.gif +0 -0
  44. rock_physics_open/equinor_utilities/various_utilities/Equinor_logo.ico +0 -0
  45. rock_physics_open/equinor_utilities/various_utilities/__init__.py +24 -0
  46. rock_physics_open/equinor_utilities/various_utilities/display_result_statistics.py +90 -0
  47. rock_physics_open/equinor_utilities/various_utilities/gassmann_dry_mod.py +56 -0
  48. rock_physics_open/equinor_utilities/various_utilities/gassmann_mod.py +56 -0
  49. rock_physics_open/equinor_utilities/various_utilities/gassmann_sub_mod.py +64 -0
  50. rock_physics_open/equinor_utilities/various_utilities/hs_average.py +59 -0
  51. rock_physics_open/equinor_utilities/various_utilities/pressure.py +96 -0
  52. rock_physics_open/equinor_utilities/various_utilities/reflectivity.py +101 -0
  53. rock_physics_open/equinor_utilities/various_utilities/timeshift.py +104 -0
  54. rock_physics_open/equinor_utilities/various_utilities/vp_vs_rho_set_statistics.py +170 -0
  55. rock_physics_open/equinor_utilities/various_utilities/vrh_3_min.py +83 -0
  56. rock_physics_open/fluid_models/__init__.py +9 -0
  57. rock_physics_open/fluid_models/brine_model/__init__.py +5 -0
  58. rock_physics_open/fluid_models/brine_model/brine_properties.py +178 -0
  59. rock_physics_open/fluid_models/gas_model/__init__.py +5 -0
  60. rock_physics_open/fluid_models/gas_model/gas_properties.py +319 -0
  61. rock_physics_open/fluid_models/oil_model/__init__.py +5 -0
  62. rock_physics_open/fluid_models/oil_model/dead_oil_density.py +65 -0
  63. rock_physics_open/fluid_models/oil_model/dead_oil_velocity.py +30 -0
  64. rock_physics_open/fluid_models/oil_model/live_oil_density.py +82 -0
  65. rock_physics_open/fluid_models/oil_model/live_oil_velocity.py +24 -0
  66. rock_physics_open/fluid_models/oil_model/oil_bubble_point.py +69 -0
  67. rock_physics_open/fluid_models/oil_model/oil_properties.py +146 -0
  68. rock_physics_open/sandstone_models/__init__.py +59 -0
  69. rock_physics_open/sandstone_models/cemented_shalysand_sandyshale_models.py +304 -0
  70. rock_physics_open/sandstone_models/constant_cement_models.py +204 -0
  71. rock_physics_open/sandstone_models/constant_cement_optimisation.py +125 -0
  72. rock_physics_open/sandstone_models/contact_cement_model.py +138 -0
  73. rock_physics_open/sandstone_models/curvefit_sandstone_models.py +143 -0
  74. rock_physics_open/sandstone_models/friable_models.py +177 -0
  75. rock_physics_open/sandstone_models/friable_optimisation.py +115 -0
  76. rock_physics_open/sandstone_models/friable_shalysand_sandyshale_models.py +235 -0
  77. rock_physics_open/sandstone_models/patchy_cement_fluid_substitution_model.py +477 -0
  78. rock_physics_open/sandstone_models/patchy_cement_model.py +384 -0
  79. rock_physics_open/sandstone_models/patchy_cement_optimisation.py +254 -0
  80. rock_physics_open/sandstone_models/unresolved_cemented_sandshale_models.py +134 -0
  81. rock_physics_open/sandstone_models/unresolved_friable_sandshale_models.py +126 -0
  82. rock_physics_open/shale_models/__init__.py +19 -0
  83. rock_physics_open/shale_models/dem.py +174 -0
  84. rock_physics_open/shale_models/dem_dual_por.py +61 -0
  85. rock_physics_open/shale_models/kus_tok.py +59 -0
  86. rock_physics_open/shale_models/multi_sca.py +133 -0
  87. rock_physics_open/shale_models/pq.py +102 -0
  88. rock_physics_open/shale_models/sca.py +90 -0
  89. rock_physics_open/shale_models/shale4_mineral.py +147 -0
  90. rock_physics_open/shale_models/shale4_mineral_dem_overlay.py +92 -0
  91. rock_physics_open/span_wagner/__init__.py +5 -0
  92. rock_physics_open/span_wagner/co2_properties.py +444 -0
  93. rock_physics_open/span_wagner/coefficients.py +165 -0
  94. rock_physics_open/span_wagner/equations.py +104 -0
  95. rock_physics_open/span_wagner/tables/__init__.py +0 -0
  96. rock_physics_open/span_wagner/tables/carbon_dioxide_density.npz +0 -0
  97. rock_physics_open/span_wagner/tables/lookup_table.py +33 -0
  98. rock_physics_open/t_matrix_models/Equinor_logo.ico +0 -0
  99. rock_physics_open/t_matrix_models/__init__.py +35 -0
  100. rock_physics_open/t_matrix_models/carbonate_pressure_substitution.py +124 -0
  101. rock_physics_open/t_matrix_models/curvefit_t_matrix_exp.py +123 -0
  102. rock_physics_open/t_matrix_models/curvefit_t_matrix_min.py +86 -0
  103. rock_physics_open/t_matrix_models/parse_t_matrix_inputs.py +297 -0
  104. rock_physics_open/t_matrix_models/run_t_matrix.py +243 -0
  105. rock_physics_open/t_matrix_models/t_matrix_C.py +210 -0
  106. rock_physics_open/t_matrix_models/t_matrix_opt_fluid_sub_exp.py +137 -0
  107. rock_physics_open/t_matrix_models/t_matrix_opt_fluid_sub_petec.py +167 -0
  108. rock_physics_open/t_matrix_models/t_matrix_opt_forward_model_exp.py +76 -0
  109. rock_physics_open/t_matrix_models/t_matrix_opt_forward_model_min.py +89 -0
  110. rock_physics_open/t_matrix_models/t_matrix_parameter_optimisation_exp.py +176 -0
  111. rock_physics_open/t_matrix_models/t_matrix_parameter_optimisation_min.py +162 -0
  112. rock_physics_open/t_matrix_models/t_matrix_vector/__init__.py +12 -0
  113. rock_physics_open/t_matrix_models/t_matrix_vector/array_functions.py +75 -0
  114. rock_physics_open/t_matrix_models/t_matrix_vector/calc_c_eff.py +163 -0
  115. rock_physics_open/t_matrix_models/t_matrix_vector/calc_isolated.py +95 -0
  116. rock_physics_open/t_matrix_models/t_matrix_vector/calc_kd.py +40 -0
  117. rock_physics_open/t_matrix_models/t_matrix_vector/calc_kd_eff.py +116 -0
  118. rock_physics_open/t_matrix_models/t_matrix_vector/calc_kd_uuv.py +18 -0
  119. rock_physics_open/t_matrix_models/t_matrix_vector/calc_pressure.py +140 -0
  120. rock_physics_open/t_matrix_models/t_matrix_vector/calc_t.py +71 -0
  121. rock_physics_open/t_matrix_models/t_matrix_vector/calc_td.py +42 -0
  122. rock_physics_open/t_matrix_models/t_matrix_vector/calc_theta.py +43 -0
  123. rock_physics_open/t_matrix_models/t_matrix_vector/calc_x.py +33 -0
  124. rock_physics_open/t_matrix_models/t_matrix_vector/calc_z.py +50 -0
  125. rock_physics_open/t_matrix_models/t_matrix_vector/check_and_tile.py +43 -0
  126. rock_physics_open/t_matrix_models/t_matrix_vector/g_tensor.py +140 -0
  127. rock_physics_open/t_matrix_models/t_matrix_vector/iso_av.py +60 -0
  128. rock_physics_open/t_matrix_models/t_matrix_vector/iso_ave_all.py +55 -0
  129. rock_physics_open/t_matrix_models/t_matrix_vector/pressure_input.py +44 -0
  130. rock_physics_open/t_matrix_models/t_matrix_vector/t_matrix_vec.py +278 -0
  131. rock_physics_open/t_matrix_models/t_matrix_vector/velocity_vti_angles.py +81 -0
  132. rock_physics_open/t_matrix_models/tmatrix_python.dll +0 -0
  133. rock_physics_open/t_matrix_models/tmatrix_python.so +0 -0
  134. rock_physics_open/ternary_plots/__init__.py +3 -0
  135. rock_physics_open/ternary_plots/gen_ternary_plot.py +73 -0
  136. rock_physics_open/ternary_plots/shale_prop_ternary.py +337 -0
  137. rock_physics_open/ternary_plots/ternary_patches.py +277 -0
  138. rock_physics_open/ternary_plots/ternary_plot_utilities.py +197 -0
  139. rock_physics_open/ternary_plots/unconventionals_ternary.py +75 -0
  140. rock_physics_open/version.py +34 -0
  141. rock_physics_open-0.3.2.dist-info/METADATA +90 -0
  142. rock_physics_open-0.3.2.dist-info/RECORD +145 -0
  143. rock_physics_open-0.3.2.dist-info/WHEEL +5 -0
  144. rock_physics_open-0.3.2.dist-info/licenses/LICENSE +165 -0
  145. rock_physics_open-0.3.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,241 @@
1
+ import pickle
2
+ from typing import Any, Self, final
3
+
4
+ import numpy as np
5
+ from typing_extensions import override
6
+
7
+ from .base_pressure_model import BasePressureModel
8
+
9
+
10
+ @final
11
+ class SigmoidalPressureModel(BasePressureModel):
12
+ """
13
+ Sigmoidal pressure sensitivity model for velocity prediction.
14
+
15
+ Uses nested sigmoid functions: velocity amplitude varies with porosity,
16
+ and velocity varies sigmoidally with effective pressure using the amplitude.
17
+
18
+ Input format (n,3): [porosity, p_eff_in_situ, p_eff_depleted]
19
+
20
+ The model applies two sigmoid transformations:
21
+ 1. Porosity -> velocity amplitude using phi_model parameters
22
+ 2. Effective pressure -> velocity using p_eff_model parameters and amplitude
23
+ """
24
+
25
+ def __init__(
26
+ self,
27
+ phi_amplitude: float,
28
+ phi_median_point: float,
29
+ phi_x_scaling: float,
30
+ phi_bias: float,
31
+ p_eff_median_point: float,
32
+ p_eff_x_scaling: float,
33
+ p_eff_bias: float,
34
+ model_max_pressure: float | None = None,
35
+ description: str = "",
36
+ ):
37
+ """
38
+ Initialize sigmoidal pressure model.
39
+
40
+ Parameters
41
+ ----------
42
+ phi_amplitude : float
43
+ Amplitude parameter for porosity sigmoid [m/s].
44
+ phi_median_point : float
45
+ Median point for porosity sigmoid [fraction].
46
+ phi_x_scaling : float
47
+ X-scaling parameter for porosity sigmoid [unitless].
48
+ phi_bias : float
49
+ Bias parameter for porosity sigmoid [m/s].
50
+ p_eff_median_point : float
51
+ Median point for pressure sigmoid [Pa].
52
+ p_eff_x_scaling : float
53
+ X-scaling parameter for pressure sigmoid [1/Pa].
54
+ p_eff_bias : float
55
+ Bias parameter for pressure sigmoid [m/s].
56
+ model_max_pressure : float | None
57
+ Maximum pressure for predict_max method [Pa].
58
+ description : str
59
+ Model description.
60
+ """
61
+ super().__init__(model_max_pressure, description)
62
+ # Porosity model parameters
63
+ self._phi_amplitude = phi_amplitude
64
+ self._phi_median_point = phi_median_point
65
+ self._phi_x_scaling = phi_x_scaling
66
+ self._phi_bias = phi_bias
67
+ # Pressure model parameters
68
+ self._p_eff_median_point = p_eff_median_point
69
+ self._p_eff_x_scaling = p_eff_x_scaling
70
+ self._p_eff_bias = p_eff_bias
71
+
72
+ @property
73
+ def phi_amplitude(self) -> float:
74
+ """Porosity sigmoid amplitude."""
75
+ return self._phi_amplitude
76
+
77
+ @property
78
+ def phi_median_point(self) -> float:
79
+ """Porosity sigmoid median point."""
80
+ return self._phi_median_point
81
+
82
+ @property
83
+ def phi_x_scaling(self) -> float:
84
+ """Porosity sigmoid x-scaling."""
85
+ return self._phi_x_scaling
86
+
87
+ @property
88
+ def phi_bias(self) -> float:
89
+ """Porosity sigmoid bias."""
90
+ return self._phi_bias
91
+
92
+ @property
93
+ def p_eff_median_point(self) -> float:
94
+ """Pressure sigmoid median point."""
95
+ return self._p_eff_median_point
96
+
97
+ @property
98
+ def p_eff_x_scaling(self) -> float:
99
+ """Pressure sigmoid x-scaling."""
100
+ return self._p_eff_x_scaling
101
+
102
+ @property
103
+ def p_eff_bias(self) -> float:
104
+ """Pressure sigmoid bias."""
105
+ return self._p_eff_bias
106
+
107
+ @override
108
+ def validate_input(self, inp_arr: np.ndarray) -> np.ndarray:
109
+ """
110
+ Validate input for sigmoidal model.
111
+
112
+ Parameters
113
+ ----------
114
+ inp_arr : np.ndarray
115
+ Input array to validate.
116
+
117
+ Returns
118
+ -------
119
+ np.ndarray
120
+ Validated input array.
121
+
122
+ Raises
123
+ ------
124
+ ValueError
125
+ If input format is invalid.
126
+ """
127
+ if not isinstance(inp_arr, np.ndarray): # pyright: ignore[reportUnnecessaryIsInstance] | Kept for backward compatibility
128
+ raise ValueError("Input must be numpy ndarray.") # pyright: ignore[reportUnreachable] | Kept for backward compatibility
129
+ if inp_arr.ndim != 2 or inp_arr.shape[1] != 3:
130
+ raise ValueError(
131
+ "Input must be (n,3): [porosity, p_eff_in_situ, p_eff_depleted]"
132
+ )
133
+ return inp_arr
134
+
135
+ def _sigmoid_phi(self, phi: np.ndarray) -> np.ndarray:
136
+ """
137
+ Calculate velocity amplitude from porosity using sigmoid function.
138
+
139
+ Parameters
140
+ ----------
141
+ phi : np.ndarray
142
+ Porosity values [fraction].
143
+
144
+ Returns
145
+ -------
146
+ np.ndarray
147
+ Velocity amplitude values [m/s].
148
+ """
149
+ return (
150
+ self._phi_amplitude
151
+ / (1 + np.exp(-self._phi_x_scaling * (phi - self._phi_median_point)))
152
+ + self._phi_bias
153
+ )
154
+
155
+ def _sigmoid_p_eff(self, p_eff: np.ndarray, amplitude: np.ndarray) -> np.ndarray:
156
+ """
157
+ Calculate velocity from effective pressure using sigmoid function with amplitude.
158
+
159
+ Parameters
160
+ ----------
161
+ p_eff : np.ndarray
162
+ Effective pressure values [Pa].
163
+ amplitude : np.ndarray
164
+ Velocity amplitude values [m/s].
165
+
166
+ Returns
167
+ -------
168
+ np.ndarray
169
+ Velocity values [m/s].
170
+ """
171
+ return (
172
+ amplitude
173
+ / (1 + np.exp(-self._p_eff_x_scaling * (p_eff - self._p_eff_median_point)))
174
+ + self._p_eff_bias
175
+ )
176
+
177
+ @override
178
+ def predict_abs(self, inp_arr: np.ndarray, case: str = "in_situ") -> np.ndarray:
179
+ """
180
+ Calculate absolute velocity for specified pressure case.
181
+
182
+ Parameters
183
+ ----------
184
+ inp_arr : np.ndarray
185
+ Validated input array (n,3).
186
+ case : str
187
+ Pressure case: "in_situ" or "depleted".
188
+
189
+ Returns
190
+ -------
191
+ np.ndarray
192
+ Velocity values [m/s].
193
+ """
194
+ arr = self.validate_input(inp_arr)
195
+
196
+ phi = arr[:, 0]
197
+ p_in_situ = arr[:, 1]
198
+ p_depleted = arr[:, 2]
199
+
200
+ # Calculate velocity amplitude from porosity
201
+ velocity_amplitude = self._sigmoid_phi(phi)
202
+
203
+ # Select pressure based on case
204
+ p_eff = p_in_situ if case == "in_situ" else p_depleted
205
+
206
+ # Calculate velocity from effective pressure and amplitude
207
+ return self._sigmoid_p_eff(p_eff, velocity_amplitude)
208
+
209
+ @override
210
+ def todict(self) -> dict[str, Any]:
211
+ """Convert model to dictionary."""
212
+ return {
213
+ "phi_amplitude": self._phi_amplitude,
214
+ "phi_median_point": self._phi_median_point,
215
+ "phi_x_scaling": self._phi_x_scaling,
216
+ "phi_bias": self._phi_bias,
217
+ "p_eff_median_point": self._p_eff_median_point,
218
+ "p_eff_x_scaling": self._p_eff_x_scaling,
219
+ "p_eff_bias": self._p_eff_bias,
220
+ "model_max_pressure": self._model_max_pressure,
221
+ "description": self._description,
222
+ }
223
+
224
+ @override
225
+ @classmethod
226
+ def load(cls, file: str | bytes) -> Self:
227
+ """Load sigmoidal model from pickle file."""
228
+ with open(file, "rb") as f_in:
229
+ d = pickle.load(f_in)
230
+
231
+ return cls(
232
+ phi_amplitude=d["phi_amplitude"],
233
+ phi_median_point=d["phi_median_point"],
234
+ phi_x_scaling=d["phi_x_scaling"],
235
+ phi_bias=d["phi_bias"],
236
+ p_eff_median_point=d["p_eff_median_point"],
237
+ p_eff_x_scaling=d["p_eff_x_scaling"],
238
+ p_eff_bias=d["p_eff_bias"],
239
+ model_max_pressure=d["model_max_pressure"],
240
+ description=d["description"],
241
+ )
@@ -0,0 +1,19 @@
1
+ from .opt_subst_utilities import (
2
+ gen_mod_routine,
3
+ gen_opt_routine,
4
+ gen_sub_routine,
5
+ load_opt_params,
6
+ opt_param_info,
7
+ opt_param_to_ascii,
8
+ save_opt_params,
9
+ )
10
+
11
+ __all__ = [
12
+ "gen_mod_routine",
13
+ "gen_sub_routine",
14
+ "gen_opt_routine",
15
+ "opt_param_to_ascii",
16
+ "opt_param_info",
17
+ "save_opt_params",
18
+ "load_opt_params",
19
+ ]