00001
00002
00003
00004 #include "cddefines.h"
00005 #include "rfield.h"
00006 #include "optimize.h"
00007 #include "input.h"
00008 #include "parser.h"
00009 #include "physconst.h"
00010
00011 void ParsePowerlawContinuum(Parser &p)
00012 {
00013 DEBUG_ENTRY( "ParsePowerlawContinuum()" );
00014
00015
00016 strcpy( rfield.chSpType[rfield.nShape], "POWER" );
00017
00018
00019 rfield.slope[rfield.nShape] = p.FFmtRead();
00020 if( p.lgEOL() )
00021 {
00022 fprintf( ioQQQ, " There should have been a number on this line. Sorry.\n" );
00023 cdEXIT(EXIT_FAILURE);
00024 }
00025
00026 if( rfield.slope[rfield.nShape] >= 0. )
00027 {
00028 fprintf( ioQQQ, " Is the slope of this power law correct?\n" );
00029 }
00030
00031
00032 rfield.cutoff[rfield.nShape][0] = p.FFmtRead();
00033
00034
00035 if( p.lgEOL() )
00036 {
00037
00038 rfield.cutoff[rfield.nShape][0] = 1e4;
00039 rfield.cutoff[rfield.nShape][1] = 1e-4;
00040 }
00041 else
00042 {
00043
00044 rfield.cutoff[rfield.nShape][1] = p.FFmtRead();
00045 if( p.lgEOL() )
00046 rfield.cutoff[rfield.nShape][1] = 1e-4;
00047 }
00048
00049
00050 if( rfield.cutoff[rfield.nShape][1] > rfield.cutoff[rfield.nShape][0] )
00051 {
00052 fprintf( ioQQQ, " The optional cutoff energies do not appear to be in the correct order. Check Hazy.\n" );
00053 cdEXIT(EXIT_FAILURE);
00054 }
00055
00056
00057 if( p.nMatch("KELV") )
00058 {
00059
00060 if( rfield.cutoff[rfield.nShape][0] <= 10. || p.nMatch(" LOG") )
00061 rfield.cutoff[rfield.nShape][0] = pow(10.,rfield.cutoff[rfield.nShape][0]);
00062 if( rfield.cutoff[rfield.nShape][1] <= 10. || p.nMatch(" LOG") )
00063 rfield.cutoff[rfield.nShape][1] = pow(10.,rfield.cutoff[rfield.nShape][1]);
00064 rfield.cutoff[rfield.nShape][0] /= TE1RYD;
00065 rfield.cutoff[rfield.nShape][1] /= TE1RYD;
00066 }
00067
00068 if( rfield.cutoff[rfield.nShape][0] < 0. ||
00069 rfield.cutoff[rfield.nShape][1] < 0. )
00070 {
00071 fprintf( ioQQQ, " A negative cutoff energy is not physical. Sorry.\n" );
00072 cdEXIT(EXIT_FAILURE);
00073 }
00074
00075 if( rfield.cutoff[rfield.nShape][1] == 0. &&
00076 rfield.slope[rfield.nShape] <= -1. )
00077 {
00078 fprintf( ioQQQ, " A power-law with this slope, and no low energy cutoff, may have an unphysically large\n brightness temperature in the radio.\n" );
00079 }
00080
00081
00082 if( optimize.lgVarOn )
00083 {
00084
00085 optimize.nvfpnt[optimize.nparm] = input.nRead;
00086 if( p.nMatch("VARYB") )
00087 {
00088
00089
00090
00091 optimize.nvarxt[optimize.nparm] = 1;
00092 sprintf( optimize.chVarFmt[optimize.nparm], "POWER LAW %f KELVIN %%f %f LOG",
00093 rfield.slope[rfield.nShape],
00094 log10(rfield.cutoff[rfield.nShape][1]*TE1RYD) );
00095 optimize.vparm[0][optimize.nparm] =
00096 (realnum)log10(rfield.cutoff[rfield.nShape][0]*TE1RYD);
00097 optimize.varang[optimize.nparm][0] = (realnum)log10(rfield.cutoff[rfield.nShape][1]*TE1RYD);
00098 optimize.varang[optimize.nparm][1] = FLT_MAX;
00099 optimize.vincr[optimize.nparm] = 0.2f;
00100 }
00101 else if( p.nMatch("VARYC") )
00102 {
00103
00104
00105 optimize.nvarxt[optimize.nparm] = 1;
00106 sprintf( optimize.chVarFmt[optimize.nparm], "POWER LAW %f KELVIN %f %%f LOG",
00107 rfield.slope[rfield.nShape],
00108 log10(rfield.cutoff[rfield.nShape][0]*TE1RYD) );
00109 optimize.vparm[0][optimize.nparm] =
00110 (realnum)log10(rfield.cutoff[rfield.nShape][1]*TE1RYD);
00111 optimize.varang[optimize.nparm][0] = -FLT_MAX;
00112 optimize.varang[optimize.nparm][1] = (realnum)log10(rfield.cutoff[rfield.nShape][0]*TE1RYD);
00113 optimize.vincr[optimize.nparm] = 0.2f;
00114 }
00115 else
00116 {
00117
00118
00119 optimize.nvarxt[optimize.nparm] = 1;
00120 sprintf( optimize.chVarFmt[optimize.nparm], "POWER LAW %%f KELVIN %f %f LOG",
00121 log10(rfield.cutoff[rfield.nShape][0]*TE1RYD),
00122 log10(rfield.cutoff[rfield.nShape][1]*TE1RYD) );
00123 optimize.vparm[0][optimize.nparm] = (realnum)rfield.slope[rfield.nShape];
00124 optimize.vincr[optimize.nparm] = 0.2f;
00125 }
00126 ++optimize.nparm;
00127 }
00128
00129
00130
00131
00132
00133 ++rfield.nShape;
00134 if( rfield.nShape >= LIMSPC )
00135 {
00136 fprintf( ioQQQ, " Too many continua entered; increase LIMSPC\n" );
00137 cdEXIT(EXIT_FAILURE);
00138 }
00139
00140 return;
00141 }