00001 #include <UnitTest++.h>
00002 #include "cddefines.h"
00003 #include "energy.h"
00004 #include "flux.h"
00005 #include "parser.h"
00006
00007 namespace {
00008
00009 TEST(TestFluxCTor)
00010 {
00011 Energy E(1.,"Ryd");
00012 Flux Fzero;
00013 CHECK( fp_equal( Fzero.get(), 0. ) );
00014 Flux Ferg_s_cm20(E,1.);
00015 CHECK( fp_equal( Ferg_s_cm20.get(), 1. ) );
00016 Flux Ferg_s_cm21(E,1.,"erg/s/cm2");
00017 CHECK( fp_equal( Ferg_s_cm21.get(), 1. ) );
00018 Flux Ferg_s_cm2_A(E,1.,"erg/s/cm2/A");
00019 CHECK( fp_equal( Ferg_s_cm2_A.get(), E.Angstrom() ) );
00020 Flux Ferg_s_cm2_micron(E,1.,"erg/s/cm2/micron");
00021 CHECK( fp_equal( Ferg_s_cm2_micron.get(), E.micron() ) );
00022 Flux Ferg_s_cm2_Hz(E,1.,"erg/s/cm2/Hz");
00023 CHECK( fp_equal( Ferg_s_cm2_Hz.get(), E.Hz() ) );
00024 Flux FW_m2(E,1.,"W/m2");
00025 CHECK( fp_equal( FW_m2.get(), 1.e3 ) );
00026 Flux FW_m2_A(E,1.,"W/m2/A");
00027 CHECK( fp_equal( FW_m2_A.get(), 1.e3*E.Angstrom() ) );
00028 Flux FW_m2_nm(E,1.,"W/m2/nm");
00029 CHECK( fp_equal( FW_m2_nm.get(), 1.e3*E.nm() ) );
00030 Flux FW_m2_micron(E,1.,"W/m2/micron");
00031 CHECK( fp_equal( FW_m2_micron.get(), 1.e3*E.micron() ) );
00032 Flux FW_m2_Hz(E,1.,"W/m2/Hz");
00033 CHECK( fp_equal( FW_m2_Hz.get(), 1.e3*E.Hz() ) );
00034 Flux FW_cm2(E,1.,"W/cm2");
00035 CHECK( fp_equal( FW_cm2.get(), 1.e7 ) );
00036 Flux FW_cm2_A(E,1.,"W/cm2/A");
00037 CHECK( fp_equal( FW_cm2_A.get(), 1.e7*E.Angstrom() ) );
00038 Flux FW_cm2_micron(E,1.,"W/cm2/micron");
00039 CHECK( fp_equal( FW_cm2_micron.get(), 1.e7*E.micron() ) );
00040 Flux FW_cm2_Hz(E,1.,"W/cm2/Hz");
00041 CHECK( fp_equal( FW_cm2_Hz.get(), 1.e7*E.Hz() ) );
00042 Flux FW_cm2_Hz_sr(E,1.,"W/cm2/Hz/sr");
00043 CHECK( fp_equal( FW_cm2_Hz_sr.get(), 1.e7*E.Hz()*PI4 ) );
00044 Flux FW_cm2_Hz_arcsec2(E,1.,"W/cm2/Hz/arcsec2");
00045 CHECK( fp_equal( FW_cm2_Hz_arcsec2.get(), 1.e7*E.Hz()*SQAS_SKY ) );
00046 Flux FJy(E,1.,"Jy");
00047 CHECK( fp_equal( FJy.get(), 1.e-23*E.Hz() ) );
00048 Flux FmJy(E,1.,"mJy");
00049 CHECK( fp_equal( FmJy.get(), 1.e-26*E.Hz() ) );
00050 Flux FMJy_sr(E,1.,"MJy/sr");
00051 CHECK( fp_equal( FMJy_sr.get(), 1.e-17*E.Hz()*PI4 ) );
00052 }
00053
00054 TEST(TestFluxSet)
00055 {
00056 Energy E(1.,"Ryd");
00057 Flux F;
00058 F.set(E,10.);
00059 CHECK( fp_equal( F.get(), 10. ) );
00060 CHECK_EQUAL( "erg/s/cm2", F.uu() );
00061
00062 F.set(E,10.,"erg/s/cm2");
00063 CHECK( fp_equal( F.get(), 10. ) );
00064 CHECK_EQUAL( "erg/s/cm2", F.uu() );
00065
00066 F.set(E,10.,"erg/s/cm2/A");
00067 CHECK( fp_equal( F.get(), 10.*E.Angstrom() ) );
00068 CHECK_EQUAL( "erg/s/cm2/A", F.uu() );
00069
00070 F.set(E,10.,"erg/s/cm2/micron");
00071 CHECK( fp_equal( F.get(), 10.*E.micron() ) );
00072 CHECK_EQUAL( "erg/s/cm2/micron", F.uu() );
00073
00074 F.set(E,10.,"erg/s/cm2/Hz");
00075 CHECK( fp_equal( F.get(), 10.*E.Hz() ) );
00076 CHECK_EQUAL( "erg/s/cm2/Hz", F.uu() );
00077
00078 F.set(E,10.,"W/m2");
00079 CHECK( fp_equal( F.get(), 1.e4 ) );
00080 CHECK_EQUAL( "W/m2", F.uu() );
00081
00082 F.set(E,10.,"W/m2/A");
00083 CHECK( fp_equal( F.get(), 1.e4*E.Angstrom() ) );
00084 CHECK_EQUAL( "W/m2/A", F.uu() );
00085
00086 F.set(E,10.,"W/m2/nm");
00087 CHECK( fp_equal( F.get(), 1.e4*E.nm() ) );
00088 CHECK_EQUAL( "W/m2/nm", F.uu() );
00089
00090 F.set(E,10.,"W/m2/micron");
00091 CHECK( fp_equal( F.get(), 1.e4*E.micron() ) );
00092 CHECK_EQUAL( "W/m2/micron", F.uu() );
00093
00094 F.set(E,10.,"W/m2/Hz");
00095 CHECK( fp_equal( F.get(), 1.e4*E.Hz() ) );
00096 CHECK_EQUAL( "W/m2/Hz", F.uu() );
00097
00098 F.set(E,10.,"W/cm2");
00099 CHECK( fp_equal( F.get(), 1.e8 ) );
00100 CHECK_EQUAL( "W/cm2", F.uu() );
00101
00102 F.set(E,10.,"W/cm2/A");
00103 CHECK( fp_equal( F.get(), 1.e8*E.Angstrom() ) );
00104 CHECK_EQUAL( "W/cm2/A", F.uu() );
00105
00106 F.set(E,10.,"W/cm2/micron");
00107 CHECK( fp_equal( F.get(), 1.e8*E.micron() ) );
00108 CHECK_EQUAL( "W/cm2/micron", F.uu() );
00109
00110 F.set(E,10.,"W/cm2/Hz");
00111 CHECK( fp_equal( F.get(), 1.e8*E.Hz() ) );
00112 CHECK_EQUAL( "W/cm2/Hz", F.uu() );
00113
00114 F.set(E,10.,"W/cm2/Hz/sr");
00115 CHECK( fp_equal( F.get(), 1.e8*E.Hz()*PI4 ) );
00116 CHECK_EQUAL( "W/cm2/Hz/sr", F.uu() );
00117
00118 F.set(E,10.,"W/cm2/Hz/arcsec2");
00119 CHECK( fp_equal( F.get(), 1.e8*E.Hz()*SQAS_SKY ) );
00120 CHECK_EQUAL( "W/cm2/Hz/arcsec2", F.uu() );
00121
00122 F.set(E,10.,"Jy");
00123 CHECK( fp_equal( F.get(), 1.e-22*E.Hz() ) );
00124 CHECK_EQUAL( "Jy", F.uu() );
00125
00126 F.set(E,10.,"mJy");
00127 CHECK( fp_equal( F.get(), 1.e-25*E.Hz() ) );
00128 CHECK_EQUAL( "mJy", F.uu() );
00129
00130 F.set(E,10.,"MJy/sr");
00131 CHECK( fp_equal( F.get(), 1.e-16*E.Hz()*PI4 ) );
00132 CHECK_EQUAL( "MJy/sr", F.uu() );
00133 }
00134
00135 TEST(TestFluxGet)
00136 {
00137 Energy E(1.,"Ryd");
00138 Flux F(E,1.);
00139 CHECK( fp_equal( F.get("erg/s/cm2"), 1. ) );
00140 CHECK( fp_equal( F.get("erg/s/cm2/A"), 1./E.Angstrom() ) );
00141 CHECK( fp_equal( F.get("erg/s/cm2/micron"), 1./E.micron() ) );
00142 CHECK( fp_equal( F.get("erg/s/cm2/Hz"), 1./E.Hz() ) );
00143 CHECK( fp_equal( F.get("W/m2"), 1.e-3 ) );
00144 CHECK( fp_equal( F.get("W/m2/A"), 1.e-3/E.Angstrom() ) );
00145 CHECK( fp_equal( F.get("W/m2/micron"), 1.e-3/E.micron() ) );
00146 CHECK( fp_equal( F.get("W/m2/Hz"), 1.e-3/E.Hz() ) );
00147 CHECK( fp_equal( F.get("W/cm2"), 1.e-7 ) );
00148 CHECK( fp_equal( F.get("W/cm2/A"), 1.e-7/E.Angstrom() ) );
00149 CHECK( fp_equal( F.get("W/cm2/nm"), 1.e-7/E.nm() ) );
00150 CHECK( fp_equal( F.get("W/cm2/micron"), 1.e-7/E.micron() ) );
00151 CHECK( fp_equal( F.get("W/cm2/Hz"), 1.e-7/E.Hz() ) );
00152 CHECK( fp_equal( F.get("W/cm2/Hz/sr"), 1.e-7/E.Hz()/PI4 ) );
00153 CHECK( fp_equal( F.get("W/cm2/Hz/arcsec2"), 1.e-7/E.Hz()/SQAS_SKY ) );
00154 CHECK( fp_equal( F.get("Jy"), 1.e23/E.Hz() ) );
00155 CHECK( fp_equal( F.get("mJy"), 1.e26/E.Hz() ) );
00156 CHECK( fp_equal( F.get("MJy/sr"), 1.e17/E.Hz()/PI4 ) );
00157 }
00158
00159 TEST(TestFluxUnitConversion)
00160 {
00161 Energy E(1.,"Ryd");
00162 Flux F(E,10.);
00163 CHECK( fp_equal( F.get( StandardFluxUnit("ERG/S/SQCM") ), 10. ) );
00164 CHECK( fp_equal( F.get( StandardFluxUnit("ERG/S/SQCM/A ") ), 10./F.E().Angstrom() ) );
00165 CHECK( fp_equal( F.get( StandardFluxUnit("ERG/S/SQCM/MICRON") ), 10./F.E().micron() ) );
00166 CHECK( fp_equal( F.get( StandardFluxUnit("ERG/S/SQCM/HZ") ), 10./F.E().Hz() ) );
00167 CHECK( fp_equal( F.get( StandardFluxUnit("W/SQM") ), 1.e-2 ) );
00168 CHECK( fp_equal( F.get( StandardFluxUnit("W/SQM/A ") ), 1.e-2/F.E().Angstrom() ) );
00169 CHECK( fp_equal( F.get( StandardFluxUnit("W/SQM/MICRON") ), 1.e-2/F.E().micron() ) );
00170 CHECK( fp_equal( F.get( StandardFluxUnit("W/SQM/HZ") ), 1.e-2/F.E().Hz() ) );
00171 CHECK( fp_equal( F.get( StandardFluxUnit("W/SQCM") ), 1.e-6 ) );
00172 CHECK( fp_equal( F.get( StandardFluxUnit("W/SQCM/A ") ), 1.e-6/F.E().Angstrom() ) );
00173 CHECK( fp_equal( F.get( StandardFluxUnit("W/SQCM/MICRON") ), 1.e-6/F.E().micron() ) );
00174 CHECK( fp_equal( F.get( StandardFluxUnit("W/SQCM/HZ") ), 1.e-6/F.E().Hz() ) );
00175 CHECK( fp_equal( F.get( StandardFluxUnit("W/SQCM/NM/SR") ), 1.e-6/F.E().nm()/PI4 ) );
00176 CHECK( fp_equal( F.get( StandardFluxUnit("W/SQCM/HZ/SR") ), 1.e-6/F.E().Hz()/PI4 ) );
00177 CHECK( fp_equal( F.get( StandardFluxUnit("W/SQCM/HZ/SQAS") ), 1.e-6/F.E().Hz()/SQAS_SKY ) );
00178 CHECK( fp_equal( F.get( StandardFluxUnit(" JY ") ), 1.e24/F.E().Hz() ) );
00179 CHECK( fp_equal( F.get( StandardFluxUnit("JANSKY") ), 1.e24/F.E().Hz() ) );
00180 CHECK( fp_equal( F.get( StandardFluxUnit(" MJY") ), 1.e27/F.E().Hz() ) );
00181 CHECK( fp_equal( F.get( StandardFluxUnit("MJY/SR") ), 1.e18/F.E().Hz()/PI4 ) );
00182 }
00183
00184 TEST(TestValidFluxUnit)
00185 {
00186 CHECK( ValidFluxUnit( "erg/s/cm2/arcsec2" ) );
00187 CHECK( !ValidFluxUnit( "erg/s/cm2/arcsec" ) );
00188 CHECK( !ValidFluxUnit( "erg/cm2/arcsec2" ) );
00189 CHECK( !ValidFluxUnit( "erg/s/cm2/cm2/arcsec2" ) );
00190 CHECK( !ValidFluxUnit( "erg/s/cm2/A/nm" ) );
00191 CHECK( !ValidFluxUnit( "erg/s/cm2/" ) );
00192 CHECK( !ValidFluxUnit( "MJy/arcsec2" ) );
00193 CHECK( !ValidFluxUnit( "mJy/sr" ) );
00194 CHECK( !ValidFluxUnit( "Jy/sr" ) );
00195 }
00196
00197
00198 TEST(TestEnergyFluxParser1)
00199 {
00200 char chCard[100];
00201 strcpy( chCard, "OPTIMIZE FLUX 0.03 RYD 24 ERG/S/SQCM/MICRON" );
00202 Parser p;
00203 p.setline(chCard);
00204 double energy = p.FFmtRead();
00205 double flux = p.FFmtRead();
00206 Energy E( energy, p.StandardEnergyUnit() );
00207 Flux F( E, flux, p.StandardFluxUnit() );
00208 CHECK( fp_equal( E.Ryd(), 0.03 ) );
00209 CHECK( fp_equal( F.get("erg/s/cm2/micron"), 24. ) );
00210 }
00211
00212 TEST(TestEnergyFluxParser2)
00213 {
00214 char chCard[100];
00215 strcpy( chCard, "OPTIMIZE FLUX 12 MICRON 24 ERG/S/SQCM" );
00216 Parser p;
00217 p.setline( chCard );
00218 double energy = p.FFmtRead();
00219 double flux = p.FFmtRead();
00220 Energy E( energy, p.StandardEnergyUnit() );
00221 Flux F( E, flux, p.StandardFluxUnit() );
00222 CHECK( fp_equal( E.micron(), 12. ) );
00223 CHECK( fp_equal( F.get("erg/s/cm2"), 24. ) );
00224 }
00225
00226 TEST(TestEnergyFluxParser3)
00227 {
00228 char chCard[100];
00229 strcpy( chCard, "OPTIMIZE FLUX 12E-14 ERG 24 W/SQCM" );
00230 Parser p;
00231 p.setline(chCard );
00232 double energy = p.FFmtRead();
00233 double flux = p.FFmtRead();
00234 Energy E( energy, p.StandardEnergyUnit() );
00235 Flux F( E, flux, p.StandardFluxUnit() );
00236 CHECK( fp_equal( E.Erg(), 12.e-14 ) );
00237 CHECK( fp_equal( F.get("W/cm2"), 24. ) );
00238 }
00239
00240 }