IAP GITLAB

Skip to content
Snippets Groups Projects
Commit 48e18eae authored by Philipp Windischhofer's avatar Philipp Windischhofer
Browse files

test pattern for environment dump

parent fb6257c1
No related branches found
No related tags found
No related merge requests found
Pipeline #13471 passed with warnings
......@@ -8,6 +8,7 @@
#pragma once
#include <iostream>
#include <corsika/framework/core/PhysicalUnits.hpp>
#include <corsika/framework/geometry/Line.hpp>
#include <corsika/framework/geometry/Point.hpp>
......@@ -35,6 +36,10 @@ namespace corsika {
LengthType getArclengthFromGrammage(BaseTrajectory const&,
GrammageType grammage) const override;
void DescribeMassDensity(std::ostream& stream) const override {
stream << "mass_density = " << density_.magnitude() << std::endl;
}
private:
MassDensityType const density_;
NuclearComposition const nuclComp_;
......
......@@ -8,6 +8,8 @@
#pragma once
#include <iostream>
#include <corsika/framework/geometry/Point.hpp>
#include <corsika/framework/geometry/Vector.hpp>
#include <corsika/framework/core/PhysicalUnits.hpp>
......@@ -40,6 +42,13 @@ namespace corsika {
*/
virtual ~IMagneticFieldModel() = default; // LCOV_EXCL_LINE
virtual void DescribeMagneticField(std::ostream&) const { }; // = 0; // make pure-virtual once implemented everywhere
virtual void AddProperties(std::ostream& stream) const override {
Model::AddProperties(stream);
DescribeMagneticField(stream);
};
}; // END: class MagneticField
} // namespace corsika
......@@ -8,6 +8,7 @@
#pragma once
#include <iostream>
#include <corsika/media/NuclearComposition.hpp>
#include <corsika/framework/geometry/Point.hpp>
#include <corsika/framework/core/PhysicalUnits.hpp>
......@@ -44,6 +45,12 @@ namespace corsika {
GrammageType) const = 0;
virtual NuclearComposition const& getNuclearComposition() const = 0;
virtual void DescribeMassDensity(std::ostream&) const { }; // = 0; // make pure-virtual once implemented everywhere
virtual void AddProperties(std::ostream& stream) const {
DescribeMassDensity(stream);
};
};
} // namespace corsika
......@@ -8,6 +8,8 @@
#pragma once
#include <iostream>
#include <corsika/media/MediumProperties.hpp>
#include <corsika/framework/geometry/Point.hpp>
......@@ -37,6 +39,13 @@ namespace corsika {
*/
virtual ~IMediumPropertyModel() = default;
virtual void DescribeMedium(std::ostream&) const { }; // = 0; // make pure-virtual once implemented everywhere
virtual void AddProperties(std::ostream& stream) const override {
TModel::AddProperties(stream);
DescribeMedium(stream);
};
}; // END: class IMediumTypeModel
} // namespace corsika
......@@ -8,6 +8,7 @@
#pragma once
#include <iostream>
#include <corsika/framework/geometry/Point.hpp>
namespace corsika {
......@@ -35,6 +36,13 @@ namespace corsika {
*/
virtual ~IRefractiveIndexModel() = default;
virtual void DescribeRefractiveIndex(std::ostream&) const { }; // = 0; // make pure-virtual once implemented everywhere
virtual void AddProperties(std::ostream& stream) const override {
TModel::AddProperties(stream);
DescribeRefractiveIndex(stream);
};
}; // END: class IRefractiveIndexModel
} // namespace corsika
......@@ -8,6 +8,7 @@
#pragma once
#include <iostream>
#include <corsika/media/IMediumPropertyModel.hpp>
namespace corsika {
......@@ -45,6 +46,10 @@ namespace corsika {
*/
void setMedium(Medium const medium);
void DescribeMedium(std::ostream& stream) const override {
stream << "A MediumPropertyModel with some attributes " << std::endl;
};
}; // END: class MediumPropertyModel
} // namespace corsika
......
......@@ -8,6 +8,7 @@
#pragma once
#include <iostream>
#include <corsika/media/IMagneticFieldModel.hpp>
#include <corsika/framework/geometry/Vector.hpp>
#include <corsika/framework/geometry/PhysicalGeometry.hpp>
......@@ -55,6 +56,10 @@ namespace corsika {
*/
void setMagneticField(MagneticFieldVector const& Bfield) { B_ = Bfield; }
void DescribeMagneticField(std::ostream& stream) const override {
stream << "B-field = " << B_.getNorm().magnitude() << std::endl;
}
private:
MagneticFieldVector B_; ///< The constant magnetic field we use.
......
......@@ -8,6 +8,7 @@
#pragma once
#include <iostream>
#include <corsika/media/IRefractiveIndexModel.hpp>
namespace corsika {
......@@ -51,6 +52,10 @@ namespace corsika {
*/
void setRefractiveIndex(double const n);
void DescribeRefractiveIndex(std::ostream& stream) const override {
stream << "IOR = " << n_ << std::endl;
}
}; // END: class RefractiveIndex
} // namespace corsika
......
......@@ -18,3 +18,6 @@ target_compile_definitions (
PRIVATE
REFDATADIR="${CMAKE_CURRENT_SOURCE_DIR}"
)
add_executable (testEnvironmentDump testEnvironmentDump.cpp)
target_link_libraries (testEnvironmentDump CORSIKA8)
#include <corsika/framework/geometry/SeparationPlane.hpp>
#include <corsika/media/Environment.hpp>
#include <corsika/media/HomogeneousMedium.hpp>
#include <corsika/media/IMagneticFieldModel.hpp>
#include <corsika/media/MediumPropertyModel.hpp>
#include <corsika/media/NuclearComposition.hpp>
#include <corsika/media/ShowerAxis.hpp>
#include <corsika/media/UniformMagneticField.hpp>
#include <corsika/media/UniformRefractiveIndex.hpp>
using namespace corsika;
using namespace std;
using EnvironmentInterface =
IRefractiveIndexModel<IMediumPropertyModel<IMagneticFieldModel<IMediumModel>>>;
using EnvType = Environment<EnvironmentInterface>;
int main(int argc, char** argv) {
EnvType env;
CoordinateSystemPtr const& rootCS = env.getCoordinateSystem();
Point const surfaceCenter{rootCS, 0_m, 0_m, 0_m};
auto iceBlock = EnvType::createNode<SeparationPlane>(
Plane(surfaceCenter, DirectionVector(rootCS, {0, 0, 1})));
auto airBlock = EnvType::createNode<SeparationPlane>(
Plane(surfaceCenter, DirectionVector(rootCS, {0, 0, -1})));
// see https://www.ngdc.noaa.gov/geomag/calculators/magcalc.shtml#igrfwmm
// for 90 deg south, 1.95km alt.
MagneticFieldVector const southPoleBField(rootCS, -8.734_uT, 14.357_uT, 51.694_uT);
// Creating the universe where all mediums exist.
using NodeT = VolumeTreeNode<EnvironmentInterface>;
NodeT* const universe = env.getUniverse().get();
// Ice properties
NuclearComposition const nuclearCompositionIce{{Code::Hydrogen, Code::Oxygen},
{2.0 / 3.0, 1.0 / 3.0}};
MassDensityType const iceDensity = 0.919_g / (1_cm * 1_cm * 1_cm);
double const iceRefractiveIndex = 1.42;
auto const mediumIce = std::make_shared<UniformRefractiveIndex<MediumPropertyModel<
UniformMagneticField<HomogeneousMedium<EnvironmentInterface>>>>>(
iceRefractiveIndex, Medium::WaterIce, southPoleBField, iceDensity,
nuclearCompositionIce);
iceBlock->setModelProperties(mediumIce);
universe->addChild(std::move(iceBlock));
// Air properties
// TODO: The following is just a guess, need to use actual air
NuclearComposition const nuclearCompositionAir{{Code::Nitrogen, Code::Oxygen},
{3.0 / 4.0, 1.0 / 4.0}};
MassDensityType const airDensity = 1.2e-3_g / (1_cm * 1_cm * 1_cm);
double const airRefractiveIndex = 1.00001;
auto const mediumAir = std::make_shared<UniformRefractiveIndex<MediumPropertyModel<
UniformMagneticField<HomogeneousMedium<EnvironmentInterface>>>>>(
airRefractiveIndex, Medium::AirDry1Atm, southPoleBField, airDensity,
nuclearCompositionAir);
airBlock->setModelProperties(mediumAir);
universe->addChild(std::move(airBlock));
auto dumper = [](const NodeT& node){
const EnvironmentInterface* props = &node.getModelProperties();
if(props != nullptr) {
std::cout << "------" << std::endl;
props -> AddProperties(std::cout);
std::cout << "------" << std::endl;
}
};
universe->walk(dumper);
// Output:
// ------
// mass_density = 919
// B-field = 5.43569e-05
// A MediumPropertyModel with some attributes
// IOR = 1.42
// ------
// ------
// mass_density = 1.2
// B-field = 5.43569e-05
// A MediumPropertyModel with some attributes
// IOR = 1.00001
// ------
std::cout << "done" << std::endl;
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment