00001
00002
00003
00004 #include "cddefines.h"
00005 #include "optimize.h"
00006 #include "input.h"
00007 #include "rfield.h"
00008 #include "parser.h"
00009
00010 #if defined(__HP_aCC)
00011 #pragma OPT_LEVEL 1
00012 #endif
00013
00014 void ParseRatio(Parser &p)
00015 {
00016 bool lgAoxOn;
00017 double aox;
00018
00019 DEBUG_ENTRY( "ParseRatio()" );
00020
00021
00022
00023
00024
00025
00026
00027
00028 if( p.m_nqh == 0 )
00029 {
00030 fprintf( ioQQQ, " Can\'t form ratio since this is first continuum.\n" );
00031 cdEXIT(EXIT_FAILURE);
00032 }
00033
00034
00035 strcpy( rfield.chRSpec[p.m_nqh], "SQCM" );
00036 strcpy( rfield.chSpNorm[p.m_nqh], "RATI" );
00037
00038
00039 if( p.nMatch("ALPH") )
00040 {
00041
00042 lgAoxOn = true;
00043
00044 aox = p.FFmtRead();
00045
00046
00047
00048 rfield.totpow[p.m_nqh] = pow(403.3,aox);
00049 rfield.range[p.m_nqh][0] = 0.3645;
00050 rfield.range[p.m_nqh][1] = 147.;
00051 }
00052
00053 else
00054 {
00055
00056 lgAoxOn = false;
00057
00058 aox = -DBL_MAX;
00059
00060 rfield.totpow[p.m_nqh] = p.FFmtRead();
00061 if( p.lgEOL() )
00062 p.NoNumb("continuum ratio");
00063
00064
00065 if( rfield.totpow[p.m_nqh] <= 0. || p.nMatch(" LOG" ) )
00066 {
00067 rfield.totpow[p.m_nqh] = pow(10.,rfield.totpow[p.m_nqh]);
00068 }
00069
00070 rfield.range[p.m_nqh][0] = p.FFmtRead();
00071 if( p.lgEOL() )
00072 {
00073 fprintf( ioQQQ, " There must be at least 2 numbers on this line.\n" );
00074 fprintf( ioQQQ, " The ratio, and one or two energies\n" );
00075 cdEXIT(EXIT_FAILURE);
00076 }
00077
00078 rfield.range[p.m_nqh][1] = p.FFmtRead();
00079
00080 if( p.lgEOL() )
00081 rfield.range[p.m_nqh][1] = rfield.range[p.m_nqh][0];
00082
00083 if( rfield.range[p.m_nqh][0] < rfield.emm ||
00084 rfield.range[p.m_nqh][1] < rfield.emm )
00085 {
00086 fprintf( ioQQQ, " One of the energies is too low, outside the range of the code.\n" );
00087 cdEXIT(EXIT_FAILURE);
00088 }
00089 if( rfield.range[p.m_nqh][0] > rfield.egamry ||
00090 rfield.range[p.m_nqh][1] > rfield.egamry )
00091 {
00092 fprintf( ioQQQ, " One of the energies is too high, outside the range of the code.\n" );
00093 cdEXIT(EXIT_FAILURE);
00094 }
00095 }
00096
00097
00098 if( p.nMatch( "TIME" ) )
00099 rfield.lgTimeVary[p.m_nqh] = true;
00100
00101
00102 if( optimize.lgVarOn )
00103 {
00104
00105 optimize.nvfpnt[optimize.nparm] = input.nRead;
00106 if( lgAoxOn )
00107 {
00108
00109 optimize.nvarxt[optimize.nparm] = 1;
00110
00111 strcpy( optimize.chVarFmt[optimize.nparm], "RATIO alphox %f" );
00112 optimize.lgOptimizeAsLinear[optimize.nparm] = true;
00113
00114 optimize.vparm[0][optimize.nparm] = (realnum)aox;
00115 optimize.vincr[optimize.nparm] = 0.2f;
00116 }
00117 else
00118 {
00119
00120 optimize.nvarxt[optimize.nparm] = 3;
00121 strcpy( optimize.chVarFmt[optimize.nparm], "RATIO LOG %f %f %f" );
00122
00123 optimize.vparm[0][optimize.nparm] = (realnum)log10(rfield.totpow[p.m_nqh]);
00124 optimize.vparm[1][optimize.nparm] = (realnum)rfield.range[p.m_nqh][0];
00125 optimize.vparm[2][optimize.nparm] = (realnum)rfield.range[p.m_nqh][1];
00126 optimize.vincr[optimize.nparm] = 0.2f;
00127 }
00128 if( rfield.lgTimeVary[p.m_nqh] )
00129 strcat( optimize.chVarFmt[optimize.nparm], " TIME" );
00130 ++optimize.nparm;
00131 }
00132
00133 ++p.m_nqh;
00134 if( p.m_nqh >= LIMSPC )
00135 {
00136 fprintf( ioQQQ, " Too many continua entered; increase LIMSPC\n" );
00137 cdEXIT(EXIT_FAILURE);
00138 }
00139
00140 return;
00141 }
00142 #if defined(__HP_aCC)
00143 #pragma OPTIMIZE OFF
00144 #pragma OPTIMIZE ON
00145 #endif