cloudy  trunk
TestFlux.cpp
Go to the documentation of this file.
1 /* This file is part of Cloudy and is copyright (C)1978-2013 by Gary J. Ferland and
2  * others. For conditions of distribution and use see copyright notice in license.txt */
3 #include "cdstd.h"
4 #include <UnitTest++.h>
5 #include "cddefines.h"
6 #include "energy.h"
7 #include "flux.h"
8 #include "parser.h"
9 
10 namespace {
11 
12  TEST(TestFluxCTor)
13  {
14  Energy E(1.,"Ryd");
15  Flux Fzero;
16  CHECK( fp_equal( Fzero.get(), 0. ) );
17  Flux Ferg_s_cm20(E,1.);
18  CHECK( fp_equal( Ferg_s_cm20.get(), 1. ) );
19  Flux Ferg_s_cm21(E,1.,"erg/s/cm2");
20  CHECK( fp_equal( Ferg_s_cm21.get(), 1. ) );
21  Flux Ferg_s_cm2_A(E,1.,"erg/s/cm2/A");
22  CHECK( fp_equal( Ferg_s_cm2_A.get(), E.Angstrom() ) );
23  Flux Ferg_s_cm2_micron(E,1.,"erg/s/cm2/micron");
24  CHECK( fp_equal( Ferg_s_cm2_micron.get(), E.micron() ) );
25  Flux Ferg_s_cm2_Hz(E,1.,"erg/s/cm2/Hz");
26  CHECK( fp_equal( Ferg_s_cm2_Hz.get(), E.Hz() ) );
27  Flux FW_m2(E,1.,"W/m2");
28  CHECK( fp_equal( FW_m2.get(), 1.e3 ) );
29  Flux FW_m2_A(E,1.,"W/m2/A");
30  CHECK( fp_equal( FW_m2_A.get(), 1.e3*E.Angstrom() ) );
31  Flux FW_m2_nm(E,1.,"W/m2/nm");
32  CHECK( fp_equal( FW_m2_nm.get(), 1.e3*E.nm() ) );
33  Flux FW_m2_micron(E,1.,"W/m2/micron");
34  CHECK( fp_equal( FW_m2_micron.get(), 1.e3*E.micron() ) );
35  Flux FW_m2_Hz(E,1.,"W/m2/Hz");
36  CHECK( fp_equal( FW_m2_Hz.get(), 1.e3*E.Hz() ) );
37  Flux FW_cm2(E,1.,"W/cm2");
38  CHECK( fp_equal( FW_cm2.get(), 1.e7 ) );
39  Flux FW_cm2_A(E,1.,"W/cm2/A");
40  CHECK( fp_equal( FW_cm2_A.get(), 1.e7*E.Angstrom() ) );
41  Flux FW_cm2_micron(E,1.,"W/cm2/micron");
42  CHECK( fp_equal( FW_cm2_micron.get(), 1.e7*E.micron() ) );
43  Flux FW_cm2_Hz(E,1.,"W/cm2/Hz");
44  CHECK( fp_equal( FW_cm2_Hz.get(), 1.e7*E.Hz() ) );
45  Flux FW_cm2_Hz_sr(E,1.,"W/cm2/Hz/sr");
46  CHECK( fp_equal( FW_cm2_Hz_sr.get(), 1.e7*E.Hz()*PI4 ) );
47  Flux FW_cm2_Hz_arcsec2(E,1.,"W/cm2/Hz/arcsec2");
48  CHECK( fp_equal( FW_cm2_Hz_arcsec2.get(), 1.e7*E.Hz()*SQAS_SKY ) );
49  Flux FJy(E,1.,"Jy");
50  CHECK( fp_equal( FJy.get(), 1.e-23*E.Hz() ) );
51  Flux FmJy(E,1.,"mJy");
52  CHECK( fp_equal( FmJy.get(), 1.e-26*E.Hz() ) );
53  Flux FMJy_sr(E,1.,"MJy/sr");
54  CHECK( fp_equal( FMJy_sr.get(), 1.e-17*E.Hz()*PI4 ) );
55  }
56 
57  TEST(TestFluxSet)
58  {
59  Energy E(1.,"Ryd");
60  Flux F;
61  F.set(E,10.);
62  CHECK( fp_equal( F.get(), 10. ) );
63  CHECK_EQUAL( "erg/s/cm2", F.uu() );
64 
65  F.set(E,10.,"erg/s/cm2");
66  CHECK( fp_equal( F.get(), 10. ) );
67  CHECK_EQUAL( "erg/s/cm2", F.uu() );
68 
69  F.set(E,10.,"erg/s/cm2/A");
70  CHECK( fp_equal( F.get(), 10.*E.Angstrom() ) );
71  CHECK_EQUAL( "erg/s/cm2/A", F.uu() );
72 
73  F.set(E,10.,"erg/s/cm2/micron");
74  CHECK( fp_equal( F.get(), 10.*E.micron() ) );
75  CHECK_EQUAL( "erg/s/cm2/micron", F.uu() );
76 
77  F.set(E,10.,"erg/s/cm2/Hz");
78  CHECK( fp_equal( F.get(), 10.*E.Hz() ) );
79  CHECK_EQUAL( "erg/s/cm2/Hz", F.uu() );
80 
81  F.set(E,10.,"W/m2");
82  CHECK( fp_equal( F.get(), 1.e4 ) );
83  CHECK_EQUAL( "W/m2", F.uu() );
84 
85  F.set(E,10.,"W/m2/A");
86  CHECK( fp_equal( F.get(), 1.e4*E.Angstrom() ) );
87  CHECK_EQUAL( "W/m2/A", F.uu() );
88 
89  F.set(E,10.,"W/m2/nm");
90  CHECK( fp_equal( F.get(), 1.e4*E.nm() ) );
91  CHECK_EQUAL( "W/m2/nm", F.uu() );
92 
93  F.set(E,10.,"W/m2/micron");
94  CHECK( fp_equal( F.get(), 1.e4*E.micron() ) );
95  CHECK_EQUAL( "W/m2/micron", F.uu() );
96 
97  F.set(E,10.,"W/m2/Hz");
98  CHECK( fp_equal( F.get(), 1.e4*E.Hz() ) );
99  CHECK_EQUAL( "W/m2/Hz", F.uu() );
100 
101  F.set(E,10.,"W/cm2");
102  CHECK( fp_equal( F.get(), 1.e8 ) );
103  CHECK_EQUAL( "W/cm2", F.uu() );
104 
105  F.set(E,10.,"W/cm2/A");
106  CHECK( fp_equal( F.get(), 1.e8*E.Angstrom() ) );
107  CHECK_EQUAL( "W/cm2/A", F.uu() );
108 
109  F.set(E,10.,"W/cm2/micron");
110  CHECK( fp_equal( F.get(), 1.e8*E.micron() ) );
111  CHECK_EQUAL( "W/cm2/micron", F.uu() );
112 
113  F.set(E,10.,"W/cm2/Hz");
114  CHECK( fp_equal( F.get(), 1.e8*E.Hz() ) );
115  CHECK_EQUAL( "W/cm2/Hz", F.uu() );
116 
117  F.set(E,10.,"W/cm2/Hz/sr");
118  CHECK( fp_equal( F.get(), 1.e8*E.Hz()*PI4 ) );
119  CHECK_EQUAL( "W/cm2/Hz/sr", F.uu() );
120 
121  F.set(E,10.,"W/cm2/Hz/arcsec2");
122  CHECK( fp_equal( F.get(), 1.e8*E.Hz()*SQAS_SKY ) );
123  CHECK_EQUAL( "W/cm2/Hz/arcsec2", F.uu() );
124 
125  F.set(E,10.,"Jy");
126  CHECK( fp_equal( F.get(), 1.e-22*E.Hz() ) );
127  CHECK_EQUAL( "Jy", F.uu() );
128 
129  F.set(E,10.,"mJy");
130  CHECK( fp_equal( F.get(), 1.e-25*E.Hz() ) );
131  CHECK_EQUAL( "mJy", F.uu() );
132 
133  F.set(E,10.,"MJy/sr");
134  CHECK( fp_equal( F.get(), 1.e-16*E.Hz()*PI4 ) );
135  CHECK_EQUAL( "MJy/sr", F.uu() );
136  }
137 
138  TEST(TestFluxGet)
139  {
140  Energy E(1.,"Ryd");
141  Flux F(E,1.);
142  CHECK( fp_equal( F.get("erg/s/cm2"), 1. ) );
143  CHECK( fp_equal( F.get("erg/s/cm2/A"), 1./E.Angstrom() ) );
144  CHECK( fp_equal( F.get("erg/s/cm2/micron"), 1./E.micron() ) );
145  CHECK( fp_equal( F.get("erg/s/cm2/Hz"), 1./E.Hz() ) );
146  CHECK( fp_equal( F.get("W/m2"), 1.e-3 ) );
147  CHECK( fp_equal( F.get("W/m2/A"), 1.e-3/E.Angstrom() ) );
148  CHECK( fp_equal( F.get("W/m2/micron"), 1.e-3/E.micron() ) );
149  CHECK( fp_equal( F.get("W/m2/Hz"), 1.e-3/E.Hz() ) );
150  CHECK( fp_equal( F.get("W/cm2"), 1.e-7 ) );
151  CHECK( fp_equal( F.get("W/cm2/A"), 1.e-7/E.Angstrom() ) );
152  CHECK( fp_equal( F.get("W/cm2/nm"), 1.e-7/E.nm() ) );
153  CHECK( fp_equal( F.get("W/cm2/micron"), 1.e-7/E.micron() ) );
154  CHECK( fp_equal( F.get("W/cm2/Hz"), 1.e-7/E.Hz() ) );
155  CHECK( fp_equal( F.get("W/cm2/Hz/sr"), 1.e-7/E.Hz()/PI4 ) );
156  CHECK( fp_equal( F.get("W/cm2/Hz/arcsec2"), 1.e-7/E.Hz()/SQAS_SKY ) );
157  CHECK( fp_equal( F.get("Jy"), 1.e23/E.Hz() ) );
158  CHECK( fp_equal( F.get("mJy"), 1.e26/E.Hz() ) );
159  CHECK( fp_equal( F.get("MJy/sr"), 1.e17/E.Hz()/PI4 ) );
160  }
161 
162  TEST(TestFluxUnitConversion)
163  {
164  Energy E(1.,"Ryd");
165  Flux F(E,10.);
166  CHECK( fp_equal( F.get( StandardFluxUnit("ERG/S/SQCM") ), 10. ) );
167  CHECK( fp_equal( F.get( StandardFluxUnit("ERG/S/SQCM/A ") ), 10./F.E().Angstrom() ) );
168  CHECK( fp_equal( F.get( StandardFluxUnit("ERG/S/SQCM/MICRON") ), 10./F.E().micron() ) );
169  CHECK( fp_equal( F.get( StandardFluxUnit("ERG/S/SQCM/HZ") ), 10./F.E().Hz() ) );
170  CHECK( fp_equal( F.get( StandardFluxUnit("W/SQM") ), 1.e-2 ) );
171  CHECK( fp_equal( F.get( StandardFluxUnit("W/SQM/A ") ), 1.e-2/F.E().Angstrom() ) );
172  CHECK( fp_equal( F.get( StandardFluxUnit("W/SQM/MICRON") ), 1.e-2/F.E().micron() ) );
173  CHECK( fp_equal( F.get( StandardFluxUnit("W/SQM/HZ") ), 1.e-2/F.E().Hz() ) );
174  CHECK( fp_equal( F.get( StandardFluxUnit("W/SQCM") ), 1.e-6 ) );
175  CHECK( fp_equal( F.get( StandardFluxUnit("W/SQCM/A ") ), 1.e-6/F.E().Angstrom() ) );
176  CHECK( fp_equal( F.get( StandardFluxUnit("W/SQCM/MICRON") ), 1.e-6/F.E().micron() ) );
177  CHECK( fp_equal( F.get( StandardFluxUnit("W/SQCM/HZ") ), 1.e-6/F.E().Hz() ) );
178  CHECK( fp_equal( F.get( StandardFluxUnit("W/SQCM/NM/SR") ), 1.e-6/F.E().nm()/PI4 ) );
179  CHECK( fp_equal( F.get( StandardFluxUnit("W/SQCM/HZ/SR") ), 1.e-6/F.E().Hz()/PI4 ) );
180  CHECK( fp_equal( F.get( StandardFluxUnit("W/SQCM/HZ/SQAS") ), 1.e-6/F.E().Hz()/SQAS_SKY ) );
181  CHECK( fp_equal( F.get( StandardFluxUnit(" JY ") ), 1.e24/F.E().Hz() ) );
182  CHECK( fp_equal( F.get( StandardFluxUnit("JANSKY") ), 1.e24/F.E().Hz() ) );
183  CHECK( fp_equal( F.get( StandardFluxUnit(" MJY") ), 1.e27/F.E().Hz() ) );
184  CHECK( fp_equal( F.get( StandardFluxUnit("MJY/SR") ), 1.e18/F.E().Hz()/PI4 ) );
185  }
186 
187  TEST(TestValidFluxUnit)
188  {
189  CHECK( ValidFluxUnit( "erg/s/cm2/arcsec2" ) );
190  CHECK( !ValidFluxUnit( "erg/s/cm2/arcsec" ) );
191  CHECK( !ValidFluxUnit( "erg/cm2/arcsec2" ) );
192  CHECK( !ValidFluxUnit( "erg/s/cm2/cm2/arcsec2" ) );
193  CHECK( !ValidFluxUnit( "erg/s/cm2/A/nm" ) );
194  CHECK( !ValidFluxUnit( "erg/s/cm2/" ) );
195  CHECK( !ValidFluxUnit( "MJy/arcsec2" ) );
196  CHECK( !ValidFluxUnit( "mJy/sr" ) );
197  CHECK( !ValidFluxUnit( "Jy/sr" ) );
198  }
199 
200  // test some command lines that could possibly confuse the unit readers...
201  TEST(TestEnergyFluxParser1)
202  {
203  char chCard[100];
204  strcpy( chCard, "OPTIMIZE FLUX 0.03 RYD 24 ERG/S/SQCM/MICRON" );
205  Parser p;
206  p.setline(chCard);
207  double energy = p.FFmtRead();
208  double flux = p.FFmtRead();
209  Energy E( energy, p.StandardEnergyUnit() );
210  Flux F( E, flux, p.StandardFluxUnit() );
211  CHECK( fp_equal( E.Ryd(), 0.03 ) );
212  CHECK( fp_equal( F.get("erg/s/cm2/micron"), 24. ) );
213  }
214 
215  TEST(TestEnergyFluxParser2)
216  {
217  char chCard[100];
218  strcpy( chCard, "OPTIMIZE FLUX 12 MICRON 24 ERG/S/SQCM" );
219  Parser p;
220  p.setline( chCard );
221  double energy = p.FFmtRead();
222  double flux = p.FFmtRead();
223  Energy E( energy, p.StandardEnergyUnit() );
224  Flux F( E, flux, p.StandardFluxUnit() );
225  CHECK( fp_equal( E.micron(), 12. ) );
226  CHECK( fp_equal( F.get("erg/s/cm2"), 24. ) );
227  }
228 
229  TEST(TestEnergyFluxParser3)
230  {
231  char chCard[100];
232  strcpy( chCard, "OPTIMIZE FLUX 12E-14 ERG 24 W/SQCM" );
233  Parser p;
234  p.setline(chCard );
235  double energy = p.FFmtRead();
236  double flux = p.FFmtRead();
237  Energy E( energy, p.StandardEnergyUnit() );
238  Flux F( E, flux, p.StandardFluxUnit() );
239  CHECK( fp_equal( E.Erg(), 12.e-14 ) );
240  CHECK( fp_equal( F.get("W/cm2"), 24. ) );
241  }
242 
243 }
Energy::Hz
double Hz() const
Definition: energy.h:54
Flux::get
double get() const
Definition: flux.h:51
Parser::FFmtRead
double FFmtRead(void)
Definition: parser.cpp:353
Parser::StandardFluxUnit
string StandardFluxUnit(void) const
Definition: parser.cpp:178
energy.h
Flux::set
void set(Energy e, double flux)
Definition: flux.h:42
Parser::StandardEnergyUnit
const char * StandardEnergyUnit(void) const
Definition: parser.cpp:174
ValidFluxUnit
bool ValidFluxUnit(const string &unit)
Definition: flux.h:71
StandardFluxUnit
string StandardFluxUnit(const char *chCard)
Definition: flux.cpp:207
SQAS_SKY
const UNUSED double SQAS_SKY
Definition: physconst.h:135
PI4
const UNUSED double PI4
Definition: physconst.h:35
Energy::nm
double nm() const
Definition: energy.h:74
flux.h
Parser
Definition: parser.h:31
cddefines.h
cdstd.h
Flux
Definition: flux.h:9
Energy
Definition: energy.h:7
Parser::setline
void setline(const char *const card)
Definition: parser.h:69
fp_equal
bool fp_equal(sys_float x, sys_float y, int n=3)
Definition: cddefines.h:812
parser.h
Flux::E
Energy E() const
Definition: flux.h:59
Energy::Angstrom
double Angstrom() const
Definition: energy.h:70
Flux::uu
string uu() const
Definition: flux.cpp:257
Energy::micron
double micron() const
Definition: energy.h:78