├── .github └── ISSUE_TEMPLATE │ ├── 0-general-issue.md │ ├── 1-submission.md │ ├── 2-published.md │ └── config.yml ├── .gitignore ├── LICENSE-CC-BY.txt ├── LICENSE-MIT.txt ├── Makefile ├── README.md ├── REPRODUCING.md ├── code ├── README.md ├── euler.py ├── real-data-application.ipynb ├── real-data-geology.ipynb ├── real-data-preparation.ipynb ├── synthetic-interfering-sources-dykes.ipynb ├── synthetic-interfering-sources.ipynb ├── synthetic-noise-levels.ipynb ├── synthetic-proof-of-concept.ipynb ├── synthetic-structural-index.ipynb └── synthetic-windows.ipynb ├── conda-lock.yml ├── data ├── README.md ├── processed │ ├── rio-de-janeiro-dikes.feather │ ├── rio-de-janeiro-geology.feather │ ├── rio-de-janeiro-magnetic.csv │ └── rio-de-janeiro-topography.nc ├── raw │ ├── 1038_XYZ.tar.xz │ ├── ne_110m_admin_0_countries.zip │ └── shapefiles │ │ ├── dikes_cut.cpg │ │ ├── dikes_cut.dbf │ │ ├── dikes_cut.prj │ │ ├── dikes_cut.shp │ │ ├── dikes_cut.shx │ │ ├── geology_cut.cpg │ │ ├── geology_cut.dbf │ │ ├── geology_cut.prj │ │ ├── geology_cut.shp │ │ └── geology_cut.shx └── rio-de-janeiro-magnetic.csv ├── environment.yml ├── graphical-abstract.jpg ├── graphical-abstract.svg └── paper ├── README.md ├── abstract-plain.tex ├── abstract.tex ├── apalike-doi.bst ├── content.tex ├── cover-letter.tex ├── figures ├── real-data-application-comparison.png ├── real-data-application.png ├── real-data-geology.png ├── synthetic-interfering-sources-dykes.png ├── synthetic-interfering-sources.png ├── synthetic-noise-levels.png ├── synthetic-proof-of-concept.png ├── synthetic-structural-index.png └── synthetic-windows.png ├── information.tex ├── manuscript.tex ├── natbibspacing.sty ├── preprint.tex ├── references.bib ├── variables.tex └── variables ├── real-data-application.tex ├── real-data-geology.tex ├── real-data-preparation.tex ├── synthetic-interfering-sources-dykes.tex ├── synthetic-interfering-sources.tex ├── synthetic-noise-levels.tex ├── synthetic-proof-of-concept.tex ├── synthetic-structural-index.tex └── synthetic-windows.tex /.github/ISSUE_TEMPLATE/0-general-issue.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: General issue 3 | about: Use to create tasks, ideas, or report errors 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/1-submission.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Submission checklist 3 | about: Checklist for submitting the paper to a journal and preprint server 4 | title: Submit the paper to a journal and EarthArXiv 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## Information 11 | 12 | 17 | 18 | - Journal name: 19 | - Journal guidelines for authors: 20 | 21 | ## Checklist 22 | 23 | - [ ] Reserve a DOI on [figshare](https://figshare.com/) or [Zenodo](https://zenodo.org/) for the supplementary material (a zip archive of this repository). Paste the DOI at the top of this issue. 24 | - [ ] Add the reserved DOI to `paper/information.tex` and the main `README.md`. 25 | - [ ] Do one final proof-read of the whole paper, double-checking format, figures, and equations. 26 | - [ ] Submit the preprint to [EarthArXiv](https://eartharxiv.org/) (make sure 27 | all authors have accounts that include their ORCIDs otherwise they won't be 28 | linked automatically). 29 | - [ ] Add the preprint DOI to `paper/information.tex` and the main `README.md`. 30 | - [ ] Make the GitHub repository public (if it isn't already). 31 | - [ ] Make a release on GitHub with the `submitted` tag. You could also append 32 | the journal initials to the tag, like `submitted-gji`. 33 | - [ ] Upload the `.zip` archive of the repository from the GitHub release to figshare/Zenodo and publish it. 34 | - [ ] Update the EarthArXiv version so it includes the EarthArXiv DOI. 35 | - [ ] Make a cover letter for the journal using `paper/cover-letter.tex`. Include a short summary of the paper, a statement about it being posted as a preprint under CC-BY, suggested reviewers, and contributions by student authors. 36 | - [ ] Submit the paper to the journal. 37 | - [ ] Make a nice summary figure or graphical abstract for social media and the website. This should be in 2:1 aspect ratio and easily readable on mobile devices (so large fonts). 38 | - [ ] Create a news item on the CompGeoLab website. 39 | - [ ] Share the preprint DOI link on social media, including a link to our website. 40 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/2-published.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Final publication checklist 3 | about: Checklist with what to do once the paper is accepted and published 4 | title: Final tasks after acceptance and publication 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 13 | 14 | - [ ] Make sure the editor and reviewers are thanked in the Acknowledgements. 15 | - [ ] Add the journal DOI to `paper/information.tex` and the main `README.md`. 16 | - [ ] Update the preprint information box to say that the paper has been 17 | published and make sure it links to the version of record (journal DOI). 18 | - [ ] Publish a release on GitHub, linking to the journal DOI and adding the 19 | manuscript and preprint PDFs. 20 | - [ ] Upload the latest zip archive from the GitHub release to the existing 21 | Zenodo/figshare archive. 22 | - [ ] Upload the latest preprint-formatted text to EarthArXiv. 23 | - [ ] Upload latest source files to the journal system. 24 | - [ ] Create a news item on the CompGeoLab website. 25 | - [ ] Share the journal DOI link on social media, including a link to our website. 26 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Contact the team 4 | url: https://www.compgeolab.org/team/ 5 | about: You can also contact the team directly if you need futher help 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .ipynb_checkpoints 2 | __pycache__ 3 | paper/**/*.pdf 4 | paper/*-diff-*.tex 5 | paper/_diff 6 | code/profile_output* 7 | -------------------------------------------------------------------------------- /LICENSE-CC-BY.txt: -------------------------------------------------------------------------------- 1 | Attribution 4.0 International 2 | 3 | ======================================================================= 4 | 5 | Creative Commons Corporation ("Creative Commons") is not a law firm and 6 | does not provide legal services or legal advice. Distribution of 7 | Creative Commons public licenses does not create a lawyer-client or 8 | other relationship. Creative Commons makes its licenses and related 9 | information available on an "as-is" basis. Creative Commons gives no 10 | warranties regarding its licenses, any material licensed under their 11 | terms and conditions, or any related information. Creative Commons 12 | disclaims all liability for damages resulting from their use to the 13 | fullest extent possible. 14 | 15 | Using Creative Commons Public Licenses 16 | 17 | Creative Commons public licenses provide a standard set of terms and 18 | conditions that creators and other rights holders may use to share 19 | original works of authorship and other material subject to copyright 20 | and certain other rights specified in the public license below. The 21 | following considerations are for informational purposes only, are not 22 | exhaustive, and do not form part of our licenses. 23 | 24 | Considerations for licensors: Our public licenses are 25 | intended for use by those authorized to give the public 26 | permission to use material in ways otherwise restricted by 27 | copyright and certain other rights. Our licenses are 28 | irrevocable. Licensors should read and understand the terms 29 | and conditions of the license they choose before applying it. 30 | Licensors should also secure all rights necessary before 31 | applying our licenses so that the public can reuse the 32 | material as expected. Licensors should clearly mark any 33 | material not subject to the license. This includes other CC- 34 | licensed material, or material used under an exception or 35 | limitation to copyright. More considerations for licensors: 36 | wiki.creativecommons.org/Considerations_for_licensors 37 | 38 | Considerations for the public: By using one of our public 39 | licenses, a licensor grants the public permission to use the 40 | licensed material under specified terms and conditions. If 41 | the licensor's permission is not necessary for any reason--for 42 | example, because of any applicable exception or limitation to 43 | copyright--then that use is not regulated by the license. Our 44 | licenses grant only permissions under copyright and certain 45 | other rights that a licensor has authority to grant. Use of 46 | the licensed material may still be restricted for other 47 | reasons, including because others have copyright or other 48 | rights in the material. A licensor may make special requests, 49 | such as asking that all changes be marked or described. 50 | Although not required by our licenses, you are encouraged to 51 | respect those requests where reasonable. More_considerations 52 | for the public: 53 | wiki.creativecommons.org/Considerations_for_licensees 54 | 55 | ======================================================================= 56 | 57 | Creative Commons Attribution 4.0 International Public License 58 | 59 | By exercising the Licensed Rights (defined below), You accept and agree 60 | to be bound by the terms and conditions of this Creative Commons 61 | Attribution 4.0 International Public License ("Public License"). To the 62 | extent this Public License may be interpreted as a contract, You are 63 | granted the Licensed Rights in consideration of Your acceptance of 64 | these terms and conditions, and the Licensor grants You such rights in 65 | consideration of benefits the Licensor receives from making the 66 | Licensed Material available under these terms and conditions. 67 | 68 | 69 | Section 1 -- Definitions. 70 | 71 | a. Adapted Material means material subject to Copyright and Similar 72 | Rights that is derived from or based upon the Licensed Material 73 | and in which the Licensed Material is translated, altered, 74 | arranged, transformed, or otherwise modified in a manner requiring 75 | permission under the Copyright and Similar Rights held by the 76 | Licensor. For purposes of this Public License, where the Licensed 77 | Material is a musical work, performance, or sound recording, 78 | Adapted Material is always produced where the Licensed Material is 79 | synched in timed relation with a moving image. 80 | 81 | b. Adapter's License means the license You apply to Your Copyright 82 | and Similar Rights in Your contributions to Adapted Material in 83 | accordance with the terms and conditions of this Public License. 84 | 85 | c. Copyright and Similar Rights means copyright and/or similar rights 86 | closely related to copyright including, without limitation, 87 | performance, broadcast, sound recording, and Sui Generis Database 88 | Rights, without regard to how the rights are labeled or 89 | categorized. For purposes of this Public License, the rights 90 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 91 | Rights. 92 | 93 | d. Effective Technological Measures means those measures that, in the 94 | absence of proper authority, may not be circumvented under laws 95 | fulfilling obligations under Article 11 of the WIPO Copyright 96 | Treaty adopted on December 20, 1996, and/or similar international 97 | agreements. 98 | 99 | e. Exceptions and Limitations means fair use, fair dealing, and/or 100 | any other exception or limitation to Copyright and Similar Rights 101 | that applies to Your use of the Licensed Material. 102 | 103 | f. Licensed Material means the artistic or literary work, database, 104 | or other material to which the Licensor applied this Public 105 | License. 106 | 107 | g. Licensed Rights means the rights granted to You subject to the 108 | terms and conditions of this Public License, which are limited to 109 | all Copyright and Similar Rights that apply to Your use of the 110 | Licensed Material and that the Licensor has authority to license. 111 | 112 | h. Licensor means the individual(s) or entity(ies) granting rights 113 | under this Public License. 114 | 115 | i. Share means to provide material to the public by any means or 116 | process that requires permission under the Licensed Rights, such 117 | as reproduction, public display, public performance, distribution, 118 | dissemination, communication, or importation, and to make material 119 | available to the public including in ways that members of the 120 | public may access the material from a place and at a time 121 | individually chosen by them. 122 | 123 | j. Sui Generis Database Rights means rights other than copyright 124 | resulting from Directive 96/9/EC of the European Parliament and of 125 | the Council of 11 March 1996 on the legal protection of databases, 126 | as amended and/or succeeded, as well as other essentially 127 | equivalent rights anywhere in the world. 128 | 129 | k. You means the individual or entity exercising the Licensed Rights 130 | under this Public License. Your has a corresponding meaning. 131 | 132 | 133 | Section 2 -- Scope. 134 | 135 | a. License grant. 136 | 137 | 1. Subject to the terms and conditions of this Public License, 138 | the Licensor hereby grants You a worldwide, royalty-free, 139 | non-sublicensable, non-exclusive, irrevocable license to 140 | exercise the Licensed Rights in the Licensed Material to: 141 | 142 | a. reproduce and Share the Licensed Material, in whole or 143 | in part; and 144 | 145 | b. produce, reproduce, and Share Adapted Material. 146 | 147 | 2. Exceptions and Limitations. For the avoidance of doubt, where 148 | Exceptions and Limitations apply to Your use, this Public 149 | License does not apply, and You do not need to comply with 150 | its terms and conditions. 151 | 152 | 3. Term. The term of this Public License is specified in Section 153 | 6(a). 154 | 155 | 4. Media and formats; technical modifications allowed. The 156 | Licensor authorizes You to exercise the Licensed Rights in 157 | all media and formats whether now known or hereafter created, 158 | and to make technical modifications necessary to do so. The 159 | Licensor waives and/or agrees not to assert any right or 160 | authority to forbid You from making technical modifications 161 | necessary to exercise the Licensed Rights, including 162 | technical modifications necessary to circumvent Effective 163 | Technological Measures. For purposes of this Public License, 164 | simply making modifications authorized by this Section 2(a) 165 | (4) never produces Adapted Material. 166 | 167 | 5. Downstream recipients. 168 | 169 | a. Offer from the Licensor -- Licensed Material. Every 170 | recipient of the Licensed Material automatically 171 | receives an offer from the Licensor to exercise the 172 | Licensed Rights under the terms and conditions of this 173 | Public License. 174 | 175 | b. No downstream restrictions. You may not offer or impose 176 | any additional or different terms or conditions on, or 177 | apply any Effective Technological Measures to, the 178 | Licensed Material if doing so restricts exercise of the 179 | Licensed Rights by any recipient of the Licensed 180 | Material. 181 | 182 | 6. No endorsement. Nothing in this Public License constitutes or 183 | may be construed as permission to assert or imply that You 184 | are, or that Your use of the Licensed Material is, connected 185 | with, or sponsored, endorsed, or granted official status by, 186 | the Licensor or others designated to receive attribution as 187 | provided in Section 3(a)(1)(A)(i). 188 | 189 | b. Other rights. 190 | 191 | 1. Moral rights, such as the right of integrity, are not 192 | licensed under this Public License, nor are publicity, 193 | privacy, and/or other similar personality rights; however, to 194 | the extent possible, the Licensor waives and/or agrees not to 195 | assert any such rights held by the Licensor to the limited 196 | extent necessary to allow You to exercise the Licensed 197 | Rights, but not otherwise. 198 | 199 | 2. Patent and trademark rights are not licensed under this 200 | Public License. 201 | 202 | 3. To the extent possible, the Licensor waives any right to 203 | collect royalties from You for the exercise of the Licensed 204 | Rights, whether directly or through a collecting society 205 | under any voluntary or waivable statutory or compulsory 206 | licensing scheme. In all other cases the Licensor expressly 207 | reserves any right to collect such royalties. 208 | 209 | 210 | Section 3 -- License Conditions. 211 | 212 | Your exercise of the Licensed Rights is expressly made subject to the 213 | following conditions. 214 | 215 | a. Attribution. 216 | 217 | 1. If You Share the Licensed Material (including in modified 218 | form), You must: 219 | 220 | a. retain the following if it is supplied by the Licensor 221 | with the Licensed Material: 222 | 223 | i. identification of the creator(s) of the Licensed 224 | Material and any others designated to receive 225 | attribution, in any reasonable manner requested by 226 | the Licensor (including by pseudonym if 227 | designated); 228 | 229 | ii. a copyright notice; 230 | 231 | iii. a notice that refers to this Public License; 232 | 233 | iv. a notice that refers to the disclaimer of 234 | warranties; 235 | 236 | v. a URI or hyperlink to the Licensed Material to the 237 | extent reasonably practicable; 238 | 239 | b. indicate if You modified the Licensed Material and 240 | retain an indication of any previous modifications; and 241 | 242 | c. indicate the Licensed Material is licensed under this 243 | Public License, and include the text of, or the URI or 244 | hyperlink to, this Public License. 245 | 246 | 2. You may satisfy the conditions in Section 3(a)(1) in any 247 | reasonable manner based on the medium, means, and context in 248 | which You Share the Licensed Material. For example, it may be 249 | reasonable to satisfy the conditions by providing a URI or 250 | hyperlink to a resource that includes the required 251 | information. 252 | 253 | 3. If requested by the Licensor, You must remove any of the 254 | information required by Section 3(a)(1)(A) to the extent 255 | reasonably practicable. 256 | 257 | 4. If You Share Adapted Material You produce, the Adapter's 258 | License You apply must not prevent recipients of the Adapted 259 | Material from complying with this Public License. 260 | 261 | 262 | Section 4 -- Sui Generis Database Rights. 263 | 264 | Where the Licensed Rights include Sui Generis Database Rights that 265 | apply to Your use of the Licensed Material: 266 | 267 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 268 | to extract, reuse, reproduce, and Share all or a substantial 269 | portion of the contents of the database; 270 | 271 | b. if You include all or a substantial portion of the database 272 | contents in a database in which You have Sui Generis Database 273 | Rights, then the database in which You have Sui Generis Database 274 | Rights (but not its individual contents) is Adapted Material; and 275 | 276 | c. You must comply with the conditions in Section 3(a) if You Share 277 | all or a substantial portion of the contents of the database. 278 | 279 | For the avoidance of doubt, this Section 4 supplements and does not 280 | replace Your obligations under this Public License where the Licensed 281 | Rights include other Copyright and Similar Rights. 282 | 283 | 284 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 285 | 286 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 287 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 288 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 289 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 290 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 291 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 292 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 293 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 294 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 295 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 296 | 297 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 298 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 299 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 300 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 301 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 302 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 303 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 304 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 305 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 306 | 307 | c. The disclaimer of warranties and limitation of liability provided 308 | above shall be interpreted in a manner that, to the extent 309 | possible, most closely approximates an absolute disclaimer and 310 | waiver of all liability. 311 | 312 | 313 | Section 6 -- Term and Termination. 314 | 315 | a. This Public License applies for the term of the Copyright and 316 | Similar Rights licensed here. However, if You fail to comply with 317 | this Public License, then Your rights under this Public License 318 | terminate automatically. 319 | 320 | b. Where Your right to use the Licensed Material has terminated under 321 | Section 6(a), it reinstates: 322 | 323 | 1. automatically as of the date the violation is cured, provided 324 | it is cured within 30 days of Your discovery of the 325 | violation; or 326 | 327 | 2. upon express reinstatement by the Licensor. 328 | 329 | For the avoidance of doubt, this Section 6(b) does not affect any 330 | right the Licensor may have to seek remedies for Your violations 331 | of this Public License. 332 | 333 | c. For the avoidance of doubt, the Licensor may also offer the 334 | Licensed Material under separate terms or conditions or stop 335 | distributing the Licensed Material at any time; however, doing so 336 | will not terminate this Public License. 337 | 338 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 339 | License. 340 | 341 | 342 | Section 7 -- Other Terms and Conditions. 343 | 344 | a. The Licensor shall not be bound by any additional or different 345 | terms or conditions communicated by You unless expressly agreed. 346 | 347 | b. Any arrangements, understandings, or agreements regarding the 348 | Licensed Material not stated herein are separate from and 349 | independent of the terms and conditions of this Public License. 350 | 351 | 352 | Section 8 -- Interpretation. 353 | 354 | a. For the avoidance of doubt, this Public License does not, and 355 | shall not be interpreted to, reduce, limit, restrict, or impose 356 | conditions on any use of the Licensed Material that could lawfully 357 | be made without permission under this Public License. 358 | 359 | b. To the extent possible, if any provision of this Public License is 360 | deemed unenforceable, it shall be automatically reformed to the 361 | minimum extent necessary to make it enforceable. If the provision 362 | cannot be reformed, it shall be severed from this Public License 363 | without affecting the enforceability of the remaining terms and 364 | conditions. 365 | 366 | c. No term or condition of this Public License will be waived and no 367 | failure to comply consented to unless expressly agreed to by the 368 | Licensor. 369 | 370 | d. Nothing in this Public License constitutes or may be interpreted 371 | as a limitation upon, or waiver of, any privileges and immunities 372 | that apply to the Licensor or You, including from the legal 373 | processes of any jurisdiction or authority. 374 | 375 | 376 | ======================================================================= 377 | 378 | Creative Commons is not a party to its public 379 | licenses. Notwithstanding, Creative Commons may elect to apply one of 380 | its public licenses to material it publishes and in those instances 381 | will be considered the “Licensor.” The text of the Creative Commons 382 | public licenses is dedicated to the public domain under the CC0 Public 383 | Domain Dedication. Except for the limited purpose of indicating that 384 | material is shared under a Creative Commons public license or as 385 | otherwise permitted by the Creative Commons policies published at 386 | creativecommons.org/policies, Creative Commons does not authorize the 387 | use of the trademark "Creative Commons" or any other trademark or logo 388 | of Creative Commons without its prior written consent including, 389 | without limitation, in connection with any unauthorized modifications 390 | to any of its public licenses or any other arrangements, 391 | understandings, or agreements concerning use of licensed material. For 392 | the avoidance of doubt, this paragraph does not form part of the 393 | public licenses. 394 | 395 | Creative Commons may be contacted at creativecommons.org. 396 | -------------------------------------------------------------------------------- /LICENSE-MIT.txt: -------------------------------------------------------------------------------- 1 | Copyright 2024 Leonardo Uieda, Gelson Ferreira Souza-Junior, India Uppal, Vanderlei Coelho Oliveira Jr., Valéria Cristina Ferreira Barbosa 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # Rules for compiling the PDF from the LaTeX sources and displaying the output 2 | 3 | # Variables 4 | ############################################################################### 5 | ### Git tags for different revisions 6 | SUBMITTED = submitted-gji 7 | ### Documents to build 8 | PDF = paper/preprint.pdf paper/manuscript.pdf paper/manuscript-diff-$(SUBMITTED).pdf paper/cover-letter.pdf 9 | ### File Types (for dependencies) 10 | TEX = $(filter-out $(PDF:.pdf=.tex), $(wildcard paper/*.tex)) 11 | TEXVARS = $(wildcard paper/variables/*.tex) 12 | BIB = $(wildcard paper/*.bib) 13 | FIG = $(wildcard paper/figures/*) 14 | # For word counting, how many words does the journal consider for each figure 15 | WORDS_PER_FIGURE = 300 16 | 17 | 18 | # Main targets 19 | ############################################################################### 20 | preprint: paper/preprint.pdf 21 | 22 | manuscript: paper/manuscript.pdf 23 | 24 | diff-submitted: paper/manuscript-diff-$(SUBMITTED).pdf 25 | 26 | letter: paper/cover-letter.pdf 27 | 28 | all: $(PDF) 29 | 30 | clean: 31 | rm -rf $(PDF) paper/manuscript-diff-*.tex paper/_diff 32 | 33 | format: 34 | black code/ 35 | 36 | lock: conda-lock.yml 37 | 38 | wordcount: 39 | @echo -n "Paper: " 40 | @echo $$((`detex paper/content.tex | wc --words` + `detex paper/abstract.tex | wc --words` + $(WORDS_PER_FIGURE) * `ls paper/figures/*.png | wc --lines`)) 41 | @echo -n "Abstract: " 42 | @echo $$((`detex paper/abstract.tex | wc --words`)) 43 | 44 | 45 | # Rules for building PDFs 46 | ############################################################################### 47 | %.pdf: %.tex $(TEX) $(BIB) $(FIG) 48 | tectonic -X compile $< 49 | 50 | paper/manuscript-diff-$(SUBMITTED).tex: paper/manuscript.tex $(TEX) $(BIB) $(FIG) 51 | cd paper \ 52 | && latexdiff-vc --git --flatten --force --dir=_diff --rev $(SUBMITTED) `basename $<` \ 53 | && cd .. \ 54 | && mv paper/_diff/*.tex $@ 55 | 56 | paper/misc/cover-letter.pdf: paper/misc/cover-letter.tex paper/information.tex 57 | tectonic -X compile $< 58 | 59 | paper/variables.tex: $(TEXVARS) 60 | cat $^ > $@ 61 | 62 | # Rules for generating results and other files 63 | ############################################################################### 64 | conda-lock.yml: environment.yml 65 | conda-lock -f $< 66 | 67 | # paper/figures/%.png paper/variables/%.tex &: code/%.ipynb code/euler.py 68 | # jupyter execute --inplace --kernel_name=python3 $< && touch paper/figures/$*.png paper/variables/$*.tex 69 | # 70 | # paper/figures/real-data-application.png paper/variables/real-data-application.tex &: code/real-data-application.ipynb code/euler.py data/rio-de-janeiro-magnetic.csv 71 | # jupyter execute --inplace --kernel_name=python3 $< && touch paper/figures/real-data-application.png paper/variables/real-data-application.tex 72 | # 73 | # data/rio-de-janeiro-magnetic.csv paper/variables/real-data-preparation.tex &: code/real-data-preparation.ipynb data/raw/1038_XYZ.tar.xz 74 | # jupyter execute --inplace --kernel_name=python3 $< && touch data/rio-de-janeiro-magnetic.csv paper/variables/real-data-preparation.tex 75 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Euler inversion: Locating sources of potential-field data through inversion of Euler’s homogeneity equation 2 | 3 | by 4 | [Leonardo Uieda](https://leouieda.com), 5 | [Gelson Ferreira Souza-Junior](https://github.com/souza-junior), 6 | [India Uppal](https://github.com/indiauppal), 7 | [Vanderlei Coelho Oliveira Jr.](https://www.pinga-lab.org/people/oliveira-jr.html) 8 | 9 | This repository contains the data and source code used to produce the results 10 | presented in: 11 | 12 | > Uieda, L., Souza-Junior, G. F., Uppal, I., Oliveira Jr., V. C. (2025). Euler 13 | > inversion: Locating sources of potential-field data through inversion of 14 | > Euler’s homogeneity equation. *Geophysical Journal International*. 15 | > doi:[10.1093/gji/ggaf114](https://doi.org/10.1093/gji/ggaf114). 16 | 17 | | | **Information** | 18 | |-----------------------------------:|:----------------| 19 | | Version of record | https://doi.org/10.1093/gji/ggaf114 | 20 | | Open-access preprint on EarthArXiv | https://doi.org/10.31223/X5T41M | 21 | | Archive of this repository | https://doi.org/10.6084/m9.figshare.26384140 | 22 | | Software Heritage ID | [`swh:1:snp:b0d1f8fdbf57f87e0ce56d5dda0f360c4a314d9d`](https://archive.softwareheritage.org/swh:1:snp:b0d1f8fdbf57f87e0ce56d5dda0f360c4a314d9d;origin=https://github.com/compgeolab/euler-inversion) | 23 | | Reproducing our results | [`REPRODUCING.md`](REPRODUCING.md) | 24 | 25 | ## About 26 | 27 | The main idea for this paper came about during an potential-field methods class 28 | which Leo took in 2012 with his then PhD supervisor 29 | [Prof. Valéria C. F. Barbosa](https://www.pinga-lab.org/people/barbosa.html). 30 | While learning about the Euler deconvolution method, which is a speciality of 31 | Valéria, Leo connected it with the geodetic network adjustment theory he had 32 | been taught by 33 | [Prof. Spiros Pagiatakis](https://www.yorku.ca/spiros/spiros.html) during an 34 | exchange program at York University, Canada, in 2008. An initial prototype was 35 | developed in 2012 but there were still some rough edges and the project was 36 | shelved to make way for other more urgent projects at the time. Leo returned to 37 | this every few years, making slow progress, and involving Vanderlei in the 38 | planning and discussion of the theory. In 2024, co-authors Gelson, India, and 39 | Vanderlei joined Leo for a sprint to finish the method and produce this paper. 40 | 41 | ## Abstract 42 | 43 | Earth scientists can estimate the depth of certain rocks beneath Earth's 44 | surface by measuring the small disturbances that they cause in the Earth's 45 | gravity and magnetic fields. A popular method for this is **Euler deconvolution**, 46 | which is widely available in geoscience software and can be run quickly on 47 | a standard computer. Unfortunately, Euler deconvolution has some shortcomings: 1) 48 | the approximate shape of the rocks must be known, for example, a sphere or 49 | a wide flat slab, represented by the **structural index** 2) the depth of the 50 | rocks is not well estimated when there is noise in our data, which is a common 51 | occurrence. We propose a new method, **Euler inversion**, which fixes some of 52 | the shortcomings of Euler deconvolution by using more adequate (and complex) 53 | mathematics. Our method is less sensitive to noise in the data and is also able 54 | to determine the approximate shape of the source (the structural index). Euler 55 | inversion is also fast to execute on a standard computer, making it a practical 56 | alternative to Euler deconvolution on an Earth scientists toolbox. 57 | 58 |
59 | Left panel: Euler inversion is a new method for finding depths from gravity and magnetic data. It's much more robust to noise and interfering sources than Euler deconvolution and can estimate the structural index. Right panel: Map with red-white-blue colored dots representing the magnetic anomaly. There are several dipolar looking anomalies and some linear anomalies in the NE-SW direction. Overlaid are small triangles, circles, and squares which follow the dipolar and linear anomalies. 60 |
61 | Figure: Results of applying Euler inversion with a window 62 | size of 12 000 m and a window step of 2400 m to the aeromagnetic data from 63 | Rio de Janeiro, Brazil. Estimated source locations and structural indices 64 | obtained from Euler inversion are shown as triangles (𝜂 = 1), squares (𝜂 65 | = 2), and circles (𝜂 = 3). The colour of each symbol represents the estimated 66 | depth below the surface of the Earth (topography). Also shown are the 67 | total-field anomaly flight-line data, the contours of the post-collisional 68 | magmatism and alkaline intrusions (solid black lines) and dykes (dashed 69 | lines). The purple squares highlight the A, B, C, and D anomalies that are 70 | discussed in the text. 71 |
72 |
73 | 74 | ## Citing 75 | 76 | Please cite this work as: 77 | 78 | > Uieda, L., Souza-Junior, G. F., Uppal, I., Oliveira Jr., V. C. (2025). Euler 79 | > inversion: Locating sources of potential-field data through inversion of 80 | > Euler’s homogeneity equation. *Geophysical Journal International*. 81 | > doi:[10.1093/gji/ggaf114](https://doi.org/10.1093/gji/ggaf114). 82 | 83 | You can also reference the supplementary files (data and software) as: 84 | 85 | > Uieda, L., Souza-Junior, G. F., Uppal, I., Oliveira Jr., V. C. (2024). 86 | > Supplementary material for "Euler inversion: Locating sources of 87 | > potential-field data through inversion of Euler's homogeneity equation". 88 | > *figshare*. doi:[10.6084/m9.figshare.26384140](https://doi.org/10.6084/m9.figshare.26384140). 89 | 90 | ## License 91 | 92 | All Python source code (including `.py` and `.ipynb` files) is made available 93 | under the MIT license. You can freely use and modify the code, without 94 | warranty, so long as you provide attribution to the authors. See 95 | `LICENSE-MIT.txt` for the full license text. 96 | 97 | The manuscript text (including all LaTeX files), figures, and data/models 98 | produced as part of this research are available under the 99 | [Creative Commons Attribution 4.0 License (CC-BY)][cc-by]. See 100 | `LICENSE-CC-BY.txt` for the full license text. 101 | 102 | [cc-by]: https://creativecommons.org/licenses/by/4.0/ 103 | -------------------------------------------------------------------------------- /REPRODUCING.md: -------------------------------------------------------------------------------- 1 | # Reproducing our results 2 | 3 | You can download a copy of all the files in this repository by cloning the 4 | [git](https://git-scm.com/) repository: 5 | 6 | ``` 7 | git clone https://github.com/compgeolab/euler-inversion 8 | ``` 9 | 10 | or downloading a zip archive from the provided DOI in the `README.md`. 11 | 12 | All source code used to generate the results and figures in the paper are in 13 | the `code` folder. There you can find the [Jupyter](https://jupyter.org/) 14 | notebooks and `.py` modules that perform the calculations and generate the 15 | figures and results presented in the paper. 16 | 17 | The LaTeX sources for the manuscript text and figures are in `paper`. 18 | 19 | ## Setting up your environment 20 | 21 | You'll need a working Python 3 environment with all the standard 22 | scientific packages installed (numpy, pandas, scipy, matplotlib, etc) and some 23 | extra dependencies. 24 | The **easiest (and recommended) way to get this** is to download and install 25 | the [Miniforge Python distribution](https://github.com/conda-forge/miniforge). 26 | This will give you access to a Python 3 environment and the excellent `conda` 27 | package manager. 28 | 29 | Besides the standard scientific packages, you'll also need to install some 30 | extra libraries which are specified in the `environment.yml` file. 31 | **Instead of manually installing them**, they can all be automatically 32 | installed at the exact version we used for this paper with a conda environment: 33 | 34 | 1. Install the [conda-lock](https://github.com/conda/conda-lock) package: 35 | ``` 36 | conda install conda-lock 37 | ``` 38 | 1. Inside the cloned repository (or an unzipped version), create a new virtual 39 | environment that replicates the one we used from the `conda-lock.yml` file: 40 | ``` 41 | conda-lock install --name euler-inversion conda-lock.yml 42 | ``` 43 | 1. Activate the new environment by running: 44 | ``` 45 | conda activate euler-inversion 46 | ``` 47 | 48 | ## Generating the results from the paper 49 | 50 | All results and their associated figures are created by the notebooks in the 51 | `code` folder. To fully reproduce them, run each notebook from top to bottom 52 | following the numerical order of notebook file names. 53 | 54 | With the environment activated, start a JupyterLab server by running: 55 | 56 | ``` 57 | jupyter lab 58 | ``` 59 | 60 | Once in JupyterLab, open each notebook in turn and run them from top to bottom. 61 | 62 | > Some notebooks might take several minutes to run, depending on the resources 63 | > of your system. 64 | 65 | ## Generating the preprint PDF 66 | 67 | The `paper` folder provides all of the LaTeX sources used to generate the paper 68 | PDF. A `Makefile` in the base directory of this repository includes commands 69 | that automatically build the preprint PDF from the LaTeX source files using 70 | [Tectonic](https://tectonic-typesetting.github.io/). The GNU/Make program which 71 | executes the `Makefile` should be installed in your conda environment from 72 | above. 73 | 74 | In the base folder of the cloned repository (or downloaded and unpacked 75 | archive), run the `make` command to generate `paper/preprint.pdf`. 76 | 77 | ## Generating PDFs of marked differences between versions 78 | 79 | The `Makefile` also includes rules for generating PDFs with marked changes 80 | between version of the manuscript. This is used during the review process. 81 | To do so, you'll need to **install 82 | [latexdiff](https://github.com/ftilmann/latexdiff)**. 83 | 84 | On Linux and Mac, it can be installed with `conda`: 85 | 86 | ``` 87 | conda install -c conda-forge latexdiff 88 | ``` 89 | 90 | But on Windows you'll need to install it separately (hence why it's not in the 91 | `environment.yml` or `env/*` files). 92 | 93 | Once install, you can use `make diff-submitted` for example to create 94 | a manuscript with marked differences between the current version and one tagged 95 | on git with the `submitted` tag (see the `Makefile` for details). 96 | -------------------------------------------------------------------------------- /code/README.md: -------------------------------------------------------------------------------- 1 | # Source code used this study 2 | 3 | This folder houses all of the code used to generate the results presented in 4 | the paper. 5 | 6 | * Python modules (`.py` files) contain the implementation of the methodology 7 | and common utilities used in the notebooks. 8 | * Jupyter notebooks (`.ipynb` files) are named with a numbering scheme in order 9 | that they need to be executed (e.g., `02-synthetic-test-complex.ipynb`). 10 | -------------------------------------------------------------------------------- /code/euler.py: -------------------------------------------------------------------------------- 1 | """ 2 | Quick implementation of Euler inversion and Euler deconvolution 3 | """ 4 | 5 | import concurrent.futures 6 | import numpy as np 7 | import scipy as sp 8 | import verde as vd 9 | import xarray as xr 10 | 11 | 12 | DEFAULT_WEIGHTS = (1, 0.1, 0.1, 0.025) 13 | STRUCTURAL_INDICES = (0, 1, 2, 3) 14 | 15 | 16 | def rotate_coordinates(coordinates, azimuth): 17 | "Rotate a coordinate system by a given azimuth angle" 18 | angle = np.radians(azimuth) 19 | rotated = ( 20 | coordinates[0] * np.cos(angle) + coordinates[1] * np.sin(angle), 21 | -coordinates[0] * np.sin(angle) + coordinates[1] * np.cos(angle), 22 | coordinates[2], 23 | ) 24 | return rotated 25 | 26 | 27 | class EulerDeconvolution: 28 | """ 29 | Classic Euler deconvolution but with only a single data window 30 | 31 | The windowed version is implemented in a different class. 32 | """ 33 | 34 | def __init__(self, structural_index): 35 | self.structural_index = structural_index 36 | if structural_index == 0: 37 | self.nparams = 3 38 | else: 39 | self.nparams = 4 40 | 41 | def fit(self, coordinates, data): 42 | """ 43 | Perform Euler Deconvolution on a single window spanning the entire data 44 | """ 45 | east, north, up = coordinates 46 | field, deriv_east, deriv_north, deriv_up = data 47 | jacobian = np.empty((field.size, self.nparams)) 48 | jacobian[:, 0] = deriv_east 49 | jacobian[:, 1] = deriv_north 50 | jacobian[:, 2] = deriv_up 51 | if self.nparams == 4: 52 | jacobian[:, 3] = self.structural_index 53 | pseudo_data = ( 54 | east * deriv_east 55 | + north * deriv_north 56 | + up * deriv_up 57 | + self.structural_index * field 58 | ) 59 | hessian = jacobian.T @ jacobian 60 | cofactor = sp.linalg.inv(hessian) 61 | parameters = cofactor @ jacobian.T @ pseudo_data 62 | pseudo_residuals = pseudo_data - jacobian @ parameters 63 | chi_squared = np.sum(pseudo_residuals**2) / (pseudo_data.size - parameters.size) 64 | self.covariance_ = chi_squared * cofactor 65 | self.parameters_ = parameters 66 | self.location_ = parameters[:3] 67 | if self.nparams == 4: 68 | self.base_level_ = parameters[-1] 69 | else: 70 | self.base_level_ = None 71 | return self 72 | 73 | def fit_grid( 74 | self, 75 | grid, 76 | data_names=("field", "deriv_east", "deriv_north", "deriv_up"), 77 | coordinate_names=("easting", "northing", "height"), 78 | ): 79 | """ 80 | Perform Euler Deconvolution on data on a regular grid 81 | """ 82 | table = vd.grid_to_table(grid) 83 | coordinates = [table[n] for n in coordinate_names] 84 | data = [table[n] for n in data_names] 85 | self.fit(coordinates, data) 86 | return self 87 | 88 | 89 | class EulerDeconvolutionWindowed: 90 | 91 | def __init__( 92 | self, 93 | window_size, 94 | window_step, 95 | structural_index, 96 | keep=0.15, 97 | ): 98 | self.structural_index = structural_index 99 | self.window_size = window_size 100 | self.window_step = window_step 101 | self.keep = keep 102 | 103 | def fit(self, coordinates, data): 104 | _, windows = vd.rolling_window( 105 | coordinates, 106 | size=self.window_size, 107 | spacing=self.window_step, 108 | adjust="region", 109 | ) 110 | n_windows = windows.size 111 | solutions = [] 112 | for window in windows.ravel(): 113 | ed = EulerDeconvolution(self.structural_index) 114 | window_coordinates = [c[window[0]] for c in coordinates] 115 | ed.fit( 116 | window_coordinates, 117 | [d[window[0]] for d in data], 118 | ) 119 | inside_window = vd.inside(ed.location_, vd.get_region(window_coordinates)) 120 | if inside_window: 121 | solutions.append(ed) 122 | variances = [np.sum(np.diag(ed.covariance_)[:3]) for ed in solutions] 123 | keep = int(self.keep * n_windows) 124 | self.solutions_ = [solutions[i] for i in np.argsort(variances)[:keep]] 125 | self.locations_ = np.transpose([ed.location_ for ed in self.solutions_]) 126 | self.base_levels_ = np.array([ed.base_level_ for ed in self.solutions_]) 127 | return self 128 | 129 | def fit_grid( 130 | self, 131 | grid, 132 | data_names=("field", "deriv_east", "deriv_north", "deriv_up"), 133 | coordinate_names=("easting", "northing", "height"), 134 | ): 135 | """ 136 | Perform Euler Deconvolution on data on a regular grid 137 | """ 138 | table = vd.grid_to_table(grid) 139 | coordinates = [table[n] for n in coordinate_names] 140 | data = [table[n] for n in data_names] 141 | self.fit(coordinates, data) 142 | return self 143 | 144 | 145 | class EulerDeconvolutionFD: 146 | """ 147 | Finite-difference Euler deconvolution of Gerovska et al. (2005) 148 | 149 | The SI is estimated from the data. 150 | """ 151 | 152 | def fit(self, coordinates, data): 153 | """ 154 | Perform FD Euler Deconvolution on a single window spanning the entire data 155 | """ 156 | east, north, up = coordinates 157 | field, deriv_east, deriv_north, deriv_up = data 158 | # Find the point closest to the center of the data window 159 | window_center = np.median(east), np.median(north) 160 | tree = vd.utils.kdtree((east, north)) 161 | center = tree.query(np.atleast_2d(window_center))[1][0] 162 | not_center = np.arange(field.size) != center 163 | # Build the Jacobian matrix 164 | jacobian = np.empty((field.size - 1, 4)) 165 | jacobian[:, 0] = deriv_east[not_center] - deriv_east[center] 166 | jacobian[:, 1] = deriv_north[not_center] - deriv_north[center] 167 | jacobian[:, 2] = deriv_up[not_center] - deriv_up[center] 168 | jacobian[:, 3] = field[center] - field[not_center] 169 | pseudo_data = ( 170 | east[not_center] * deriv_east[not_center] 171 | - east[center] * deriv_east[center] 172 | + north[not_center] * deriv_north[not_center] 173 | - north[center] * deriv_north[center] 174 | ) 175 | hessian = jacobian.T @ jacobian 176 | cofactor = sp.linalg.inv(hessian) 177 | parameters = cofactor @ jacobian.T @ pseudo_data 178 | pseudo_residuals = pseudo_data - jacobian @ parameters 179 | chi_squared = np.sum(pseudo_residuals**2) / (pseudo_data.size - parameters.size) 180 | 181 | self.covariance_ = chi_squared * cofactor 182 | self.parameters_ = parameters 183 | self.location_ = parameters[:3] 184 | self.structural_index_ = parameters[-1] 185 | return self 186 | 187 | def fit_grid( 188 | self, 189 | grid, 190 | data_names=("field", "deriv_east", "deriv_north", "deriv_up"), 191 | coordinate_names=("easting", "northing", "height"), 192 | ): 193 | """ 194 | Perform Euler Deconvolution on data on a regular grid 195 | """ 196 | table = vd.grid_to_table(grid) 197 | coordinates = [table[n] for n in coordinate_names] 198 | data = [table[n] for n in data_names] 199 | self.fit(coordinates, data) 200 | return self 201 | 202 | 203 | class EulerDeconvolutionFDWindowed: 204 | 205 | def __init__( 206 | self, 207 | window_size, 208 | window_step, 209 | keep=0.15, 210 | ): 211 | self.window_size = window_size 212 | self.window_step = window_step 213 | self.keep = keep 214 | 215 | def fit(self, coordinates, data): 216 | _, windows = vd.rolling_window( 217 | coordinates, 218 | size=self.window_size, 219 | spacing=self.window_step, 220 | adjust="region", 221 | ) 222 | n_windows = windows.size 223 | solutions = [] 224 | for window in windows.ravel(): 225 | ed = EulerDeconvolutionFD() 226 | window_coordinates = [np.asarray(c[window[0]]) for c in coordinates] 227 | ed.fit( 228 | window_coordinates, 229 | [np.asarray(d[window[0]]) for d in data], 230 | ) 231 | inside_window = vd.inside(ed.location_, vd.get_region(window_coordinates)) 232 | valid_si = ed.structural_index_ >= -1 and ed.structural_index_ <= 3 233 | if inside_window and valid_si: 234 | solutions.append(ed) 235 | variances = [np.sum(np.diag(ed.covariance_)[:3]) for ed in solutions] 236 | keep = int(self.keep * n_windows) 237 | self.solutions_ = [solutions[i] for i in np.argsort(variances)[:keep]] 238 | self.locations_ = np.transpose([ed.location_ for ed in self.solutions_]) 239 | self.structural_indices_ = np.array( 240 | [ed.structural_index_ for ed in self.solutions_] 241 | ) 242 | return self 243 | 244 | def fit_grid( 245 | self, 246 | grid, 247 | data_names=("field", "deriv_east", "deriv_north", "deriv_up"), 248 | coordinate_names=("easting", "northing", "height"), 249 | ): 250 | """ 251 | Perform Euler Deconvolution on data on a regular grid 252 | """ 253 | table = vd.grid_to_table(grid) 254 | coordinates = [table[n] for n in coordinate_names] 255 | data = [table[n] for n in data_names] 256 | self.fit(coordinates, data) 257 | return self 258 | 259 | 260 | class EulerInversion: 261 | 262 | def __init__( 263 | self, 264 | structural_index, 265 | max_iterations=20, 266 | tol=0.1, 267 | euler_misfit_balance=0.1, 268 | initial=None, 269 | ): 270 | self.structural_index = structural_index 271 | self.max_iterations = max_iterations 272 | self.tol = tol 273 | self.euler_misfit_balance = euler_misfit_balance 274 | self.initial = initial 275 | if structural_index == 0: 276 | self.nparams = 3 277 | else: 278 | self.nparams = 4 279 | 280 | 281 | def fit_grid( 282 | self, 283 | grid, 284 | weights=DEFAULT_WEIGHTS, 285 | data_names=("field", "deriv_east", "deriv_north", "deriv_up"), 286 | coordinate_names=("easting", "northing", "height"), 287 | ): 288 | """ 289 | Perform Euler Inversion on data on a regular grid 290 | """ 291 | shape = grid[data_names[0]].shape 292 | table = vd.grid_to_table(grid) 293 | coordinates = [table[n] for n in coordinate_names] 294 | data = [table[n] for n in data_names] 295 | self.fit(coordinates, data, weights) 296 | self.predicted_grid_ = xr.full_like( 297 | grid, 298 | { 299 | data_names[0]: self.predicted_field_.reshape(shape), 300 | data_names[1]: self.predicted_deriv_east_.reshape(shape), 301 | data_names[2]: self.predicted_deriv_north_.reshape(shape), 302 | data_names[3]: self.predicted_deriv_up_.reshape(shape), 303 | }, 304 | ) 305 | return self 306 | 307 | def fit(self, coordinates, data, weights=DEFAULT_WEIGHTS): 308 | """ 309 | Perform Euler Inversion on a single window spanning the entire data 310 | """ 311 | n_data = data[0].size 312 | # The data are organized into a single vector because of the maths 313 | data_observed = np.concatenate(data) 314 | data_predicted = self._initial_data(coordinates, data) 315 | if self.initial is None: 316 | parameters = self._initial_parameters(coordinates, data) 317 | else: 318 | parameters = self.initial.copy() 319 | # Data weights 320 | data_weights = np.empty_like(data_predicted) 321 | data_weights[:n_data] = weights[0] 322 | data_weights[n_data : 2 * n_data] = weights[1] 323 | data_weights[2 * n_data : 3 * n_data] = weights[2] 324 | data_weights[3 * n_data : 4 * n_data] = weights[3] 325 | Wd_inv = [np.full(n_data, 1 / w) for w in weights] 326 | euler = self._eulers_equation(coordinates, data_predicted, parameters) 327 | residuals = data_observed - data_predicted 328 | # Keep track of the way these things vary with iteration 329 | self.euler_misfit_ = [np.linalg.norm(euler)] 330 | self.data_misfit_ = [np.linalg.norm(residuals * data_weights)] 331 | self.merit_ = [ 332 | self.data_misfit_[-1] + self.euler_misfit_balance * self.euler_misfit_[-1] 333 | ] 334 | self.location_per_iteration_ = [parameters[:3].copy()] 335 | if self.nparams == 4: 336 | self.base_level_per_iteration_ = [parameters[3]] 337 | for iteration in range(self.max_iterations): 338 | parameter_step, data_step, cofactor_new = self._newton_step( 339 | coordinates, 340 | data_observed, 341 | data_predicted, 342 | parameters, 343 | euler, 344 | Wd_inv, 345 | ) 346 | parameters += parameter_step 347 | data_predicted += data_step 348 | euler = self._eulers_equation(coordinates, data_predicted, parameters) 349 | residuals = data_observed - data_predicted 350 | # Check stopping criteria 351 | new_euler_misfit = np.linalg.norm(euler) 352 | new_data_misfit = np.linalg.norm(residuals * data_weights) 353 | new_merit = new_data_misfit + self.euler_misfit_balance * new_euler_misfit 354 | if new_merit > self.merit_[-1]: 355 | data_predicted -= data_step 356 | parameters -= parameter_step 357 | self.stopping_reason_ = "Merit function increased" 358 | break 359 | # Update tracked variables 360 | cofactor = cofactor_new 361 | self.euler_misfit_.append(new_euler_misfit) 362 | self.data_misfit_.append(new_data_misfit) 363 | self.merit_.append(new_merit) 364 | self.location_per_iteration_.append(parameters[:3].copy()) 365 | if self.structural_index != 0: 366 | self.base_level_per_iteration_.append(parameters[3]) 367 | # Check convergence 368 | merit_change = abs((self.merit_[-2] - self.merit_[-1]) / self.merit_[-2]) 369 | if merit_change < self.tol: 370 | self.stopping_reason_ = f"Merit change ({merit_change:.2e}) below tolerance ({self.tol:.2e})" 371 | break 372 | # Save output attributes 373 | self.iterations_ = len(self.euler_misfit_) - 1 374 | self.predicted_field_ = data_predicted[:n_data] 375 | self.predicted_deriv_east_ = data_predicted[n_data : 2 * n_data] 376 | self.predicted_deriv_north_ = data_predicted[2 * n_data : 3 * n_data] 377 | self.predicted_deriv_up_ = data_predicted[3 * n_data :] 378 | self.location_ = parameters[:3] 379 | if self.nparams == 4: 380 | self.base_level_ = parameters[3] 381 | else: 382 | self.base_level_ = None 383 | chi_squared = np.sum(residuals**2) / (residuals.size - parameters.size) 384 | self.covariance_ = chi_squared * cofactor 385 | return self 386 | 387 | def _newton_step( 388 | self, coordinates, data_observed, data_predicted, parameters, euler, Wd_inv 389 | ): 390 | """ 391 | Calculate the step in parameters and data in the Gauss-Newton iteration 392 | """ 393 | # Weights don't seem to make a difference 394 | east, north, up = coordinates 395 | field, deriv_east, deriv_north, deriv_up = np.split(data_predicted, 4) 396 | A = self._parameter_jacobian(deriv_east, deriv_north, deriv_up) 397 | B_diags = self._data_jacobian_diagonals(coordinates, parameters[:3]) 398 | B = sp.sparse.hstack([sp.sparse.diags(b) for b in B_diags]) 399 | WBT = sp.sparse.hstack( 400 | [sp.sparse.diags(w * b) for b, w in zip(B_diags, Wd_inv)] 401 | ).T 402 | residuals = data_observed - data_predicted 403 | # Q = B @ Wd_inv @ B.T 404 | Q_inv = sp.sparse.diags(1 / sum([b**2 * w for b, w in zip(B_diags, Wd_inv)])) 405 | ATQ = A.T @ Q_inv 406 | BTQ = WBT @ Q_inv 407 | Br = B @ residuals 408 | cofactor = sp.linalg.inv(ATQ @ A) 409 | parameter_step = -cofactor @ ATQ @ (euler + Br) 410 | data_step = residuals - BTQ @ (Br + euler + A @ parameter_step) 411 | return parameter_step, data_step, cofactor 412 | 413 | def _initial_data(self, coordinates, data): 414 | # Initial estimate for the predicted data is close to the observed 415 | # data. It can't be exactly the observed data, zero or any other single 416 | # value because those lead to singular matrices 417 | data_predicted = 0.9 * np.concatenate(data) 418 | return data_predicted 419 | 420 | def _initial_parameters(self, coordinates, data): 421 | # Make an initial estimate for the parameters using the Euler 422 | # Deconvolution results 423 | euler_deconv = EulerDeconvolution(structural_index=self.structural_index) 424 | euler_deconv.fit(coordinates, data) 425 | parameters = np.empty(self.nparams) 426 | parameters[:3] = euler_deconv.location_ 427 | if self.nparams == 4: 428 | parameters[3] = euler_deconv.base_level_ 429 | return parameters 430 | 431 | def _parameter_jacobian( 432 | self, 433 | deriv_east, 434 | deriv_north, 435 | deriv_up, 436 | ): 437 | """ 438 | Calculate the model parameter Jacobian for Euler Inversion 439 | """ 440 | jacobian = np.empty((deriv_east.size, self.nparams)) 441 | jacobian[:, 0] = -deriv_east 442 | jacobian[:, 1] = -deriv_north 443 | jacobian[:, 2] = -deriv_up 444 | if self.nparams == 4: 445 | jacobian[:, 3] = -self.structural_index 446 | return jacobian 447 | 448 | def _data_jacobian_diagonals(self, coordinates, source_location): 449 | """ 450 | Calculate the data Jacobian for Euler Inversion 451 | """ 452 | east, north, up = coordinates 453 | east_s, north_s, up_s = source_location 454 | nequations = east.size 455 | diagonals = [ 456 | np.full(nequations, self.structural_index), 457 | east - east_s, 458 | north - north_s, 459 | up - up_s, 460 | ] 461 | return diagonals 462 | 463 | def _eulers_equation(self, coordinates, data, parameters): 464 | """ 465 | Evaluate Euler's homogeneity equation 466 | """ 467 | east, north, up = coordinates 468 | field, deriv_east, deriv_north, deriv_up = np.split(data, 4) 469 | east_s, north_s, up_s = parameters[:3] 470 | if self.nparams == 4: 471 | base_level = parameters[-1] 472 | else: 473 | base_level = 0 474 | euler = ( 475 | (east - east_s) * deriv_east 476 | + (north - north_s) * deriv_north 477 | + (up - up_s) * deriv_up 478 | + self.structural_index * (field - base_level) 479 | ) 480 | return euler 481 | 482 | 483 | class EulerInversionWindowed: 484 | 485 | def __init__( 486 | self, 487 | window_size, 488 | window_step, 489 | structural_index=None, 490 | keep=0.15, 491 | max_iterations=20, 492 | tol=0.1, 493 | euler_misfit_balance=0.1, 494 | ): 495 | self.structural_index = structural_index 496 | self.window_size = window_size 497 | self.window_step = window_step 498 | self.max_iterations = max_iterations 499 | self.tol = tol 500 | self.euler_misfit_balance = euler_misfit_balance 501 | self.keep = keep 502 | 503 | def fit(self, coordinates, data, weights=DEFAULT_WEIGHTS): 504 | _, windows = vd.rolling_window( 505 | coordinates, 506 | size=self.window_size, 507 | spacing=self.window_step, 508 | adjust="region", 509 | ) 510 | n_windows = windows.size 511 | if self.structural_index is None: 512 | structural_indices = STRUCTURAL_INDICES 513 | else: 514 | structural_indices = self.structural_index 515 | pool = concurrent.futures.ProcessPoolExecutor() 516 | futures = [] 517 | for window in windows.ravel(): 518 | # Skip windows with too few data points 519 | if window[0].size <= 4: 520 | continue 521 | window_coordinates = [c[window[0]] for c in coordinates] 522 | window_data = [d[window[0]] for d in data] 523 | future = pool.submit( 524 | fit_window, 525 | window_coordinates, 526 | window_data, 527 | weights, 528 | structural_indices, 529 | dict( 530 | tol=self.tol, 531 | max_iterations=self.max_iterations, 532 | euler_misfit_balance=self.euler_misfit_balance, 533 | ), 534 | ) 535 | futures.append(future) 536 | solutions = {si: [] for si in structural_indices} 537 | for future in concurrent.futures.as_completed(futures): 538 | model = future.result() 539 | if model is not None: 540 | solutions[model.structural_index].append(model) 541 | # Filter per SI value since their covariances can't be compared against 542 | # each other 543 | keep = int(self.keep * n_windows) 544 | for si in structural_indices: 545 | variances = [np.sum(np.diag(ei.covariance_)[:3]) for ei in solutions[si]] 546 | solutions[si] = [solutions[si][i] for i in np.argsort(variances)[:keep]] 547 | self.solutions_ = sum((solutions[si] for si in structural_indices), start=[]) 548 | self.locations_ = np.transpose([ei.location_ for ei in self.solutions_]) 549 | self.base_levels_ = np.array([ei.base_level_ for ei in self.solutions_]) 550 | self.structural_indices_ = np.array( 551 | [ei.structural_index for ei in self.solutions_] 552 | ) 553 | return self 554 | 555 | def fit_grid( 556 | self, 557 | grid, 558 | weights=DEFAULT_WEIGHTS, 559 | data_names=("field", "deriv_east", "deriv_north", "deriv_up"), 560 | coordinate_names=("easting", "northing", "height"), 561 | ): 562 | """ 563 | Perform Euler Deconvolution on data on a regular grid 564 | """ 565 | shape = grid[data_names[0]].shape 566 | table = vd.grid_to_table(grid) 567 | coordinates = [np.asarray(table[n]) for n in coordinate_names] 568 | data = [np.asarray(table[n]) for n in data_names] 569 | self.fit(coordinates, data, weights) 570 | return self 571 | 572 | 573 | def fit_window(window_coordinates, window_data, weights, structural_indices, kwargs): 574 | window_region = vd.get_region(window_coordinates) 575 | deconvolutions = [] 576 | for si in structural_indices: 577 | ed = EulerDeconvolution(si).fit(window_coordinates, window_data) 578 | deconvolutions.append(ed) 579 | if all([not vd.inside(ed.location_, window_region) for ed in deconvolutions]): 580 | solution = None 581 | else: 582 | candidates = [] 583 | for si, ed in zip(structural_indices, deconvolutions): 584 | ei = EulerInversion(si, initial=ed.parameters_, **kwargs) 585 | ei.fit(window_coordinates, window_data, weights) 586 | candidates.append(ei) 587 | best = candidates[np.argmin([ei.data_misfit_[-1] for ei in candidates])] 588 | inside_window = vd.inside(best.location_, window_region) 589 | if inside_window: 590 | solution = best 591 | else: 592 | solution = None 593 | return solution 594 | -------------------------------------------------------------------------------- /data/README.md: -------------------------------------------------------------------------------- 1 | # Open data used and produced in this project 2 | 3 | Contents: 4 | 5 | * The `raw` folder contains the raw data as it was downloaded from the original 6 | sources. 7 | * The `processed` folder contains the data that was produced by the notebooks 8 | in `code` from the raw data. 9 | 10 | ## Rio de Janeiro data 11 | 12 | The shapefiles and aeromagnetic survey data were obtained from the 13 | [Brazilian Geological Survey](https://geosgb.sgb.gov.br/) (Serviço Geológico 14 | Brasileiro - SGB). The data is publicly available under a Creative Commons 15 | Attribution-NonCommercial 4.0 International License, allowing for use and 16 | modification for non-commercial purposes. 17 | 18 | ### Aeromagnetic data 19 | 20 | The aeromagnetic data (https://geosgb.sgb.gov.br/downloads/) were collected 21 | in two phases in 1978. Subarea 1 was surveyed using an Islander aircraft from 22 | March 25 to May 27, and Subarea 2 from April 6 to July 19 using a Bandeirante 23 | aircraft, funded by the Brazilian government. The survey followed a grid with 24 | 1 km spaced north-south flight lines and east-west tie lines, recording data 25 | every 100 meters with a Geometrics G-803 magnetometer. 26 | 27 | * `raw/1038_XYZ.tar.xz`: Aeromagnetic line data for survey 1038 "Projeto 28 | Aerogeofísico São Paulo -- Rio de Janeiro -- Parte 2" from 29 | [SBG](https://geosgb.sgb.gov.br). License: CC-BY-NC. 30 | * `processed/rio-de-janeiro-magnetic.csv`: Cropped version of the Rio de 31 | Janeiro aeromagnetic data that includes some extra fields: coordinates in 32 | a Mercator projection, derivatives of the field in the 3 cartesian 33 | directions. **Produced in this project**. License: CC-BY-NC. 34 | 35 | ### Geology 36 | 37 | The shapefiles in `raw/shapefiles` were downloaded from 38 | https://rigeo.sgb.gov.br/handle/doc/20479) and represent the geology of the 39 | NE-ENE trending Ribeira Belt (RB), formed during the Brasiliano orogeny. The RB 40 | comprises older basement high-grade metamorphic rocks, Neoproterozoic to 41 | Cambrian/Ordovician granitoid magmatism, and Upper Cretaceous to Paleocene 42 | magmatism that resulted in basic dike swarms and alkaline intrusions. License: 43 | CC-BY-NC. 44 | 45 | ## Natural Earth 46 | 47 | The shapefile `raw/ne_110m_admin_0_countries.zip` was downloaded from 48 | https://www.naturalearthdata.com/downloads/110m-cultural-vectors/ and is in the 49 | public domain. 50 | -------------------------------------------------------------------------------- /data/processed/rio-de-janeiro-dikes.feather: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/data/processed/rio-de-janeiro-dikes.feather -------------------------------------------------------------------------------- /data/processed/rio-de-janeiro-geology.feather: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/data/processed/rio-de-janeiro-geology.feather -------------------------------------------------------------------------------- /data/processed/rio-de-janeiro-topography.nc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/data/processed/rio-de-janeiro-topography.nc -------------------------------------------------------------------------------- /data/raw/1038_XYZ.tar.xz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/data/raw/1038_XYZ.tar.xz -------------------------------------------------------------------------------- /data/raw/ne_110m_admin_0_countries.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/data/raw/ne_110m_admin_0_countries.zip -------------------------------------------------------------------------------- /data/raw/shapefiles/dikes_cut.cpg: -------------------------------------------------------------------------------- 1 | ISO-8859-1 -------------------------------------------------------------------------------- /data/raw/shapefiles/dikes_cut.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/data/raw/shapefiles/dikes_cut.dbf -------------------------------------------------------------------------------- /data/raw/shapefiles/dikes_cut.prj: -------------------------------------------------------------------------------- 1 | GEOGCS["GCS_SIRGAS_2000",DATUM["D_SIRGAS_2000",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] -------------------------------------------------------------------------------- /data/raw/shapefiles/dikes_cut.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/data/raw/shapefiles/dikes_cut.shp -------------------------------------------------------------------------------- /data/raw/shapefiles/dikes_cut.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/data/raw/shapefiles/dikes_cut.shx -------------------------------------------------------------------------------- /data/raw/shapefiles/geology_cut.cpg: -------------------------------------------------------------------------------- 1 | ISO-8859-1 -------------------------------------------------------------------------------- /data/raw/shapefiles/geology_cut.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/data/raw/shapefiles/geology_cut.dbf -------------------------------------------------------------------------------- /data/raw/shapefiles/geology_cut.prj: -------------------------------------------------------------------------------- 1 | GEOGCS["GCS_SIRGAS_2000",DATUM["D_SIRGAS_2000",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] -------------------------------------------------------------------------------- /data/raw/shapefiles/geology_cut.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/data/raw/shapefiles/geology_cut.shp -------------------------------------------------------------------------------- /data/raw/shapefiles/geology_cut.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/data/raw/shapefiles/geology_cut.shx -------------------------------------------------------------------------------- /data/rio-de-janeiro-magnetic.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/data/rio-de-janeiro-magnetic.csv -------------------------------------------------------------------------------- /environment.yml: -------------------------------------------------------------------------------- 1 | name: euler-inversion 2 | channels: 3 | - conda-forge 4 | - defaults 5 | dependencies: 6 | # Should be on every project 7 | - python==3.12.* 8 | - pip 9 | - conda-lock 10 | - numpy 11 | - scipy 12 | - matplotlib 13 | - jupyterlab 14 | - pandas 15 | # For building latex documents 16 | - make 17 | - tectonic 18 | # Project specific dependencies 19 | - xarray 20 | - netcdf4 21 | - numba 22 | - rich 23 | - ipywidgets 24 | - pyproj 25 | - pygmt 26 | - matplotlib-scalebar 27 | - geopandas 28 | - fiona 29 | # Fatiando 30 | - verde 31 | - pooch 32 | - harmonica 33 | - pip: 34 | - black[jupyter] 35 | -------------------------------------------------------------------------------- /graphical-abstract.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/graphical-abstract.jpg -------------------------------------------------------------------------------- /paper/README.md: -------------------------------------------------------------------------------- 1 | # LaTeX source code for the preprint and journal manuscript 2 | 3 | This folder contains the LaTeX source code and figures used to generate the 4 | preprint and manuscript for journal submission. 5 | 6 | ## Files and folders 7 | 8 | * `content.tex`: Contains the actual text for the paper, except for the 9 | abstract and information like title and authors. 10 | * `abstract.tex`: The abstract. 11 | * `abstract-plain.tex`: A plain language version of the abstract. 12 | * `preprint.tex`: The main preprint template for EarthArXiv. Includes the 13 | information in the other files. 14 | * `figures`: Contains all figures. Results figures are generated by the code in 15 | the `code` folder. 16 | * `Makefile`: GNU Make rules for building the PDF documents. 17 | 18 | You mainly will be editing `content.tex`, `preprint.tex`, `abstract-plain.tex`, 19 | and `abstract.tex`. 20 | 21 | ## Creating the PDFs 22 | 23 | To create the PDFs from the LaTeX sources, run `make` in this folder from a 24 | terminal. You will need to have the virtual environment activated to guarantee 25 | that you have GNU Make and Tectonic installed. 26 | See [`REPRODUCING.md`](../REPRODUCING.md). 27 | -------------------------------------------------------------------------------- /paper/abstract-plain.tex: -------------------------------------------------------------------------------- 1 | Earth scientists can estimate the depth of certain rocks beneath Earth's surface by measuring the small disturbances that they cause in the Earth's gravity and magnetic fields. 2 | A popular method for this is \textit{Euler deconvolution}, which is widely available in geoscience software and can be run quickly on a standard computer. 3 | Unfortunately, Euler deconvolution has some shortcomings: 1) the approximate shape of the rocks must be known, for example, a sphere or a wide flat slab, represented by the \textit{structural index} 2) the depth of the rocks is not well estimated when there is noise in our data, which is a common occurrence. 4 | We propose a new method, \textit{Euler inversion}, which fixes some of the shortcomings of Euler deconvolution by using more adequate (and complex) mathematics. 5 | Our method is less sensitive to noise in the data and is also able to determine the approximate shape of the source (the structural index). 6 | Euler inversion is also fast to execute on a standard computer, making it a practical alternative to Euler deconvolution on an Earth scientists toolbox. -------------------------------------------------------------------------------- /paper/abstract.tex: -------------------------------------------------------------------------------- 1 | Locating the sources of observed disturbances in potential-field data is a challenging problem due to the non-unique nature of the inverse problem. 2 | The Euler deconvolution method was created to solve this issue, particularly for idealized sources (such as spheres and planar vertical dykes). 3 | Euler deconvolution has become widely used in potential-field methods due, in large part, to its low computational cost and ease of implementation into software. 4 | However, it is widely known that Euler deconvolution suffers from some shortcomings: 1) non-uniqueness of the solution with respect to the depth of the source and the structural index (a parameter that represents the idealised shape of the source); 2) sensitivity to short-wavelength noise in the data derivatives which are used as inputs for the method. 5 | Here, we present a new method called \textit{Euler inversion} which is a reformulation of the inverse problem of Euler's homogeneity equation as an implicit mathematical model rather than a parametric one. 6 | Euler inversion is a constrained, non-linear inverse problem capable of estimating both the model parameters (location of the source and constant base level) and the predicted data (potential field and its derivatives). 7 | We show that Euler inversion is less sensitive than Euler deconvolution to short-wavelength noise and to the presence of interfering sources in the data window. 8 | By also estimating the predicted data, Euler inversion is also able to estimate the best integer structural index 9 | to be used for inversion. 10 | Our results show that the estimated structural index minimizes the data misfit and coincides with those of the simulated sources. 11 | Furthermore, most matrices involved in the method are either sparse or diagonal, making Euler inversion computationally efficient. 12 | Tests on synthetic data and a real aeromagnetic dataset from Rio de Janeiro, Brazil, demonstrate the effectiveness of Euler inversion to delineate sources with variable geometries and correctly estimate their depths. 13 | -------------------------------------------------------------------------------- /paper/apalike-doi.bst: -------------------------------------------------------------------------------- 1 | % Modified version of the `apalike.bst` bibliography style 2 | % 3 | % Adds the doi and/or the URL to every type of publication if present. 4 | % Adds the ISBN to books, booklet, inbook, incollection, inproceedings and 5 | % proceedings if present. 6 | % Both doi and URL are added with a hyperlink. 7 | % In order to work, use with `doi` and `url` pacakges: 8 | % 9 | % \usepackage{doi} 10 | % \usepackage{url} 11 | % 12 | % This style can also be used with `natbib`. 13 | % 14 | % 15 | % Copyright (C) 2021. Santiago Soler (santiago.r.soler@gmail.com) 16 | % 17 | % Permission is hereby granted, free of charge, to any person obtaining a copy 18 | % of this software and associated documentation files (the "Software"), to deal 19 | % in the Software without restriction, including without limitation the rights 20 | % to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 21 | % copies of the Software, and to permit persons to whom the Software is 22 | % furnished to do so, subject to the following conditions: 23 | 24 | % The above copyright notice and this permission notice shall be included in 25 | % all copies or substantial portions of the Software. 26 | % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 27 | % IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 28 | % FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 29 | % AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 30 | % LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 31 | % OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 32 | % SOFTWARE. 33 | % 34 | % Due to the original license, this file or any modification of it cannot be 35 | % named `apalike.bst`. 36 | 37 | ENTRY 38 | { address 39 | author 40 | booktitle 41 | chapter 42 | doi 43 | edition 44 | editor 45 | howpublished 46 | institution 47 | isbn 48 | journal 49 | key 50 | % month not used in apalike 51 | note 52 | number 53 | organization 54 | pages 55 | publisher 56 | school 57 | series 58 | title 59 | type 60 | url 61 | volume 62 | year 63 | } 64 | {} 65 | { label extra.label sort.label } 66 | 67 | INTEGERS { output.state before.all mid.sentence after.sentence after.block } 68 | 69 | FUNCTION {init.state.consts} 70 | { #0 'before.all := 71 | #1 'mid.sentence := 72 | #2 'after.sentence := 73 | #3 'after.block := 74 | } 75 | 76 | STRINGS { s t } 77 | 78 | FUNCTION {output.nonnull} 79 | { 's := 80 | output.state mid.sentence = 81 | { ", " * write$ } 82 | { output.state after.block = 83 | { add.period$ write$ 84 | newline$ 85 | "\newblock " write$ 86 | } 87 | { output.state before.all = 88 | 'write$ 89 | { add.period$ " " * write$ } 90 | if$ 91 | } 92 | if$ 93 | mid.sentence 'output.state := 94 | } 95 | if$ 96 | s 97 | } 98 | 99 | FUNCTION {output} 100 | { duplicate$ empty$ 101 | 'pop$ 102 | 'output.nonnull 103 | if$ 104 | } 105 | 106 | FUNCTION {output.check} 107 | { 't := 108 | duplicate$ empty$ 109 | { pop$ "empty " t * " in " * cite$ * warning$ } 110 | 'output.nonnull 111 | if$ 112 | } 113 | 114 | % apalike needs this function because 115 | % the year has special punctuation; 116 | % apalike ignores the month 117 | FUNCTION {output.year.check} 118 | { year empty$ 119 | { "empty year in " cite$ * warning$ } 120 | { write$ 121 | " (" year * extra.label * ")" * 122 | mid.sentence 'output.state := 123 | } 124 | if$ 125 | } 126 | 127 | FUNCTION {output.bibitem} 128 | { newline$ 129 | "\bibitem[" write$ 130 | label write$ 131 | "]{" write$ 132 | cite$ write$ 133 | "}" write$ 134 | newline$ 135 | "" 136 | before.all 'output.state := 137 | } 138 | 139 | FUNCTION {fin.entry} 140 | { add.period$ 141 | write$ 142 | newline$ 143 | } 144 | 145 | FUNCTION {new.block} 146 | { output.state before.all = 147 | 'skip$ 148 | { after.block 'output.state := } 149 | if$ 150 | } 151 | 152 | FUNCTION {new.sentence} 153 | { output.state after.block = 154 | 'skip$ 155 | { output.state before.all = 156 | 'skip$ 157 | { after.sentence 'output.state := } 158 | if$ 159 | } 160 | if$ 161 | } 162 | 163 | FUNCTION {not} 164 | { { #0 } 165 | { #1 } 166 | if$ 167 | } 168 | 169 | FUNCTION {and} 170 | { 'skip$ 171 | { pop$ #0 } 172 | if$ 173 | } 174 | 175 | FUNCTION {or} 176 | { { pop$ #1 } 177 | 'skip$ 178 | if$ 179 | } 180 | 181 | FUNCTION {new.block.checkb} 182 | { empty$ 183 | swap$ empty$ 184 | and 185 | 'skip$ 186 | 'new.block 187 | if$ 188 | } 189 | 190 | FUNCTION {field.or.null} 191 | { duplicate$ empty$ 192 | { pop$ "" } 193 | 'skip$ 194 | if$ 195 | } 196 | 197 | FUNCTION {emphasize} 198 | { duplicate$ empty$ 199 | { pop$ "" } 200 | { "{\em " swap$ * "}" * } 201 | if$ 202 | } 203 | 204 | INTEGERS { nameptr namesleft numnames } 205 | 206 | FUNCTION {format.names} 207 | { 's := 208 | #1 'nameptr := 209 | s num.names$ 'numnames := 210 | numnames 'namesleft := 211 | { namesleft #0 > } 212 | { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := % last name first 213 | nameptr #1 > 214 | { namesleft #1 > 215 | { ", " * t * } 216 | { numnames #2 > 217 | { "," * } 218 | 'skip$ 219 | if$ 220 | t "others" = 221 | { " et~al." * } 222 | { " and " * t * } 223 | if$ 224 | } 225 | if$ 226 | } 227 | 't 228 | if$ 229 | nameptr #1 + 'nameptr := 230 | namesleft #1 - 'namesleft := 231 | } 232 | while$ 233 | } 234 | 235 | FUNCTION {format.authors} 236 | { author empty$ 237 | { "" } 238 | { author format.names } 239 | if$ 240 | } 241 | 242 | FUNCTION {format.key} % this function is just for apalike 243 | { empty$ 244 | { key field.or.null } 245 | { "" } 246 | if$ 247 | } 248 | 249 | FUNCTION {format.editors} 250 | { editor empty$ 251 | { "" } 252 | { editor format.names 253 | editor num.names$ #1 > 254 | { ", editors" * } 255 | { ", editor" * } 256 | if$ 257 | } 258 | if$ 259 | } 260 | 261 | FUNCTION {format.title} 262 | { title empty$ 263 | { "" } 264 | { title "t" change.case$ } 265 | if$ 266 | } 267 | 268 | FUNCTION {n.dashify} 269 | { 't := 270 | "" 271 | { t empty$ not } 272 | { t #1 #1 substring$ "-" = 273 | { t #1 #2 substring$ "--" = not 274 | { "--" * 275 | t #2 global.max$ substring$ 't := 276 | } 277 | { { t #1 #1 substring$ "-" = } 278 | { "-" * 279 | t #2 global.max$ substring$ 't := 280 | } 281 | while$ 282 | } 283 | if$ 284 | } 285 | { t #1 #1 substring$ * 286 | t #2 global.max$ substring$ 't := 287 | } 288 | if$ 289 | } 290 | while$ 291 | } 292 | 293 | FUNCTION {format.btitle} 294 | { title emphasize 295 | } 296 | 297 | FUNCTION {tie.or.space.connect} 298 | { duplicate$ text.length$ #3 < 299 | { "~" } 300 | { " " } 301 | if$ 302 | swap$ * * 303 | } 304 | 305 | FUNCTION {either.or.check} 306 | { empty$ 307 | 'pop$ 308 | { "can't use both " swap$ * " fields in " * cite$ * warning$ } 309 | if$ 310 | } 311 | 312 | FUNCTION {format.bvolume} 313 | { volume empty$ 314 | { "" } 315 | { "volume" volume tie.or.space.connect 316 | series empty$ 317 | 'skip$ 318 | { " of " * series emphasize * } 319 | if$ 320 | "volume and number" number either.or.check 321 | } 322 | if$ 323 | } 324 | 325 | FUNCTION {format.number.series} 326 | { volume empty$ 327 | { number empty$ 328 | { series field.or.null } 329 | { output.state mid.sentence = 330 | { "number" } 331 | { "Number" } 332 | if$ 333 | number tie.or.space.connect 334 | series empty$ 335 | { "there's a number but no series in " cite$ * warning$ } 336 | { " in " * series * } 337 | if$ 338 | } 339 | if$ 340 | } 341 | { "" } 342 | if$ 343 | } 344 | 345 | FUNCTION {format.edition} 346 | { edition empty$ 347 | { "" } 348 | { output.state mid.sentence = 349 | { edition "l" change.case$ " edition" * } 350 | { edition "t" change.case$ " edition" * } 351 | if$ 352 | } 353 | if$ 354 | } 355 | 356 | INTEGERS { multiresult } 357 | 358 | FUNCTION {multi.page.check} 359 | { 't := 360 | #0 'multiresult := 361 | { multiresult not 362 | t empty$ not 363 | and 364 | } 365 | { t #1 #1 substring$ 366 | duplicate$ "-" = 367 | swap$ duplicate$ "," = 368 | swap$ "+" = 369 | or or 370 | { #1 'multiresult := } 371 | { t #2 global.max$ substring$ 't := } 372 | if$ 373 | } 374 | while$ 375 | multiresult 376 | } 377 | 378 | FUNCTION {format.pages} 379 | { pages empty$ 380 | { "" } 381 | { pages multi.page.check 382 | { "pages" pages n.dashify tie.or.space.connect } 383 | { "page" pages tie.or.space.connect } 384 | if$ 385 | } 386 | if$ 387 | } 388 | 389 | FUNCTION {format.vol.num.pages} 390 | { volume field.or.null 391 | number empty$ 392 | 'skip$ 393 | { "(" number * ")" * * 394 | volume empty$ 395 | { "there's a number but no volume in " cite$ * warning$ } 396 | 'skip$ 397 | if$ 398 | } 399 | if$ 400 | pages empty$ 401 | 'skip$ 402 | { duplicate$ empty$ 403 | { pop$ format.pages } 404 | { ":" * pages n.dashify * } 405 | if$ 406 | } 407 | if$ 408 | } 409 | 410 | FUNCTION {format.chapter.pages} 411 | { chapter empty$ 412 | 'format.pages 413 | { type empty$ 414 | { "chapter" } 415 | { type "l" change.case$ } 416 | if$ 417 | chapter tie.or.space.connect 418 | pages empty$ 419 | 'skip$ 420 | { ", " * format.pages * } 421 | if$ 422 | } 423 | if$ 424 | } 425 | 426 | FUNCTION {format.in.ed.booktitle} 427 | { booktitle empty$ 428 | { "" } 429 | { editor empty$ 430 | { "In " booktitle emphasize * } 431 | { "In " format.editors * ", " * booktitle emphasize * } 432 | if$ 433 | } 434 | if$ 435 | } 436 | 437 | FUNCTION {format.thesis.type} 438 | { type empty$ 439 | 'skip$ 440 | { pop$ 441 | type "t" change.case$ 442 | } 443 | if$ 444 | } 445 | 446 | FUNCTION {format.tr.number} 447 | { type empty$ 448 | { "Technical Report" } 449 | 'type 450 | if$ 451 | number empty$ 452 | { "t" change.case$ } 453 | { number tie.or.space.connect } 454 | if$ 455 | } 456 | 457 | FUNCTION {format.article.crossref} 458 | { "In" % this is for apalike 459 | " \cite{" * crossref * "}" * 460 | } 461 | 462 | FUNCTION {format.book.crossref} 463 | { volume empty$ 464 | { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ 465 | "In " 466 | } 467 | { "Volume" volume tie.or.space.connect 468 | " of " * 469 | } 470 | if$ 471 | "\cite{" * crossref * "}" * % this is for apalike 472 | } 473 | 474 | FUNCTION {format.incoll.inproc.crossref} 475 | { "In" % this is for apalike 476 | " \cite{" * crossref * "}" * 477 | } 478 | 479 | FUNCTION {format.doi} 480 | { doi empty$ 481 | { "" } 482 | { new.block "\doi{" doi * "}" * } 483 | if$ 484 | } 485 | 486 | FUNCTION {format.url} 487 | { url empty$ 488 | { "" } 489 | { new.block "URL \url{" url * "}" * } 490 | if$ 491 | } 492 | 493 | FUNCTION {format.isbn} 494 | { isbn empty$ 495 | { "" } 496 | { new.block "ISBN " isbn * } 497 | if$ 498 | } 499 | 500 | FUNCTION {article} 501 | { output.bibitem 502 | format.authors "author" output.check 503 | author format.key output % special for 504 | output.year.check % apalike 505 | new.block 506 | format.title "title" output.check 507 | new.block 508 | crossref missing$ 509 | { journal emphasize "journal" output.check 510 | format.vol.num.pages output 511 | } 512 | { format.article.crossref output.nonnull 513 | format.pages output 514 | } 515 | if$ 516 | format.doi output 517 | format.url output 518 | new.block 519 | note output 520 | fin.entry 521 | } 522 | 523 | FUNCTION {book} 524 | { output.bibitem 525 | author empty$ 526 | { format.editors "author and editor" output.check 527 | editor format.key output 528 | } 529 | { format.authors output.nonnull 530 | crossref missing$ 531 | { "author and editor" editor either.or.check } 532 | 'skip$ 533 | if$ 534 | } 535 | if$ 536 | output.year.check % special for apalike 537 | new.block 538 | format.btitle "title" output.check 539 | crossref missing$ 540 | { format.bvolume output 541 | new.block 542 | format.number.series output 543 | new.sentence 544 | publisher "publisher" output.check 545 | address output 546 | } 547 | { new.block 548 | format.book.crossref output.nonnull 549 | } 550 | if$ 551 | format.edition output 552 | format.isbn output 553 | format.doi output 554 | format.url output 555 | new.block 556 | note output 557 | fin.entry 558 | } 559 | 560 | FUNCTION {booklet} 561 | { output.bibitem 562 | format.authors output 563 | author format.key output % special for 564 | output.year.check % apalike 565 | new.block 566 | format.title "title" output.check 567 | new.block 568 | howpublished output 569 | address output 570 | format.isbn output 571 | format.doi output 572 | format.url output 573 | new.block 574 | note output 575 | fin.entry 576 | } 577 | 578 | FUNCTION {inbook} 579 | { output.bibitem 580 | author empty$ 581 | { format.editors "author and editor" output.check 582 | editor format.key output 583 | } 584 | { format.authors output.nonnull 585 | crossref missing$ 586 | { "author and editor" editor either.or.check } 587 | 'skip$ 588 | if$ 589 | } 590 | if$ 591 | output.year.check % special for apalike 592 | new.block 593 | format.btitle "title" output.check 594 | crossref missing$ 595 | { format.bvolume output 596 | format.chapter.pages "chapter and pages" output.check 597 | new.block 598 | format.number.series output 599 | new.sentence 600 | publisher "publisher" output.check 601 | address output 602 | } 603 | { format.chapter.pages "chapter and pages" output.check 604 | new.block 605 | format.book.crossref output.nonnull 606 | } 607 | if$ 608 | format.edition output 609 | format.isbn output 610 | format.doi output 611 | format.url output 612 | new.block 613 | note output 614 | fin.entry 615 | } 616 | 617 | FUNCTION {incollection} 618 | { output.bibitem 619 | format.authors "author" output.check 620 | author format.key output % special for 621 | output.year.check % apalike 622 | new.block 623 | format.title "title" output.check 624 | new.block 625 | crossref missing$ 626 | { format.in.ed.booktitle "booktitle" output.check 627 | format.bvolume output 628 | format.number.series output 629 | format.chapter.pages output 630 | new.sentence 631 | publisher "publisher" output.check 632 | address output 633 | format.edition output 634 | } 635 | { format.incoll.inproc.crossref output.nonnull 636 | format.chapter.pages output 637 | } 638 | if$ 639 | format.isbn output 640 | format.doi output 641 | format.url output 642 | new.block 643 | note output 644 | fin.entry 645 | } 646 | 647 | FUNCTION {inproceedings} 648 | { output.bibitem 649 | format.authors "author" output.check 650 | author format.key output % special for 651 | output.year.check % apalike 652 | new.block 653 | format.title "title" output.check 654 | new.block 655 | crossref missing$ 656 | { format.in.ed.booktitle "booktitle" output.check 657 | format.bvolume output 658 | format.number.series output 659 | format.pages output 660 | address output % for apalike 661 | new.sentence % there's no year 662 | organization output % here so things 663 | publisher output % are simpler 664 | } 665 | { format.incoll.inproc.crossref output.nonnull 666 | format.pages output 667 | } 668 | if$ 669 | format.isbn output 670 | format.doi output 671 | format.url output 672 | new.block 673 | note output 674 | fin.entry 675 | } 676 | 677 | FUNCTION {conference} { inproceedings } 678 | 679 | FUNCTION {manual} 680 | { output.bibitem 681 | format.authors output 682 | author format.key output % special for 683 | output.year.check % apalike 684 | new.block 685 | format.btitle "title" output.check 686 | organization address new.block.checkb 687 | organization output 688 | address output 689 | format.edition output 690 | format.doi output 691 | format.url output 692 | new.block 693 | note output 694 | fin.entry 695 | } 696 | 697 | FUNCTION {mastersthesis} 698 | { output.bibitem 699 | format.authors "author" output.check 700 | author format.key output % special for 701 | output.year.check % apalike 702 | new.block 703 | format.title "title" output.check 704 | new.block 705 | "Master's thesis" format.thesis.type output.nonnull 706 | school "school" output.check 707 | address output 708 | format.doi output 709 | format.url output 710 | new.block 711 | note output 712 | fin.entry 713 | } 714 | 715 | FUNCTION {misc} 716 | { output.bibitem 717 | format.authors output 718 | author format.key output % special for 719 | output.year.check % apalike 720 | new.block 721 | format.title output 722 | new.block 723 | howpublished output 724 | format.doi output 725 | format.url output 726 | new.block 727 | note output 728 | fin.entry 729 | } 730 | 731 | FUNCTION {phdthesis} 732 | { output.bibitem 733 | format.authors "author" output.check 734 | author format.key output % special for 735 | output.year.check % apalike 736 | new.block 737 | format.btitle "title" output.check 738 | new.block 739 | "PhD thesis" format.thesis.type output.nonnull 740 | school "school" output.check 741 | address output 742 | format.doi output 743 | format.url output 744 | new.block 745 | note output 746 | fin.entry 747 | } 748 | 749 | FUNCTION {proceedings} 750 | { output.bibitem 751 | format.editors output 752 | editor format.key output % special for 753 | output.year.check % apalike 754 | new.block 755 | format.btitle "title" output.check 756 | format.bvolume output 757 | format.number.series output 758 | address output % for apalike 759 | new.sentence % we always output 760 | organization output % a nonempty organization 761 | publisher output % here 762 | format.isbn output 763 | format.doi output 764 | format.url output 765 | new.block 766 | note output 767 | fin.entry 768 | } 769 | 770 | FUNCTION {techreport} 771 | { output.bibitem 772 | format.authors "author" output.check 773 | author format.key output % special for 774 | output.year.check % apalike 775 | new.block 776 | format.title "title" output.check 777 | new.block 778 | format.tr.number output.nonnull 779 | institution "institution" output.check 780 | address output 781 | format.doi output 782 | format.url output 783 | new.block 784 | note output 785 | fin.entry 786 | } 787 | 788 | FUNCTION {unpublished} 789 | { output.bibitem 790 | format.authors "author" output.check 791 | author format.key output % special for 792 | output.year.check % apalike 793 | new.block 794 | format.title "title" output.check 795 | format.doi output 796 | format.url output 797 | new.block 798 | note "note" output.check 799 | fin.entry 800 | } 801 | 802 | FUNCTION {default.type} { misc } 803 | 804 | MACRO {jan} {"January"} 805 | 806 | MACRO {feb} {"February"} 807 | 808 | MACRO {mar} {"March"} 809 | 810 | MACRO {apr} {"April"} 811 | 812 | MACRO {may} {"May"} 813 | 814 | MACRO {jun} {"June"} 815 | 816 | MACRO {jul} {"July"} 817 | 818 | MACRO {aug} {"August"} 819 | 820 | MACRO {sep} {"September"} 821 | 822 | MACRO {oct} {"October"} 823 | 824 | MACRO {nov} {"November"} 825 | 826 | MACRO {dec} {"December"} 827 | 828 | MACRO {acmcs} {"ACM Computing Surveys"} 829 | 830 | MACRO {acta} {"Acta Informatica"} 831 | 832 | MACRO {cacm} {"Communications of the ACM"} 833 | 834 | MACRO {ibmjrd} {"IBM Journal of Research and Development"} 835 | 836 | MACRO {ibmsj} {"IBM Systems Journal"} 837 | 838 | MACRO {ieeese} {"IEEE Transactions on Software Engineering"} 839 | 840 | MACRO {ieeetc} {"IEEE Transactions on Computers"} 841 | 842 | MACRO {ieeetcad} 843 | {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} 844 | 845 | MACRO {ipl} {"Information Processing Letters"} 846 | 847 | MACRO {jacm} {"Journal of the ACM"} 848 | 849 | MACRO {jcss} {"Journal of Computer and System Sciences"} 850 | 851 | MACRO {scp} {"Science of Computer Programming"} 852 | 853 | MACRO {sicomp} {"SIAM Journal on Computing"} 854 | 855 | MACRO {tocs} {"ACM Transactions on Computer Systems"} 856 | 857 | MACRO {tods} {"ACM Transactions on Database Systems"} 858 | 859 | MACRO {tog} {"ACM Transactions on Graphics"} 860 | 861 | MACRO {toms} {"ACM Transactions on Mathematical Software"} 862 | 863 | MACRO {toois} {"ACM Transactions on Office Information Systems"} 864 | 865 | MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} 866 | 867 | MACRO {tcs} {"Theoretical Computer Science"} 868 | 869 | READ 870 | 871 | FUNCTION {sortify} 872 | { purify$ 873 | "l" change.case$ 874 | } 875 | 876 | INTEGERS { len } 877 | 878 | FUNCTION {chop.word} 879 | { 's := 880 | 'len := 881 | s #1 len substring$ = 882 | { s len #1 + global.max$ substring$ } 883 | 's 884 | if$ 885 | } 886 | 887 | % There are three apalike cases: one person (Jones), 888 | % two (Jones and de~Bruijn), and more (Jones et~al.). 889 | % This function is much like format.crossref.editors. 890 | % 891 | FUNCTION {format.lab.names} 892 | { 's := 893 | s #1 "{vv~}{ll}" format.name$ 894 | s num.names$ duplicate$ 895 | #2 > 896 | { pop$ " et~al." * } 897 | { #2 < 898 | 'skip$ 899 | { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = 900 | { " et~al." * } 901 | { " and " * s #2 "{vv~}{ll}" format.name$ * } 902 | if$ 903 | } 904 | if$ 905 | } 906 | if$ 907 | } 908 | 909 | FUNCTION {author.key.label} 910 | { author empty$ 911 | { key empty$ 912 | { cite$ #1 #3 substring$ } 913 | 'key % apalike uses the whole key 914 | if$ 915 | } 916 | { author format.lab.names } 917 | if$ 918 | } 919 | 920 | FUNCTION {author.editor.key.label} 921 | { author empty$ 922 | { editor empty$ 923 | { key empty$ 924 | { cite$ #1 #3 substring$ } 925 | 'key % apalike uses the whole key 926 | if$ 927 | } 928 | { editor format.lab.names } 929 | if$ 930 | } 931 | { author format.lab.names } 932 | if$ 933 | } 934 | 935 | FUNCTION {editor.key.label} 936 | { editor empty$ 937 | { key empty$ 938 | { cite$ #1 #3 substring$ } 939 | 'key % apalike uses the whole key, no organization 940 | if$ 941 | } 942 | { editor format.lab.names } 943 | if$ 944 | } 945 | 946 | FUNCTION {calc.label} 947 | { type$ "book" = 948 | type$ "inbook" = 949 | or 950 | 'author.editor.key.label 951 | { type$ "proceedings" = 952 | 'editor.key.label % apalike ignores organization 953 | 'author.key.label % for labeling and sorting 954 | if$ 955 | } 956 | if$ 957 | ", " % these three lines are 958 | * % for apalike, which 959 | year field.or.null purify$ #-1 #4 substring$ % uses all four digits 960 | * 961 | 'label := 962 | } 963 | 964 | FUNCTION {sort.format.names} 965 | { 's := 966 | #1 'nameptr := 967 | "" 968 | s num.names$ 'numnames := 969 | numnames 'namesleft := 970 | { namesleft #0 > } 971 | { nameptr #1 > 972 | { " " * } 973 | 'skip$ 974 | if$ % apalike uses initials 975 | s nameptr "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" format.name$ 't := % <= here 976 | nameptr numnames = t "others" = and 977 | { "et al" * } 978 | { t sortify * } 979 | if$ 980 | nameptr #1 + 'nameptr := 981 | namesleft #1 - 'namesleft := 982 | } 983 | while$ 984 | } 985 | 986 | FUNCTION {sort.format.title} 987 | { 't := 988 | "A " #2 989 | "An " #3 990 | "The " #4 t chop.word 991 | chop.word 992 | chop.word 993 | sortify 994 | #1 global.max$ substring$ 995 | } 996 | 997 | FUNCTION {author.sort} 998 | { author empty$ 999 | { key empty$ 1000 | { "to sort, need author or key in " cite$ * warning$ 1001 | "" 1002 | } 1003 | { key sortify } 1004 | if$ 1005 | } 1006 | { author sort.format.names } 1007 | if$ 1008 | } 1009 | 1010 | FUNCTION {author.editor.sort} 1011 | { author empty$ 1012 | { editor empty$ 1013 | { key empty$ 1014 | { "to sort, need author, editor, or key in " cite$ * warning$ 1015 | "" 1016 | } 1017 | { key sortify } 1018 | if$ 1019 | } 1020 | { editor sort.format.names } 1021 | if$ 1022 | } 1023 | { author sort.format.names } 1024 | if$ 1025 | } 1026 | 1027 | FUNCTION {editor.sort} 1028 | { editor empty$ 1029 | { key empty$ 1030 | { "to sort, need editor or key in " cite$ * warning$ 1031 | "" 1032 | } 1033 | { key sortify } 1034 | if$ 1035 | } 1036 | { editor sort.format.names } 1037 | if$ 1038 | } 1039 | 1040 | % apalike uses two sorting passes; the first one sets the 1041 | % labels so that the `a's, `b's, etc. can be computed; 1042 | % the second pass puts the references in "correct" order. 1043 | % The presort function is for the first pass. It computes 1044 | % label, sort.label, and title, and then concatenates. 1045 | FUNCTION {presort} 1046 | { calc.label 1047 | label sortify 1048 | " " 1049 | * 1050 | type$ "book" = 1051 | type$ "inbook" = 1052 | or 1053 | 'author.editor.sort 1054 | { type$ "proceedings" = 1055 | 'editor.sort 1056 | 'author.sort 1057 | if$ 1058 | } 1059 | if$ 1060 | #1 entry.max$ substring$ % for 1061 | 'sort.label := % apalike 1062 | sort.label % style 1063 | * 1064 | " " 1065 | * 1066 | title field.or.null 1067 | sort.format.title 1068 | * 1069 | #1 entry.max$ substring$ 1070 | 'sort.key$ := 1071 | } 1072 | 1073 | ITERATE {presort} 1074 | 1075 | SORT % by label, sort.label, title---for final label calculation 1076 | 1077 | STRINGS { last.label next.extra } % apalike labels are only for the text; 1078 | 1079 | INTEGERS { last.extra.num } % there are none in the bibliography 1080 | 1081 | FUNCTION {initialize.extra.label.stuff} % and hence there is no `longest.label' 1082 | { #0 int.to.chr$ 'last.label := 1083 | "" 'next.extra := 1084 | #0 'last.extra.num := 1085 | } 1086 | 1087 | FUNCTION {forward.pass} 1088 | { last.label label = 1089 | { last.extra.num #1 + 'last.extra.num := 1090 | last.extra.num int.to.chr$ 'extra.label := 1091 | } 1092 | { "a" chr.to.int$ 'last.extra.num := 1093 | "" 'extra.label := 1094 | label 'last.label := 1095 | } 1096 | if$ 1097 | } 1098 | 1099 | FUNCTION {reverse.pass} 1100 | { next.extra "b" = 1101 | { "a" 'extra.label := } 1102 | 'skip$ 1103 | if$ 1104 | label extra.label * 'label := 1105 | extra.label 'next.extra := 1106 | } 1107 | 1108 | EXECUTE {initialize.extra.label.stuff} 1109 | 1110 | ITERATE {forward.pass} 1111 | 1112 | REVERSE {reverse.pass} 1113 | 1114 | % Now that the label is right we sort for real, 1115 | % on sort.label then year then title. This is 1116 | % for the second sorting pass. 1117 | FUNCTION {bib.sort.order} 1118 | { sort.label 1119 | " " 1120 | * 1121 | year field.or.null sortify 1122 | * 1123 | " " 1124 | * 1125 | title field.or.null 1126 | sort.format.title 1127 | * 1128 | #1 entry.max$ substring$ 1129 | 'sort.key$ := 1130 | } 1131 | 1132 | ITERATE {bib.sort.order} 1133 | 1134 | SORT % by sort.label, year, title---giving final bibliography order 1135 | 1136 | FUNCTION {begin.bib} 1137 | { preamble$ empty$ % no \etalchar in apalike 1138 | 'skip$ 1139 | { preamble$ write$ newline$ } 1140 | if$ 1141 | "\begin{thebibliography}{}" write$ newline$ % no labels in apalike 1142 | } 1143 | 1144 | EXECUTE {begin.bib} 1145 | 1146 | EXECUTE {init.state.consts} 1147 | 1148 | ITERATE {call.type$} 1149 | 1150 | FUNCTION {end.bib} 1151 | { newline$ 1152 | "\end{thebibliography}" write$ newline$ 1153 | } 1154 | 1155 | EXECUTE {end.bib} 1156 | -------------------------------------------------------------------------------- /paper/cover-letter.tex: -------------------------------------------------------------------------------- 1 | % Template for a letter on IAG-USP letterhead 2 | 3 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4 | % Set a class and general configuration 5 | \documentclass[a4paper,onecolumn,10pt]{article} 6 | 7 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8 | % Set variables with the title, authors, etc. 9 | 10 | \input{information.tex} 11 | \newcommand{\LetterTitle}{Cover letter -- \Title} 12 | 13 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 14 | % Import the required packages 15 | \usepackage[utf8]{inputenc} 16 | \usepackage[TU]{fontenc} 17 | \usepackage[british]{babel} 18 | \usepackage{graphicx} 19 | \usepackage{hyperref} 20 | \usepackage{fancyhdr} 21 | \usepackage{geometry} 22 | \usepackage{microtype} 23 | \usepackage{xcolor} 24 | % improved urls with proper hyphenation 25 | \usepackage{xurl} 26 | % Use a different font 27 | \usepackage[scaled=1.1]{notomath} 28 | % Control the font size 29 | \usepackage{anyfontsize} 30 | \usepackage{setspace} 31 | % Generate random text 32 | \usepackage{lipsum} 33 | % Better left and right align 34 | \usepackage{ragged2e} 35 | 36 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 37 | % Configuration of the document 38 | 39 | \geometry{% 40 | left=25mm, 41 | right=15mm, 42 | top=15mm, 43 | bottom=15mm, 44 | headsep=15mm, 45 | headheight=15mm, 46 | footskip=7mm, 47 | includehead=true, 48 | includefoot=true 49 | } 50 | 51 | % Control line spacing 52 | \onehalfspacing 53 | \newcommand{\Padding}{\vspace{0.75cm}} 54 | 55 | % Custom colors 56 | \definecolor{darkgray}{gray}{0.4} 57 | \definecolor{mediumgray}{gray}{0.5} 58 | \definecolor{lightgray}{gray}{0.9} 59 | \definecolor{mediumblue}{HTML}{2060c2} 60 | \definecolor{lightblue}{HTML}{f7faff} 61 | 62 | % Make urls use the same font as every other text 63 | \urlstyle{same} 64 | 65 | % Configure hyperref and add PDF metadata 66 | \hypersetup{ 67 | colorlinks, 68 | allcolors=mediumblue, 69 | pdftitle={\LetterTitle}, 70 | pdfauthor={\AuthorShort}, 71 | breaklinks=true, 72 | } 73 | 74 | % Remove numbering and headers and footers 75 | \pagestyle{empty} 76 | 77 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 78 | \begin{document} 79 | 80 | \begin{flushleft} 81 | Editorial team 82 | \\ 83 | \Journal 84 | \end{flushleft} 85 | \begin{flushright} 86 | 20th December 2024 87 | \end{flushright} 88 | \Padding 89 | 90 | \noindent 91 | Dear Editor, 92 | \Padding 93 | 94 | We are pleased to submit the original research paper titled ``\Title{}'' for 95 | consideration by \Journal{}. 96 | The manuscript is currently available as a preprint on EarthArXiv at 97 | \url{https://doi.org/\PreprintDOI} under the CC-BY license. 98 | 99 | The paper introduces a novel method that we have developed, which we call 100 | \textit{Euler inversion}, for estimating the location and approximate geometry 101 | of sources of gravity and magnetic anomalies. 102 | Euler inversion is a significant departure from established methods (mainly 103 | Euler deconvolution and its variants), both in terms of the mathematical 104 | formulation and the higher robustness of the results to random noise and the 105 | presence of interfering sources. 106 | Instead of a linear inversion, we perform a non-linear inversion which can 107 | estimate both the model parameters and the predicted potential-field and its 108 | spatial derivatives. 109 | The mathematics used are similar to total-least-squares from statistics and the 110 | combined adjustment from geodesy (which was the inspiration for our work). 111 | An added benefit of being able to provide predicted data (which Euler 112 | deconvolution cannot do) is that Euler inversion can also estimate an integer 113 | structural index, which is related to the source geometry. 114 | We found that the best index is the one that minimizes the data misfit. 115 | Euler inversion is also fast to execute on a standard computer, making it 116 | a practical alternative to Euler deconvolution on an Earth scientists toolbox. 117 | All of the code and data needed to reproduce every figure is provided through 118 | the DOI and GitHub repository to which there are links in the paper. 119 | 120 | This paper has contributions from two student authors currently undertaking 121 | their PhD training: myself (India Uppal), and Gelson F. Souza-Junior. 122 | However, it is not a part of either doctoral theses. 123 | \Padding 124 | 125 | Thank you for your consideration of our manuscript. 126 | \Padding 127 | 128 | \begin{flushleft} 129 | Yours Faithfully, 130 | \Padding 131 | 132 | India Uppal (on behalf of all authors) 133 | \\[0.25cm] 134 | { 135 | \color{mediumgray} 136 | \small 137 | Department of Earth, Ocean and Ecological Sciences 138 | \\ 139 | School of Environmental Science 140 | \\ 141 | University of Liverpool 142 | \\ 143 | United Kingdom 144 | } 145 | \end{flushleft} 146 | \end{document} 147 | -------------------------------------------------------------------------------- /paper/figures/real-data-application-comparison.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/paper/figures/real-data-application-comparison.png -------------------------------------------------------------------------------- /paper/figures/real-data-application.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/paper/figures/real-data-application.png -------------------------------------------------------------------------------- /paper/figures/real-data-geology.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/paper/figures/real-data-geology.png -------------------------------------------------------------------------------- /paper/figures/synthetic-interfering-sources-dykes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/paper/figures/synthetic-interfering-sources-dykes.png -------------------------------------------------------------------------------- /paper/figures/synthetic-interfering-sources.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/paper/figures/synthetic-interfering-sources.png -------------------------------------------------------------------------------- /paper/figures/synthetic-noise-levels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/paper/figures/synthetic-noise-levels.png -------------------------------------------------------------------------------- /paper/figures/synthetic-proof-of-concept.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/paper/figures/synthetic-proof-of-concept.png -------------------------------------------------------------------------------- /paper/figures/synthetic-structural-index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/paper/figures/synthetic-structural-index.png -------------------------------------------------------------------------------- /paper/figures/synthetic-windows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/paper/figures/synthetic-windows.png -------------------------------------------------------------------------------- /paper/information.tex: -------------------------------------------------------------------------------- 1 | % Used to set information about the paper that is used in multiple files 2 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 3 | 4 | % Set variables with the title, authors, etc. 5 | \newcommand{\Title}{Euler inversion: Locating sources of potential-field data through inversion of Euler's homogeneity equation} 6 | \newcommand{\TitleShort}{Euler inversion} 7 | 8 | \newcommand{\Year}{2025} 9 | \newcommand{\PreprintOn}{2024/12/19} 10 | \newcommand{\SubmittedOn}{2024/12/20} 11 | \newcommand{\RevisionAOn}{2025/02/28} 12 | \newcommand{\PublishedOn}{2025/03/26} 13 | 14 | \newcommand{\AuthorShort}{Uieda et al.} 15 | \newcommand{\Authors}{% 16 | Leonardo Uieda\textsuperscript{1}, 17 | Gelson Ferreira Souza-Junior\textsuperscript{1}, 18 | India Uppal\textsuperscript{2}, 19 | Vanderlei Coelho Oliveira Jr.\textsuperscript{3} 20 | } 21 | \newcommand{\Email}{uieda@usp.br} 22 | \newcommand{\Corresponding}{% 23 | Corresponding author: Leonardo Uieda <\href{mailto:\Email}{\Email}> 24 | } 25 | \newcommand{\Affiliations}{% 26 | \textsuperscript{1} Universidade de São Paulo, Brazil; 27 | \textsuperscript{2} University of Liverpool, UK; 28 | \textsuperscript{3} Observatório Nacional, Brazil; 29 | } 30 | \newcommand{\AuthorORCIDs}{% 31 | LU (\href{https://orcid.org/0000-0001-6123-9515}{0000-0001-6123-9515}); 32 | GFSJ (\href{https://orcid.org/0000-0002-5695-4239}{0000-0002-5695-4239}); 33 | IU (\href{https://orcid.org/0000-0003-3531-2656}{0000-0003-3531-2656}); 34 | VCOJr (\href{https://orcid.org/0000-0002-6338-4086}{0000-0002-6338-4086}) 35 | } 36 | 37 | \newcommand{\Journal}{Geophysical Journal International} 38 | \newcommand{\JournalDOI}{10.1093/gji/ggaf114} 39 | \newcommand{\PreprintDOI}{10.31223/X5T41M} 40 | \newcommand{\ArchiveDOI}{10.6084/m9.figshare.26384140} 41 | \newcommand{\GitHubRepository}{compgeolab/euler-inversion} 42 | \newcommand{\SWHeritageID}{swh:1:snp:b0d1f8fdbf57f87e0ce56d5dda0f360c4a314d9d} 43 | \newcommand{\SWHeritageURL}{https://archive.softwareheritage.org/\SWHeritageID;origin=https://github.com/\GitHubRepository} 44 | 45 | % From GJI's list of keywords: https://static.primary.prod.gcms.the-infra.com/static/site/gji/document/GJI%20Keywords%202023.pdf?node=ef215d8b2a32e1ee1ffe 46 | \newcommand{\Keywords}{% 47 | Gravity anomalies and Earth structure; 48 | Magnetic anomalies: modelling and interpretation; 49 | Inverse theory; 50 | } 51 | -------------------------------------------------------------------------------- /paper/manuscript.tex: -------------------------------------------------------------------------------- 1 | % Manuscript for submission to a journal. 2 | % 3 | % Formatted with double space and line numbers. 4 | % 5 | % This is the document structure. The actual content is written in: 6 | % * abstract.tex: The abstract. 7 | % * content.tex: The actual manuscript text (minus the abstract). 8 | % 9 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 10 | % Set a class and general configuration 11 | \documentclass[onecolumn,12pt,a4paper]{article} 12 | 13 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 14 | 15 | % Read in the title, authors, etc 16 | \input{information.tex} 17 | \input{variables.tex} 18 | 19 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 20 | % Import the required packages 21 | \usepackage[utf8]{inputenc} 22 | \usepackage[TU]{fontenc} 23 | \usepackage[english]{babel} 24 | \usepackage{amsmath} 25 | \usepackage{amssymb} 26 | \usepackage{graphicx} 27 | \usepackage{hyperref} 28 | \usepackage{fancyhdr} 29 | \usepackage{geometry} 30 | \usepackage{booktabs} 31 | \usepackage{microtype} 32 | \usepackage{siunitx} 33 | \usepackage[longend,linesnumbered,ruled]{algorithm2e} 34 | % To customize the title page 35 | \usepackage{titling} 36 | % For adding multiple authors 37 | \usepackage{authblk} 38 | % improved urls with proper hyphenation 39 | \usepackage{xurl} 40 | % Tweak the look of captions 41 | \usepackage{caption} 42 | % To control the style of section titles 43 | \usepackage{titlesec} 44 | % Import natbib and doi packages 45 | \usepackage[round,authoryear,sort]{natbib} 46 | % show dois as links on references 47 | \usepackage{doi} 48 | % Remove extra space between references 49 | \usepackage{natbibspacing} 50 | % Control the font size 51 | \usepackage{anyfontsize} 52 | \usepackage{setspace} 53 | % To get the number of pages in the document 54 | \usepackage{lastpage} 55 | \usepackage{ragged2e} 56 | % Add line numbers 57 | \usepackage{lineno} 58 | 59 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 60 | % Math shortcuts 61 | 62 | % To be able to use matrices with more than 10 columns in amsmath 63 | \setcounter{MaxMatrixCols}{20} 64 | 65 | % Lagrangian 66 | \DeclareMathOperator{\Lagr}{\mathcal{L}} 67 | % Merit function 68 | \DeclareMathOperator{\Merit}{\mathcal{M}} 69 | 70 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 71 | % Configuration of the document 72 | 73 | \geometry{% 74 | left=30mm, 75 | right=15mm, 76 | top=15mm, 77 | bottom=15mm, 78 | headsep=0mm, 79 | headheight=0mm, 80 | footskip=10mm, 81 | includehead=true, 82 | includefoot=true 83 | } 84 | 85 | % Control line spacing 86 | \doublespacing 87 | 88 | % Configure captions 89 | \captionsetup[table]{position=below,skip=0pt} 90 | \captionsetup{labelfont=bf,font={small,onehalfspacing},skip=10pt} 91 | 92 | % Make urls use the same font as every other text 93 | \urlstyle{same} 94 | 95 | % Configure hyperref and add PDF metadata 96 | \hypersetup{ 97 | colorlinks, 98 | allcolors=blue, 99 | pdftitle={\Title}, 100 | pdfauthor={\AuthorShort}, 101 | breaklinks=true, 102 | } 103 | 104 | % Configure header and footer 105 | \newcommand{\Separator}{\hspace{3pt}|\hspace{3pt}} 106 | \newcommand{\FooterFont}{\footnotesize} 107 | \pagestyle{fancy} 108 | \fancyhf{} 109 | \lfoot{% 110 | \FooterFont{} 111 | \AuthorShort{} (\Year) 112 | \Separator{} 113 | \TitleShort 114 | } 115 | \rfoot{% 116 | \FooterFont{} 117 | Submitted to \Journal{} 118 | \Separator{} 119 | \thepage\space of\space \pageref*{LastPage} 120 | } 121 | \renewcommand{\headrulewidth}{0pt} 122 | \renewcommand{\footrulewidth}{0.5pt} 123 | 124 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 125 | 126 | \begin{document} 127 | 128 | \begin{FlushLeft} 129 | {\Large\bfseries \Title} 130 | \\[0.3cm] 131 | \Authors 132 | \\[0.3cm] 133 | {\Affiliations} 134 | \\[0.3cm] 135 | {Submitted for publication to \textit{\Journal{}} on \SubmittedOn.} 136 | \\[0.3cm] 137 | {Resubmitted to \textit{\Journal{}} after revisions on \RevisionAOn.} 138 | \\[0.3cm] 139 | {Published in \textit{\Journal{}} on \PublishedOn.} 140 | \end{FlushLeft} 141 | 142 | % Add line numbers 143 | \linenumbers 144 | 145 | \section*{Abstract} 146 | 147 | \input{abstract} 148 | 149 | \vspace{0.5cm} 150 | \noindent 151 | \textbf{Keywords:} \Keywords{} 152 | 153 | \input{content.tex} 154 | 155 | \bibliographystyle{apalike-doi} 156 | \bibliography{references} 157 | 158 | \end{document} 159 | -------------------------------------------------------------------------------- /paper/natbibspacing.sty: -------------------------------------------------------------------------------- 1 | % Source: http://dcwww.camd.dtu.dk/~schiotz/comp/LatexTips/LatexTips.html 2 | \newdimen\bibspacing 3 | \setlength\bibspacing\z@ 4 | \renewenvironment{thebibliography}[1]{% 5 | \bibfont\bibsection\parindent \z@\list 6 | {\@biblabel{\arabic{NAT@ctr}}}{\@bibsetup{#1}% 7 | \setcounter{NAT@ctr}{0}}% 8 | \ifNAT@openbib 9 | \renewcommand\newblock{\par} 10 | \else 11 | \renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}% 12 | \fi 13 | \sloppy\clubpenalty4000\widowpenalty4000 14 | \sfcode`\.=1000\relax 15 | \let\citeN\cite \let\shortcite\cite 16 | \let\citeasnoun\cite 17 | \itemsep\bibspacing % 18 | \parsep\z@skip % 19 | }{\def\@noitemerr{% 20 | \PackageWarning{natbib} 21 | {Empty `thebibliography' environment}}% 22 | \endlist\vskip-\lastskip} 23 | -------------------------------------------------------------------------------- /paper/preprint.tex: -------------------------------------------------------------------------------- 1 | % Template for an EarthArXiv preprint of the manuscript. 2 | % Includes the standard disclaimers and formatting that is required. 3 | % 4 | % This is the document structure. The actual content is written in: 5 | % * abstract.tex: The abstract. 6 | % * abstract-plain.tex: A plain language version of the abstract. 7 | % * content.tex: The actual manuscript text (minus the abstract). 8 | % 9 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 10 | % Set a class and general configuration 11 | \documentclass[onecolumn,10pt,a4paper]{article} 12 | 13 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 14 | 15 | % Read in the title, authors, etc 16 | \input{information.tex} 17 | \input{variables.tex} 18 | 19 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 20 | % Import the required packages 21 | \usepackage[utf8]{inputenc} 22 | \usepackage[TU]{fontenc} 23 | \usepackage[english]{babel} 24 | \usepackage{amsmath} 25 | \usepackage{amssymb} 26 | \usepackage{graphicx} 27 | \usepackage{hyperref} 28 | \usepackage{fancyhdr} 29 | \usepackage{orcidlink} 30 | \usepackage{geometry} 31 | \usepackage{booktabs} 32 | \usepackage{microtype} 33 | \usepackage{siunitx} 34 | \usepackage[longend,linesnumbered,ruled]{algorithm2e} 35 | % To customize the title page 36 | \usepackage{titling} 37 | % For adding multiple authors 38 | \usepackage{authblk} 39 | % improved urls with proper hyphenation 40 | \usepackage{xurl} 41 | % Tweak the look of captions 42 | \usepackage{caption} 43 | % To control the style of section titles 44 | \usepackage{titlesec} 45 | % Import natbib and doi packages 46 | \usepackage[round,authoryear,sort]{natbib} 47 | % show dois as links on references 48 | \usepackage{doi} 49 | % Remove extra space between references 50 | \usepackage{natbibspacing} 51 | % Use a different font 52 | \usepackage[scaled=1.1]{notomath} 53 | % Icons and fonts (requires using xelatex or luatex) 54 | \usepackage{fontawesome5} 55 | \usepackage{academicons} 56 | % Control the font size 57 | \usepackage{anyfontsize} 58 | \usepackage{setspace} 59 | % To get the number of pages in the document 60 | \usepackage{lastpage} 61 | \usepackage{lipsum} 62 | \usepackage{ragged2e} 63 | \usepackage{mdframed} 64 | % To define custom environments 65 | \usepackage{environ} 66 | % To control hyphenation for individual blocks of text \usepackage{hyphenat} 67 | 68 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 69 | % Math shortcuts 70 | 71 | % To be able to use matrices with more than 10 columns in amsmath 72 | \setcounter{MaxMatrixCols}{20} 73 | 74 | % Lagrangian 75 | \DeclareMathOperator{\Lagr}{\mathcal{L}} 76 | % Merit function 77 | \DeclareMathOperator{\Merit}{\mathcal{M}} 78 | 79 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 80 | % Configuration of the document 81 | 82 | \geometry{% 83 | left=23mm, 84 | right=23mm, 85 | top=15mm, 86 | bottom=15mm, 87 | headsep=0mm, 88 | headheight=0mm, 89 | footskip=7mm, 90 | includehead=true, 91 | includefoot=true 92 | } 93 | 94 | % Control line spacing 95 | \onehalfspacing 96 | 97 | % Set the spacing between bibliography entries (requires natbib) 98 | \setlength{\bibsep}{0pt} 99 | 100 | % Custom colors 101 | \definecolor{darkgray}{gray}{0.4} 102 | \definecolor{mediumgray}{gray}{0.5} 103 | \definecolor{lightgray}{gray}{0.9} 104 | \definecolor{mediumblue}{HTML}{2060c2} 105 | \definecolor{lightblue}{HTML}{f7faff} 106 | 107 | % Configure captions 108 | \captionsetup[table]{position=below,skip=0pt} 109 | \captionsetup{labelfont=bf,font={small,color=darkgray},skip=10pt} 110 | 111 | % Make urls use the same font as every other text 112 | \urlstyle{same} 113 | 114 | % Configure hyperref and add PDF metadata 115 | \hypersetup{ 116 | colorlinks, 117 | allcolors=mediumblue, 118 | pdftitle={\Title}, 119 | pdfauthor={\AuthorShort}, 120 | breaklinks=true, 121 | } 122 | 123 | % Configure header and footer 124 | % Inspired by LaPreprint: https://github.com/roaldarbol/LaPreprint 125 | \newcommand{\Separator}{\hspace{3pt}|\hspace{3pt}} 126 | \newcommand{\FooterFont}{\footnotesize\color{mediumgray}} 127 | \pagestyle{fancy} 128 | \fancyhf{} 129 | \lfoot{% 130 | \FooterFont{} 131 | \AuthorShort{} (\Year) 132 | \Separator{} 133 | \TitleShort 134 | } 135 | \rfoot{% 136 | \FooterFont{} 137 | doi:\href{https://doi.org/\PreprintDOI}{\PreprintDOI} 138 | \Separator{} 139 | EarthArXiv 140 | \Separator{} 141 | \thepage\space of\space \pageref*{LastPage} 142 | } 143 | \renewcommand{\headrulewidth}{0pt} 144 | \renewcommand{\footrulewidth}{1pt} 145 | \preto{\footrule}{\color{lightgray}} 146 | \fancypagestyle{plain}{% 147 | \fancyhf{} 148 | \lfoot{% 149 | \FooterFont{} 150 | \faCreativeCommons\faCreativeCommonsBy 151 | \Separator{} 152 | \textcopyright{} \Year{} The Authors 153 | } 154 | \rfoot{% 155 | \FooterFont{} 156 | doi:\href{https://doi.org/\PreprintDOI}{\PreprintDOI} 157 | \Separator{} 158 | EarthArXiv 159 | \Separator{} 160 | \thepage\space of\space \pageref*{LastPage} 161 | } 162 | } 163 | 164 | % Define fancy text boxes 165 | \NewEnviron{summarybox}{% 166 | \mdfdefinestyle{summarybox_}{% 167 | leftline=true, 168 | rightline=false, 169 | topline=false, 170 | bottomline=false, 171 | linewidth=2pt, 172 | linecolor=mediumblue, 173 | backgroundcolor=lightblue, 174 | innertopmargin=12pt, 175 | innerbottommargin=12pt, 176 | innerleftmargin=12pt, 177 | innerrightmargin=12pt, 178 | skipbelow=5pt, 179 | skipabove=5pt, 180 | } 181 | \newmdenv[style=summarybox_]{summarybox_} 182 | \begin{summarybox_} 183 | \footnotesize 184 | \BODY 185 | \end{summarybox_} 186 | } 187 | 188 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 189 | \begin{document} 190 | 191 | \thispagestyle{plain} 192 | \begin{FlushLeft} 193 | \begin{spacing}{2} 194 | {\LARGE\bfseries \Title} 195 | \end{spacing} 196 | {\color{lightgray}\hrule height 1.5pt} 197 | \vspace{0.3cm} 198 | \Authors 199 | \\[0.2cm] 200 | {\footnotesize \Affiliations} 201 | \newline 202 | {\footnotesize \Corresponding} 203 | \newline 204 | {\footnotesize 205 | Submitted as a preprint to EarthArXiv on \PreprintOn. 206 | Published in final form after peer-review on \PublishedOn. 207 | } 208 | \end{FlushLeft} 209 | 210 | \begin{summarybox} 211 | \noindent 212 | \textbf{Disclaimer:} 213 | % This is a non-peer reviewed preprint of an article submitted for publication 214 | % in \textit{\Journal{}}. It is available from EarthArXiv at 215 | % \url{https://doi.org/\PreprintDOI}. 216 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 217 | % Comment the above and uncomment below after publication in a journal 218 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 219 | This is a peer-reviewed author-produced postprint of the article 220 | ``\AuthorShort{} (\Year). \Title. \textit{\Journal}. 221 | doi:\href{https://doi.org/\JournalDOI}{\JournalDOI}''. 222 | The postprint is available from EarthArXiv at 223 | \url{https://doi.org/\PreprintDOI}. 224 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 225 | \\[0.2cm] 226 | \noindent 227 | \textbf{Open research:} 228 | The source code used to generate all of the results presented in this 229 | research can be freely accessed and reused under the terms of an open license. 230 | You can find it at doi:\href{https://doi.org/\ArchiveDOI}{\ArchiveDOI}, 231 | Software Heritage: \href{\SWHeritageURL}{\SWHeritageID}, 232 | and GitHub: \href{https://github.com/\GitHubRepository}{\GitHubRepository}. 233 | \\[0.2cm] 234 | \noindent 235 | \textbf{ORCID:} \AuthorORCIDs{}. 236 | \\[0.2cm] 237 | \noindent 238 | \textbf{\textcopyright{} \Year{} The Authors.} 239 | Available under the \href{https://creativecommons.org/licenses/by/4.0/}{Creative Commons Attribution 4.0 International License} 240 | \faCreativeCommons\faCreativeCommonsBy{}. 241 | \end{summarybox} 242 | 243 | \section*{\normalsize Plain language summary} 244 | \begingroup 245 | \setstretch{1.1} \small \input{abstract-plain} \par 246 | \endgroup 247 | 248 | \section*{\normalsize Abstract} 249 | \begingroup 250 | \setstretch{1.1} \small \input{abstract} \par 251 | \endgroup 252 | 253 | \input{content.tex} 254 | 255 | \bibliographystyle{apalike-doi} 256 | \bibliography{references} 257 | 258 | \end{document} 259 | -------------------------------------------------------------------------------- /paper/references.bib: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | Use the https://www.doi2bib.org website to easily get well formated BibTex 3 | entries. 4 | ******************************************************************************/ 5 | @misc{figshare, 6 | doi = {10.6084/m9.figshare.26384140}, 7 | author = {Uieda, Leonardo and Souza-{J}unior, Gelson F. and Uppal, India and {Oliveira Jr.}, Vanderlei C.}, 8 | title = {{Supplementary material for ``Euler inversion: Locating sources of 9 | potential-field data through inversion of Euler’s homogeneity 10 | equation'' [Dataset]}}, 11 | journal = {figshare}, 12 | year = {2024}, 13 | copyright = {Creative Commons Attribution 4.0 International} 14 | } 15 | @article{Reid2014, 16 | title = {The structural index in gravity and magnetic interpretation: {E}rrors, uses, and abuses}, 17 | volume = {79}, 18 | ISSN = {1942-2156}, 19 | DOI = {10.1190/geo2013-0235.1}, 20 | number = {4}, 21 | journal = {Geophysics}, 22 | publisher = {Society of Exploration Geophysicists}, 23 | author = {Reid, Alan B. and Thurston, Jeffrey B.}, 24 | year = {2014}, 25 | month = jul, 26 | pages = {J61–J66} 27 | } 28 | @article{Reid2014b, 29 | title = {Avoidable {E}uler Errors – the use and abuse of {E}uler deconvolution applied to potential fields}, 30 | volume = {62}, 31 | ISSN = {1365-2478}, 32 | DOI = {10.1111/1365-2478.12119}, 33 | number = {5}, 34 | journal = {Geophysical Prospecting}, 35 | publisher = {Wiley}, 36 | author = {Reid, Alan B. and Ebbing, J\"{o}rg and Webb, Susan J.}, 37 | year = {2014}, 38 | month = apr, 39 | pages = {1162–1168} 40 | } 41 | @article{Stavrev2007, 42 | title = {Degrees of homogeneity of potential fields and structural indices of {E}uler deconvolution}, 43 | volume = {72}, 44 | ISSN = {1942-2156}, 45 | DOI = {10.1190/1.2400010}, 46 | number = {1}, 47 | journal = {Geophysics}, 48 | publisher = {Society of Exploration Geophysicists}, 49 | author = {Stavrev, Petar and Reid, Alan}, 50 | year = {2007}, 51 | month = jan, 52 | pages = {L1–L12} 53 | } 54 | @misc{SRTM, 55 | doi = {10.5066/F7PR7TFT}, 56 | author = {{Earth Resources Observation And Science (EROS) Center}}, 57 | keywords = {Shuttle Radar Topography}, 58 | title = {{Shuttle Radar Topography Mission (SRTM)} 1 Arc-Second Global}, 59 | publisher = {U.S. Geological Survey}, 60 | year = {2017} 61 | } 62 | @article{Soler2021, 63 | title = {Gradient-boosted equivalent sources}, 64 | volume = {227}, 65 | ISSN = {1365-246X}, 66 | DOI = {10.1093/gji/ggab297}, 67 | number = {3}, 68 | journal = {Geophysical Journal International}, 69 | publisher = {Oxford University Press (OUP)}, 70 | author = {Soler, Santiago R and Uieda, Leonardo}, 71 | year = {2021}, 72 | month = aug, 73 | pages = {1768–1783} 74 | } 75 | @article{Gerovska2005, 76 | title = {Finite-difference {E}uler Deconvolution Algorithm Applied to the 77 | Interpretation of Magnetic Data from Northern {B}ulgaria}, 78 | volume = {162}, 79 | ISSN = {1420-9136}, 80 | DOI = {10.1007/s00024-004-2623-1}, 81 | number = {3}, 82 | journal = {pure and applied geophysics}, 83 | publisher = {Springer Science and Business Media LLC}, 84 | author = {Gerovska, Daniela and Stavrev, Petar and Araúzo-Bravo, Marcos J.}, 85 | year = {2005}, 86 | month = mar, 87 | pages = {591–608} 88 | } 89 | @article{Castro2020, 90 | title = {Constraining {E}uler Deconvolution Solutions Through Combined Tilt Derivative Filters}, 91 | volume = {177}, 92 | ISSN = {1420-9136}, 93 | DOI = {10.1007/s00024-020-02533-w}, 94 | number = {10}, 95 | journal = {Pure and Applied Geophysics}, 96 | publisher = {Springer Science and Business Media LLC}, 97 | author = {Castro, Fabrício R. and Oliveira, Saulo P. and de Souza, Jeferson and Ferreira, Francisco J. F.}, 98 | year = {2020}, 99 | month = jun, 100 | pages = {4883–4895} 101 | } 102 | @article{Thompson1982, 103 | author = {Thompson, D. T.}, 104 | journal = {Geophysics}, 105 | number = {1}, 106 | year = {1982}, 107 | month = {2}, 108 | pages = {31--37}, 109 | title = {EULDPH: a new technique for making computer-assisted depth estimates from magnetic data.}, 110 | volume = {47}, 111 | doi = {10.1190/1.1441278}, 112 | issn = {00168033}, 113 | } 114 | @article{Reid1990, 115 | author = {Reid, A. B. and Allsop, J. M. and Granser, H. and Millett, A. J. and Somerton, I. W.}, 116 | journal = {Geophysics}, 117 | number = {1}, 118 | year = {1990}, 119 | month = {1}, 120 | pages = {80--91}, 121 | title = {Magnetic interpretation in three dimensions using {Euler} deconvolution}, 122 | volume = {55}, 123 | doi = {10.1190/1.1442774}, 124 | issn = {00168033}, 125 | } 126 | @book{Aster2018, 127 | title={Parameter estimation and inverse problems}, 128 | author={Aster, Richard C and Borchers, Brian and Thurber, Clifford H}, 129 | year={2018}, 130 | publisher={Elsevier} 131 | } 132 | @book{Vanicek1986, 133 | title={Geodesy: The Concepts}, 134 | author={Vaníček, P. and Krakiwsky, E.J.}, 135 | year={1986}, 136 | publisher={Elsevier Science} 137 | } 138 | @misc{Ruddock1966, 139 | title={Method for determining depth and falloff rate of subterranean magnetic disturbances utilizing a plurality of magnetometers}, 140 | author={Ruddock, Kenneth A and Slack, Howard A and Sheldon, Breiner}, 141 | year={1966}, 142 | note={US Patent 3,263,161} 143 | } 144 | @article{Silva2001, 145 | title = {Scattering, symmetry, and bias analysis of source‐position 146 | estimates in {Euler} deconvolution and its practical implications}, 147 | volume = {66}, 148 | ISSN = {1942-2156}, 149 | DOI = {10.1190/1.1487062}, 150 | number = {4}, 151 | journal = {Geophysics}, 152 | publisher = {Society of Exploration Geophysicists}, 153 | author = {Silva, J. B. C. and Barbosa, V. C. F. and Medeiros, W. E.}, 154 | year = {2001}, 155 | month = jul, 156 | pages = {1149–1156} 157 | } 158 | @article{Melo2020, 159 | title = {Reliable {Euler} deconvolution estimates throughout the vertical derivatives of the total-field anomaly}, 160 | volume = {138}, 161 | ISSN = {0098-3004}, 162 | DOI = {10.1016/j.cageo.2020.104436}, 163 | journal = {Computers \& Geosciences}, 164 | publisher = {Elsevier BV}, 165 | author = {Melo, Felipe F. and Barbosa, Valéria C.F.}, 166 | year = {2020}, 167 | month = may, 168 | pages = {104436} 169 | } 170 | @article{Pasteka2009, 171 | title = {Regularized derivatives of potential fields and their role in semi‐automated interpretation methods}, 172 | volume = {57}, 173 | ISSN = {1365-2478}, 174 | DOI = {10.1111/j.1365-2478.2008.00780.x}, 175 | number = {4}, 176 | journal = {Geophysical Prospecting}, 177 | publisher = {Wiley}, 178 | author = {Pašteka, R. and Richter, F.P. and Karcol, R. and Brazda, K. and Hajach, M.}, 179 | year = {2009}, 180 | month = jun, 181 | pages = {507–516} 182 | } 183 | @article{Florio2014, 184 | title = {On the estimation of the structural index from low-pass filtered magnetic data}, 185 | volume = {79}, 186 | ISSN = {1942-2156}, 187 | DOI = {10.1190/geo2013-0421.1}, 188 | number = {6}, 189 | journal = {Geophysics}, 190 | publisher = {Society of Exploration Geophysicists}, 191 | author = {Florio, Giovanni and Fedi, Maurizio and Pašteka, Roman}, 192 | year = {2014}, 193 | month = nov, 194 | pages = {J67–J80} 195 | } 196 | @book{WellsKrakiwsky1971, 197 | title = "The method of least squares", 198 | author = "Wells, D.E. and Krakiwsky, E.J.", 199 | publisher = "Department of {G}eodesy and {G}eomatics {E}ngineering {L}ecture {N}otes, University of New Brunswick", 200 | year = 1971, 201 | month = may 202 | } 203 | @misc{pygmt, 204 | doi = {10.5281/ZENODO.3781524}, 205 | author = {Tian, Dongdong and Uieda, Leonardo and Leong, Wei Ji and Fr\"{o}hlich, Yvonne and Schlitzer, William and Grund, Michael and Jones, Max and Toney, Liam and Yao, Jiayuan and Magen, Yohai and Jing-Hui, Tong and Materna, Kathryn and Belem, Andre and Newton, Tyler and Anant, Abhishek and Ziebarth, Malte and Quinn, Jamie and Wessel, Paul}, 206 | title = {PyGMT: A Python interface for the Generic Mapping Tools [software]}, 207 | publisher = {Zenodo}, 208 | year = {2024}, 209 | } 210 | @article{matplotlib, 211 | author = {Hunter, J. D.}, 212 | title = {{Matplotlib}: A 2D graphics environment [Software]}, 213 | journal = {Computing in Science \& Engineering}, 214 | volume = {9}, 215 | number = {3}, 216 | pages = {90--95}, 217 | year = {2007}, 218 | doi = {10.1109/MCSE.2007.55} 219 | } 220 | @article{scipy, 221 | author = {{Virtanen}, P. and {Gommers}, R. and {Oliphant}, T. E. and 222 | {Haberland}, M. and {Reddy}, T. and {Cournapeau}, D. and 223 | {Burovski}, E. and {Peterson}, P. and {Weckesser}, W. and 224 | {Bright}, J. and {van der Walt}, S. J. and {Brett}, M. and 225 | {Wilson}, J. and {Millman}, K. J. and {Mayorov}, N. and {Nelson}, 226 | A. R. J. and {Jones}, E. and {Kern}, R. and {Larson}, E. and 227 | {Carey}, C. J. and {Polat}, I. and {Feng}, Y. and {Moore}, E. W. 228 | and {VanderPlas}, J. and {Laxalde}, D. and {Perktold}, J. and 229 | {Cimrman}, R. and {Henriksen}, I. and {Quintero}, E. A. and 230 | {Harris}, C. R. and {Archibald}, A. M. and {Ribeiro}, A. H. and 231 | {Pedregosa}, F. and {van Mulbregt}, P. and {Contributors}}, 232 | title = "{SciPy 1.0: Fundamental Algorithms for Scientific Computing in Python [Software]}", 233 | journal = {Nature Methods}, 234 | volume = {17}, 235 | number = {3}, 236 | pages = {261--272}, 237 | year = {2020}, 238 | doi = {10.1038/s41592-019-0686-2}, 239 | publisher = {Springer Science and Business Media {LLC}} 240 | } 241 | @article{numpy, 242 | title = {Array programming with {NumPy} [Software]}, 243 | author = {Harris, Charles R. and Millman, K. Jarrod and van der Walt, Stéfan J. and Gommers, Ralf and Virtanen, Pauli and Cournapeau, David and Wieser, Eric and Taylor, Julian and Bergstra, James and Smith, Nathaniel J. and Kern, Robert and Picus, Matti and Hoyer, Stephan and van Kerkwijk, Marten H. and Brett, Matthew and Haldane, Allan and Del Río, Jaime and Wiebe, Mark and Peterson, Pearu and Gérard-Marchant, Pierre and Sheppard, Kevin and Reddy, Tyler and Weckesser, Warren and Abbasi, Hameer and Gohlke, Christoph and Oliphant, Travis E.}, 244 | journal = {Nature}, 245 | volume = {585}, 246 | number = {7825}, 247 | pages = {357--362}, 248 | year = {2020}, 249 | doi = {10.1038/s41586-020-2649-2} 250 | } 251 | @article{xarray, 252 | title = {xarray: {N-D} labeled arrays and datasets in {Python} [Software]}, 253 | author = {Hoyer, S. and J. Hamman}, 254 | journal = {Journal of Open Research Software}, 255 | volume = {5}, 256 | number = {1}, 257 | year = {2017}, 258 | publisher = {Ubiquity Press}, 259 | doi = {10.5334/jors.148} 260 | } 261 | @article{verde, 262 | title = {{Verde}: {Processing} and gridding spatial data using {Green's} functions [Software]}, 263 | author = {Uieda, Leonardo}, 264 | year = {2018}, 265 | journal = {Journal of Open Source Software}, 266 | volume = {3}, 267 | number = {29}, 268 | pages = {957}, 269 | issn = {2475-9066}, 270 | doi = {10.21105/joss.00957}, 271 | } 272 | @article{harmonica, 273 | author = {{Fatiando a Terra Project} and 274 | Esteban, Federico D. and 275 | Li, Lu and 276 | Oliveira Jr, Vanderlei C and 277 | Pesce, Agustina and 278 | Shea, Nicholas and 279 | Soler, Santiago R. and 280 | Tankersley, Matthew and 281 | Uieda, Leonardo}, 282 | title = {{Harmonica v0.6.0: Forward modeling, inversion, and 283 | processing gravity and magnetic data [Software]}}, 284 | month = mar, 285 | year = 2023, 286 | journal = {Zenodo}, 287 | doi = {10.5281/zenodo.7690145}, 288 | } 289 | @article{pandas, 290 | doi = {10.5281/ZENODO.13819579}, 291 | author = {{The pandas development team}}, 292 | title = {pandas-dev/pandas: Pandas [Software]}, 293 | journal = {Zenodo}, 294 | year = {2024}, 295 | } 296 | @article{geopandas, 297 | doi = {10.5281/ZENODO.12625316}, 298 | author = {Joris Van den Bossche and Kelsey Jordahl and Martin Fleischmann and Matt Richards and James McBride and Jacob Wasserman and Adrian Garcia Badaracco and Alan D. Snow and Brendan Ward and Jeff Tratner and Jeffrey Gerard and Matthew Perry and cjqf and Geir Arne Hjelle and Mike Taves and Ewout ter Hoeven and Micah Cochran and Ray Bell and rraymondgh and Matt Bartos and Pieter Roggemans and Lucas Culbertson and Giacomo Caria and Nicholas YS Tan and Nick Eubank and sangarshanan and John Flavin and Sergio Rey and James Gardiner}, 299 | title = {geopandas/geopandas: v1.0.1 [Software]}, 300 | journal = {Zenodo}, 301 | year = {2024}, 302 | } 303 | @article{pyproj, 304 | doi = {10.5281/ZENODO.13864781}, 305 | author = {Alan D. Snow and Jeff Whitaker and Micah Cochran and Idan Miara and Joris Van den Bossche and Chris Mayo and Greg Lucas and Paul Cochrane and Jos de Kloe and Charles Karney and Javier Jimenez Shaw and Filipe and George Ouzounoudis and Justin Dearing and Guillaume Lostis and David Hoese and Bas Couwenberg and Brendan Jurd and Christoph Gohlke and Cora Schneck and Daniel McDonald and Mikhail Itkin and Ryan May and Heitor de Bittencourt and Bill Little and Poruri Sai Rahul and Nick Eubank and Neil and Mike Taves}, 306 | title = {pyproj4/pyproj: 3.7.0 Release [Software]}, 307 | journal = {Zenodo}, 308 | year = {2024}, 309 | } 310 | @incollection{Almeida2013, 311 | author = {J.C.H. Almeida and F.B. Dios and W.U. Mohriak and C. Valeriano and M. Heilbron and L.G. Eirado and E. Tomazzoli}, 312 | title = {Pre-rift tectonic scenario of the Eo-Cretaceous Gondwana break-up along SE Brazil – SW Africa insights from tholeiitic mafic dykes swarms}, 313 | booktitle = {Geological Society, London, Special Publications}, 314 | volume = {369}, 315 | pages = {11--40}, 316 | year = {2013}, 317 | publisher = {Geological Society of London} 318 | } 319 | @article{EgydioSilva2005, 320 | author = {Egydio-Silva, M. and Vauchez, A. and Raposo, M.I.R. and Bascou, J. and Uhlein, A.}, 321 | title = {Deformation regime variations in an arcuate transpressional orogen 322 | ({Ribeira belt, SE Brazil}) imaged by anisotropy of magnetic 323 | susceptibility in granulites}, 324 | journal = {Journal of Structural Geology}, 325 | year = {2005}, 326 | volume = {27}, 327 | pages = {1750--1764}, 328 | doi = {10.1016/j.jsg.2005.03.010} 329 | } 330 | @misc{Heilbron2016, 331 | author = {Heilbron, M. and Eirado, L.G. and Almeida, J.}, 332 | title = {Mapa Geológico e de Recursos Minerais do Estado do {Rio de Janeiro}}, 333 | year = {2016}, 334 | howpublished = {Programa Geologia do Brasil (PGB), Mapas Geológicos Estaduais}, 335 | note = {Escala 1:400.000}, 336 | publisher = {CPRM-Serviço Geológico do Brasil, Superintendência Regional de Belo Horizonte} 337 | } 338 | @article{Heilbron2008, 339 | author = {M. Heilbron and C. M. Valeriano and C. C. G. Tassinari and J. Almeida and M. Tupinambá and O. Siga and R. Trouw }, 340 | title = {Correlation of Neoproterozoic terranes between the {Ribeira Belt, SE 341 | Brazil} and its {African} counterpart: comparative tectonic evolution and open questions}, 342 | journal = {Geological Society, London, Special Publications}, 343 | volume = {294}, 344 | number = {1}, 345 | pages = {211-237}, 346 | year = {2008}, 347 | doi = {10.1144/SP294.12} 348 | } 349 | @incollection{Trouw2000, 350 | author = {Trouw, R.A. and Heilbron, M. and Ribeiro, A. and Paciullo, F. and Valeriano, C.M. and Almeida, J.H. and Tupinambá, M. and Andreis, R.}, 351 | title = {The central segment of the {Ribeira belt}}, 352 | booktitle = {Geotectonics of South America}, 353 | editor = {Cordani, U.G. and Milani, E.J. and Thomaz Filho, A. and Campos, D.A.}, 354 | publisher = {31st International Geological Congress (IGC), Special Publication}, 355 | year = {2000}, 356 | pages = {297--310} 357 | } 358 | @article{Valeriano2011, 359 | author = {Valeriano, C.M. and Tupinambá, M. and Simonetti, A. and Heilbron, M. and Almeida, J.C.H. and Eirado Silva, L.G.}, 360 | title = {{U-Pb LA-MC-ICPMS geochronology of Cambro-Ordovician post-collisional granites of the Ribeira belt, southeast Brazil: terminal Brasiliano magmatism in central Gondwana supercontinent}}, 361 | journal = {Journal of South American Earth Sciences}, 362 | volume = {32}, 363 | number = {4}, 364 | pages = {416--428}, 365 | year = {2011}, 366 | doi = {10.1016/j.jsames.2011.03.003} 367 | } 368 | @article{Meira2015, 369 | author = {Meira, V. T. and Garcia‐Casco, A. and Juliani, C. and Almeida, R. P. and Schorscher, J. H. D.}, 370 | title = {The role of intracontinental deformation in supercontinent 371 | assembly: Insights from the {Ribeira Belt, Southeastern Brazil 372 | (Neoproterozoic Western Gondwana)}}, 373 | journal = {Terra Nova}, 374 | volume = {27}, 375 | number = {3}, 376 | pages = {206--217}, 377 | year = {2015}, 378 | doi = {10.1111/ter.12149} 379 | } 380 | @article{Meira2019, 381 | author = {Meira, V. T. and Garcia‐Casco, A. and Hyppolito, T. and Juliani, C. and Schorscher, J. H. D.}, 382 | title = {Tectono‐metamorphic evolution of the Central {Ribeira Belt, Brazil}: {A} case of late Neoproterozoic intracontinental orogeny and flow of partially molten deep crust during the assembly of {West Gondwana}}, 383 | journal = {Tectonics}, 384 | volume = {38}, 385 | pages = {3182--3209}, 386 | year = {2019}, 387 | doi = {10.1029/2018TC004959} 388 | } 389 | @article{Thompson1998, 390 | author = {Thompson, R. N. and Gibson, S. A. and Mitchell, J. G. and Dickin, A. P. and Leonardos, O. H. and Brod, J. A. and Greenwood, J. C.}, 391 | title = "{Migrating Cretaceous–Eocene Magmatismin the Serra do Mar Alkaline Province, SE Brazil: Melts from the Deflected Trindade Mantle Plume?}", 392 | journal = {Journal of Petrology}, 393 | volume = {39}, 394 | number = {8}, 395 | pages = {1493-1526}, 396 | year = {1998}, 397 | month = {08}, 398 | issn = {0022-3530}, 399 | doi = {10.1093/petroj/39.8.1493} 400 | } 401 | @article{Heilbron2003, 402 | author = {Heilbron, M. and Machado, N.}, 403 | title = {Timing of terrane accretion in the Neoproterozoic-Eopaleozoic Ribeira orogen (SE Brazil)}, 404 | journal = {Precambrian Research}, 405 | volume = {125}, 406 | number = {1-2}, 407 | pages = {87--112}, 408 | year = {2003}, 409 | doi = {10.1016/S0301-9268(03)00082-2} 410 | } 411 | @article{Heilbron2020, 412 | author = {Heilbron, M. and Silva, L. G. do E. and Almeida, J. C. H. de and Tupinambá, M. and Peixoto, C. and Valeriano, C. de M. and Lobato, M. and Rodrigues, S. W. de O. and Ragatky, C. D. and Silva, M. A. and Monteiro, T. and Freitas, N. C. de and Miguens, D. and Girão, R.}, 413 | title = {Proterozoic to Ordovician geology and tectonic evolution of Rio de Janeiro State, SE-Brazil: insights on the central Ribeira Orogen from the new 1:400,000 scale geologic map}, 414 | journal = {Brazilian Journal of Geology}, 415 | volume = {50}, 416 | number = {2}, 417 | pages = {e20190099}, 418 | year = {2020}, 419 | doi = {10.1590/2317-4889202020190099} 420 | } 421 | 422 | @book{Dantas2017, 423 | title={{Geodiversidade do estado do Rio de Janeiro}}, 424 | author={Dantas, Marcelo Eduardo and Moraes, Juliana Maceira and Ferrassoli, Marcelo Ambr{\'o}sio and Jorge, Marcelo de Queiroz and Hilquias, Victor Augusto}, 425 | year={2017}, 426 | publisher={CPRM}, 427 | keywords={Geodiversidade, Gestão territorial, Meio ambiente, Geologia ambiental, Geoturismo, Rio de Janeiro}, 428 | url={https://rigeo.sgb.gov.br/handle/doc/20479} 429 | } 430 | @inproceedings{McKinney2010, 431 | series = {SciPy}, 432 | title = {Data Structures for Statistical Computing in Python}, 433 | ISSN = {2575-9752}, 434 | DOI = {10.25080/majora-92bf1922-00a}, 435 | booktitle = {Proceedings of the 9th Python in Science Conference}, 436 | publisher = {SciPy}, 437 | author = {McKinney, Wes}, 438 | year = {2010}, 439 | pages = {56–61}, 440 | collection = {SciPy} 441 | } 442 | @article{Saleh2012, 443 | title = {Applying the regularized derivatives approach in {Euler} 444 | deconvolution and modeling geophysical data to estimate the deep 445 | active structures for the northern {Red Sea Rift} region, {E}gypt}, 446 | volume = {42}, 447 | ISSN = {1335-2806}, 448 | DOI = {10.2478/v10126-012-0003-x}, 449 | number = {1}, 450 | journal = {Contributions to Geophysics and Geodesy}, 451 | publisher = {Walter de Gruyter GmbH}, 452 | author = {Saleh, Salah and Pašteka, Roman}, 453 | year = {2012}, 454 | month = jan 455 | } 456 | @article{Pateka2009, 457 | title = {Regularized derivatives of potential fields and their role in semi‐automated interpretation methods}, 458 | volume = {57}, 459 | ISSN = {1365-2478}, 460 | DOI = {10.1111/j.1365-2478.2008.00780.x}, 461 | number = {4}, 462 | journal = {Geophysical Prospecting}, 463 | publisher = {Wiley}, 464 | author = {Pašteka, R. and Richter, F.P. and Karcol, R. and Brazda, K. and Hajach, M.}, 465 | year = {2009}, 466 | month = jun, 467 | pages = {507–516} 468 | } 469 | @article{FitzGerald2004, 470 | title = {New discrimination techniques for {E}uler deconvolution}, 471 | volume = {30}, 472 | ISSN = {0098-3004}, 473 | DOI = {10.1016/j.cageo.2004.03.006}, 474 | number = {5}, 475 | journal = {Computers \& Geosciences}, 476 | publisher = {Elsevier BV}, 477 | author = {FitzGerald, Desmond and Reid, Alan and McInerney, Philip}, 478 | year = {2004}, 479 | month = jun, 480 | pages = {461–469} 481 | } 482 | @article{Huang2022, 483 | title = {Ratio‐{E}uler deconvolution and its applications}, 484 | volume = {70}, 485 | ISSN = {1365-2478}, 486 | DOI = {10.1111/1365-2478.13201}, 487 | number = {6}, 488 | journal = {Geophysical Prospecting}, 489 | publisher = {Wiley}, 490 | author = {Huang, Liang and Zhang, Henglei and Li, Chun‐Feng and Feng, Jie}, 491 | year = {2022}, 492 | month = may, 493 | pages = {1016–1032} 494 | } 495 | @inproceedings{Salem2007, 496 | title = {Generalized magnetic tilt‐{E}uler deconvolution}, 497 | DOI = {10.1190/1.2792530}, 498 | booktitle = {SEG Technical Program Expanded Abstracts 2007}, 499 | publisher = {Society of Exploration Geophysicists}, 500 | author = {Salem, Ahmed and Smith, Richard and Williams, Simon and Ravat, Dhananjay and Fairhead, Derek}, 501 | year = {2007}, 502 | month = jan, 503 | pages = {790–794} 504 | } 505 | @article{Huang2019, 506 | title = {An improved Tilt-{E}uler deconvolution and its application on a {F}e-polymetallic deposit}, 507 | volume = {114}, 508 | ISSN = {0169-1368}, 509 | DOI = {10.1016/j.oregeorev.2019.103114}, 510 | journal = {Ore Geology Reviews}, 511 | publisher = {Elsevier BV}, 512 | author = {Huang, Liang and Zhang, Henglei and Sekelani, Stence and Wu, Zhaocai}, 513 | year = {2019}, 514 | month = nov, 515 | pages = {103114} 516 | } 517 | @article{Melo2013, 518 | title = {Estimating the nature and the horizontal and vertical positions of 519 | 3D magnetic sources using {E}uler deconvolution}, 520 | volume = {78}, 521 | ISSN = {1942-2156}, 522 | DOI = {10.1190/geo2012-0515.1}, 523 | number = {6}, 524 | journal = {Geophysics}, 525 | publisher = {Society of Exploration Geophysicists}, 526 | author = {Melo, Felipe F. and Barbosa, Valeria C. F. and Uieda, Leonardo and Oliveira Jr., Vanderlei C. and Silva, João B. C.}, 527 | year = {2013}, 528 | month = nov, 529 | pages = {J87–J98} 530 | } 531 | @article{Melo2018, 532 | title = {Correct structural index in {E}uler deconvolution via base-level estimates}, 533 | volume = {83}, 534 | ISSN = {1942-2156}, 535 | DOI = {10.1190/geo2017-0774.1}, 536 | number = {6}, 537 | journal = {Geophysics}, 538 | publisher = {Society of Exploration Geophysicists}, 539 | author = {Melo, Felipe F. and Barbosa, Valéria C. F.}, 540 | year = {2018}, 541 | month = nov, 542 | pages = {J87–J98} 543 | } 544 | @article{Florio2013, 545 | title = {Multiridge {E}uler deconvolution}, 546 | volume = {62}, 547 | ISSN = {1365-2478}, 548 | DOI = {10.1111/1365-2478.12078}, 549 | number = {2}, 550 | journal = {Geophysical Prospecting}, 551 | publisher = {Wiley}, 552 | author = {Florio, Giovanni and Fedi, Maurizio}, 553 | year = {2013}, 554 | month = oct, 555 | pages = {333–351} 556 | } 557 | @article{Salem2003, 558 | title = {A combined analytic signal and {Euler method (AN‐EUL)} for automatic interpretation of magnetic data}, 559 | volume = {68}, 560 | ISSN = {1942-2156}, 561 | DOI = {10.1190/1.1635049}, 562 | number = {6}, 563 | journal = {Geophysics}, 564 | publisher = {Society of Exploration Geophysicists}, 565 | author = {Salem, Ahmed and Ravat, Dhananjay}, 566 | year = {2003}, 567 | month = nov, 568 | pages = {1952–1961} 569 | } 570 | @article{Silva2003, 571 | title = {{3D E}uler deconvolution: Theoretical basis for automatically selecting good solutions}, 572 | volume = {68}, 573 | ISSN = {1942-2156}, 574 | DOI = {10.1190/1.1635050}, 575 | number = {6}, 576 | journal = {Geophysics}, 577 | publisher = {Society of Exploration Geophysicists}, 578 | author = {Silva, João B. C. and Barbosa, Valéria C. F.}, 579 | year = {2003}, 580 | month = nov, 581 | pages = {1962–1968} 582 | } 583 | @inproceedings{Uieda2013, 584 | series = {SciPy}, 585 | title = {Modeling the {Earth with Fatiando a Terra}}, 586 | ISSN = {2575-9752}, 587 | DOI = {10.25080/majora-8b375195-010}, 588 | booktitle = {Proceedings of the 12th Python in Science Conference}, 589 | publisher = {SciPy}, 590 | author = {Uieda, Leonardo and Oliveira, Vanderlei and Barbosa, Valéria}, 591 | year = {2013}, 592 | pages = {92–98}, 593 | collection = {SciPy} 594 | } 595 | @article{Uieda2014, 596 | title = {Geophysical tutorial: {E}uler deconvolution of potential-field data}, 597 | volume = {33}, 598 | ISSN = {1938-3789}, 599 | DOI = {10.1190/tle33040448.1}, 600 | number = {4}, 601 | journal = {The Leading Edge}, 602 | publisher = {Society of Exploration Geophysicists}, 603 | author = {Uieda, Leonardo and Oliveira, Vanderlei C. and Barbosa, Valéria C. F.}, 604 | year = {2014}, 605 | month = apr, 606 | pages = {448–450} 607 | } 608 | @book{VanHuffel1991, 609 | title = {The Total Least Squares Problem: Computational Aspects and Analysis}, 610 | ISBN = {9781611971002}, 611 | DOI = {10.1137/1.9781611971002}, 612 | publisher = {Society for Industrial and Applied Mathematics}, 613 | author = {Van Huffel, Sabine and Vandewalle, Joos}, 614 | year = {1991}, 615 | month = jan 616 | } 617 | @article{Mushayandebvu2004, 618 | title = {Grid Euler deconvolution with constraints for 2D structures}, 619 | volume = {69}, 620 | ISSN = {1942-2156}, 621 | url = {http://dx.doi.org/10.1190/1.1707069}, 622 | DOI = {10.1190/1.1707069}, 623 | number = {2}, 624 | journal = {GEOPHYSICS}, 625 | publisher = {Society of Exploration Geophysicists}, 626 | author = {Mushayandebvu, M. F. and Lesur, V. and Reid, A. B. and Fairhead, J. D.}, 627 | year = {2004}, 628 | month = mar, 629 | pages = {489–496} 630 | } 631 | @article{Gerovska2010, 632 | title = {Three-dimensional interpretation of magnetic and gravity anomalies using the finite-difference similarity transform}, 633 | volume = {75}, 634 | ISSN = {1942-2156}, 635 | url = {http://dx.doi.org/10.1190/1.3453765}, 636 | DOI = {10.1190/1.3453765}, 637 | number = {4}, 638 | journal = {GEOPHYSICS}, 639 | publisher = {Society of Exploration Geophysicists}, 640 | author = {Gerovska, Daniela and Araúzo-Bravo, Marcos J. and Whaler, Kathryn and Stavrev, Petar and Reid, Alan}, 641 | year = {2010}, 642 | month = jul, 643 | pages = {L79–L90} 644 | } 645 | @article{SouzaJunior2024, 646 | title = {Full Vector Inversion of Magnetic Microscopy Images Using Euler Deconvolution as Prior Information}, 647 | volume = {25}, 648 | ISSN = {1525-2027}, 649 | DOI = {10.1029/2023gc011082}, 650 | number = {7}, 651 | journal = {Geochemistry, Geophysics, Geosystems}, 652 | publisher = {American Geophysical Union (AGU)}, 653 | author = {Souza‐Junior, Gelson F. and Uieda, Leonardo and Trindade, Ricardo I. F. and Carmo, Janine and Fu, Roger}, 654 | year = {2024}, 655 | month = jul 656 | } -------------------------------------------------------------------------------- /paper/variables.tex: -------------------------------------------------------------------------------- 1 | \newcommand{\RioNSources}{\num{300}} 2 | \newcommand{\RioWindowSize}{\qty{12000}{\m}} 3 | \newcommand{\RioWindowStep}{\qty{2400}{\m}} 4 | \newcommand{\RioWeightsF}{\num{1}} 5 | \newcommand{\RioWeightsE}{\num{0.1}} 6 | \newcommand{\RioWeightsN}{\num{0.1}} 7 | \newcommand{\RioWeightsU}{\num{0.05}} 8 | \newcommand{\RioPercentile}{\num{99.5}} 9 | \newcommand{\RioSIMin}{1} 10 | \newcommand{\RioSIMax}{3}\newcommand{\RioNData}{\num{50882}} 11 | \newcommand{\RioDerivSpacing}{\qty{1}{\m}} 12 | \newcommand{\RioEQSDepth}{\qty{1000}{\m}} 13 | \newcommand{\RioEQSDamping}{\num{10}} 14 | \newcommand{\RioEQSBlock}{\qty{100}{\m}} 15 | \newcommand{\RioEQSWindow}{\qty{22313}{\m}}\newcommand{\SynInterfDykesDistMax}{\qty{9000}{\m}} 16 | \newcommand{\SynInterfDykesDistMin}{\qty{1000}{\m}} 17 | \newcommand{\SynInterfDykesTrueEast}{\qty{7000}{\m}} 18 | \newcommand{\SynInterfDykesTrueNorth}{\qty{4500}{\m}} 19 | \newcommand{\SynInterfDykesTrueUp}{\qty{0}{\m}} 20 | \newcommand{\SynInterfDykesTrueBase}{\qty{100}{\nano\tesla}} 21 | \newcommand{\SynInterfDykesInterfEastMax}{\qty{6000}{\m}} 22 | \newcommand{\SynInterfDykesInterfEastMin}{\qty{-2000}{\m}} 23 | \newcommand{\SynInterfDykesInterfNorth}{\qty{4500}{\m}} 24 | \newcommand{\SynInterfDykesInterfUp}{\qty{300}{\m}} 25 | \newcommand{\SynInterfDykesNModels}{33} 26 | \newcommand{\SynInterfDykesInt}{\qty{2e+01}{\ampere\per\meter}} 27 | \newcommand{\SynInterfDykesDec}{\qty{20}{\degree}} 28 | \newcommand{\SynInterfDykesInc}{\qty{-30}{\degree}} 29 | \newcommand{\SynInterfDykesHeight}{\qty{400}{\m}} 30 | \newcommand{\SynInterfDykesSpacing}{\qty{150}{\m}}\newcommand{\SynInterfTrueEast}{\qty{7000}{\m}} 31 | \newcommand{\SynInterfTrueNorth}{\qty{4000}{\m}} 32 | \newcommand{\SynInterfTrueUp}{\qty{-3000}{\m}} 33 | \newcommand{\SynInterfTrueBase}{\qty{100}{\nano\tesla}} 34 | \newcommand{\SynInterfInterfEastMax}{\qty{5000}{\m}} 35 | \newcommand{\SynInterfInterfEastMin}{\qty{-1000}{\m}} 36 | \newcommand{\SynInterfInterfNorth}{\qty{5000}{\m}} 37 | \newcommand{\SynInterfInterfUp}{\qty{-1500}{\m}} 38 | \newcommand{\SynInterfNModels}{31} 39 | \newcommand{\SynInterfInt}{\qty{5e+11}{\ampere\per\meter}} 40 | \newcommand{\SynInterfDec}{\qty{-10}{\degree}} 41 | \newcommand{\SynInterfInc}{\qty{-30}{\degree}} 42 | \newcommand{\SynInterfHeight}{\qty{400}{\m}} 43 | \newcommand{\SynInterfSpacing}{\qty{200}{\m}}\newcommand{\SynNoiseWeightsF}{1} 44 | \newcommand{\SynNoiseWeightsE}{0.1} 45 | \newcommand{\SynNoiseWeightsN}{0.1} 46 | \newcommand{\SynNoiseWeightsU}{0.025} 47 | \newcommand{\SynNoiseTrueEast}{\qty{15000}{\m}} 48 | \newcommand{\SynNoiseTrueNorth}{\qty{11000}{\m}} 49 | \newcommand{\SynNoiseTrueUp}{\qty{-5000}{\m}} 50 | \newcommand{\SynNoiseTrueBase}{\qty{100}{\nano\tesla}} 51 | \newcommand{\SynNoiseInt}{\qty{2e+12}{\ampere\per\meter}} 52 | \newcommand{\SynNoiseDec}{\qty{15}{\degree}} 53 | \newcommand{\SynNoiseInc}{\qty{-30}{\degree}} 54 | \newcommand{\SynNoiseMin}{\qty{0}{\nano\tesla}} 55 | \newcommand{\SynNoiseMax}{\qty{40}{\nano\tesla}} 56 | \newcommand{\SynNoiseStep}{\qty{0.2}{\nano\tesla}} 57 | \newcommand{\SynNoisePlotted}{0, 10, 25, and \qty{40}{\nano\tesla}} 58 | \newcommand{\SynNoiseHeight}{\qty{800}{\m}} 59 | \newcommand{\SynNoiseSpacing}{\qty{500}{\m}} 60 | \newcommand{\SynNoiseErrUEI}{\qty{4628}{\m}} 61 | \newcommand{\SynNoiseErrUED}{\qty{4252}{\m}} 62 | \newcommand{\SynNoiseErrUEIW}{\qty{2128}{\m}} 63 | \newcommand{\SynNoiseErrNEI}{\qty{81}{\m}} 64 | \newcommand{\SynNoiseErrNED}{\qty{449}{\m}} 65 | \newcommand{\SynNoiseErrNEIW}{\qty{125}{\m}} 66 | \newcommand{\SynNoiseErrEEI}{\qty{947}{\m}} 67 | \newcommand{\SynNoiseErrEED}{\qty{1275}{\m}} 68 | \newcommand{\SynNoiseErrEEIW}{\qty{482}{\m}} 69 | \newcommand{\SynNoiseErrBEI}{\qty{10}{\nano\tesla}} 70 | \newcommand{\SynNoiseErrBED}{\qty{4}{\nano\tesla}} 71 | \newcommand{\SynNoiseErrBEIW}{\qty{9}{\nano\tesla}}\newcommand{\DefaultWeightsF}{1} 72 | \newcommand{\DefaultWeightsE}{0.1} 73 | \newcommand{\DefaultWeightsN}{0.1} 74 | \newcommand{\DefaultWeightsU}{0.025} 75 | \newcommand{\SynProofTrueEast}{\qty{15000}{\m}} 76 | \newcommand{\SynProofTrueNorth}{\qty{12000}{\m}} 77 | \newcommand{\SynProofTrueUp}{\qty{-3000}{\m}} 78 | \newcommand{\SynProofTrueBase}{\qty{100}{\nano\tesla}} 79 | \newcommand{\SynProofInt}{\qty{5e+11}{\ampere\per\meter}} 80 | \newcommand{\SynProofDec}{\qty{15}{\degree}} 81 | \newcommand{\SynProofInc}{\qty{-30}{\degree}} 82 | \newcommand{\SynProofNoise}{\qty{10}{\nano\tesla}} 83 | \newcommand{\SynProofHeight}{\qty{800}{\m}} 84 | \newcommand{\SynProofSpacing}{\qty{300}{\m}} 85 | \newcommand{\SynProofEstEast}{\qty{15045}{\m}} 86 | \newcommand{\SynProofEstNorth}{\qty{12028}{\m}} 87 | \newcommand{\SynProofEstUp}{\qty{-2663}{\m}} 88 | \newcommand{\SynProofEstBase}{\qty{93}{\nano\tesla}} 89 | \newcommand{\SynProofEDEast}{\qty{14626}{\m}} 90 | \newcommand{\SynProofEDNorth}{\qty{11865}{\m}} 91 | \newcommand{\SynProofEDUp}{\qty{-1553}{\m}} 92 | \newcommand{\SynProofEDBase}{\qty{94}{\nano\tesla}} 93 | \newcommand{\SynProofNIter}{6}\newcommand{\DefaultSIMin}{0} 94 | \newcommand{\DefaultSIMax}{3} 95 | \newcommand{\SynSITrueEast}{\qty{15000}{\m}} 96 | \newcommand{\SynSITrueNorth}{\qty{10000}{\m}} 97 | \newcommand{\SynSITrueUp}{\qty{0}{\m}} 98 | \newcommand{\SynSITrueBase}{\qty{300}{\nano\tesla}} 99 | \newcommand{\SynSIDec}{\qty{-20}{\degree}} 100 | \newcommand{\SynSIInc}{\qty{35}{\degree}} 101 | \newcommand{\SynSINoise}{\qty{15}{\nano\tesla}} 102 | \newcommand{\SynSIHeight}{\qty{1000}{\m}} 103 | \newcommand{\SynSISpacing}{\qty{300}{\m}}\newcommand{\SynWinDec}{\qty{-20}{\degree}} 104 | \newcommand{\SynWinInc}{\qty{-30}{\degree}} 105 | \newcommand{\SynWinNoise}{\qty{50}{\nano\tesla}} 106 | \newcommand{\SynWinBase}{\qty{1000}{\nano\tesla}} 107 | \newcommand{\SynWinHeight}{\qty{1000}{\m}} 108 | \newcommand{\SynWinSpacing}{\qty{500}{\m}} 109 | \newcommand{\SynWinWindowSize}{\qty{10000}{\m}} 110 | \newcommand{\SynWinWindowStep}{\qty{5000}{\m}} 111 | \newcommand{\SynWinNSources}{10} 112 | \newcommand{\SynWinKeepED}{0.3} 113 | \newcommand{\SynWinKeepFD}{0.35} 114 | \newcommand{\SynWinKeepEI}{0.25} 115 | \newcommand{\SynWinRegionalE}{\qty{0.02}{\nano\tesla\per\meter}} 116 | \newcommand{\SynWinRegionalN}{\qty{-0.03}{\nano\tesla\per\meter}} -------------------------------------------------------------------------------- /paper/variables/real-data-application.tex: -------------------------------------------------------------------------------- 1 | \newcommand{\RioNSources}{\num{300}} 2 | \newcommand{\RioWindowSize}{\qty{12000}{\m}} 3 | \newcommand{\RioWindowStep}{\qty{2400}{\m}} 4 | \newcommand{\RioWeightsF}{\num{1}} 5 | \newcommand{\RioWeightsE}{\num{0.1}} 6 | \newcommand{\RioWeightsN}{\num{0.1}} 7 | \newcommand{\RioWeightsU}{\num{0.05}} 8 | \newcommand{\RioPercentile}{\num{99.5}} 9 | \newcommand{\RioSIMin}{1} 10 | \newcommand{\RioSIMax}{3} -------------------------------------------------------------------------------- /paper/variables/real-data-geology.tex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/compgeolab/euler-inversion/91ffed9ea163897fa691ca6cf3cdd91fa2738c58/paper/variables/real-data-geology.tex -------------------------------------------------------------------------------- /paper/variables/real-data-preparation.tex: -------------------------------------------------------------------------------- 1 | \newcommand{\RioNData}{\num{50882}} 2 | \newcommand{\RioDerivSpacing}{\qty{1}{\m}} 3 | \newcommand{\RioEQSDepth}{\qty{1000}{\m}} 4 | \newcommand{\RioEQSDamping}{\num{10}} 5 | \newcommand{\RioEQSBlock}{\qty{100}{\m}} 6 | \newcommand{\RioEQSWindow}{\qty{22313}{\m}} -------------------------------------------------------------------------------- /paper/variables/synthetic-interfering-sources-dykes.tex: -------------------------------------------------------------------------------- 1 | \newcommand{\SynInterfDykesDistMax}{\qty{9000}{\m}} 2 | \newcommand{\SynInterfDykesDistMin}{\qty{1000}{\m}} 3 | \newcommand{\SynInterfDykesTrueEast}{\qty{7000}{\m}} 4 | \newcommand{\SynInterfDykesTrueNorth}{\qty{4500}{\m}} 5 | \newcommand{\SynInterfDykesTrueUp}{\qty{0}{\m}} 6 | \newcommand{\SynInterfDykesTrueBase}{\qty{100}{\nano\tesla}} 7 | \newcommand{\SynInterfDykesInterfEastMax}{\qty{6000}{\m}} 8 | \newcommand{\SynInterfDykesInterfEastMin}{\qty{-2000}{\m}} 9 | \newcommand{\SynInterfDykesInterfNorth}{\qty{4500}{\m}} 10 | \newcommand{\SynInterfDykesInterfUp}{\qty{300}{\m}} 11 | \newcommand{\SynInterfDykesNModels}{33} 12 | \newcommand{\SynInterfDykesInt}{\qty{2e+01}{\ampere\per\meter}} 13 | \newcommand{\SynInterfDykesDec}{\qty{20}{\degree}} 14 | \newcommand{\SynInterfDykesInc}{\qty{-30}{\degree}} 15 | \newcommand{\SynInterfDykesHeight}{\qty{400}{\m}} 16 | \newcommand{\SynInterfDykesSpacing}{\qty{150}{\m}} -------------------------------------------------------------------------------- /paper/variables/synthetic-interfering-sources.tex: -------------------------------------------------------------------------------- 1 | \newcommand{\SynInterfTrueEast}{\qty{7000}{\m}} 2 | \newcommand{\SynInterfTrueNorth}{\qty{4000}{\m}} 3 | \newcommand{\SynInterfTrueUp}{\qty{-3000}{\m}} 4 | \newcommand{\SynInterfTrueBase}{\qty{100}{\nano\tesla}} 5 | \newcommand{\SynInterfInterfEastMax}{\qty{5000}{\m}} 6 | \newcommand{\SynInterfInterfEastMin}{\qty{-1000}{\m}} 7 | \newcommand{\SynInterfInterfNorth}{\qty{5000}{\m}} 8 | \newcommand{\SynInterfInterfUp}{\qty{-1500}{\m}} 9 | \newcommand{\SynInterfNModels}{31} 10 | \newcommand{\SynInterfInt}{\qty{5e+11}{\ampere\per\meter}} 11 | \newcommand{\SynInterfDec}{\qty{-10}{\degree}} 12 | \newcommand{\SynInterfInc}{\qty{-30}{\degree}} 13 | \newcommand{\SynInterfHeight}{\qty{400}{\m}} 14 | \newcommand{\SynInterfSpacing}{\qty{200}{\m}} -------------------------------------------------------------------------------- /paper/variables/synthetic-noise-levels.tex: -------------------------------------------------------------------------------- 1 | \newcommand{\SynNoiseWeightsF}{1} 2 | \newcommand{\SynNoiseWeightsE}{0.1} 3 | \newcommand{\SynNoiseWeightsN}{0.1} 4 | \newcommand{\SynNoiseWeightsU}{0.025} 5 | \newcommand{\SynNoiseTrueEast}{\qty{15000}{\m}} 6 | \newcommand{\SynNoiseTrueNorth}{\qty{11000}{\m}} 7 | \newcommand{\SynNoiseTrueUp}{\qty{-5000}{\m}} 8 | \newcommand{\SynNoiseTrueBase}{\qty{100}{\nano\tesla}} 9 | \newcommand{\SynNoiseInt}{\qty{2e+12}{\ampere\per\meter}} 10 | \newcommand{\SynNoiseDec}{\qty{15}{\degree}} 11 | \newcommand{\SynNoiseInc}{\qty{-30}{\degree}} 12 | \newcommand{\SynNoiseMin}{\qty{0}{\nano\tesla}} 13 | \newcommand{\SynNoiseMax}{\qty{40}{\nano\tesla}} 14 | \newcommand{\SynNoiseStep}{\qty{0.2}{\nano\tesla}} 15 | \newcommand{\SynNoisePlotted}{0, 10, 25, and \qty{40}{\nano\tesla}} 16 | \newcommand{\SynNoiseHeight}{\qty{800}{\m}} 17 | \newcommand{\SynNoiseSpacing}{\qty{500}{\m}} 18 | \newcommand{\SynNoiseErrUEI}{\qty{4628}{\m}} 19 | \newcommand{\SynNoiseErrUED}{\qty{4252}{\m}} 20 | \newcommand{\SynNoiseErrUEIW}{\qty{2128}{\m}} 21 | \newcommand{\SynNoiseErrNEI}{\qty{81}{\m}} 22 | \newcommand{\SynNoiseErrNED}{\qty{449}{\m}} 23 | \newcommand{\SynNoiseErrNEIW}{\qty{125}{\m}} 24 | \newcommand{\SynNoiseErrEEI}{\qty{947}{\m}} 25 | \newcommand{\SynNoiseErrEED}{\qty{1275}{\m}} 26 | \newcommand{\SynNoiseErrEEIW}{\qty{482}{\m}} 27 | \newcommand{\SynNoiseErrBEI}{\qty{10}{\nano\tesla}} 28 | \newcommand{\SynNoiseErrBED}{\qty{4}{\nano\tesla}} 29 | \newcommand{\SynNoiseErrBEIW}{\qty{9}{\nano\tesla}} -------------------------------------------------------------------------------- /paper/variables/synthetic-proof-of-concept.tex: -------------------------------------------------------------------------------- 1 | \newcommand{\DefaultWeightsF}{1} 2 | \newcommand{\DefaultWeightsE}{0.1} 3 | \newcommand{\DefaultWeightsN}{0.1} 4 | \newcommand{\DefaultWeightsU}{0.025} 5 | \newcommand{\SynProofTrueEast}{\qty{15000}{\m}} 6 | \newcommand{\SynProofTrueNorth}{\qty{12000}{\m}} 7 | \newcommand{\SynProofTrueUp}{\qty{-3000}{\m}} 8 | \newcommand{\SynProofTrueBase}{\qty{100}{\nano\tesla}} 9 | \newcommand{\SynProofInt}{\qty{5e+11}{\ampere\per\meter}} 10 | \newcommand{\SynProofDec}{\qty{15}{\degree}} 11 | \newcommand{\SynProofInc}{\qty{-30}{\degree}} 12 | \newcommand{\SynProofNoise}{\qty{10}{\nano\tesla}} 13 | \newcommand{\SynProofHeight}{\qty{800}{\m}} 14 | \newcommand{\SynProofSpacing}{\qty{300}{\m}} 15 | \newcommand{\SynProofEstEast}{\qty{15045}{\m}} 16 | \newcommand{\SynProofEstNorth}{\qty{12028}{\m}} 17 | \newcommand{\SynProofEstUp}{\qty{-2663}{\m}} 18 | \newcommand{\SynProofEstBase}{\qty{93}{\nano\tesla}} 19 | \newcommand{\SynProofEDEast}{\qty{14626}{\m}} 20 | \newcommand{\SynProofEDNorth}{\qty{11865}{\m}} 21 | \newcommand{\SynProofEDUp}{\qty{-1553}{\m}} 22 | \newcommand{\SynProofEDBase}{\qty{94}{\nano\tesla}} 23 | \newcommand{\SynProofNIter}{6} -------------------------------------------------------------------------------- /paper/variables/synthetic-structural-index.tex: -------------------------------------------------------------------------------- 1 | \newcommand{\DefaultSIMin}{0} 2 | \newcommand{\DefaultSIMax}{3} 3 | \newcommand{\SynSITrueEast}{\qty{15000}{\m}} 4 | \newcommand{\SynSITrueNorth}{\qty{10000}{\m}} 5 | \newcommand{\SynSITrueUp}{\qty{0}{\m}} 6 | \newcommand{\SynSITrueBase}{\qty{300}{\nano\tesla}} 7 | \newcommand{\SynSIDec}{\qty{-20}{\degree}} 8 | \newcommand{\SynSIInc}{\qty{35}{\degree}} 9 | \newcommand{\SynSINoise}{\qty{15}{\nano\tesla}} 10 | \newcommand{\SynSIHeight}{\qty{1000}{\m}} 11 | \newcommand{\SynSISpacing}{\qty{300}{\m}} -------------------------------------------------------------------------------- /paper/variables/synthetic-windows.tex: -------------------------------------------------------------------------------- 1 | \newcommand{\SynWinDec}{\qty{-20}{\degree}} 2 | \newcommand{\SynWinInc}{\qty{-30}{\degree}} 3 | \newcommand{\SynWinNoise}{\qty{50}{\nano\tesla}} 4 | \newcommand{\SynWinBase}{\qty{1000}{\nano\tesla}} 5 | \newcommand{\SynWinHeight}{\qty{1000}{\m}} 6 | \newcommand{\SynWinSpacing}{\qty{500}{\m}} 7 | \newcommand{\SynWinWindowSize}{\qty{10000}{\m}} 8 | \newcommand{\SynWinWindowStep}{\qty{5000}{\m}} 9 | \newcommand{\SynWinNSources}{10} 10 | \newcommand{\SynWinKeepED}{0.3} 11 | \newcommand{\SynWinKeepFD}{0.35} 12 | \newcommand{\SynWinKeepEI}{0.25} 13 | \newcommand{\SynWinRegionalE}{\qty{0.02}{\nano\tesla\per\meter}} 14 | \newcommand{\SynWinRegionalN}{\qty{-0.03}{\nano\tesla\per\meter}} --------------------------------------------------------------------------------