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