شبكة من (433) إيروس مع 739 رؤوس و 1474 وجوه
هذا الرمز هو تنفيذ تم التحقق من صحته في C ++ 17 من نموذج الجاذبية المتعددة السطوح بواسطة Tsoulis et al .. بالإضافة إلى ذلك ، يوفر النموذج ربط Python. تم إنشاؤه في البداية في مشروع تعاوني بين TU Munich وفريق المفاهيم المتقدمة لـ ESA.
إذا أثبت هذا التنفيذ مفيدًا لك ، فيرجى التفكير في الاستشهاد بالورقة المصاحبة المنشورة في مجلة البرامج المفتوحة المصدر .
يعتمد التنفيذ على الورقة Tsoulis ، D. ، 2012. الحساب التحليلي لمتوتر الجاذبية الكامل لمصدر متعدد السطوح متجانس بشكل تعسفي باستخدام تكاملات الخط. الجيوفيزياء ، 77 (2) ، ص. F1-F11. وتنفيذها المقابل في فورتران.
يمكن العثور على التفاصيل التكميلية في الورقة الأكثر حداثة تسوليس ، ديميتريوس ؛ غافريليدو ، جورجيا. مراجعة حسابية لخط الصيغة التحليلية المتكاملة لإشارة الجاذبية متعددة السطوح. التنقيب الجيوفيزيائي ، 2021 ، 69. 8-9 ، S. 1745-1760. وتنفيذها المقابل في MATLAB ، والذي يعتمد بقوة على التنفيذ السابق في فورتران.
ملحوظة
تحتوي صفحات GitHub في هذا المشروع على وثائق واسعة كاملة لمكتبة C ++ وواجهة Python بالإضافة إلى خلفية على نموذج الجاذبية والإعدادات المتقدمة غير مفصلة هنا.
يتطلب تقييم نموذج الجاذبية متعددة السطوح المعلمات التالية:
اسم |
---|
شبكة متعددة السطوح (إما كرؤوس ووجوه أو كملفات مصدر متعدد السطوح) |
كثافة ثابتة |
يجب أن تتطابق الشبكة ووحدة كثافة الثوابت. إلقاء نظرة على الوثائق لعرض ملفات الشبكات المدعومة.
يقوم الحساب بإخراج المعلمات التالية لكل نقطة حساب ص . تعتمد وحدات الإخراج المعني على وحدات معلمات الإدخال (الشبكة والكثافة)! وبالتالي ، إذا كانت شبكةك في
اسم | الوحدة (إذا شبكة في | تعليق |
---|---|---|
الإمكانات أو تسمى أيضًا طاقة محددة | ||
Accerleration الجاذبية في اتجاهات الديكارتية الثلاثة | ||
المعدل المكاني لتغيير الصعود الجاذبية |
ملحوظة
يطيع ناتج نموذج الجاذبية هذا إلى اتفاقيات العلامات الجيوديسية والجيوفيزيائية. وبالتالي ، فإن الإمكانات
يوضح المثال التالي كيفية استخدام واجهة 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 ])
نحدد أولاً polyhedron الكثافة الثابتة من vertices
faces
cube_polyhedron = Polyhedron (
polyhedral_source = ( cube_vertices , cube_faces ),
density = cube_density ,
)
في حال كنت ترغب في تسليم polyhedron عبر تنسيق ملف مدعوم ، فقط استبدل وسيطة 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
. يقوم بتخزين بنية البيانات الداخلية والخصائص التي يمكن إعادة استخدامها لتقييمات متعددة. هذا مفيد بشكل خاص إذا كنت ترغب في حساب الجاذبية لنقاط حساب متعددة ، ولكن لا تعرف "النقاط المستقبلية" مقدمًا.
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
قائمة من الثلاثيات التي تشتمل على إمكانات وتسارع وموتر.
يتطلب نموذج الجاذبية أن جميع القواعد المعتادة للوحدة في وحدة polyhedron تشير باستمرار إلى الخارج أو إلى الداخل. يمكنك تحديد هذا عبر 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
)
نصيحة
يتم تصوير المزيد من الأمثلة والمؤامرات في دفتر Jupyter.
يوضح المثال التالي كيفية استخدام مكتبة C ++ لحساب الجاذبية. إنه يعمل بشكل مشابه إلى مثال الثعبان أعلاه.
// 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
.
// 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 ++ القابلة للتنفيذ.
يمكن تثبيت واجهة بيثون بسهولة مع كوندا:
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 ++ القادر وتثبيت 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 .
الخيارات التالية متوفرة:
الاسم (افتراضي) | خيارات |
---|---|
polyhedral_gravity_paraldization ( CPP ) | CPP = التنفيذ التسلسلي / OMP أو TBB = تنفيذ متوازي مع OPERMP أو Intel's TBB |
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 ) | بناء واجهة بيثون |
أثناء اختبار polyhedral_gravity_paraldization = كان TBB
أكثر الأداء. لا ينصح أيضًا بتغيير logging_level إلى شيء آخر غير INFO=2
.
ستبدو إعدادات CMake الموصى بها باستخدام الواجهة الخلفية TBB
هكذا:
cmake .. -POLYHEDRAL_GRAVITY_PARALLELIZATION= " TBB "
بعد الإنشاء ، يمكن تشغيل نموذج الجاذبية عن طريق التنفيذ:
./polyhedralGravity < YAML-Configuration-File >
حيث يحتوي ملف تكوين YAML على المعلمات المطلوبة. يمكن العثور على أمثلة لملفات التكوين وملفات مصدر متعددة السطوح في هذا المستودع في المجلد /example-config/
.
يجب أن يبدو التكوين مشابهًا للمثال المعطى أدناه. مطلوب لتحديد ملامح المصدر لشبكة polyhedron (مزيد من المعلومات حول الملف المدعوم في الوثائق) ، وكثافة polyhedron ، ونقاط الحساب التي يتم الحصول عليها حيث يتم حساب موتر الجاذبية. علاوة على ذلك ، يجب على المرء تحديد اسم ملف إخراج .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 ، يرجى تنفيذ الأمر التالي في مجلد Routsory Root:
pytest
يسعدنا قبول المساهمات في المشروع في شكل اقتراحات وتقارير الأخطاء وطلبات السحب. يرجى إلقاء نظرة على الإرشادات المساهمة لمزيد من المعلومات.