00001
00002
00003
00004 #include "cddefines.h"
00005 #include "optimize.h"
00006 #include "grid.h"
00007 #include "parser.h"
00008
00009
00010 void ParseGrid(
00011
00012 Parser &p)
00013 {
00014 DEBUG_ENTRY( "ParseGrid()" );
00015
00016
00017
00018 strcpy( optimize.chOptRtn, "XSPE" );
00019 grid.lgGrid = true;
00020
00021 if( p.nMatch("REPE") )
00022 {
00023
00024
00025 grid.lgStrictRepeat = true;
00026 }
00027
00028
00029
00030 if( optimize.nparm > 0 )
00031 {
00032 ASSERT( optimize.nparm <= LIMPAR );
00033
00034 grid.paramLimits[optimize.nparm-1][0] = (realnum)p.FFmtRead();
00035 grid.paramLimits[optimize.nparm-1][1] = (realnum)p.FFmtRead();
00036 grid.paramIncrements[optimize.nparm-1] = (realnum)p.FFmtRead();
00037 grid.lgLinearIncrements[optimize.nparm-1] = p.nMatch("LINE") ? true : false ;
00038 if( grid.paramIncrements[optimize.nparm-1] < realnum(0.) )
00039 grid.lgNegativeIncrements = true;
00040
00041
00042 if( grid.paramIncrements[optimize.nparm-1] == 0. )
00043 {
00044 fprintf( ioQQQ," The increment (third parameter) should not be zero.\n" );
00045 fprintf( ioQQQ," Sorry.\n" );
00046 cdEXIT( EXIT_FAILURE );
00047 }
00048
00049 if( abs( grid.paramIncrements[optimize.nparm-1] ) > abs( grid.paramLimits[optimize.nparm-1][1] - grid.paramLimits[optimize.nparm-1][0] ) )
00050 {
00051 fprintf( ioQQQ," The increment (third parameter) must not be greater than the difference between the limits (first and second parameters).\n" );
00052 fprintf( ioQQQ," Sorry.\n" );
00053 cdEXIT( EXIT_FAILURE );
00054 }
00055
00056 if( p.lgEOL() )
00057 {
00058 fprintf( ioQQQ," This command has changed since the definition given in Porter et al. 2006, PASP, 118, 920.\n" );
00059 fprintf( ioQQQ," The grid command now requires three parameters: lower limit, upper limit, and increment.\n" );
00060 fprintf( ioQQQ," The keywords RANGE and STEPS are no longer necessary.\n" );
00061 fprintf( ioQQQ," Sorry.\n" );
00062 cdEXIT( EXIT_FAILURE );
00063 }
00064 else
00065 {
00066 ++optimize.nRangeSet;
00067 }
00068
00069 realnum ratio = (grid.paramLimits[optimize.nparm-1][1] - grid.paramLimits[optimize.nparm-1][0])/
00070 grid.paramIncrements[optimize.nparm-1];
00071
00072
00073 if( ratio < realnum(0.) )
00074 {
00075 fprintf( ioQQQ, "The increment (third parameter) has the wrong sign. It doesn't take you from the initial to the final grid value (first and second parameter, resp.).\n" );
00076 fprintf( ioQQQ," Sorry.\n" );
00077 cdEXIT( EXIT_FAILURE );
00078 }
00079
00080
00081
00082
00083 realnum feps = realnum(1.5)*
00084 (grid.paramLimits[optimize.nparm-1][1] + grid.paramLimits[optimize.nparm-1][0])/
00085 (grid.paramLimits[optimize.nparm-1][1] - grid.paramLimits[optimize.nparm-1][0]);
00086 long eps = max(nint(abs(feps)),3);
00087
00088
00089 ASSERT( eps <= INT_MAX );
00090
00091
00092 if( fp_equal( ratio, realnum(nint(ratio)), int(eps) ) )
00093 grid.numParamValues[optimize.nparm-1] = nint(ratio) + 1;
00094 else
00095 grid.numParamValues[optimize.nparm-1] = long(ratio) + 1;
00096
00097 if( grid.numParamValues[optimize.nparm-1] < 2 )
00098 fprintf( ioQQQ, " NOTE must have at least two grid points\n" );
00099
00100 grid.numParamValues[optimize.nparm-1] = MAX2( 2, grid.numParamValues[optimize.nparm-1] );
00101
00102
00103
00104
00105 realnum safety = 0.001f*grid.paramIncrements[optimize.nparm-1];
00106
00107 if( grid.lgLinearIncrements[optimize.nparm-1] )
00108 {
00109 if( grid.paramLimits[optimize.nparm-1][0]-safety<=0. )
00110 {
00111 fprintf(ioQQQ,"The current implementation of the grid command works with log parameter values even when you specify LINEAR.\n");
00112 fprintf(ioQQQ,"A non-positive value was entered. The grid command cannot deal with this.\n");
00113 cdEXIT( EXIT_FAILURE );
00114 }
00115 optimize.varang[optimize.nparm-1][0] = log10(grid.paramLimits[optimize.nparm-1][0]-safety);
00116 optimize.varang[optimize.nparm-1][1] = log10(grid.paramLimits[optimize.nparm-1][1]+safety);
00117 }
00118 else
00119 {
00120 optimize.varang[optimize.nparm-1][0] = grid.paramLimits[optimize.nparm-1][0]-safety;
00121 optimize.varang[optimize.nparm-1][1] = grid.paramLimits[optimize.nparm-1][1]+safety;
00122 }
00123 }
00124
00125 return;
00126 }