Сетка (433) эроса с 739 вершинами и 1474 лицами
Этот код является проверенной реализацией в C ++ 17 модели многогранного гравитации Tsoulis et al. Кроме того, модель обеспечивает связывание Python. Первоначально он был создан в совместном проекте между Tu Munich и ESA Advanced Concepts Team.
Если эта реализация окажется полезной, пожалуйста, рассмотрите возможность сослаться на сопроводительную статью, опубликованную в журнале программного обеспечения с открытым исходным кодом .
Реализация основана на статье Tsoulis, D., 2012. Аналитическое вычисление полного гравитационного тензора однородного многогранного многогранного источника с использованием линейных интегралов. Геофизика, 77 (2), с. и его соответствующая реализация в Фортране.
Дополнительные детали можно найти в более поздней статье Tsoulis, Dimitrios; Гаврилиду, Грузия. Вычислительный обзор линейной интегральной аналитической формулировки многогранного гравитационного сигнала. Геофизический поиск, 2021, 69. JG., Nr. 8-9, S. 1745-1760. и его соответствующая реализация в Matlab, которая сильно основана на бывшей реализации в Fortran.
Примечание
Страницы GitHub этого проекта содержат полную обширную документацию библиотеки C ++ и интерфейса Python, а также фон по модели гравитации и расширенные настройки, не подробные здесь.
Оценка модели многогранного гравитации требует следующих параметров:
Имя |
---|
Многогранная сетка (либо в виде вершин и грани, либо в виде многогранных исходных файлов) |
Постоянная плотность |
Сетка и единица плотности константы должны соответствовать. Посмотрите документацию, чтобы просмотреть поддерживаемые сетки.
Расчет выводит следующие параметры для каждой точки вычисления p . Единицы соответствующего вывода зависят от единиц входных параметров (сетка и плотность)! Следовательно, если например, ваша сетка в
Имя | Единица (если сетка в | Комментарий |
---|---|---|
Потенциал или также называемый конкретной энергией | ||
Гравитационная укрепивка в трех декартовых направлениях | ||
Пространственная скорость изменения гравитационной аккурации |
Примечание
Выходная модель этой гравитационной модели подчиняется конвенциям геодезии и геофизики. Следовательно, потенциал
В следующем примере показано, как использовать интерфейс Python для вычисления гравитации вокруг куба:
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 ])
Сначала мы определяем многогранник постоянной плотности из vertices
и faces
cube_polyhedron = Polyhedron (
polyhedral_source = ( cube_vertices , cube_faces ),
density = cube_density ,
)
В случае, если вы хотите передать многогранник через поддерживаемый формат файла, просто замените аргумент polyhedral_source
в список строк , где каждая строка является путем к поддерживаемому формату файла, например, polyhedral_source=["eros.node","eros.face"]
или polyhedral_source=["eros.mesh"]
.
Продолжая, самый простой способ вычисления гравитации - это использовать функцию evaluate
:
potential , acceleration , tensor = evaluate (
polyhedron = cube_polyhedron ,
computation_points = computation_point ,
parallel = True ,
)
Более продвинутый способ - использовать GravityEvaluable
Class. Он кэширует внутреннюю структуру и свойства данных, которые могут быть использованы для многочисленных оценок. Это особенно полезно, если вы хотите вычислить гравитацию для нескольких точек вычисления, но не знаете «будущие точки» заранее.
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
Обратите внимание, что computation_point
также может быть (n, 3)-образованный массив для вычисления нескольких точек одновременно. В этом случае возвратная стоимость evaluate(..)
или GravityEvaluable
будет списком триплетов, включающих потенциал, ускорение и тензор.
Модель гравитации требует, чтобы все нормы плоских единиц полиэгрона последовательно указывали наружу или внутрь многогранника. Вы можете указать это через normal_orientation
. Это свойство - по умолчанию - проверяется при построении Polyhedron
! Так что, не волнуйтесь, невозможно, если не явно отключено, чтобы создать неверный Polyhedron
. Вы можете отключить/ включить этот настройка через необязательный флаг integrity_check
и даже автоматически восстановить упорядочение через HEAL
. Если вы уверены, что ваша сетка определяется правильно (например, проверяется один раз с проверкой целостности), вы можете отключить эту проверку (через DISABLE
), чтобы избежать дополнительных накладных расходов во время выполнения проверки.
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
)
Кончик
Больше примеров и участков изображены в ноутбуке Юпитера.
В следующем примере показано, как использовать библиотеку C ++ для вычисления гравитации. Это работает аналогично примеру Python выше.
// 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 ;
Библиотека C ++ также предоставляет также два способа вычисления гравитации. Через бесплатную функцию evaluate
...
const auto [pot, acc, tensor] = GravityModel::evaluate(polyhedron, point, parallel);
... или через GravityEvaluable
Class.
// 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);
Подобно Python, реализация C ++ также предоставляет возможности проверки сетки.
Кончик
Для справки, посмотрите на основной метод исполняемого C ++.
Интерфейс Python может быть легко установлен с помощью Conda:
conda install -c conda-forge polyhedral-gravity-model
В качестве второго варианта вы также можете установить интерфейс Python с PIP от PYPI.
pip install polyhedral-gravity
Двойки для самых распространенных платформ доступны на PYPI, включая Windows, Linux и MacOS. Для MacOS и Linux представлены двоичные файлы для x86_64
и aarch64
. В случае, если pip
использует распределение источников, убедитесь, что у вас есть установлен компилятор C ++ 17 и Cmake.
Проект использует следующие зависимости, все они автоматически настраиваются через CMAKE:
atan(..)
Модуль будет построен с использованием компилятора C ++ 17, Cmake. Просто выполните следующую команду в корневой папке репозитория:
pip install .
Чтобы изменить варианты сборки (например, параллелизация), посмотрите на следующий абзац. Параметры изменяются путем установки переменных среды перед выполнением pip install .
команда, например:
export POLYHEDRAL_GRAVITY_PARALLELIZATION= " TBB "
pip install .
(Необязательно: для более быстрой сборки вы можете установить все зависимости, доступные для вашей системы в вашей местной среде Python. Таким образом, они не будут извлечены из GitHub.)
Программа создается с помощью Cmake. Поэтому сначала убедитесь, что вы установили Cmake, а затем выполните эти шаги:
mkdir build
cd build
cmake .. < options >
cmake --build .
Доступны следующие варианты:
Имя (по умолчанию) | Параметры |
---|---|
PolyEdral_gravity_parallelization ( CPP ) | CPP = серийное выполнение / OMP или TBB = параллельное выполнение с OpenMP или TBB Intel |
Logging_level ( INFO ) | TRACE , DEBUG , INFO , WARN , ERROR , CRITICAL , OFF |
Build_polyhedral_gravity_docs ( OFF ) | Создайте эту документацию |
Build_polyhedral_gravity_tests ( ON ) | Создайте тесты |
Build_polyhedral_python_interface ( ON ) | Создайте интерфейс Python |
Во время тестирования POLYEDRAR_GRAVITY_PARALLELISTIAG = TBB
был наиболее эффективным. Далее это не рекомендуется изменять logging_level на что -то другое, кроме INFO=2
.
Рекомендуемые настройки Cmake с использованием бэкэнда TBB
выглядели бы так:
cmake .. -POLYHEDRAL_GRAVITY_PARALLELIZATION= " TBB "
После сборки модель гравитации может быть запущена путем выполнения:
./polyhedralGravity < YAML-Configuration-File >
где файл yaml-конфигурации содержит необходимые параметры. Примеры для файлов конфигурации и многогранных исходных файлов можно найти в этом репозитории в папке /example-config/
.
Конфигурация должна выглядеть аналогично данному примеру ниже. Требуется указать исходные материалы сетки многогранника (дополнительная информация о поддерживаемом файле в документации), плотность многогранника и желаемые точки вычисления, где должен быть вычислен тензор гравитации. Далее следует указать имя выходного файла .csv.
---
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
Исполняемый файл создает файл CSV, содержащий
Проект использует Googletest для тестирования. В Oder, чтобы выполнить эти тесты, просто выполните следующую команду в каталоге сборки:
ctest
Для набора тестов Python, пожалуйста, выполните следующую команду в корневой папке репозитория:
pytest
Мы рады принять вклад в проект в виде предложений, отчетов об ошибках и запросов. Пожалуйста, посмотрите на руководящие принципы для получения дополнительной информации.