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 cdEXIT(EXIT_FAILURE);
00035 }
00036
00037
00038 strcpy( rfield.chRSpec[*nqh], "SQCM" );
00039 strcpy( rfield.chSpNorm[*nqh], "RATI" );
00040
00041
00042 if( nMatch("ALPH",chCard) )
00043 {
00044
00045 lgAoxOn = true;
00046
00047 i = 5;
00048 aox = FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00049
00050
00051
00052 rfield.totpow[*nqh] = pow(403.3,aox);
00053 rfield.range[*nqh][0] = 0.3645;
00054 rfield.range[*nqh][1] = 147.;
00055 }
00056
00057 else
00058 {
00059
00060 lgAoxOn = false;
00061
00062 aox = -DBL_MAX;
00063
00064 i = 5;
00065 rfield.totpow[*nqh] = FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00066
00067
00068 if( rfield.totpow[*nqh] <= 0. || nMatch(" LOG",chCard ) )
00069 {
00070 rfield.totpow[*nqh] = pow(10.,rfield.totpow[*nqh]);
00071 }
00072
00073 if( lgEOL )
00074 {
00075 fprintf( ioQQQ, " There must be a number on this line.\n" );
00076 cdEXIT(EXIT_FAILURE);
00077 }
00078
00079 rfield.range[*nqh][0] = FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00080
00081 if( lgEOL )
00082 {
00083 fprintf( ioQQQ, " There must be at least 2 numbers on this line.\n" );
00084 fprintf( ioQQQ, " The ratio, and two energies\n" );
00085 cdEXIT(EXIT_FAILURE);
00086 }
00087
00088 rfield.range[*nqh][1] = FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00089
00090
00091 if( lgEOL )
00092 {
00093 rfield.range[*nqh][1] = rfield.range[*nqh][0];
00094 }
00095
00096 if( rfield.range[*nqh][0] < rfield.emm ||
00097 rfield.range[*nqh][1] < rfield.emm )
00098 {
00099 fprintf( ioQQQ, " One of the energies is too low, outside the range of the code.\n" );
00100 cdEXIT(EXIT_FAILURE);
00101 }
00102 else if( rfield.range[*nqh][0] > rfield.egamry || rfield.range[*nqh][1] >
00103 rfield.egamry )
00104 {
00105 fprintf( ioQQQ, " One of the energies is too high, outside the range of the code.\n" );
00106 cdEXIT(EXIT_FAILURE);
00107 }
00108 }
00109
00110
00111 if( nMatch( "TIME" , chCard ) )
00112 rfield.lgTimeVary[*nqh] = true;
00113
00114
00115 if( optimize.lgVarOn )
00116 {
00117
00118 optimize.nvfpnt[optimize.nparm] = input.nRead;
00119 if( lgAoxOn )
00120 {
00121
00122 optimize.nvarxt[optimize.nparm] = 1;
00123
00124 strcpy( optimize.chVarFmt[optimize.nparm], "RATIO alphox %f" );
00125
00126 optimize.vparm[0][optimize.nparm] = (realnum)aox;
00127 optimize.vincr[optimize.nparm] = 0.2f;
00128 }
00129 else
00130 {
00131
00132 optimize.nvarxt[optimize.nparm] = 3;
00133 strcpy( optimize.chVarFmt[optimize.nparm], "RATIO LOG %f %f %f" );
00134
00135 optimize.vparm[0][optimize.nparm] = (realnum)log10(rfield.totpow[*nqh]);
00136 optimize.vparm[1][optimize.nparm] = (realnum)rfield.range[*nqh][0];
00137 optimize.vparm[2][optimize.nparm] = (realnum)rfield.range[*nqh][1];
00138 optimize.vincr[optimize.nparm] = 0.2f;
00139 }
00140 ++optimize.nparm;
00141 }
00142
00143 ++*nqh;
00144 if( *nqh >= LIMSPC )
00145 {
00146 fprintf( ioQQQ, " Too many continua entered; increase LIMSPC\n" );
00147 cdEXIT(EXIT_FAILURE);
00148 }
00149
00150 return;
00151 }
00152 #if defined(__HP_aCC)
00153 #pragma OPTIMIZE OFF
00154 #pragma OPTIMIZE ON
00155 #endif