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