00001 /* This file is part of Cloudy and is copyright (C)1978-2010 by Gary J. Ferland and 00002 * others. For conditions of distribution and use see copyright notice in license.txt */ 00003 00004 #ifndef ENERGY_H_ 00005 #define ENERGY_H_ 00006 00007 #include "physconst.h" 00008 00009 class Energy 00010 { 00011 double m_energy; 00012 public: 00013 // CONSTRUCTORS 00014 Energy () : m_energy(0.0) {} 00015 Energy (double energy) : m_energy(energy) {} 00016 Energy (double energy, const char *unit) : m_energy(0.0) 00017 { 00018 set(energy, unit); 00019 } 00020 // MUTATORS 00021 void set(double energy) 00022 { 00023 m_energy = energy; 00024 } 00025 void set(double energy, const char *unit); 00026 // ACCESSORS 00027 double get(const char * unit) const; 00028 double Ryd() const 00029 { 00030 return m_energy; 00031 } 00032 double K() const 00033 { 00034 return m_energy*TE1RYD; 00035 } 00036 double Erg() const 00037 { 00038 return m_energy*EN1RYD; 00039 } 00040 double WN() const 00041 { 00042 return m_energy*RYD_INF; 00043 } 00044 double eV() const 00045 { 00046 return m_energy*EVRYD; 00047 } 00048 double keV() const 00049 { 00050 return 1e-3*eV(); 00051 } 00052 double MeV() const 00053 { 00054 return 1e-6*eV(); 00055 } 00056 double Hz() const 00057 { 00058 return m_energy*FR1RYD; 00059 } 00060 double kHz() const 00061 { 00062 return Hz()*1e-3; 00063 } 00064 double MHz() const 00065 { 00066 return Hz()*1e-6; 00067 } 00068 double GHz() const 00069 { 00070 return Hz()*1e-9; 00071 } 00072 double Angstrom() const 00073 { 00074 return RYDLAM/m_energy; 00075 } 00076 double nm() const 00077 { 00078 return Angstrom()*1e-1; 00079 } 00080 double micron() const 00081 { 00082 return Angstrom()*1e-4; 00083 } 00084 double mm() const 00085 { 00086 return Angstrom()*1e-7; 00087 } 00088 double cm() const 00089 { 00090 return Angstrom()*1e-8; 00091 } 00092 }; 00093 00094 // 00099 // 00100 class EnergyEntry : public Energy 00101 { 00102 long p_ip; 00103 void p_set_ip(); 00104 public: 00105 EnergyEntry() : Energy(0.) 00106 { 00107 p_ip = -1; 00108 } 00109 EnergyEntry(double energy) : Energy(energy) 00110 { 00111 p_ip = -1; 00112 } 00113 EnergyEntry(double energy, const char *unit) : Energy(energy,unit) 00114 { 00115 p_ip = -1; 00116 } 00117 void set(double energy, const char *unit) 00118 { 00119 Energy::set(energy,unit); 00120 p_set_ip(); 00121 } 00122 void set(double energy) 00123 { 00124 Energy::set(energy); 00125 p_set_ip(); 00126 } 00127 // pointer on C scale 00128 long ip_C() 00129 { 00130 // doing it this way assures that we can create an EnergyEntry before 00131 // the mesh is set up; ipoint() will check that mesh is actually set up 00132 if( p_ip < 0 ) 00133 p_set_ip(); 00134 return p_ip; 00135 } 00136 // pointer on fortran scale 00137 long ip_fortran() 00138 { 00139 return ip_C() + 1; 00140 } 00141 }; 00142 00143 const char *StandardEnergyUnit(const char *); 00144 00145 bool lgConserveEnergy( void ); 00146 00147 #endif /* ENERGY_H_ */ 00148