cloudy trunk
Loading...
Searching...
No Matches
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
10namespace {
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}
bool fp_equal(sys_float x, sys_float y, int n=3)
Definition cddefines.h:812
Definition energy.h:8
double Angstrom() const
Definition energy.h:70
double nm() const
Definition energy.h:74
double Hz() const
Definition energy.h:54
double micron() const
Definition energy.h:78
Definition flux.h:10
Energy E() const
Definition flux.h:59
string uu() const
Definition flux.cpp:257
void set(Energy e, double flux)
Definition flux.h:42
double get() const
Definition flux.h:51
double FFmtRead(void)
Definition parser.cpp:353
void setline(const char *const card)
Definition parser.h:69
const char * StandardEnergyUnit(void) const
Definition parser.cpp:174
string StandardFluxUnit(void) const
Definition parser.cpp:178
string StandardFluxUnit(const char *chCard)
Definition flux.cpp:207
bool ValidFluxUnit(const string &unit)
Definition flux.h:71
UNUSED const double PI4
Definition physconst.h:35
UNUSED const double SQAS_SKY
Definition physconst.h:135