Skip to content

Commit

Permalink
Merge pull request #125 from tudat-team/feature/radiation_pressure_mo…
Browse files Browse the repository at this point in the history
…delling

Feature/radiation pressure modelling
  • Loading branch information
DominicDirkx authored Nov 1, 2023
2 parents b417690 + f3815dd commit 4b54651
Show file tree
Hide file tree
Showing 7 changed files with 431 additions and 30 deletions.
1 change: 1 addition & 0 deletions tudatpy/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ YACMA_PYTHON_MODULE(kernel
kernel/expose_numerical_simulation/expose_environment_setup/expose_shape_setup.cpp
kernel/expose_numerical_simulation/expose_environment_setup/expose_ground_station_setup.cpp
kernel/expose_numerical_simulation/expose_environment_setup/expose_rigid_body_setup.cpp
kernel/expose_numerical_simulation/expose_environment_setup/expose_vehicle_systems_setup.cpp


kernel/expose_numerical_simulation/expose_propagation_setup.cpp
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "expose_environment_setup/expose_shape_setup.h"
#include "expose_environment_setup/expose_shape_deformation_setup.h"
#include "expose_environment_setup/expose_rigid_body_setup.h"
#include "expose_environment_setup/expose_vehicle_systems_setup.h"

#include "tudatpy/docstrings.h"
#include "tudatpy/scalarTypes.h"
Expand Down Expand Up @@ -67,12 +68,15 @@ namespace environment_setup {
.def_readwrite("gravity_field_settings", &tss::BodySettings::gravityFieldSettings, get_docstring("BodySettings.gravity_field_settings").c_str())
.def_readwrite("rotation_model_settings", &tss::BodySettings::rotationModelSettings, get_docstring("BodySettings.rotation_model_settings").c_str())
.def_readwrite("shape_settings", &tss::BodySettings::shapeModelSettings, get_docstring("BodySettings.shape_settings").c_str())
.def_readwrite("radiation_pressure_settings", &tss::BodySettings::radiationPressureSettings, get_docstring("BodySettings.radiation_pressure_settings").c_str())
.def_readwrite("aerodynamic_coefficient_settings", &tss::BodySettings::aerodynamicCoefficientSettings, get_docstring("BodySettings.aerodynamic_coefficient_settings").c_str())
.def_readwrite("gravity_field_variation_settings", &tss::BodySettings::gravityFieldVariationSettings, get_docstring("BodySettings.gravity_field_variation_settings").c_str())
.def_readwrite("shape_deformation_settings", &tss::BodySettings::bodyDeformationSettings, get_docstring("BodySettings.shape_deformation_settings").c_str())
.def_readwrite("ground_station_settings", &tss::BodySettings::groundStationSettings, get_docstring("BodySettings.ground_station_settings").c_str())
.def_readwrite("rigid_body_settings", &tss::BodySettings::rigidBodyPropertiesSettings, get_docstring("BodySettings.rigidBodyPropertiesSettings").c_str());
.def_readwrite("rigid_body_settings", &tss::BodySettings::rigidBodyPropertiesSettings, get_docstring("BodySettings.rigidBodyPropertiesSettings").c_str())
.def_readwrite("radiation_pressure_target_settings", &tss::BodySettings::radiationPressureTargetModelSettings, get_docstring("BodySettings.rigidBodyPropertiesSettings").c_str())
.def_readwrite("radiation_source_settings", &tss::BodySettings::radiationSourceModelSettings, get_docstring("BodySettings.rigidBodyPropertiesSettings").c_str())
.def_readwrite("vehicle_shape_settings", &tss::BodySettings::bodyExteriorPanelSettings_, get_docstring("BodySettings.vehicle_shape_settings").c_str())
.def_readwrite("radiation_pressure_settings", &tss::BodySettings::radiationPressureSettings, get_docstring("BodySettings.radiation_pressure_settings").c_str());


py::class_<tss::BodyListSettings,
Expand Down Expand Up @@ -200,6 +204,12 @@ namespace environment_setup {
py::arg("bodies"), py::arg("body_name"), py::arg("radiation_pressure_settings"),
get_docstring("add_radiation_pressure_interface").c_str());


m.def("add_radiation_pressure_target_model",
&tss::addRadiationPressureTargetModel,
py::arg("bodies"), py::arg("body_name"), py::arg("radiation_pressure_target_settings"),
get_docstring("add_radiation_pressure_interface").c_str());

m.def("add_rotation_model",
&tss::addRotationModel,
py::arg("bodies"), py::arg("body_name"), py::arg("rotation_model_settings"),
Expand Down Expand Up @@ -304,6 +314,10 @@ namespace environment_setup {
auto rigid_body_setup = m.def_submodule("rigid_body");
rigid_body::expose_rigid_body_setup(rigid_body_setup);

auto vehicle_systems_setup = m.def_submodule("vehicle_systems");
vehicle_systems::expose_vehicle_systems_setup(vehicle_systems_setup);


// auto system_model_setup = m.def_submodule("system_models");
// gravity_field_variation::expose_system_model_setup(system_model_setup);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,12 @@ namespace radiation_pressure {
.value("cannonball_radiation_pressure_interface",
tss::RadiationPressureType::cannon_ball_radiation_pressure_interface,
get_docstring("RadiationPressureType.cannonball_radiation_pressure_interface").c_str())
.value("panelled_radiation_pressure_interface",
tss::RadiationPressureType::panelled_radiation_pressure_interface,
get_docstring("RadiationPressureType.panelled_radiation_pressure_interface").c_str())
.value("solar_sailing_radiation_pressure_interface",
tss::RadiationPressureType::solar_sailing_radiation_pressure_interface,
get_docstring("RadiationPressureType.solar_sailing_radiation_pressure_interface").c_str())
// .value("panelled_radiation_pressure_interface",
// tss::RadiationPressureType::panelled_radiation_pressure_interface,
// get_docstring("RadiationPressureType.panelled_radiation_pressure_interface").c_str())
// .value("solar_sailing_radiation_pressure_interface",
// tss::RadiationPressureType::solar_sailing_radiation_pressure_interface,
// get_docstring("RadiationPressureType.solar_sailing_radiation_pressure_interface").c_str())
.export_values();


Expand Down Expand Up @@ -80,17 +80,264 @@ namespace radiation_pressure {
get_docstring("cannonball").c_str()
);

m.def("panelled",
&tss::panelledRadiationPressureInterfaceSettings,
py::arg("source_body"),
py::arg("emissivities"),
py::arg("areas"),
py::arg("diffusion_coefficients"),
py::arg("surface_normals_in_body_fixed_frame"),
py::arg("occulting_bodies") = std::vector<std::string>(),
get_docstring("panelled").c_str()
// m.def("panelled",
// &tss::panelledRadiationPressureInterfaceSettings,
// py::arg("source_body"),
// py::arg("emissivities"),
// py::arg("areas"),
// py::arg("diffusion_coefficients"),
// py::arg("surface_normals_in_body_fixed_frame"),
// py::arg("occulting_bodies") = std::vector<std::string>(),
// get_docstring("panelled").c_str()
// );


///////////////////////////////////////////////////////////
/////////// ENUMS
///////////////////////////////////////////////////////////

py::enum_<tss::KnockeTypeSurfacePropertyDistributionModel>(m, "KnockeTypeSurfacePropertyDistributionModel")
.value("custom", tss::KnockeTypeSurfacePropertyDistributionModel::custom)
.value("albedo_knocke", tss::KnockeTypeSurfacePropertyDistributionModel::albedo_knocke)
.value("emissivity_knocke", tss::KnockeTypeSurfacePropertyDistributionModel::emissivity_knocke)
.export_values();

py::enum_<tss::SphericalHarmonicsSurfacePropertyDistributionModel>(m, "SphericalHarmonicsSurfacePropertyDistributionModel")
.value("albedo_dlam1", tss::SphericalHarmonicsSurfacePropertyDistributionModel::albedo_dlam1)
.export_values();

enum class SphericalHarmonicsSurfacePropertyDistributionModel
{
custom,
albedo_dlam1 /**< DLAM-1 lunar albedo model: Floberghagen, R. et al. "Lunar Albedo Force Modeling and its Effect on Low Lunar Orbit and Gravity Field Determination". ASR 23. 4(1999): 733-738. */
};

///////////////////////////////////////////////////////////
/////////// LUMINOSITY MODELS
///////////////////////////////////////////////////////////

py::class_<tss::LuminosityModelSettings,
std::shared_ptr<tss::LuminosityModelSettings>>(
m, "LuminosityModelSettings",
get_docstring("LuminosityModelSettings").c_str());

m.def("constant_luminosity",
&tss::constantLuminosityModelSettings,
py::arg("luminosity"),
get_docstring("constant_luminosity").c_str()
);

m.def("irradiance_based_constant_luminosity",
&tss::irradianceBasedLuminosityModelSettings,
py::arg("constant_irradiance"),
py::arg("reference_distance"),
get_docstring("irradiance_based_constant_luminosity").c_str()
);

m.def("time_variable_luminosity",
&tss::timeVariableLuminosityModelSettings,
py::arg("luminosity_function"),
get_docstring("time_variable_luminosity").c_str()
);

m.def("irradiance_based_time_variable_luminosity",
&tss::timeVariableIrradianceBasedLuminosityModelSettings,
py::arg("irradiance_function"),
py::arg("reference_distance"),
get_docstring("irradiance_based_time_variable_luminosity").c_str()
);


///////////////////////////////////////////////////////////
/////////// SURFACE PROPERTY MODELS
///////////////////////////////////////////////////////////


py::class_<tss::SurfacePropertyDistributionSettings,
std::shared_ptr<tss::SurfacePropertyDistributionSettings>>(
m, "SurfacePropertyDistributionSettings",
get_docstring("SurfacePropertyDistributionSettings").c_str());


m.def("constant_surface_property_distribution",
&tss::constantSurfacePropertyDistributionSettings,
py::arg("constant_value"),
get_docstring("constant_surface_property_distribution").c_str()
);

m.def("spherical_harmonic_surface_property_distribution",
py::overload_cast< const Eigen::MatrixXd&, const Eigen::MatrixXd& >(
&tss::sphericalHarmonicsSurfacePropertyDistributionSettings ),
py::arg("cosine_coefficients"),
py::arg("sine_coefficients"),
get_docstring("spherical_harmonic_surface_property_distribution").c_str()
);

m.def("predefined_spherical_harmonic_surface_property_distribution",
py::overload_cast< tss::SphericalHarmonicsSurfacePropertyDistributionModel >(
&tss::sphericalHarmonicsSurfacePropertyDistributionSettings ),
py::arg("predefined_model"),
get_docstring("predefined_spherical_harmonic_surface_property_distribution").c_str()
);


m.def("knocke_type_surface_property_distribution",
&tss::manualSecondDegreeZonalPeriodicSurfacePropertyDistributionSettings,
py::arg("constant_contribution"),
py::arg("constant_degree_one_contribution"),
py::arg("cosine_periodic_degree_one_contribution"),
py::arg("sine_periodic_degree_one_contribution"),
py::arg("constant_degree_two_contribution"),
py::arg("reference_epoch"),
py::arg("period"),
get_docstring("knocke_type_surface_property_distribution").c_str()
);


m.def("predefined_knocke_type_surface_property_distribution",
py::overload_cast< tss::KnockeTypeSurfacePropertyDistributionModel >(
&tss::secondDegreeZonalPeriodicSurfacePropertyDistributionSettings ),
py::arg("predefined_model"),
get_docstring("predefined_knocke_type_surface_property_distribution").c_str()
);

m.def("custom_surface_property_distribution",
&tss::customSurfacePropertyDistributionSettings,
py::arg("custom_function"),
get_docstring("custom_surface_property_distribution").c_str()
);




///////////////////////////////////////////////////////////
/////////// PANEL RADIOSITY MODELS
///////////////////////////////////////////////////////////


py::class_<tss::PanelRadiosityModelSettings,
std::shared_ptr<tss::PanelRadiosityModelSettings>>(
m, "PanelRadiosityModelSettings",
get_docstring("PanelRadiosityModelSettings").c_str());

m.def("constant_radiosity",
&tss::constantPanelRadiosityModelSettings,
py::arg("radiosity"),
get_docstring("constant_radiosity").c_str()
);

m.def("constant_albedo_surface_radiosity",
py::overload_cast< double, const std::string& >( &tss::albedoPanelRadiosityModelSettings ),
py::arg("constant_albedo"),
py::arg("original_source_name"),
get_docstring("constant_albedo_surface_radiosity").c_str()
);

m.def("variable_albedo_surface_radiosity",
&tss::albedoPanelRadiosityModelSettingsGeneric,
py::arg("albedo_distribution_settings"),
py::arg("original_source_name"),
get_docstring("variable_albedo_surface_radiosity").c_str()
);

m.def("thermal_emission_blackbody_constant_emissivity",
py::overload_cast< double, const std::string& >( &tss::delayedThermalPanelRadiosityModelSettings ),
py::arg("constant_emissivity"),
py::arg("original_source_name"),
get_docstring("thermal_emission_blackbody_constant_emissivity").c_str()
);

m.def("thermal_emission_blackbody_variable_emissivity",
&tss::delayedThermalPanelRadiosityModelSettingsGeneric,
py::arg("emissivity_distribution_model"),
py::arg("original_source_name"),
get_docstring("thermal_emission_blackbody_variable_emissivity").c_str()
);

m.def("thermal_emission_angle_based_radiosity",
&tss::angleBasedThermalPanelRadiosityModelSettings,
py::arg("minimum_temperature"),
py::arg("maximum_temperature"),
py::arg("constant_emissivity"),
py::arg("original_source_name"),
get_docstring("thermal_emission_angle_based_radiosity").c_str()
);


///////////////////////////////////////////////////////////
/////////// PANEL REFLECTION MODELS
///////////////////////////////////////////////////////////

py::class_<tss::BodyPanelReflectionLawSettings,
std::shared_ptr<tss::BodyPanelReflectionLawSettings>>(
m, "BodyPanelReflectionLawSettings",
get_docstring("BodyPanelReflectionLawSettings").c_str());


m.def("specular_diffuse_body_panel_reflection",
&tss::specularDiffuseBodyPanelReflectionLawSettings,
py::arg("specular_reflectivity"),
py::arg("diffuse_reflectivity"),
py::arg("with_instantaneous_reradiation"),
get_docstring("specular_diffuse_body_panel_reflection").c_str()
);

m.def("lambertian_body_panel_reflection",
&tss::lambertainBodyPanelReflectionLawSettings,
py::arg("reflectivity"),
get_docstring("lambertian_body_panel_reflection").c_str()
);

///////////////////////////////////////////////////////////
/////////// RADIATION SOURCE MODELS
///////////////////////////////////////////////////////////


py::class_<tss::RadiationSourceModelSettings,
std::shared_ptr<tss::RadiationSourceModelSettings>>(
m, "RadiationSourceModelSettings",
get_docstring("RadiationSourceModelSettings").c_str());



m.def("isotropic_radiation_source",
&tss::isotropicPointRadiationSourceModelSettings,
py::arg("luminosity_model"),
get_docstring("isotropic_radiation_source").c_str()
);

m.def("panelled_extended_radiation_source",
&tss::extendedRadiationSourceModelSettingsWithOccultationMap,
py::arg("panel_radiosity_settings"),
py::arg("number_of_panels_per_ring"),
py::arg("original_source_occulting_bodies" ) = std::map<std::string, std::vector<std::string>>(),
get_docstring("panelled_extended_radiation_source").c_str()
);


///////////////////////////////////////////////////////////
/////////// RADIATION TARGET MODELS
///////////////////////////////////////////////////////////

py::class_<tss::RadiationPressureTargetModelSettings,
std::shared_ptr<tss::RadiationPressureTargetModelSettings>>(
m, "RadiationPressureTargetModelSettings",
get_docstring("RadiationPressureTargetModelSettings").c_str());


m.def("cannonball_radiation_target",
&tss::cannonballRadiationPressureTargetModelSettingsWithOccultationMap,
py::arg("reference_area"),
py::arg("radiation_pressure_coefficient"),
py::arg("per_source_occulting_bodies") = std::map<std::string, std::vector<std::string>>( ),
get_docstring("cannonball_radiation_target").c_str()
);

m.def("panelled_radiation_target",
&tss::paneledRadiationPressureTargetModelSettingsWithOccultationMap,
get_docstring("panelled_radiation_target").c_str()
);

}

}// namespace radiation_pressure
Expand Down
Loading

0 comments on commit 4b54651

Please sign in to comment.