Skip to content

Commit a25f045

Browse files
author
Tracy Wadleigh
authored
Add GeographicLibWrapper-0.1.0 (#3590)
* Add GeographicLibWrapper-0.1.0 * Update dependency on GeographicLib_jll.
1 parent a6cb969 commit a25f045

File tree

3 files changed

+288
-0
lines changed

3 files changed

+288
-0
lines changed
+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# Note that this script can accept some limited command-line arguments, run
2+
# `julia build_tarballs.jl --help` to see a usage message.
3+
using BinaryBuilder, Pkg
4+
5+
name = "GeographicLibWrapper"
6+
version = v"0.1.0"
7+
8+
julia_version = v"1.6"
9+
10+
sources = [DirectorySource("./src")]
11+
12+
script = raw"""
13+
mkdir -p build
14+
cd build
15+
cmake \
16+
-DCMAKE_INSTALL_PREFIX=${prefix} \
17+
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TARGET_TOOLCHAIN} \
18+
-DCMAKE_FIND_ROOT_PATH=${prefix} \
19+
-DJulia_PREFIX=${prefix} \
20+
-DCMAKE_BUILD_TYPE=Release \
21+
..
22+
cmake --build . --config Release --target install -- -j${nproc}
23+
install_license /usr/share/licenses/MIT
24+
"""
25+
26+
include("../../L/libjulia/common.jl")
27+
platforms = expand_cxxstring_abis(libjulia_platforms(julia_version))
28+
29+
products = [LibraryProduct("libGeographicLibWrapper", :libGeographicLibWrapper)]
30+
31+
dependencies = [
32+
Dependency("GeographicLib_jll"),
33+
Dependency("libcxxwrap_julia_jll"),
34+
BuildDependency(PackageSpec(; name="libjulia_jll", version=julia_version)),
35+
]
36+
37+
build_tarballs(
38+
ARGS,
39+
name,
40+
version,
41+
sources,
42+
script,
43+
platforms,
44+
products,
45+
dependencies;
46+
preferred_gcc_version=v"7",
47+
)
+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
cmake_minimum_required(VERSION 3.14)
2+
cmake_policy(SET CMP0025 NEW)
3+
4+
project(GeographicLibWrapper)
5+
6+
set(CMAKE_CXX_STANDARD 14)
7+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
8+
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
9+
10+
find_package(JlCxx REQUIRED)
11+
get_target_property(JlCxx_location JlCxx::cxxwrap_julia LOCATION)
12+
get_filename_component(JlCxx_location ${JlCxx_location} DIRECTORY)
13+
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib;${JlCxx_location}")
14+
15+
message(STATUS "Found JlCxx at ${JlCxx_location}")
16+
17+
find_package(GeographicLib REQUIRED)
18+
19+
add_library(GeographicLibWrapper SHARED GeographicLibWrapper.cpp)
20+
21+
target_include_directories(GeographicLibWrapper PUBLIC
22+
"${Julia_INCLUDE_DIRS}"
23+
"${GeographicLib_INCLUDE_DIRS}")
24+
25+
target_link_libraries(GeographicLibWrapper
26+
JlCxx::cxxwrap_julia
27+
"${GeographicLib_LIBRARIES}")
28+
29+
install(TARGETS GeographicLibWrapper LIBRARY)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
#include "jlcxx/jlcxx.hpp"
2+
3+
#include <GeographicLib/Geocentric.hpp>
4+
#include <GeographicLib/Geoid.hpp>
5+
#include <GeographicLib/GravityCircle.hpp>
6+
#include <GeographicLib/GravityModel.hpp>
7+
#include <GeographicLib/MagneticCircle.hpp>
8+
#include <GeographicLib/MagneticModel.hpp>
9+
#include <GeographicLib/Math.hpp>
10+
#include <GeographicLib/NormalGravity.hpp>
11+
12+
using namespace GeographicLib;
13+
14+
JLCXX_MODULE define_julia_module(jlcxx::Module &mod) {
15+
typedef Math::real real;
16+
17+
mod.add_type<Geocentric>("Geocentric")
18+
.constructor<real, real>()
19+
.method("forward",
20+
[](const Geocentric &g, real lat, real lon, real h, real &X,
21+
real &Y, real &Z) { return g.Forward(lat, lon, h, X, Y, Z); })
22+
.method("forward",
23+
[](const Geocentric &g, real lat, real lon, real h, real &X,
24+
real &Y, real &Z, std::vector<real> &M) {
25+
return g.Forward(lat, lon, h, X, Y, Z, M);
26+
})
27+
.method("reverse",
28+
[](const Geocentric &g, real X, real Y, real Z, real &lat,
29+
real &lon,
30+
real &h) { return g.Reverse(X, Y, Z, lat, lon, h); })
31+
.method("reverse",
32+
[](const Geocentric &g, real X, real Y, real Z, real &lat,
33+
real &lon, real &h, std::vector<real> &M) {
34+
return g.Reverse(X, Y, Z, lat, lon, h, M);
35+
})
36+
.method("init", &Geocentric::Init)
37+
.method("equatorial_radius", &Geocentric::EquatorialRadius)
38+
.method("flattening", &Geocentric::Flattening)
39+
.method("wgs84_geocentric", &Geocentric::WGS84);
40+
41+
mod.add_bits<Geoid::convertflag>("ConvertFlag", jlcxx::julia_type("CppEnum"));
42+
mod.set_const("ELLIPSOIDTOGEOID", Geoid::ELLIPSOIDTOGEOID);
43+
mod.set_const("NONE", Geoid::NONE);
44+
mod.set_const("GEOIDTOELLIPSOID", Geoid::GEOIDTOELLIPSOID);
45+
46+
mod.add_type<Geoid>("Geoid")
47+
.constructor<const std::string &, const std::string &, bool, bool>()
48+
.method(&Geoid::operator())
49+
.method("cache_area", &Geoid::CacheArea)
50+
.method("cache_all", &Geoid::CacheAll)
51+
.method("cache_clear", &Geoid::CacheClear)
52+
.method("convert_height", &Geoid::ConvertHeight)
53+
.method("description", &Geoid::Description)
54+
.method("date_time", &Geoid::DateTime)
55+
.method("geoid_file", &Geoid::GeoidFile)
56+
.method("geoid_name", &Geoid::GeoidName)
57+
.method("geoid_directory", &Geoid::GeoidDirectory)
58+
.method("interpolation", &Geoid::Interpolation)
59+
.method("max_error", &Geoid::MaxError)
60+
.method("rms_error", &Geoid::RMSError)
61+
.method("offset", &Geoid::Offset)
62+
.method("scale", &Geoid::Scale)
63+
.method("thread_safe", &Geoid::ThreadSafe)
64+
.method("cache", &Geoid::Cache)
65+
.method("cache_west", &Geoid::CacheWest)
66+
.method("cache_east", &Geoid::CacheEast)
67+
.method("cache_north", &Geoid::CacheNorth)
68+
.method("cache_south", &Geoid::CacheSouth)
69+
.method("equatorial_radius", &Geoid::EquatorialRadius)
70+
.method("flattening", &Geoid::Flattening)
71+
.method("default_geoid_path", &Geoid::DefaultGeoidPath)
72+
.method("default_geoid_name", &Geoid::DefaultGeoidName);
73+
74+
mod.add_type<NormalGravity>("NormalGravity")
75+
.constructor<real, real, real, real, bool>()
76+
.method("surface_gravity", &NormalGravity::SurfaceGravity)
77+
.method("gravity", &NormalGravity::Gravity)
78+
.method("u", &NormalGravity::U)
79+
.method("v0", &NormalGravity::V0)
80+
.method("phi", &NormalGravity::Phi)
81+
.method("init", &NormalGravity::Init)
82+
.method("equatorial_radius", &NormalGravity::EquatorialRadius)
83+
.method("mass_constant", &NormalGravity::MassConstant)
84+
.method("dynamical_form_factor", &NormalGravity::DynamicalFormFactor)
85+
.method("angular_velocity", &NormalGravity::AngularVelocity)
86+
.method("flattening", &NormalGravity::Flattening)
87+
.method("equatorial_gravity", &NormalGravity::EquatorialGravity)
88+
.method("polar_gravity", &NormalGravity::PolarGravity)
89+
.method("gravity_flattening", &NormalGravity::GravityFlattening)
90+
.method("surface_potential", &NormalGravity::SurfacePotential)
91+
.method("earth", &NormalGravity::Earth)
92+
.method("wgs84_normal_gravity", &NormalGravity::WGS84)
93+
.method("grs80_normal_gravity", &NormalGravity::GRS80)
94+
.method("j2_to_flattening", &NormalGravity::J2ToFlattening)
95+
.method("flattening_to_j2", &NormalGravity::FlatteningToJ2);
96+
97+
mod.add_type<GravityCircle>("GravityCircle")
98+
.method("gravity", &GravityCircle::Gravity)
99+
.method("disturbance", &GravityCircle::Disturbance)
100+
.method("geoid_height", &GravityCircle::GeoidHeight)
101+
.method("spherical_anomaly", &GravityCircle::SphericalAnomaly)
102+
.method("w", [](const GravityCircle &g, real lon, real &gX, real &gY,
103+
real &gZ) { return g.W(lon, gX, gY, gZ); })
104+
.method("v", [](const GravityCircle &g, real lon, real &GX, real &GY,
105+
real &GZ) { return g.V(lon, GX, GY, GZ); })
106+
.method("t",
107+
[](const GravityCircle &g, real lon, real &deltaX, real &deltaY,
108+
real &deltaZ) { return g.T(lon, deltaX, deltaY, deltaZ); })
109+
.method("t", [](const GravityCircle &g, real lon) { return g.T(lon); })
110+
.method("init", &GravityCircle::Init)
111+
.method("equatorial_radius", &GravityCircle::EquatorialRadius)
112+
.method("flattening", &GravityCircle::Flattening)
113+
.method("latitude", &GravityCircle::Latitude)
114+
.method("height", &GravityCircle::Height)
115+
.method("capabilities",
116+
[](const GravityCircle &g) { return g.Capabilities(); })
117+
.method("capabilities", [](const GravityCircle &g, unsigned testcaps) {
118+
return g.Capabilities(testcaps);
119+
});
120+
121+
mod.add_type<GravityModel>("GravityModel")
122+
.constructor<const std::string &, const std::string &, int, int>()
123+
.method("gravity", &GravityModel::Gravity)
124+
.method("disturbance", &GravityModel::Disturbance)
125+
.method("geoid_height", &GravityModel::GeoidHeight)
126+
.method("spherical_anomaly", &GravityModel::SphericalAnomaly)
127+
.method("w", &GravityModel::W)
128+
.method("v", &GravityModel::V)
129+
.method("t",
130+
[](const GravityModel &g, real X, real Y, real Z, real &deltaX,
131+
real &deltaY,
132+
real &deltaZ) { return g.T(X, Y, Z, deltaX, deltaY, deltaZ); })
133+
.method("t", [](const GravityModel &g, real X, real Y,
134+
real Z) { return g.T(X, Y, Z); })
135+
.method("u", &GravityModel::U)
136+
.method("phi", &GravityModel::Phi)
137+
.method("circle", &GravityModel::Circle)
138+
.method("reference_ellipsoid", &GravityModel::ReferenceEllipsoid)
139+
.method("description", &GravityModel::Description)
140+
.method("date_time", &GravityModel::DateTime)
141+
.method("gravity_file", &GravityModel::GravityFile)
142+
.method("gravity_model_name", &GravityModel::GravityModelName)
143+
.method("gravity_model_directory", &GravityModel::GravityModelDirectory)
144+
.method("equatorial_radius", &GravityModel::EquatorialRadius)
145+
.method("mass_constant", &GravityModel::MassConstant)
146+
.method("reference_mass_constant", &GravityModel::ReferenceMassConstant)
147+
.method("angular_velocity", &GravityModel::AngularVelocity)
148+
.method("flattening", &GravityModel::Flattening)
149+
.method("degree", &GravityModel::Degree)
150+
.method("order", &GravityModel::Order)
151+
.method("default_gravity_path", &GravityModel::DefaultGravityPath)
152+
.method("default_gravity_name", &GravityModel::DefaultGravityName);
153+
154+
mod.add_type<MagneticCircle>("MagneticCircle")
155+
.method([](const MagneticCircle &m, real lon, real &Bx, real &By,
156+
real &Bz) { return m(lon, Bx, By, Bz); })
157+
.method([](const MagneticCircle &m, real lon, real &Bx, real &By,
158+
real &Bz, real &Bxt, real &Byt,
159+
real &Bzt) { return m(lon, Bx, By, Bz, Bxt, Byt, Bzt); })
160+
.method("field_geocentric",
161+
[](const MagneticCircle &m, real lon, real &BX, real &BY,
162+
real &BZ, real &BXt, real &BYt, real &BZt) {
163+
return m.FieldGeocentric(lon, BX, BY, BZ, BXt, BYt, BZt);
164+
})
165+
.method("init", &MagneticCircle::Init)
166+
.method("equatorial_radius", &MagneticCircle::EquatorialRadius)
167+
.method("flattening", &MagneticCircle::Flattening)
168+
.method("latitude", &MagneticCircle::Latitude)
169+
.method("height", &MagneticCircle::Height)
170+
.method("time", &MagneticCircle::Time);
171+
172+
mod.add_type<MagneticModel>("MagneticModel")
173+
.constructor<const std::string &, const std::string &, const Geocentric &,
174+
int, int>()
175+
.method([](const MagneticModel &m, real t, real lat, real lon, real h,
176+
real &Bx, real &By,
177+
real &Bz) { return m(t, lat, lon, h, Bx, By, Bz); })
178+
.method([](const MagneticModel &m, real t, real lat, real lon, real h,
179+
real &Bx, real &By, real &Bz, real &Bxt, real &Byt,
180+
real &Bzt) {
181+
return m(t, lat, lon, h, Bx, By, Bz, Bxt, Byt, Bzt);
182+
})
183+
.method("circle", &MagneticModel::Circle)
184+
.method("field_geocentric", &MagneticModel::FieldGeocentric)
185+
.method("field_components",
186+
[](const MagneticModel &m, real Bx, real By, real Bz, real &H,
187+
real &F, real &D,
188+
real &I) { return m.FieldComponents(Bx, By, Bz, H, F, D, I); })
189+
.method("field_components",
190+
[](const MagneticModel &m, real Bx, real By, real Bz, real Bxt,
191+
real Byt, real Bzt, real &H, real &F, real &D, real &I,
192+
real &Ht, real &Ft, real &Dt, real &It) {
193+
return m.FieldComponents(Bx, By, Bz, Bxt, Byt, Bzt, H, F, D, I,
194+
Ht, Ft, Dt, It);
195+
})
196+
.method("description", &MagneticModel::Description)
197+
.method("date_time", &MagneticModel::DateTime)
198+
.method("magnetic_file", &MagneticModel::MagneticFile)
199+
.method("magnetic_model_name", &MagneticModel::MagneticModelName)
200+
.method("magnetic_model_directory",
201+
&MagneticModel::MagneticModelDirectory)
202+
.method("min_height", &MagneticModel::MinHeight)
203+
.method("max_height", &MagneticModel::MaxHeight)
204+
.method("min_time", &MagneticModel::MinTime)
205+
.method("max_time", &MagneticModel::MaxTime)
206+
.method("equitorial_radius", &MagneticModel::EquatorialRadius)
207+
.method("flattening", &MagneticModel::Flattening)
208+
.method("degree", &MagneticModel::Degree)
209+
.method("order", &MagneticModel::Order)
210+
.method("default_magnetic_path", &MagneticModel::DefaultMagneticPath)
211+
.method("default_magnetic_name", &MagneticModel::DefaultMagneticName);
212+
}

0 commit comments

Comments
 (0)