Netz von (433) Eros mit 739 Eckpunkten und 1474 Gesichtern
Dieser Code ist eine validierte Implementierung in C ++ 17 des polyedrischen Schwerkraftmodells von Tsoulis et al. Außerdem liefert das Modell eine Python -Bindung. Es wurde ursprünglich in einem kollaborativen Projekt zwischen Tu München und ESAs Advanced Concepts -Team erstellt.
Wenn sich diese Implementierung für Sie als nützlich erweist, erwägen Sie bitte das im Journal of Open Source Software veröffentlichte Begleitpapier.
Die Implementierung basiert auf dem Papier Tsoulis, D., 2012. Analytische Berechnung des vollständigen Tensors einer homogenen willkürlich geformten polyedrischen Quelle unter Verwendung von Linienintegralen. Geophysik, 77 (2), S.F1-F11. und seine entsprechende Umsetzung in Forran.
Zusätzliche Details finden Sie in der neueren Arbeit in Tsoulis, Dimitrios. Gavriilidou, Georgia. Eine rechnerische Überprüfung der analytischen Formulierung des Linienintegrals des polyedrischen Schwerkraftsignals. Geophysikalische Prospektion, 2021, 69. Jg., Nr. 8-9, S. 1745-1760. und seine entsprechende Implementierung in MATLAB, die stark auf der früheren Implementierung in Forran basiert.
Notiz
Die GitHub -Seiten dieses Projekts enthalten die umfassende Dokumentation der C ++ - Bibliothek und der Python -Schnittstelle sowie des Hintergrunds über das Schwerkraftmodell und erweiterte Einstellungen, die hier nicht detailliert sind.
Die Bewertung des polyedrischen Schwerkraftmodells erfordert die folgenden Parameter:
Name |
---|
Polyedrisches Netz (entweder als Scheitelpunkte und Gesichter oder als polyedrische Quelldateien) |
Konstante Dichte |
Das Netz und die Einheit der Konstanten Dichte müssen übereinstimmen. Schauen Sie sich die Dokumentation an, um die unterstützten Netzdateien anzuzeigen.
Die Berechnung gibt die folgenden Parameter für jeden Berechnungspunkt p aus. Die Einheiten der jeweiligen Ausgabe hängen von den Einheiten der Eingabeparameter (Netz und Dichte) ab! Daher, wenn Ihr Netz in Ihrem Netz ist
Name | Einheit (falls in Mesh in | Kommentar |
---|---|---|
Das Potenzial oder auch als spezifische Energie bezeichnet | ||
Die Gravitations -Akmerlerierung in den drei kartesischen Richtungen | ||
Die räumliche Änderungsrate der Gravitationsakleration |
Notiz
Die Ausgabe dieses Schwerkraftmodells folgt der Geodäse- und Geophysik -Sign -Konventionen. Daher das Potenzial
Das folgende Beispiel zeigt, wie die Python -Schnittstelle verwendet wird, um die Schwerkraft um einen Würfel zu berechnen:
import numpy as np
from polyhedral_gravity import Polyhedron , GravityEvaluable , evaluate , PolyhedronIntegrity , NormalOrientation
# We define the cube as a polyhedron with 8 vertices and 12 triangular faces
# The polyhedron's normals point outwards (see below for checking this)
# The density is set to 1.0
cube_vertices = np . array (
[[ - 1 , - 1 , - 1 ], [ 1 , - 1 , - 1 ], [ 1 , 1 , - 1 ], [ - 1 , 1 , - 1 ],
[ - 1 , - 1 , 1 ], [ 1 , - 1 , 1 ], [ 1 , 1 , 1 ], [ - 1 , 1 , 1 ]]
)
cube_faces = np . array (
[[ 1 , 3 , 2 ], [ 0 , 3 , 1 ], [ 0 , 1 , 5 ], [ 0 , 5 , 4 ], [ 0 , 7 , 3 ], [ 0 , 4 , 7 ],
[ 1 , 2 , 6 ], [ 1 , 6 , 5 ], [ 2 , 3 , 6 ], [ 3 , 7 , 6 ], [ 4 , 5 , 6 ], [ 4 , 6 , 7 ]]
)
cube_density = 1.0
computation_point = np . array ([ 0 , 0 , 0 ])
Wir definieren zuerst ein Polyeder konstanter Dichte aus vertices
und faces
cube_polyhedron = Polyhedron (
polyhedral_source = ( cube_vertices , cube_faces ),
density = cube_density ,
)
Wenn Sie das Polyeder über ein unterstütztes Dateiformat übergeben möchten, ersetzen Sie einfach das Argument polyhedral_source
durch eine Liste von Zeichenfolgen , wobei jeder String der Pfad zu einem unterstützten Dateiformat ist, z polyhedral_source=["eros.node","eros.face"]
oder polyhedral_source=["eros.mesh"]
.
Fortsetzung, der einfachste Weg, um die Schwere zu berechnen, besteht darin, die evaluate
-Funktion zu verwenden:
potential , acceleration , tensor = evaluate (
polyhedron = cube_polyhedron ,
computation_points = computation_point ,
parallel = True ,
)
Der fortgeschrittenere Weg ist die Verwendung der GravityEvaluable
-Klasse. Es zwischen den internen Datenstruktur und den Eigenschaften zwischengewertet werden, die für mehrere Bewertungen wiederverwendet werden können. Dies ist besonders nützlich, wenn Sie die Schwere für mehrere Berechnungspunkte berechnen möchten, aber die "zukünftigen Punkte" im Voraus nicht kennen.
evaluable = GravityEvaluable ( polyhedron = cube_polyhedron ) # stores intermediate computation steps
potential , acceleration , tensor = evaluable (
computation_points = computation_point ,
parallel = True ,
)
# Any future evaluable call after this one will be faster
Beachten Sie, dass das computation_point
auch (n, 3) -Sthemmungsarray sein könnte, um mehrere Punkte gleichzeitig zu berechnen. In diesem Fall wird der Rückgabwert von evaluate(..)
oder einer GravityEvaluable
eine Liste von Tripletts sein, die Potenzial, Beschleunigung und Tensor umfassen.
Das Schwerkraftmodell erfordert, dass alle Normalen der Ebeneneinheit der Polyeder auf das Polyeder nach außen oder nach innen richten. Sie können dies über die normal_orientation
angeben. Diese Eigenschaft wird standardmäßig beim Bau des Polyhedron
überprüft! Machen Sie sich also keine Sorgen, es ist unmöglich, wenn nicht explizit deaktiviert, ein ungültiges Polyhedron
zu erstellen. Sie können diese Einstellung über das optionale Flag integrity_check
deaktivieren/ aktivieren und die Bestellung auch automatisch per HEAL
reparieren. Wenn Sie zuversichtlich sind, dass Ihr Netz korrekt definiert ist (z. B. einmal überprüft mit der Integritätsprüfung), können Sie diese Prüfung (per DISABLE
) deaktivieren, um den zusätzlichen Laufzeitaufwand des Schecks zu vermeiden.
cube_polyhedron = Polyhedron (
polyhedral_source = ( cube_vertices , cube_faces ),
density = cube_density ,
normal_orientation = NormalOrientation . INWARDS , # OUTWARDS (default) or INWARDS
integrity_check = PolyhedronIntegrity . VERIFY , # VERIFY (default), DISABLE or HEAL
)
Tipp
Weitere Beispiele und Diagramme sind im Jupyter -Notizbuch dargestellt.
Das folgende Beispiel zeigt, wie die C ++ - Bibliothek verwendet wird, um die Schwerkraft zu berechnen. Es funktioniert analog zum obigen Python -Beispiel.
// Defining the input like above in the Python example
std::vector<std::array< double , 3 >> vertices = ...
std::vector<std::array< size_t , 3 >> faces = ...
double density = 1.0 ;
// The constant density polyhedron is defined by its vertices & faces
// It also supports the hand-over of NormalOrientation and PolyhedronIntegrity as optional arguments
// as above described for the Python Interface
Polyhedron polyhedron{vertices, faces, density};
std::vector<std::array< double , 3 >> points = ...
std::array< double , 3 > point = points[ 0 ];
bool parallel = true ;
Die C ++ - Bibliothek bietet auch zwei Möglichkeiten zur Berechnung der Schwerkraft. Über die freie Funktion evaluate
...
const auto [pot, acc, tensor] = GravityModel::evaluate(polyhedron, point, parallel);
... oder über die GravityEvaluable
-Ereignisklasse.
// Instantiation of the GravityEvaluable object
GravityEvaluable evaluable{polyhedron};
// From now, we can evaluate the gravity model for any point with
const auto [potential, acceleration, tensor] = evaluable(point, parallel);
// or for multiple points with
const auto results = evaluable(points, parallel);
Ähnlich wie bei Python bietet die C ++ - Implementierung auch Maschenüberprüfungsfunktionen.
Tipp
Schauen Sie sich die Hauptmethode der ausführbaren C ++ - ausführbar an.
Die Python -Schnittstelle kann einfach mit Conda installiert werden:
conda install -c conda-forge polyhedral-gravity-model
Als zweite Option können Sie auch die Python -Schnittstelle mit PIP von PYPI installieren.
pip install polyhedral-gravity
Binärdateien für die gängigsten Plattformen sind auf PYPI einschließlich Windows, Linux und MacOS verfügbar. Für MacOS und Linux werden Binärdateien für x86_64
und aarch64
bereitgestellt. Wenn pip
die Quellverteilung verwendet, stellen Sie bitte sicher, dass Sie einen C ++ 17 -fähigen Compiler und CMake installiert haben.
Das Projekt verwendet die folgenden Abhängigkeiten, alle werden automatisch über CMake eingerichtet:
atan(..)
Das Modul wird unter Verwendung eines C ++ 17 -fähigen Compilers CMake erstellt. Führen Sie einfach den folgenden Befehl im Repository -Root -Ordner aus:
pip install .
Um die Build -Optionen (wie Parallelisierung) zu ändern, sehen Sie sich den nächsten Absatz an. Die Optionen werden geändert, indem die Umgebungsvariablen vor dem Ausführen der pip install .
Befehl, zB:
export POLYHEDRAL_GRAVITY_PARALLELIZATION= " TBB "
pip install .
(Optional: Für einen schnelleren Build können Sie alle für Ihr System zur Verfügung stehenden Abhängigkeiten in Ihrer örtlichen Python -Umgebung installieren. Auf diese Weise werden sie nicht von Github abgerufen.)
Das Programm wird mit CMake erstellt. Stellen Sie also zunächst sicher, dass Sie CMake installiert haben, und befolgen Sie dann die folgenden Schritte:
mkdir build
cd build
cmake .. < options >
cmake --build .
Die folgenden Optionen sind verfügbar:
Name (Standard) | Optionen |
---|---|
Polyedral_gravity_parallelization ( CPP ) | CPP = serielle Ausführung / OMP oder TBB = Parallele Ausführung mit OpenMP oder Intels TBB |
Logging_level ( INFO ) | TRACE , DEBUG , INFO , WARN , ERROR , CRITICAL , OFF |
Build_polyheedral_gravity_docs ( OFF ) | Bauen Sie diese Dokumentation auf |
Build_polyheedral_gravity_tests ( ON ) | Bauen Sie die Tests auf |
Build_polyheedral_python_interface ( ON ) | Erstellen Sie die Python -Schnittstelle |
Während des Testens polyedral_gravity_parallelization = TBB
war die leistungsstärkste. Es wird weiter nicht empfohlen, die Logging_level in etwas anderes als INFO=2
zu ändern.
Die empfohlenen CMAKE -Einstellungen mit dem TBB
-Backend würden so aussehen:
cmake .. -POLYHEDRAL_GRAVITY_PARALLELIZATION= " TBB "
Nach dem Build kann das Schwerkraftmodell durch Ausführung ausgeführt werden:
./polyhedralGravity < YAML-Configuration-File >
wobei das Yaml-Konfigurations-Datei die erforderlichen Parameter enthält. Beispiele für Konfigurationsdateien und polyedrische Quelldateien finden Sie in diesem Repository im Ordner /example-config/
.
Die Konfiguration sollte dem folgenden Beispiel ähnlich aussehen. Es ist erforderlich, die Quellfilme des Netzes des Polyeders (weitere Informationen zur unterstützten Datei in der Dokumentation), die Dichte des Polyeders und die gewünschten Berechnungspunkte anzugeben, an denen der Schwerkraft-Tensor berechnet wird. Weiter muss man den Namen der .csv -Ausgabedatei angeben.
---
gravityModel :
input :
polyhedron : # polyhedron source-file(s)
- " ../example-config/data/tsoulis.node " # .node contains the vertices
- " ../example-config/data/tsoulis.face " # .face contains the triangular faces
density : 2670.0 # constant density, units must match with the mesh (see section below)
points : # Location of the computation point(s) P
- [ 0, 0, 0 ] # Here it is situated at the origin
check_mesh : true # Fully optional, enables mesh autodetect+repair of
# the polyhedron's vertex ordering (not given: true)
output :
filename : " gravity_result.csv " # The name of the output file
Die ausführbare Datei erzeugt eine CSV -Datei, die enthält
Das Projekt verwendet Googletest zum Testen. In ODER, um diese Tests auszuführen, führen Sie einfach den folgenden Befehl im Build -Verzeichnis aus:
ctest
Für die Python Test Suite führen Sie bitte den folgenden Befehl im Repository -Root -Ordner aus:
pytest
Gerne akzeptieren wir Beiträge zum Projekt in Form von Vorschlägen, Fehlerberichten und Zuganfragen. Bitte sehen Sie sich die beitragenden Richtlinien an, um weitere Informationen zu erhalten.