Cantera  2.0
Nuclei.h
1 /**
2  * Provides class Nucleus
3  */
4 
5 #ifndef CT_NUCL_H
6 #define CT_NUCL_H
7 
8 #include "cantera/base/ct_defs.h"
9 
10 namespace Cantera
11 {
12 
13 /**
14  * Represents atomic nuclei. These classes only provide minimal
15  * information, and are designed only to handle nuclear statistics
16  * effects on spectra.
17  * @ingroup spectroscopy
18  */
19 class Nucleus
20 {
21 public:
22  Nucleus(std::string symbol,
23  int nP, int nN, doublereal spin) : m_np(nP),
24  m_nn(nN), m_spin(spin),
25  m_sym(symbol) {}
26  virtual ~Nucleus() {}
27  int nProtons() {
28  return m_np;
29  }
30  int mNeutrons() {
31  return m_nn;
32  }
33  doublereal spin() {
34  return m_spin;
35  }
36  int multiplicity() {
37  return (int)(2*m_spin) + 1;
38  }
39  int atomicNumber() {
40  return m_np;
41  }
42  std::string symbol() {
43  return m_sym;
44  }
45 
46  bool operator==(Nucleus& b) {
47  if (m_np == b.m_np && m_nn == b.m_nn) {
48  return true;
49  } else {
50  return false;
51  }
52  }
53 
54  bool operator!=(Nucleus& b) {
55  return !(*this == b);
56  }
57 
58  bool isBoson() {
59  return (m_spin - std::floor(m_spin) < 0.001);
60  }
61 
62 
63 protected:
64 
65  int m_np; //< Number of protons
66  int m_nn; //< Number of electrons
67  doublereal m_spin; //< Spin.
68  std::string m_sym; //< Symbol.
69 };
70 
71 inline Nucleus* HydrogenNucleus()
72 {
73  return new Nucleus("H", 1, 0, 0.5);
74 }
75 inline Nucleus* DeuteriumNucleus()
76 {
77  return new Nucleus("D", 1, 1, 1.0);
78 }
79 inline Nucleus* TritiumNucleus()
80 {
81  return new Nucleus("T", 1, 2, 0.5);
82 }
83 inline Nucleus* He3Nucleus()
84 {
85  return new Nucleus("He3", 2, 1, 0.5);
86 }
87 inline Nucleus* He4Nucleus()
88 {
89  return new Nucleus("He3", 2, 2, 0.0);
90 }
91 inline Nucleus* C12nucleus()
92 {
93  return new Nucleus("C12", 6, 6, 0.0);
94 }
95 inline Nucleus* C13nucleus()
96 {
97  return new Nucleus("C13", 6, 7, 0.5);
98 }
99 inline Nucleus* N14nucleus()
100 {
101  return new Nucleus("N14", 7, 7, 1.0);
102 }
103 inline Nucleus* N15nucleus()
104 {
105  return new Nucleus("N15", 7, 8, 0.5);
106 }
107 inline Nucleus* O16nucleus()
108 {
109  return new Nucleus("O16", 8, 8, 0.0);
110 }
111 inline Nucleus* O17nucleus()
112 {
113  return new Nucleus("O17", 8, 9, 2.5);
114 }
115 inline Nucleus* O18nucleus()
116 {
117  return new Nucleus("O18", 8, 10, 0.0);
118 }
119 inline Nucleus* F19nucleus()
120 {
121  return new Nucleus("F19", 9, 10, 0.5);
122 }
123 
124 
125 } // Cantera
126 
127 #endif