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