detectability 0.2.1__tar.gz
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.
- detectability-0.2.1/LICENSE +28 -0
- detectability-0.2.1/PKG-INFO +166 -0
- detectability-0.2.1/README.md +133 -0
- detectability-0.2.1/pyproject.toml +48 -0
- detectability-0.2.1/setup.cfg +4 -0
- detectability-0.2.1/src/detectability/__init__.py +7 -0
- detectability-0.2.1/src/detectability/constants.py +6 -0
- detectability-0.2.1/src/detectability/data/harmonica_reference.json +589 -0
- detectability-0.2.1/src/detectability/data/igrf14coeffs.txt +199 -0
- detectability-0.2.1/src/detectability/detect.py +149 -0
- detectability-0.2.1/src/detectability/gravity.py +266 -0
- detectability-0.2.1/src/detectability/igrf.py +163 -0
- detectability-0.2.1/src/detectability/magnetics.py +199 -0
- detectability-0.2.1/src/detectability/rocks.py +68 -0
- detectability-0.2.1/src/detectability/survey.py +323 -0
- detectability-0.2.1/src/detectability/validation.py +404 -0
- detectability-0.2.1/src/detectability.egg-info/PKG-INFO +166 -0
- detectability-0.2.1/src/detectability.egg-info/SOURCES.txt +25 -0
- detectability-0.2.1/src/detectability.egg-info/dependency_links.txt +1 -0
- detectability-0.2.1/src/detectability.egg-info/requires.txt +7 -0
- detectability-0.2.1/src/detectability.egg-info/top_level.txt +1 -0
- detectability-0.2.1/tests/test_detect.py +73 -0
- detectability-0.2.1/tests/test_gravity.py +166 -0
- detectability-0.2.1/tests/test_igrf.py +38 -0
- detectability-0.2.1/tests/test_magnetics.py +176 -0
- detectability-0.2.1/tests/test_survey.py +77 -0
- detectability-0.2.1/tests/test_validation.py +28 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
BSD 3-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026, Mükremin Nergiz
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
|
7
|
+
|
|
8
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
9
|
+
list of conditions and the following disclaimer.
|
|
10
|
+
|
|
11
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
12
|
+
this list of conditions and the following disclaimer in the documentation
|
|
13
|
+
and/or other materials provided with the distribution.
|
|
14
|
+
|
|
15
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
16
|
+
contributors may be used to endorse or promote products derived from
|
|
17
|
+
this software without specific prior written permission.
|
|
18
|
+
|
|
19
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
20
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
21
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
22
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
23
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
24
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
25
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
26
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
27
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
28
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: detectability
|
|
3
|
+
Version: 0.2.1
|
|
4
|
+
Summary: Pre-survey detectability, modelled and reproducible: forward-modelled gravity and magnetic responses, station spacing and a detectability verdict for near-surface targets.
|
|
5
|
+
Author: Mükremin Nergiz
|
|
6
|
+
License-Expression: BSD-3-Clause
|
|
7
|
+
Project-URL: Homepage, https://detectability.mukreminnergiz.com
|
|
8
|
+
Project-URL: Documentation, https://detectability.mukreminnergiz.com/method
|
|
9
|
+
Project-URL: Validation, https://detectability.mukreminnergiz.com/validation
|
|
10
|
+
Project-URL: Repository, https://github.com/mukremin-nergiz/detectability
|
|
11
|
+
Project-URL: Issues, https://github.com/mukremin-nergiz/detectability/issues
|
|
12
|
+
Project-URL: Citation, https://doi.org/10.5281/zenodo.23931815
|
|
13
|
+
Keywords: geophysics,gravity,magnetics,survey design,near-surface,forward modelling,IGRF
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Intended Audience :: Science/Research
|
|
16
|
+
Classifier: Intended Audience :: Education
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Topic :: Scientific/Engineering :: Physics
|
|
24
|
+
Requires-Python: >=3.10
|
|
25
|
+
Description-Content-Type: text/markdown
|
|
26
|
+
License-File: LICENSE
|
|
27
|
+
Requires-Dist: numpy>=1.24
|
|
28
|
+
Provides-Extra: test
|
|
29
|
+
Requires-Dist: pytest>=7; extra == "test"
|
|
30
|
+
Provides-Extra: validation
|
|
31
|
+
Requires-Dist: harmonica==0.7.0; extra == "validation"
|
|
32
|
+
Dynamic: license-file
|
|
33
|
+
|
|
34
|
+
# Detectability
|
|
35
|
+
|
|
36
|
+
[](https://github.com/mukremin-nergiz/detectability/actions/workflows/tests.yml)
|
|
37
|
+
[](https://github.com/mukremin-nergiz/detectability/blob/main/LICENSE)
|
|
38
|
+
[](https://doi.org/10.5281/zenodo.23931815)
|
|
39
|
+
|
|
40
|
+
**Pre-survey detectability, modelled and reproducible.** Describe a buried target and a survey. Detectability models the gravity and
|
|
41
|
+
magnetic response of the target, compares it with instrument and field noise, and gives a verdict for each method
|
|
42
|
+
(clearly detectable, marginal, not detectable), with the recommended station spacing and profile length, every
|
|
43
|
+
assumption, and a Python script that reproduces the result.
|
|
44
|
+
|
|
45
|
+
- Web tool: <https://detectability.mukreminnergiz.com>
|
|
46
|
+
- Method and validation: <https://detectability.mukreminnergiz.com/method>
|
|
47
|
+
|
|
48
|
+
## Install
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
pip install detectability
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Python 3.10 or newer; the only dependency is NumPy. The development version: `pip install "git+https://github.com/mukremin-nergiz/detectability"`.
|
|
55
|
+
|
|
56
|
+
## Example
|
|
57
|
+
|
|
58
|
+
A 20 m air-filled cave whose top is 15 m deep in limestone, surveyed near Sivas, Türkiye:
|
|
59
|
+
|
|
60
|
+
```python
|
|
61
|
+
from detectability import evaluate
|
|
62
|
+
|
|
63
|
+
report = evaluate(
|
|
64
|
+
{"shape": "sphere", "depth_top": 15, "size": 20, "material": "air", "host": "limestone"},
|
|
65
|
+
{"latitude": 39.75, "longitude": 37.02, "date": "2026-07-01"},
|
|
66
|
+
)
|
|
67
|
+
print(report.summary())
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
```text
|
|
71
|
+
Detectability 0.2.1: sphere in limestone
|
|
72
|
+
- gravity: peak 114 µGal, noise 11.2 µGal, S/N 10.2: clearly detectable
|
|
73
|
+
stations every 5 m or less, profile at least 153 m long
|
|
74
|
+
- magnetic: peak 0.462 nT, noise 2 nT, S/N 0.231: not detectable
|
|
75
|
+
Recommended method: gravity
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
`report.script()` returns a standalone script that recomputes the report; `report.to_dict()` gives the full result,
|
|
79
|
+
including the modelled profiles and the assumptions.
|
|
80
|
+
|
|
81
|
+
Target shapes: `sphere`, `horizontal_cylinder`, `vertical_cylinder`, `prism`, `dyke` (any dip) and `contact`. The main
|
|
82
|
+
geomagnetic field comes from IGRF-14 for the survey location and date. Typical densities and susceptibilities are built
|
|
83
|
+
in, and measured contrasts can be given instead.
|
|
84
|
+
|
|
85
|
+
## Modules
|
|
86
|
+
|
|
87
|
+
| Module | Contents |
|
|
88
|
+
|---|---|
|
|
89
|
+
| `survey` | `evaluate()`: target and survey in, report and reproduction script out |
|
|
90
|
+
| `gravity` | sphere, horizontal cylinder, right rectangular prism (Nagy; Plouff) and its gradient tensor, vertical cylinder (exact, by a rim integral) and its gradient tensor, vertical step, dyke, 2D polygon (Talwani; Won & Bevis) |
|
|
91
|
+
| `magnetics` | total-field anomaly: sphere, horizontal cylinder, prism, vertical cylinder, 2D polygon, dyke (any dip), vertical contact; induced and remanent magnetisation |
|
|
92
|
+
| `igrf` | IGRF-14 main field from location and date, from the official IAGA coefficients |
|
|
93
|
+
| `rocks` | typical densities and magnetic susceptibilities with their ranges (Telford et al. 1990) |
|
|
94
|
+
| `detect` | instrument and field noise, signal-to-noise ratio, verdict, station spacing, profile length |
|
|
95
|
+
|
|
96
|
+
## Validation
|
|
97
|
+
|
|
98
|
+
Every model is checked against a result computed in a different way. Each row below is also a test: it fails if the
|
|
99
|
+
error exceeds the tolerance. The error is the largest difference along the profile as a percentage of the largest
|
|
100
|
+
reference value. Figures for each row: <https://detectability.mukreminnergiz.com/validation>.
|
|
101
|
+
|
|
102
|
+
The "Independent code" rows compare with [Harmonica](https://www.fatiando.org/harmonica) 0.7.0 (Fatiando a Terra
|
|
103
|
+
Project, [doi:10.5281/zenodo.13308312](https://doi.org/10.5281/zenodo.13308312)), a separate open-source package. Its
|
|
104
|
+
values are stored in `src/detectability/data/harmonica_reference.json`, so the library does not depend on it; to
|
|
105
|
+
recompute and check them:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
pip install -e ".[validation]"
|
|
109
|
+
python tools/harmonica_reference.py --check
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
| Check | Geometry and method | Reference | Max. relative error | Tolerance |
|
|
113
|
+
|---|---|---|---:|---:|
|
|
114
|
+
| Analytical limit | Prism, gravity, far from the sensor | Point mass of the same mass | 1.9e-05 % | 0.01 % |
|
|
115
|
+
| Analytical limit | Prism, gravity, wide and thin | Infinite Bouguer slab, 2πGΔρt | 0.0099 % | 0.1 % |
|
|
116
|
+
| Analytical limit | Vertical step, gravity, far over the slab | Infinite Bouguer slab, 2πGΔρt | 4.8e-04 % | 0.01 % |
|
|
117
|
+
| Analytical limit | Vertical cylinder, gravity, on its axis | Exact on-axis cylinder formula | 1.7e-13 % | 1.0e-10 % |
|
|
118
|
+
| Independent formula | Horizontal cylinder, gravity | 2D polygon, 720 sides (Talwani; Won & Bevis) | 6.3e-12 % | 0.01 % |
|
|
119
|
+
| Independent formula | Vertical dyke, gravity | 2D polygon (Won & Bevis) | 1.9e-13 % | 1.0e-06 % |
|
|
120
|
+
| Numerical integration | Prism, gravity | 16³ Gauss–Legendre point masses | 2.9e-06 % | 0.001 % |
|
|
121
|
+
| Numerical integration | Horizontal cylinder, magnetic | 3D dipoles integrated along strike | 2.2e-07 % | 0.01 % |
|
|
122
|
+
| Numerical integration | Prism, magnetic | 16³ Gauss–Legendre point dipoles | 1.3e-12 % | 0.001 % |
|
|
123
|
+
| Numerical integration | Vertical cylinder, gravity | Gauss–Legendre over the cross-section, line masses in depth | 5.5e-13 % | 1.0e-08 % |
|
|
124
|
+
| Numerical integration | Vertical cylinder, magnetic | Gauss–Legendre point dipoles over the volume | 5.8e-13 % | 1.0e-06 % |
|
|
125
|
+
| Poisson's relation | Sphere, gravity ↔ magnetic | Vertical derivative of the gravity sphere | 1.4e-08 % | 0.001 % |
|
|
126
|
+
| Poisson's relation | Vertical dyke, gravity ↔ magnetic | Vertical derivative of the gravity dyke | 2.2e-08 % | 1.0e-04 % |
|
|
127
|
+
| Poisson's relation | Dipping dyke (60°), gravity ↔ magnetic | Vertical derivative of the gravity dyke | 2.6e-08 % | 1.0e-04 % |
|
|
128
|
+
| Poisson's relation | Vertical cylinder, gravity ↔ magnetic | Vertical derivative of the gravity cylinder | 3.6e-08 % | 1.0e-04 % |
|
|
129
|
+
| Poisson's relation | Vertical contact, gravity ↔ magnetic | Vertical derivative of the gravity step | 3.9e-06 % | 1.0e-04 % |
|
|
130
|
+
| Independent code | Prism, gravity | Harmonica 0.7.0 prism_gravity | 3.0e-12 % | 1.0e-08 % |
|
|
131
|
+
| Independent code | Prism, magnetic | Harmonica 0.7.0 prism_magnetic | 4.8e-13 % | 1.0e-08 % |
|
|
132
|
+
| Independent code | Sphere, gravity | Harmonica 0.7.0 point_gravity | 3.9e-14 % | 1.0e-10 % |
|
|
133
|
+
| Independent code | Sphere, magnetic | Harmonica 0.7.0 dipole_magnetic | 8.8e-14 % | 1.0e-10 % |
|
|
134
|
+
| Independent code | Vertical dyke, gravity | Harmonica 0.7.0 prism_gravity, 200 km along strike | 3.6e-07 % | 1.0e-05 % |
|
|
135
|
+
| Independent code | Vertical dyke, magnetic | Harmonica 0.7.0 prism_magnetic, 200 km along strike | 5.1e-07 % | 1.0e-05 % |
|
|
136
|
+
| Reference service | IGRF-14 main field, 5 sites | British Geological Survey IGRF-14 | 0.38 nT, 0.0005° | 1 nT, 0.002° |
|
|
137
|
+
|
|
138
|
+
Regenerate this table with `python -m detectability.validation`. Run all tests (including these) with:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
pip install -e ".[test]"
|
|
142
|
+
pytest
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Limitations
|
|
146
|
+
|
|
147
|
+
Flat topography, a homogeneous host and no regional trend; 2D targets are infinitely long along strike; the profile
|
|
148
|
+
crosses the centre of the target; self-demagnetisation is neglected. Results are expectations under these assumptions,
|
|
149
|
+
not guarantees. Instrument presets come from manufacturers' data sheets (`detect.INSTRUMENTS` lists each figure and its
|
|
150
|
+
source); field noise, which usually dominates, is a stated assumption that you can change.
|
|
151
|
+
|
|
152
|
+
## Citation
|
|
153
|
+
|
|
154
|
+
See [CITATION.cff](https://github.com/mukremin-nergiz/detectability/blob/main/CITATION.cff), or:
|
|
155
|
+
|
|
156
|
+
> Nergiz, M. (2026). *Detectability: Pre-survey detectability, modelled and reproducible* (Version 0.2.1) [Computer software].
|
|
157
|
+
> Zenodo. https://doi.org/10.5281/zenodo.23931815
|
|
158
|
+
|
|
159
|
+
The DOI above always resolves to the latest version; each release also has its own DOI on Zenodo.
|
|
160
|
+
|
|
161
|
+
## Author
|
|
162
|
+
|
|
163
|
+
Mükremin Nergiz, Geophysical Engineer & Software Developer (Independent Researcher, Sivas, Türkiye).
|
|
164
|
+
ORCID [0009-0001-6789-2774](https://orcid.org/0009-0001-6789-2774) · <https://mukreminnergiz.com>
|
|
165
|
+
|
|
166
|
+
Licence: BSD-3-Clause.
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Detectability
|
|
2
|
+
|
|
3
|
+
[](https://github.com/mukremin-nergiz/detectability/actions/workflows/tests.yml)
|
|
4
|
+
[](https://github.com/mukremin-nergiz/detectability/blob/main/LICENSE)
|
|
5
|
+
[](https://doi.org/10.5281/zenodo.23931815)
|
|
6
|
+
|
|
7
|
+
**Pre-survey detectability, modelled and reproducible.** Describe a buried target and a survey. Detectability models the gravity and
|
|
8
|
+
magnetic response of the target, compares it with instrument and field noise, and gives a verdict for each method
|
|
9
|
+
(clearly detectable, marginal, not detectable), with the recommended station spacing and profile length, every
|
|
10
|
+
assumption, and a Python script that reproduces the result.
|
|
11
|
+
|
|
12
|
+
- Web tool: <https://detectability.mukreminnergiz.com>
|
|
13
|
+
- Method and validation: <https://detectability.mukreminnergiz.com/method>
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pip install detectability
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Python 3.10 or newer; the only dependency is NumPy. The development version: `pip install "git+https://github.com/mukremin-nergiz/detectability"`.
|
|
22
|
+
|
|
23
|
+
## Example
|
|
24
|
+
|
|
25
|
+
A 20 m air-filled cave whose top is 15 m deep in limestone, surveyed near Sivas, Türkiye:
|
|
26
|
+
|
|
27
|
+
```python
|
|
28
|
+
from detectability import evaluate
|
|
29
|
+
|
|
30
|
+
report = evaluate(
|
|
31
|
+
{"shape": "sphere", "depth_top": 15, "size": 20, "material": "air", "host": "limestone"},
|
|
32
|
+
{"latitude": 39.75, "longitude": 37.02, "date": "2026-07-01"},
|
|
33
|
+
)
|
|
34
|
+
print(report.summary())
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
Detectability 0.2.1: sphere in limestone
|
|
39
|
+
- gravity: peak 114 µGal, noise 11.2 µGal, S/N 10.2: clearly detectable
|
|
40
|
+
stations every 5 m or less, profile at least 153 m long
|
|
41
|
+
- magnetic: peak 0.462 nT, noise 2 nT, S/N 0.231: not detectable
|
|
42
|
+
Recommended method: gravity
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`report.script()` returns a standalone script that recomputes the report; `report.to_dict()` gives the full result,
|
|
46
|
+
including the modelled profiles and the assumptions.
|
|
47
|
+
|
|
48
|
+
Target shapes: `sphere`, `horizontal_cylinder`, `vertical_cylinder`, `prism`, `dyke` (any dip) and `contact`. The main
|
|
49
|
+
geomagnetic field comes from IGRF-14 for the survey location and date. Typical densities and susceptibilities are built
|
|
50
|
+
in, and measured contrasts can be given instead.
|
|
51
|
+
|
|
52
|
+
## Modules
|
|
53
|
+
|
|
54
|
+
| Module | Contents |
|
|
55
|
+
|---|---|
|
|
56
|
+
| `survey` | `evaluate()`: target and survey in, report and reproduction script out |
|
|
57
|
+
| `gravity` | sphere, horizontal cylinder, right rectangular prism (Nagy; Plouff) and its gradient tensor, vertical cylinder (exact, by a rim integral) and its gradient tensor, vertical step, dyke, 2D polygon (Talwani; Won & Bevis) |
|
|
58
|
+
| `magnetics` | total-field anomaly: sphere, horizontal cylinder, prism, vertical cylinder, 2D polygon, dyke (any dip), vertical contact; induced and remanent magnetisation |
|
|
59
|
+
| `igrf` | IGRF-14 main field from location and date, from the official IAGA coefficients |
|
|
60
|
+
| `rocks` | typical densities and magnetic susceptibilities with their ranges (Telford et al. 1990) |
|
|
61
|
+
| `detect` | instrument and field noise, signal-to-noise ratio, verdict, station spacing, profile length |
|
|
62
|
+
|
|
63
|
+
## Validation
|
|
64
|
+
|
|
65
|
+
Every model is checked against a result computed in a different way. Each row below is also a test: it fails if the
|
|
66
|
+
error exceeds the tolerance. The error is the largest difference along the profile as a percentage of the largest
|
|
67
|
+
reference value. Figures for each row: <https://detectability.mukreminnergiz.com/validation>.
|
|
68
|
+
|
|
69
|
+
The "Independent code" rows compare with [Harmonica](https://www.fatiando.org/harmonica) 0.7.0 (Fatiando a Terra
|
|
70
|
+
Project, [doi:10.5281/zenodo.13308312](https://doi.org/10.5281/zenodo.13308312)), a separate open-source package. Its
|
|
71
|
+
values are stored in `src/detectability/data/harmonica_reference.json`, so the library does not depend on it; to
|
|
72
|
+
recompute and check them:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
pip install -e ".[validation]"
|
|
76
|
+
python tools/harmonica_reference.py --check
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
| Check | Geometry and method | Reference | Max. relative error | Tolerance |
|
|
80
|
+
|---|---|---|---:|---:|
|
|
81
|
+
| Analytical limit | Prism, gravity, far from the sensor | Point mass of the same mass | 1.9e-05 % | 0.01 % |
|
|
82
|
+
| Analytical limit | Prism, gravity, wide and thin | Infinite Bouguer slab, 2πGΔρt | 0.0099 % | 0.1 % |
|
|
83
|
+
| Analytical limit | Vertical step, gravity, far over the slab | Infinite Bouguer slab, 2πGΔρt | 4.8e-04 % | 0.01 % |
|
|
84
|
+
| Analytical limit | Vertical cylinder, gravity, on its axis | Exact on-axis cylinder formula | 1.7e-13 % | 1.0e-10 % |
|
|
85
|
+
| Independent formula | Horizontal cylinder, gravity | 2D polygon, 720 sides (Talwani; Won & Bevis) | 6.3e-12 % | 0.01 % |
|
|
86
|
+
| Independent formula | Vertical dyke, gravity | 2D polygon (Won & Bevis) | 1.9e-13 % | 1.0e-06 % |
|
|
87
|
+
| Numerical integration | Prism, gravity | 16³ Gauss–Legendre point masses | 2.9e-06 % | 0.001 % |
|
|
88
|
+
| Numerical integration | Horizontal cylinder, magnetic | 3D dipoles integrated along strike | 2.2e-07 % | 0.01 % |
|
|
89
|
+
| Numerical integration | Prism, magnetic | 16³ Gauss–Legendre point dipoles | 1.3e-12 % | 0.001 % |
|
|
90
|
+
| Numerical integration | Vertical cylinder, gravity | Gauss–Legendre over the cross-section, line masses in depth | 5.5e-13 % | 1.0e-08 % |
|
|
91
|
+
| Numerical integration | Vertical cylinder, magnetic | Gauss–Legendre point dipoles over the volume | 5.8e-13 % | 1.0e-06 % |
|
|
92
|
+
| Poisson's relation | Sphere, gravity ↔ magnetic | Vertical derivative of the gravity sphere | 1.4e-08 % | 0.001 % |
|
|
93
|
+
| Poisson's relation | Vertical dyke, gravity ↔ magnetic | Vertical derivative of the gravity dyke | 2.2e-08 % | 1.0e-04 % |
|
|
94
|
+
| Poisson's relation | Dipping dyke (60°), gravity ↔ magnetic | Vertical derivative of the gravity dyke | 2.6e-08 % | 1.0e-04 % |
|
|
95
|
+
| Poisson's relation | Vertical cylinder, gravity ↔ magnetic | Vertical derivative of the gravity cylinder | 3.6e-08 % | 1.0e-04 % |
|
|
96
|
+
| Poisson's relation | Vertical contact, gravity ↔ magnetic | Vertical derivative of the gravity step | 3.9e-06 % | 1.0e-04 % |
|
|
97
|
+
| Independent code | Prism, gravity | Harmonica 0.7.0 prism_gravity | 3.0e-12 % | 1.0e-08 % |
|
|
98
|
+
| Independent code | Prism, magnetic | Harmonica 0.7.0 prism_magnetic | 4.8e-13 % | 1.0e-08 % |
|
|
99
|
+
| Independent code | Sphere, gravity | Harmonica 0.7.0 point_gravity | 3.9e-14 % | 1.0e-10 % |
|
|
100
|
+
| Independent code | Sphere, magnetic | Harmonica 0.7.0 dipole_magnetic | 8.8e-14 % | 1.0e-10 % |
|
|
101
|
+
| Independent code | Vertical dyke, gravity | Harmonica 0.7.0 prism_gravity, 200 km along strike | 3.6e-07 % | 1.0e-05 % |
|
|
102
|
+
| Independent code | Vertical dyke, magnetic | Harmonica 0.7.0 prism_magnetic, 200 km along strike | 5.1e-07 % | 1.0e-05 % |
|
|
103
|
+
| Reference service | IGRF-14 main field, 5 sites | British Geological Survey IGRF-14 | 0.38 nT, 0.0005° | 1 nT, 0.002° |
|
|
104
|
+
|
|
105
|
+
Regenerate this table with `python -m detectability.validation`. Run all tests (including these) with:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
pip install -e ".[test]"
|
|
109
|
+
pytest
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Limitations
|
|
113
|
+
|
|
114
|
+
Flat topography, a homogeneous host and no regional trend; 2D targets are infinitely long along strike; the profile
|
|
115
|
+
crosses the centre of the target; self-demagnetisation is neglected. Results are expectations under these assumptions,
|
|
116
|
+
not guarantees. Instrument presets come from manufacturers' data sheets (`detect.INSTRUMENTS` lists each figure and its
|
|
117
|
+
source); field noise, which usually dominates, is a stated assumption that you can change.
|
|
118
|
+
|
|
119
|
+
## Citation
|
|
120
|
+
|
|
121
|
+
See [CITATION.cff](https://github.com/mukremin-nergiz/detectability/blob/main/CITATION.cff), or:
|
|
122
|
+
|
|
123
|
+
> Nergiz, M. (2026). *Detectability: Pre-survey detectability, modelled and reproducible* (Version 0.2.1) [Computer software].
|
|
124
|
+
> Zenodo. https://doi.org/10.5281/zenodo.23931815
|
|
125
|
+
|
|
126
|
+
The DOI above always resolves to the latest version; each release also has its own DOI on Zenodo.
|
|
127
|
+
|
|
128
|
+
## Author
|
|
129
|
+
|
|
130
|
+
Mükremin Nergiz, Geophysical Engineer & Software Developer (Independent Researcher, Sivas, Türkiye).
|
|
131
|
+
ORCID [0009-0001-6789-2774](https://orcid.org/0009-0001-6789-2774) · <https://mukreminnergiz.com>
|
|
132
|
+
|
|
133
|
+
Licence: BSD-3-Clause.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=77"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "detectability"
|
|
7
|
+
version = "0.2.1"
|
|
8
|
+
description = "Pre-survey detectability, modelled and reproducible: forward-modelled gravity and magnetic responses, station spacing and a detectability verdict for near-surface targets."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
keywords = ["geophysics", "gravity", "magnetics", "survey design", "near-surface", "forward modelling", "IGRF"]
|
|
11
|
+
classifiers = [
|
|
12
|
+
"Development Status :: 3 - Alpha",
|
|
13
|
+
"Intended Audience :: Science/Research",
|
|
14
|
+
"Intended Audience :: Education",
|
|
15
|
+
"Operating System :: OS Independent",
|
|
16
|
+
"Programming Language :: Python :: 3",
|
|
17
|
+
"Programming Language :: Python :: 3.10",
|
|
18
|
+
"Programming Language :: Python :: 3.11",
|
|
19
|
+
"Programming Language :: Python :: 3.12",
|
|
20
|
+
"Programming Language :: Python :: 3.13",
|
|
21
|
+
"Topic :: Scientific/Engineering :: Physics",
|
|
22
|
+
]
|
|
23
|
+
requires-python = ">=3.10"
|
|
24
|
+
license = "BSD-3-Clause"
|
|
25
|
+
authors = [{ name = "Mükremin Nergiz" }]
|
|
26
|
+
dependencies = ["numpy>=1.24"]
|
|
27
|
+
|
|
28
|
+
[project.urls]
|
|
29
|
+
Homepage = "https://detectability.mukreminnergiz.com"
|
|
30
|
+
Documentation = "https://detectability.mukreminnergiz.com/method"
|
|
31
|
+
Validation = "https://detectability.mukreminnergiz.com/validation"
|
|
32
|
+
Repository = "https://github.com/mukremin-nergiz/detectability"
|
|
33
|
+
Issues = "https://github.com/mukremin-nergiz/detectability/issues"
|
|
34
|
+
Citation = "https://doi.org/10.5281/zenodo.23931815"
|
|
35
|
+
|
|
36
|
+
[project.optional-dependencies]
|
|
37
|
+
test = ["pytest>=7"]
|
|
38
|
+
# Recomputes the "Independent code" reference values (tools/harmonica_reference.py); not needed to use the library.
|
|
39
|
+
validation = ["harmonica==0.7.0"]
|
|
40
|
+
|
|
41
|
+
[tool.setuptools.packages.find]
|
|
42
|
+
where = ["src"]
|
|
43
|
+
|
|
44
|
+
[tool.setuptools.package-data]
|
|
45
|
+
detectability = ["data/*.txt", "data/*.json"]
|
|
46
|
+
|
|
47
|
+
[tool.pytest.ini_options]
|
|
48
|
+
testpaths = ["tests"]
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"""Detectability: pre-survey detectability, modelled and reproducible."""
|
|
2
|
+
|
|
3
|
+
__version__ = "0.2.1"
|
|
4
|
+
|
|
5
|
+
from .survey import METHODS, SHAPES, Report, Survey, Target, evaluate # noqa: E402
|
|
6
|
+
|
|
7
|
+
__all__ = ["evaluate", "Target", "Survey", "Report", "SHAPES", "METHODS", "__version__"]
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"""Physical constants and unit conversions (SI unless stated)."""
|
|
2
|
+
|
|
3
|
+
G = 6.67430e-11 # gravitational constant, m^3 kg^-1 s^-2 (CODATA 2018)
|
|
4
|
+
SI_TO_MGAL = 1e5 # 1 m/s^2 = 1e5 mGal
|
|
5
|
+
SI_TO_UGAL = 1e8 # 1 m/s^2 = 1e8 µGal
|
|
6
|
+
G_CM3_TO_KG_M3 = 1000.0 # density: 1 g/cm^3 = 1000 kg/m^3
|