OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
Material.h
Go to the documentation of this file.
1//
2// Class Material
3// Base class for representing materials
4//
5// Copyright (c) 2019 - 2021, Paul Scherrer Institut, Villigen PSI, Switzerland
6// All rights reserved
7//
8// This file is part of OPAL.
9//
10// OPAL is free software: you can redistribute it and/or modify
11// it under the terms of the GNU General Public License as published by
12// the Free Software Foundation, either version 3 of the License, or
13// (at your option) any later version.
14//
15// You should have received a copy of the GNU General Public License
16// along with OPAL. If not, see <https://www.gnu.org/licenses/>.
17//
18#ifndef MATERIAL_H
19#define MATERIAL_H
20
21#include <array>
22#include <cmath>
23#include <map>
24#include <memory>
25#include <string>
26
27namespace Physics {
28 class Material {
29 public:
30 enum FitCoeffs { A1 = 0, A2, A3, A4, A5, B1, B2, B3, B4, B5 };
31
33 double atomicNumber, double atomicMass, double massDensity, double radiationLength,
34 double meanExcitationEnergy, std::array<double, 10> fitCoefficients)
35 : atomicNumber_m(atomicNumber),
36 atomicMass_m(atomicMass),
37 massDensity_m(massDensity),
38 radiationLength_m(radiationLength / massDensity / 100),
39 meanExcitationEnergy_m(meanExcitationEnergy),
40 stoppingPowerFitCoefficients_m(fitCoefficients) {}
41
42 double getAtomicNumber() const; // [1]
43 double getAtomicMass() const; // [u]
44 double getMassDensity() const; // [g cm^-3]
45 double getRadiationLength() const; // [m]
46 double getMeanExcitationEnergy() const; // [eV]
48
49 static std::shared_ptr<Material> getMaterial(const std::string& name);
50 static std::shared_ptr<Material> addMaterial(
51 const std::string& name, std::shared_ptr<Material> mat_ptr);
52
53 private:
54 static std::map<std::string, std::shared_ptr<Material> > protoTable_sm;
55
56 const double atomicNumber_m;
57 const double atomicMass_m;
58 const double massDensity_m;
59 const double radiationLength_m;
61 const std::array<double, 10> stoppingPowerFitCoefficients_m;
62 };
63
64 inline double Material::getAtomicNumber() const { return atomicNumber_m; }
65
66 inline double Material::getAtomicMass() const { return atomicMass_m; }
67
68 inline double Material::getMassDensity() const { return massDensity_m; }
69
70 inline double Material::getRadiationLength() const { return radiationLength_m; }
71
73
77
78 // inline
79 // double Material::getMeanExcitationEnergy() const {
80 // double Z = getAtomicNumber();
81 // if (Z < 13.0)
82 // return 12 * Z + 7;
83
84 // return 9.76 * Z + 58.8 * std::pow(Z, -.19);
85 // }
86} // namespace Physics
87#endif
const double atomicNumber_m
Definition Material.h:56
Material(double atomicNumber, double atomicMass, double massDensity, double radiationLength, double meanExcitationEnergy, std::array< double, 10 > fitCoefficients)
Definition Material.h:32
double getAtomicMass() const
Definition Material.h:66
static std::shared_ptr< Material > addMaterial(const std::string &name, std::shared_ptr< Material > mat_ptr)
Definition Material.cpp:41
const double radiationLength_m
Definition Material.h:59
double getStoppingPowerFitCoefficients(FitCoeffs n) const
Definition Material.h:74
double getAtomicNumber() const
Definition Material.h:64
const double meanExcitationEnergy_m
Definition Material.h:60
double getRadiationLength() const
Definition Material.h:70
static std::map< std::string, std::shared_ptr< Material > > protoTable_sm
Definition Material.h:54
const double atomicMass_m
Definition Material.h:57
const double massDensity_m
Definition Material.h:58
static std::shared_ptr< Material > getMaterial(const std::string &name)
Definition Material.cpp:51
double getMassDensity() const
Definition Material.h:68
double getMeanExcitationEnergy() const
Definition Material.h:72
const std::array< double, 10 > stoppingPowerFitCoefficients_m
Definition Material.h:61
Definition Air.h:27