Mesh (433) eros dengan 739 simpul dan 1474 wajah
Kode ini adalah implementasi yang divalidasi dalam C ++ 17 dari model gravitasi polyhedral oleh Tsoulis et al .. Selain itu, model ini menyediakan pengikatan python. Awalnya dibuat dalam proyek kolaboratif antara tim konsep canggih TU Munich dan ESA.
Jika implementasi ini terbukti bermanfaat bagi Anda, harap pertimbangkan mengutip makalah yang menyertainya yang diterbitkan dalam Journal of Open Source Software .
Implementasi ini didasarkan pada kertas Tsoulis, D., 2012. Perhitungan analitik dari tensor gravitasi penuh dari sumber polihedral berbentuk homogen secara sewenang -wenang menggunakan integral garis. Geofisika, 77 (2), pp.f1-f11. dan implementasinya yang sesuai di Fortran.
Detail tambahan dapat ditemukan di makalah yang lebih baru Tsoulis, Dimitrios; Gavriilidou, Georgia. Tinjauan komputasi dari formulasi analitik integral garis dari sinyal gravitasi polihedral. Prospeksi Geofisika, 2021, 69. Jg., Nr. 8-9, S. 1745-1760. dan implementasinya yang sesuai di MATLAB, yang sangat didasarkan pada implementasi sebelumnya di Fortran.
Catatan
Halaman GitHub dari proyek ini berisi dokumentasi lengkap penuh dari C ++ Library dan Python Interface serta latar belakang pada model gravitasi dan pengaturan lanjutan yang tidak dirinci di sini.
Evaluasi model gravitasi polihedral membutuhkan parameter berikut:
Nama |
---|
Mesh polyhedral (baik sebagai simpul & wajah atau sebagai file sumber polyhedral) |
Kepadatan konstan |
Unit kepadatan mesh dan konstanta harus cocok. Lihatlah dokumentasi untuk melihat file mesh yang didukung.
Perhitungan mengeluarkan parameter berikut untuk setiap titik perhitungan p . Unit output masing -masing tergantung pada unit parameter input (mesh dan kepadatan)! Oleh karena itu, jika misalnya jala Anda
Nama | Unit (jika jala di | Komentar |
---|---|---|
Potensi atau juga energi spesifik | ||
Akserlerasi gravitasi di tiga arah Cartesian | ||
Laju perubahan spasial dari aklerasi gravitasi |
Catatan
Output model gravitasi ini mematuhi konvensi tanda geodesy dan geofisika. Karenanya, potensi
Contoh berikut menunjukkan cara menggunakan antarmuka Python untuk menghitung gravitasi di sekitar kubus:
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 ])
Pertama -tama kita mendefinisikan kepadatan konstan polyhedron dari vertices
dan faces
cube_polyhedron = Polyhedron (
polyhedral_source = ( cube_vertices , cube_faces ),
density = cube_density ,
)
Jika Anda ingin menyerahkan polyhedron melalui format file yang didukung, cukup ganti argumen polyhedral_source
dengan daftar string , di mana setiap string adalah jalur ke format file yang didukung, misalnya polyhedral_source=["eros.node","eros.face"]
atau polyhedral_source=["eros.mesh"]
.
Melanjutkan, cara paling sederhana untuk menghitung gravitasi adalah dengan menggunakan fungsi evaluate
:
potential , acceleration , tensor = evaluate (
polyhedron = cube_polyhedron ,
computation_points = computation_point ,
parallel = True ,
)
Cara yang lebih maju adalah menggunakan kelas GravityEvaluable
. Ini menyimpan struktur dan sifat data internal yang dapat digunakan kembali untuk beberapa evaluasi. Ini sangat berguna jika Anda ingin menghitung gravitasi untuk beberapa titik perhitungan, tetapi tidak tahu "poin masa depan" sebelumnya.
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
Perhatikan bahwa computation_point
juga bisa (n, 3) -daped array untuk menghitung beberapa titik sekaligus. Dalam hal ini, nilai pengembalian evaluate(..)
atau GravityEvaluable
akan menjadi daftar kembar tiga yang terdiri dari potensi, akselerasi, dan tensor.
Model gravitasi mensyaratkan bahwa semua normal unit bidang polyhedron secara konsisten menunjuk ke luar atau ke dalam polyhedron. Anda dapat menentukan ini melalui normal_orientation
. Properti ini - secara default - diperiksa saat membangun Polyhedron
! Jadi, jangan khawatir, tidak mungkin jika tidak dinonaktifkan secara eksplisit untuk membuat Polyhedron
yang tidak valid. Anda dapat menonaktifkan/ mengaktifkan pengaturan ini melalui bendera integrity_check
opsional dan bahkan dapat secara otomatis memperbaiki pemesanan melalui HEAL
. Jika Anda yakin bahwa mesh Anda didefinisikan dengan benar (misalnya diperiksa sekali dengan pemeriksaan integritas) Anda dapat menonaktifkan cek ini (melalui DISABLE
) untuk menghindari overhead runtime tambahan dari cek.
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
)
Tip
Lebih banyak contoh dan plot digambarkan dalam buku catatan Jupyter.
Contoh berikut menunjukkan cara menggunakan pustaka C ++ untuk menghitung gravitasi. Ini berfungsi secara analog dengan contoh ular piton di atas.
// 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 ;
Perpustakaan C ++ juga menyediakan dua cara untuk menghitung gravitasi. Melalui fungsi gratis evaluate
...
const auto [pot, acc, tensor] = GravityModel::evaluate(polyhedron, point, parallel);
... atau melalui kelas GravityEvaluable
.
// 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);
Demikian pula dengan Python, implementasi C ++ juga menyediakan kemampuan pemeriksaan mesh.
Tip
Untuk referensi, lihat metode utama C ++ yang dapat dieksekusi.
Antarmuka Python dapat dengan mudah diinstal dengan Conda:
conda install -c conda-forge polyhedral-gravity-model
Sebagai opsi kedua, Anda juga dapat menginstal antarmuka Python dengan PIP dari PYPI.
pip install polyhedral-gravity
Binari untuk platform yang paling umum tersedia di PYPI termasuk Windows, Linux dan MacOS. Untuk macOS dan Linux, binari untuk x86_64
dan aarch64
disediakan. Jika pip
menggunakan distribusi sumber, pastikan Anda memiliki kompiler C ++ 17 yang mampu dan CMake terpasang.
Proyek ini menggunakan dependensi berikut, semuanya secara otomatis diatur melalui CMake:
atan(..)
Modul ini akan dibangun menggunakan kompiler C ++ 17 yang mampu, CMake. Cukup jalankan perintah berikut di folder root repositori:
pip install .
Untuk memodifikasi opsi build (seperti paralelisasi), lihatlah paragraf berikutnya. Opsi dimodifikasi dengan mengatur variabel lingkungan sebelum menjalankan pip install .
perintah, misalnya:
export POLYHEDRAL_GRAVITY_PARALLELIZATION= " TBB "
pip install .
(Opsional: Untuk build yang lebih cepat Anda dapat menginstal semua dependensi yang tersedia untuk sistem Anda di lingkungan Python lokal Anda. Dengan begitu, mereka tidak akan diambil dari GitHub.)
Program ini dibangun dengan menggunakan cmake. Jadi pertama -tama pastikan Anda menginstal cmake dan kemudian ikuti langkah -langkah ini:
mkdir build
cd build
cmake .. < options >
cmake --build .
Opsi berikut tersedia:
Nama (default) | Opsi |
---|---|
Polyhedral_gravity_parallelization ( CPP ) | CPP = Eksekusi Serial / OMP atau TBB = Eksekusi Paralel dengan OpenMP atau Intel's TBB |
LOGGING_LEVEL ( INFO ) | TRACE , DEBUG , INFO , WARN , ERROR , CRITICAL , OFF |
Build_polyhedral_gravity_docs ( OFF ) | Bangun dokumentasi ini |
Build_polyhedral_gravity_tests ( ON ) | Bangun tes |
Build_polyhedral_python_interface ( ON ) | Bangun Antarmuka Python |
Selama pengujian polyhedral_gravity_parallelization = TBB
telah menjadi yang paling berkinerja. Lebih lanjut tidak disarankan untuk mengubah logging_level menjadi sesuatu yang lain selain INFO=2
.
Pengaturan CMake yang disarankan menggunakan backend TBB
akan terlihat seperti ini:
cmake .. -POLYHEDRAL_GRAVITY_PARALLELIZATION= " TBB "
Setelah membangun, model gravitasi dapat dijalankan dengan mengeksekusi:
./polyhedralGravity < YAML-Configuration-File >
di mana file-konfigurasi YAML berisi parameter yang diperlukan. Contoh untuk file konfigurasi dan file sumber polyhedral dapat ditemukan di repositori ini di folder /example-config/
.
Konfigurasi harus terlihat mirip dengan contoh yang diberikan di bawah ini. Diperlukan untuk menentukan file sumber dari mesh polyhedron (info lebih lanjut tentang file yang didukung dalam dokumentasi), kepadatan polyhedron, dan titik perhitungan yang diinginkan di mana tensor gravitasi harus dihitung. Lebih lanjut seseorang harus menentukan nama file output .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
Yang dapat dieksekusi menghasilkan file CSV yang berisi
Proyek ini menggunakan Googletest untuk pengujian. Di Oder untuk menjalankan tes -tes itu hanya menjalankan perintah berikut di Direktori Build:
ctest
Untuk suite tes Python, harap jalankan perintah berikut di folder root repositori:
pytest
Kami senang menerima kontribusi untuk proyek dalam bentuk saran, laporan bug dan permintaan tarik. Silakan lihat pedoman yang berkontribusi untuk informasi lebih lanjut.