File indexing completed on 2025-01-18 09:11:25
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "Acts/Material/detail/AverageMaterials.hpp"
0010
0011 #include "Acts/Material/Material.hpp"
0012
0013 #include <cmath>
0014
0015 Acts::MaterialSlab Acts::detail::combineSlabs(const MaterialSlab& slab1,
0016 const MaterialSlab& slab2) {
0017 const auto& mat1 = slab1.material();
0018 const auto& mat2 = slab2.material();
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032 const double thickness1 = static_cast<double>(slab1.thickness());
0033 const double thickness2 = static_cast<double>(slab2.thickness());
0034
0035
0036 const double thickness = thickness1 + thickness2;
0037
0038
0039
0040 if (mat1 == mat2) {
0041 return {mat1, static_cast<float>(thickness)};
0042 }
0043
0044
0045 const double molarDensity1 = static_cast<double>(mat1.molarDensity());
0046 const double molarDensity2 = static_cast<double>(mat2.molarDensity());
0047
0048 const double molarAmount1 = molarDensity1 * thickness1;
0049 const double molarAmount2 = molarDensity2 * thickness2;
0050 const double molarAmount = molarAmount1 + molarAmount2;
0051
0052
0053 if (!(0.0 < molarAmount)) {
0054 return {Material(), static_cast<float>(thickness)};
0055 }
0056
0057
0058 const double thicknessX01 = static_cast<double>(slab1.thicknessInX0());
0059 const double thicknessX02 = static_cast<double>(slab2.thicknessInX0());
0060 const double thicknessL01 = static_cast<double>(slab1.thicknessInL0());
0061 const double thicknessL02 = static_cast<double>(slab2.thicknessInL0());
0062
0063 const double thicknessInX0 = thicknessX01 + thicknessX02;
0064 const double thicknessInL0 = thicknessL01 + thicknessL02;
0065
0066 const float x0 = static_cast<float>(thickness / thicknessInX0);
0067 const float l0 = static_cast<float>(thickness / thicknessInL0);
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086 const double ar1 = static_cast<double>(mat1.Ar());
0087 const double ar2 = static_cast<double>(mat2.Ar());
0088
0089 const double molarWeight1 = molarAmount1 / molarAmount;
0090 const double molarWeight2 = molarAmount2 / molarAmount;
0091 const float ar = static_cast<float>(molarWeight1 * ar1 + molarWeight2 * ar2);
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106 const double z1 = static_cast<double>(mat1.Z());
0107 const double z2 = static_cast<double>(mat2.Z());
0108
0109 const double thicknessWeight1 = thickness1 / thickness;
0110 const double thicknessWeight2 = thickness2 / thickness;
0111 float z = 0.f;
0112 if (z1 > 0. && z2 > 0.) {
0113 z = static_cast<float>(std::exp(thicknessWeight1 * std::log(z1) +
0114 thicknessWeight2 * std::log(z2)));
0115 } else {
0116 z = static_cast<float>(thicknessWeight1 * z1 + thicknessWeight2 * z2);
0117 }
0118
0119
0120
0121 const float molarDensity = static_cast<float>(molarAmount / thickness);
0122
0123 return {Material::fromMolarDensity(x0, l0, ar, z, molarDensity),
0124 static_cast<float>(thickness)};
0125 }