Skip to content

Commit 6d4771f

Browse files
committed
Merge branch 'multilayer_merge'
1 parent 9919a36 commit 6d4771f

32 files changed

+1834
-428
lines changed

Intern/rayx-core/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ if(MSVC)
9090
set(MSVC_CXX_FLAGS /W3) # enable warning level 3
9191
list(APPEND MSVC_CXX_FLAGS /wd4251) # disable warnings related to missing DLL export annotation on members of exported classes
9292
list(APPEND MSVC_CXX_FLAGS /wd4267) # disable warnings related to narrowing conversion
93+
list(APPEND MSVC_CXX_FLAGS /wd221) # disable warnings related to narrowing conversion
9394
list(APPEND MSVC_CXX_FLAGS /Zc:preprocessor) # enable __VA_OPT__
9495
if(RAYX_WERROR)
9596
list(APPEND MSVC_CXX_FLAGS /WX) # handle warnings as errors

Intern/rayx-core/src/Design/DesignElement.cpp

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ void DesignElement::setExpertsCubic(Surface value) {
277277
m_elementParameters["expertsParams"]["B31"] = cub.m_b31;
278278
m_elementParameters["expertsParams"]["B32"] = cub.m_b32;
279279

280-
m_elementParameters["expertsParams"]["tangentAngleAlpha"] = cub.m_psi * 180 / PI;
280+
m_elementParameters["expertsParams"]["psi"] = cub.m_psi;
281281
}
282282

283283
Surface DesignElement::getExpertsCubic() const {
@@ -300,8 +300,7 @@ Surface DesignElement::getExpertsCubic() const {
300300
cub.m_b31 = m_elementParameters["expertsParams"]["B31"].as_double();
301301
cub.m_b32 = m_elementParameters["expertsParams"]["B32"].as_double();
302302

303-
cub.m_psi = m_elementParameters["expertsParams"]["tangentAngleAlpha"].as_double() * PI / 180;
304-
303+
cub.m_psi = m_elementParameters["expertsParams"]["psi"].as_double();
305304
return Surface::Cubic{cub};
306305
}
307306

@@ -510,4 +509,62 @@ double DesignElement::getRoughnessSubstrate() const { return m_elementParameters
510509
void DesignElement::setDesignPlane(DesignPlane value) { m_elementParameters["designPlane"] = value; }
511510
DesignPlane DesignElement::getDesignPlane() const { return m_elementParameters["designPlane"].as_designPlane(); }
512511

512+
void DesignElement::setSurfaceCoatingType(SurfaceCoatingType value) { m_elementParameters["surfaceCoatingType"] = value; }
513+
SurfaceCoatingType DesignElement::getSurfaceCoatingType() const { return m_elementParameters["surfaceCoatingType"].as_surfaceCoatingType(); }
514+
515+
516+
void DesignElement::setMultilayerCoating(const Coating::MultilayerCoating& coating) {
517+
m_elementParameters["numLayers"] = coating.numLayers;
518+
m_elementParameters["coating"] = Map();
519+
for (int i = 0; i < coating.numLayers; ++i) {
520+
m_elementParameters["coating"]["layer" + std::to_string(i + 1)] = Map();
521+
m_elementParameters["coating"]["layer" + std::to_string(i + 1)]["material"] = coating.material[i];
522+
m_elementParameters["coating"]["layer" + std::to_string(i + 1)]["thickness"] = coating.thickness[i];
523+
m_elementParameters["coating"]["layer" + std::to_string(i + 1)]["roughness"] = coating.roughness[i];
524+
}
525+
}
526+
527+
Coating DesignElement::getCoating() const { // 0 = substrate only, 1 = one coating, 2 = multiple coatings
528+
SurfaceCoatingType type = getSurfaceCoatingType();
529+
if (type == SurfaceCoatingType::SubstrateOnly) {
530+
return Coating::SubstrateOnly{};
531+
} else if (type == SurfaceCoatingType::OneCoating) {
532+
Coating::OneCoating oneCoating;
533+
oneCoating.material = static_cast<int>(getMaterialCoating());
534+
oneCoating.thickness = getThicknessCoating();
535+
oneCoating.roughness = getRoughnessCoating();
536+
return Coating::OneCoating{oneCoating};
537+
} else if (type == SurfaceCoatingType::MultipleCoatings) {
538+
Coating::MultilayerCoating mlCoating;
539+
mlCoating.numLayers = m_elementParameters["numLayers"].as_int();
540+
for (int i = 0; i < mlCoating.numLayers; ++i) {
541+
std::string layerKey = "layer" + std::to_string(i + 1);
542+
try {
543+
mlCoating.material[i] = m_elementParameters["coating"][layerKey]["material"].as_int();
544+
mlCoating.thickness[i] = m_elementParameters["coating"][layerKey]["thickness"].as_double();
545+
mlCoating.roughness[i] = m_elementParameters["coating"][layerKey]["roughness"].as_double();
546+
} catch (const std::exception& e) {
547+
std::cerr << "Error deserializing layer " << layerKey << ": " << e.what() << std::endl;
548+
}
549+
}
550+
if (0 > mlCoating.material[0] || mlCoating.material[0] > 97) {
551+
std::cerr << "Warning: No coating layers found in DesignElement." << std::endl;
552+
return Coating::SubstrateOnly{}; // Default case if no layers are found
553+
}
554+
return Coating::MultilayerCoating{mlCoating};
555+
} else {
556+
return Coating::SubstrateOnly{}; // Placeholder for multiple coatings, needs implementation
557+
}
558+
}
559+
560+
// material coating
561+
void DesignElement::setMaterialCoating(Material value) { m_elementParameters["materialCoating"] = value; }
562+
Material DesignElement::getMaterialCoating() const { return m_elementParameters["materialCoating"].as_material(); }
563+
564+
void DesignElement::setThicknessCoating(double value) { m_elementParameters["thicknessCoating"] = value; }
565+
double DesignElement::getThicknessCoating() const { return m_elementParameters["thicknessCoating"].as_double(); }
566+
567+
void DesignElement::setRoughnessCoating(double value) { m_elementParameters["roughnessCoating"] = value; }
568+
double DesignElement::getRoughnessCoating() const { return m_elementParameters["roughnessCoating"].as_double(); }
569+
513570
} // namespace RAYX

Intern/rayx-core/src/Design/DesignElement.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,5 +243,21 @@ struct RAYX_API DesignElement : public BeamlineNode {
243243

244244
void setDesignPlane(DesignPlane value);
245245
DesignPlane getDesignPlane() const;
246+
247+
void setSurfaceCoatingType(SurfaceCoatingType value);
248+
SurfaceCoatingType getSurfaceCoatingType() const;
249+
250+
void setMultilayerCoating(const Coating::MultilayerCoating& coating);
251+
252+
Coating getCoating() const;
253+
254+
void setMaterialCoating(Material value);
255+
Material getMaterialCoating() const;
256+
257+
void setThicknessCoating(double value);
258+
double getThicknessCoating() const;
259+
260+
void setRoughnessCoating(double value);
261+
double getRoughnessCoating() const;
246262
};
247263
} // namespace RAYX

Intern/rayx-core/src/Design/Value.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ ValueType DesignMap::type() const {
5353
ValueType::GratingMount,
5454
ValueType::CrystalType,
5555
ValueType::DesignPlane,
56+
ValueType::SurfaceCoatingType,
5657
};
5758
return types[m_variant.index()];
5859
}
@@ -197,6 +198,11 @@ DesignPlane DesignMap::as_designPlane() const {
197198
throw std::runtime_error("as_designPlane() called on non-designPlane!");
198199
}
199200

201+
SurfaceCoatingType DesignMap::as_surfaceCoatingType() const {
202+
if (auto* x = std::get_if<SurfaceCoatingType>(&m_variant)) return *x;
203+
throw std::runtime_error("as_surfaceCoatingType() called on non-surfaceCoatingType!");
204+
}
205+
200206
const DesignMap& DesignMap::operator[](const std::string& s) const {
201207
if (auto* m = std::get_if<Map>(&m_variant)) {
202208
auto it = m->find(s);

Intern/rayx-core/src/Design/Value.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ enum class ValueType {
4848
ElementType,
4949
GratingMount,
5050
CrystalType,
51-
DesignPlane
51+
DesignPlane,
52+
SurfaceCoatingType
5253
};
5354

5455
class Undefined {};
@@ -98,6 +99,7 @@ class RAYX_API DesignMap {
9899
DesignMap(GratingMount x) : m_variant(x) {}
99100
DesignMap(CrystalType x) : m_variant(x) {}
100101
DesignMap(DesignPlane x) : m_variant(x) {}
102+
DesignMap(SurfaceCoatingType x) : m_variant(x) {}
101103

102104
// Assignment operators
103105
void operator=(double x) { m_variant = x; }
@@ -129,6 +131,7 @@ class RAYX_API DesignMap {
129131
void operator=(ElementType x) { m_variant = x; }
130132
void operator=(CrystalType x) { m_variant = x; }
131133
void operator=(DesignPlane x) { m_variant = x; }
134+
void operator=(SurfaceCoatingType x) { m_variant = x; }
132135

133136
// Deep copy (clone) method.
134137
DesignMap clone() const;
@@ -164,6 +167,7 @@ class RAYX_API DesignMap {
164167
GratingMount as_gratingMount() const;
165168
CrystalType as_crystalType() const;
166169
DesignPlane as_designPlane() const;
170+
SurfaceCoatingType as_surfaceCoatingType() const;
167171

168172
// Subscript operators.
169173
const DesignMap& operator[](const std::string& s) const;
@@ -241,7 +245,7 @@ class RAYX_API DesignMap {
241245
std::variant<Undefined, double, int, ElectronEnergyOrientation, glm::dvec4, glm::dmat4x4, bool, EnergyDistributionType, Misalignment,
242246
CentralBeamstop, Cutout, CutoutType, EventType, CylinderDirection, FigureRotation, Map, Surface, CurvatureType, SourceDist,
243247
SpreadType, Rad, Material, EnergySpreadUnit, std::string, SigmaType, BehaviourType, ElementType, GratingMount, CrystalType,
244-
DesignPlane>
248+
DesignPlane, SurfaceCoatingType>
245249
m_variant;
246250
};
247251

Intern/rayx-core/src/Element/Behaviour.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ namespace RAYX {
1111
// Each behaviour type has its own `behave` function in `Behave.h`.
1212
enum class BehaveType { Mirror, Grating, Slit, RZP, ImagePlane, Crystal, Foil };
1313

14+
15+
1416
struct Behaviour {
1517
struct Mirror {
1618
// no parameters
@@ -73,6 +75,7 @@ struct Behaviour {
7375
Behaviour(T t) : m_behaviour(t) {}
7476

7577
template <typename T>
78+
RAYX_FN_ACC
7679
bool is() const {
7780
return variant::holds_alternative<T>(m_behaviour);
7881
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#pragma once
2+
3+
#include "Core.h"
4+
#include <vector>
5+
6+
namespace RAYX {
7+
8+
9+
enum class SurfaceCoatingType {
10+
SubstrateOnly, // No coating, only substrate
11+
OneCoating, // One coating layer
12+
MultipleCoatings // Multiple coating layers
13+
};
14+
15+
struct RAYX_API Coating{
16+
17+
struct RAYX_API SubstrateOnly {
18+
// No additional parameters needed
19+
};
20+
21+
struct RAYX_API OneCoating {
22+
int material;
23+
double thickness;
24+
double roughness;
25+
};
26+
27+
struct RAYX_API MultilayerCoating {
28+
int numLayers;
29+
int material[1000];
30+
double thickness[1000];
31+
double roughness[1000];
32+
};
33+
34+
variant::variant<SubstrateOnly, OneCoating, MultilayerCoating> m_coating;
35+
36+
Coating() : Coating(SubstrateOnly{}) {}
37+
38+
template<typename T>
39+
Coating(T t) : m_coating(t) {}
40+
41+
template <typename T>
42+
RAYX_FN_ACC
43+
bool is() const {
44+
return variant::holds_alternative<T>(m_coating);
45+
}
46+
};
47+
48+
} // namespace RAYX

Intern/rayx-core/src/Element/Element.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ OpticalElement makeElement(const DesignElement& dele, Behaviour behaviour, Surfa
6767
.m_behaviour = behaviour,
6868
.m_surface = surface,
6969
.m_cutout = *cutout,
70+
.m_coating = dele.getCoating(),
7071
.m_slopeError = dele.getSlopeError(),
7172
.m_azimuthalAngle = dele.getAzimuthalAngle().rad,
7273
.m_material = defaultMaterial(dele),

Intern/rayx-core/src/Element/Element.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "Behaviour.h"
99
#include "Core.h"
1010
#include "Cutout.h"
11+
#include "Coating.h"
1112
#include "Rml/xml.h"
1213
#include "Shader/SlopeError.h"
1314
#include "Surface.h"
@@ -52,13 +53,14 @@ struct OpticalElement {
5253
Behaviour m_behaviour; ///< Describes what happens to a ray once it collides with this OpticalElement.
5354
Surface m_surface; ///< Describes how the OpticalElement's surface is curved.
5455
Cutout m_cutout; ///< Limits the Surface to the dimensions of the actual OpticalElement.
56+
Coating m_coating; ///< Describes the coating of the surface, if any.
5557
SlopeError m_slopeError; ///< Describes a random noise in the normal vector of a particular surface point.
5658
double m_azimuthalAngle; ///< Azimuthal angle at which this element is rotated around the "main-beam".
5759
int m_material; ///< The material that this object is made of (see `enum class Material` from Material.h).
5860
};
5961

6062
// Ensure OpticalElement does not introduce cost on copy or default construction.
61-
static_assert(std::is_trivially_copyable_v<OpticalElement>);
63+
//static_assert(std::is_trivially_copyable_v<OpticalElement>);
6264

6365
RAYX_API glm::dmat4 calcTransformationMatrices(glm::dvec4 position, glm::dmat4 orientation, bool calcInMatrix, DesignPlane plane);
6466

Intern/rayx-core/src/Rml/DesignElementWriter.h

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,22 @@ namespace RAYX {
1818
* This only works in combi with the xml parser.
1919
*/
2020

21+
void getSurfaceCoating(xml::Parser parser, DesignElement* de) {
22+
if (parser.parseSurfaceCoatingType() == SurfaceCoatingType::SubstrateOnly) {
23+
de->setSurfaceCoatingType(parser.parseSurfaceCoatingType());
24+
return;
25+
} else if (parser.parseSurfaceCoatingType() == SurfaceCoatingType::OneCoating) {
26+
de->setSurfaceCoatingType(parser.parseSurfaceCoatingType());
27+
de->setMaterialCoating(parser.parseMaterial());
28+
de->setThicknessCoating(parser.parseThicknessCoating());
29+
de->setRoughnessCoating(parser.parseRoughnessCoating());
30+
} else if (parser.parseSurfaceCoatingType() == SurfaceCoatingType::MultipleCoatings) {
31+
de->setSurfaceCoatingType(parser.parseSurfaceCoatingType());
32+
de->setMultilayerCoating(parser.parseCoating());
33+
return;
34+
}
35+
}
36+
2137
void setAllMandatory(xml::Parser parser, DesignElement* de, DesignPlane dp) {
2238
de->setName(parser.name());
2339
de->setType(parser.type());
@@ -30,6 +46,7 @@ void setAllMandatory(xml::Parser parser, DesignElement* de, DesignPlane dp) {
3046
de->setAzimuthalAngle(parser.parseAzimuthalAngle());
3147
de->setMaterial(parser.parseMaterial());
3248

49+
de->setSurfaceCoatingType(SurfaceCoatingType::SubstrateOnly);
3350
de->setDesignPlane(dp);
3451
if (de->getType() != ElementType::ImagePlane) {
3552
de->setCutout(parser.parseCutout(dp, ElementStringMap[parser.type()]));
@@ -65,6 +82,8 @@ void getCone(xml::Parser parser, DesignElement* de) {
6582
de->setCurvatureType(CurvatureType::Cone);
6683
de->setBehaviourType(BehaviourType::Mirror);
6784

85+
getSurfaceCoating(parser, de);
86+
6887
de->setGrazingIncAngle(parser.parseGrazingIncAngle());
6988
de->setEntranceArmLength(parser.parseEntranceArmLength());
7089
de->setExitArmLength(parser.parseExitArmLength());
@@ -93,6 +112,8 @@ void getCylinder(xml::Parser parser, DesignElement* de) {
93112
de->setCurvatureType(CurvatureType::Cylinder);
94113
de->setBehaviourType(BehaviourType::Mirror);
95114

115+
getSurfaceCoating(parser, de);
116+
96117
de->setRadiusDirection(parser.parseBendingRadius());
97118
de->setRadius(parser.parseRadius());
98119
de->setGrazingIncAngle(parser.parseGrazingIncAngle());
@@ -105,6 +126,8 @@ void getEllipsoid(xml::Parser parser, DesignElement* de) {
105126
de->setCurvatureType(CurvatureType::Ellipsoid);
106127
de->setBehaviourType(BehaviourType::Mirror);
107128

129+
getSurfaceCoating(parser, de);
130+
108131
de->setShortHalfAxisB(parser.parseShortHalfAxisB());
109132
de->setLongHalfAxisA(parser.parseLongHalfAxisA());
110133
de->setDesignGrazingIncAngle(parser.parseDesignGrazingIncAngle());
@@ -120,6 +143,8 @@ void getParaboloid(xml::Parser parser, DesignElement* de) {
120143
de->setCurvatureType(CurvatureType::Paraboloid);
121144
de->setBehaviourType(BehaviourType::Mirror);
122145

146+
getSurfaceCoating(parser, de);
147+
123148
de->setArmLength(parser.parseArmLength());
124149
de->setParameterP(parser.parseParameterP());
125150
de->setParameterPType(parser.parseParameterPType());
@@ -157,13 +182,17 @@ void getPlaneMirror(xml::Parser parser, DesignElement* de) {
157182
setAllMandatory(parser, de, DesignPlane::XZ);
158183
de->setCurvatureType(CurvatureType::Plane);
159184
de->setBehaviourType(BehaviourType::Mirror);
185+
186+
getSurfaceCoating(parser, de);
160187
}
161188

162189
void getSphereMirror(xml::Parser parser, DesignElement* de) {
163190
setAllMandatory(parser, de, DesignPlane::XZ);
164191
de->setCurvatureType(CurvatureType::Spherical);
165192
de->setBehaviourType(BehaviourType::Mirror);
166193

194+
getSurfaceCoating(parser, de);
195+
167196
de->setGrazingIncAngle(parser.parseGrazingIncAngle());
168197
de->setEntranceArmLength(parser.parseEntranceArmLength());
169198
de->setExitArmLength(parser.parseExitArmLength());
@@ -175,14 +204,18 @@ void getToroidMirror(xml::Parser parser, DesignElement* de) {
175204
de->setCurvatureType(CurvatureType::Toroidal);
176205
de->setBehaviourType(BehaviourType::Mirror);
177206

207+
getSurfaceCoating(parser, de);
208+
178209
de->setShortRadius(parser.parseShortRadius());
179210
de->setLongRadius(parser.parseLongRadius());
180211
}
181212

182213
void getToroidalGrating(xml::Parser parser, DesignElement* de) {
183214
setAllMandatory(parser, de, DesignPlane::XZ);
184215
de->setCurvatureType(CurvatureType::Toroidal);
185-
de->setBehaviourType(BehaviourType::Mirror);
216+
de->setBehaviourType(BehaviourType::Grating);
217+
218+
getSurfaceCoating(parser, de);
186219

187220
de->setShortRadius(parser.parseShortRadius());
188221
de->setLongRadius(parser.parseLongRadius());
@@ -221,6 +254,8 @@ void getExpertsCubic(xml::Parser parser, DesignElement* de) {
221254
de->setCurvatureType(CurvatureType::Cubic);
222255
de->setBehaviourType(BehaviourType::Mirror);
223256

257+
getSurfaceCoating(parser, de);
258+
224259
de->setExpertsCubic(parser.parseCubicParameters());
225260
}
226261

@@ -229,6 +264,8 @@ void getExpertsOptics(xml::Parser parser, DesignElement* de) {
229264
de->setCurvatureType(CurvatureType::Quadric);
230265
de->setBehaviourType(BehaviourType::Mirror);
231266

267+
getSurfaceCoating(parser, de);
268+
232269
de->setExpertsOptics(parser.parseQuadricParameters());
233270
}
234271

0 commit comments

Comments
 (0)