739 개의 정점과 1474 개의 얼굴이있는 (433)의 메시
이 코드는 Tsoulis et al.에 의한 다면체 중력 모델의 C ++ 17에서 검증 된 구현입니다. 처음에는 TU Munich와 ESA의 Advanced Concepts 팀 간의 협력 프로젝트에서 만들어졌습니다.
이 구현이 귀하에게 유용한 경우, Journal of Open Source Software 에 발표 된 첨부 된 논문을 인용하십시오.
구현은 종자 적분을 사용하여 균질 한 임의로 형성 된 다면체 소스의 전체 중력 텐서의 분석 계산을 기반으로합니다. 지구 물리학, 77 (2), pp.f1-f11. Fortran에서 해당 구현.
보충 세부 사항은 최근의 논문 Tsoulis, Dimitrios에서 찾을 수 있습니다. Gavriilidou, 조지아. 다면체 중력 신호의 라인 적분 분석 제형의 계산 검토. 지구 물리학 적 전망, 2021, 69. Jg., nr. 8-9, S. 1745-1760. 그리고 MATLAB에서 해당 구현은 Fortran의 이전 구현을 기반으로합니다.
메모
이 프로젝트의 GitHub 페이지에는 C ++ 라이브러리 및 Python 인터페이스의 전체 광범위한 문서와 중력 모델 및 고급 설정에 대한 배경이 포함되어 있습니다.
다면체 중력 모델의 평가에는 다음 매개 변수가 필요합니다.
이름 |
---|
다면체 메쉬 (정점 및 얼굴 또는 다면체 소스 파일) |
일정한 밀도 |
메쉬와 상수 밀도 단위가 일치해야합니다. 지원되는 메쉬 파일을 볼 수 있도록 문서를 살펴보십시오.
계산은 모든 계산 지점 p 에 대해 다음 매개 변수를 출력합니다. 각 출력의 단위는 입력 매개 변수의 단위 (메쉬 및 밀도)에 따라 다릅니다! 따라서 메쉬가 들어간 경우
이름 | 유닛 (메쉬 인 경우 | 논평 |
---|---|---|
잠재력 또는 특정 에너지라고도합니다 | ||
세 가지 직교 방향으로 중력 accerleration | ||
중력 감정의 공간 변화 속도 |
메모
이 중력 모델의 출력은 지오 디시 및 지구 물리학 부호 규칙에 순종합니다. 따라서 잠재력
다음 예제는 파이썬 인터페이스를 사용하여 큐브 주위의 중력을 계산하는 방법을 보여줍니다.
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
클래스를 사용하는 것입니다. 다중 평가를 위해 재사용 할 수있는 내부 데이터 구조 및 속성을 캐시합니다. 이것은 여러 계산 지점에 대한 중력을 계산하려는 경우 특히 유용하지만 "미래 포인트"를 미리 알지 못합니다.
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
)
팁
더 많은 예와 음모가 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 ++ 실행 파일의 주요 방법을 살펴보십시오.
Python 인터페이스는 Conda와 함께 쉽게 설치할 수 있습니다.
conda install -c conda-forge polyhedral-gravity-model
두 번째 옵션으로 PIPI에서 PIP와 함께 Python 인터페이스를 설치할 수도 있습니다.
pip install polyhedral-gravity
가장 일반적인 플랫폼 용 바이너리는 Windows, Linux 및 MacOS를 포함하여 PYPI에서 사용할 수 있습니다. MacOS 및 Linux의 경우 x86_64
및 aarch64
용 바이너리가 제공됩니다. pip
소스 배포를 사용하는 경우 C ++ 17 기능 컴파일러와 CMAKE가 설치되어 있는지 확인하십시오.
이 프로젝트는 다음의 종속성을 사용하며 모두 CMAKE를 통해 자동으로 설정됩니다.
atan(..)
의 벡터화에 필요한 XSIMD (11.1.0 또는 호환)모듈은 C ++ 17 능력 컴파일러 인 CMAKE를 사용하여 빌드됩니다. 저장소 루트 폴더에서 다음 명령을 실행하십시오.
pip install .
빌드 옵션을 수정하려면 (병렬화와 같은) 다음 단락을 살펴 봅니다. pip install .
명령 : 예 :
export POLYHEDRAL_GRAVITY_PARALLELIZATION= " TBB "
pip install .
(선택 사항 : 더 빠른 빌드의 경우 로컬 파이썬 환경에서 시스템에 사용할 수있는 모든 종속성을 설치할 수 있습니다. 그렇게하면 Github에서 가져 오지 않을 것입니다.)
이 프로그램은 CMAKE를 사용하여 빌드됩니다. 따라서 먼저 CMAKE를 설치 한 다음 다음 단계를 따르십시오.
mkdir build
cd build
cmake .. < options >
cmake --build .
다음 옵션을 사용할 수 있습니다.
이름 (기본값) | 옵션 |
---|---|
polyhedral_gravity_parallelization ( CPP ) | CPP = 직렬 실행 / OMP 또는 TBB = OpenMP 또는 Intel의 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_parallelization = TBB
가장 성능이 좋았습니다. 또한 logging_level을 INFO=2
이외의 다른 것으로 변경하는 것이 좋습니다.
TBB
백엔드를 사용하는 권장 CMAKE 설정은 다음과 같습니다.
cmake .. -POLYHEDRAL_GRAVITY_PARALLELIZATION= " TBB "
빌드 후 중력 모델은 다음을 실행하여 실행할 수 있습니다.
./polyhedralGravity < YAML-Configuration-File >
YAML-Configuration-File에는 필요한 매개 변수가 포함됩니다. 구성 파일 및 다면체 소스 파일의 예는 폴더 /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 Test Suite의 경우 저장소 루트 폴더에서 다음 명령을 실행하십시오.
pytest
제안, 버그 보고서 및 요청 요청 형식으로 프로젝트에 대한 기여를 기꺼이 받아들이게되어 기쁩니다. 자세한 내용은 기고 가이드 라인을 살펴보십시오.