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
00039 if( grid.paramIncrements[optimize.nparm-1] <= 0. )
00040 {
00041 fprintf( ioQQQ," The increment (third parameter) must be a positive number.\n" );
00042 fprintf( ioQQQ," Sorry.\n" );
00043 cdEXIT( EXIT_FAILURE );
00044 }
00045
00046 if( grid.paramIncrements[optimize.nparm-1] > fabs( grid.paramLimits[optimize.nparm-1][1] - grid.paramLimits[optimize.nparm-1][0] ) )
00047 {
00048 fprintf( ioQQQ," The increment (third parameter) must not be greater than the difference between the limits (first and second parameters).\n" );
00049 fprintf( ioQQQ," Sorry.\n" );
00050 cdEXIT( EXIT_FAILURE );
00051 }
00052
00053 if( p.lgEOL() )
00054 {
00055 fprintf( ioQQQ," This command has changed since the definition given in Porter et al. 2006, PASP, 118, 920.\n" );
00056 fprintf( ioQQQ," The grid command now requires three parameters: lower limit, upper limit, and increment.\n" );
00057 fprintf( ioQQQ," The keywords RANGE and STEPS are no longer necessary.\n" );
00058 fprintf( ioQQQ," Sorry.\n" );
00059 cdEXIT( EXIT_FAILURE );
00060 }
00061 else
00062 {
00063 ++optimize.nRangeSet;
00064 }
00065
00066
00067 if( grid.paramLimits[optimize.nparm-1][1] < grid.paramLimits[optimize.nparm-1][0] )
00068 {
00069 realnum temp = grid.paramLimits[optimize.nparm-1][0];
00070 grid.paramLimits[optimize.nparm-1][0] = grid.paramLimits[optimize.nparm-1][1];
00071 grid.paramLimits[optimize.nparm-1][1] = temp;
00072 }
00073
00074 ASSERT( grid.paramLimits[optimize.nparm-1][1] - grid.paramLimits[optimize.nparm-1][0] > 0. );
00075
00076 realnum ratio =
00077 (grid.paramLimits[optimize.nparm-1][1] - grid.paramLimits[optimize.nparm-1][0])/
00078 grid.paramIncrements[optimize.nparm-1];
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.1f*grid.paramIncrements[optimize.nparm-1];
00106
00107 if( grid.lgLinearIncrements[optimize.nparm-1] )
00108 {
00109 optimize.varang[optimize.nparm-1][0] = log10(grid.paramLimits[optimize.nparm-1][0]-safety);
00110 optimize.varang[optimize.nparm-1][1] = log10(grid.paramLimits[optimize.nparm-1][1]+safety);
00111 }
00112 else
00113 {
00114 optimize.varang[optimize.nparm-1][0] = grid.paramLimits[optimize.nparm-1][0]-safety;
00115 optimize.varang[optimize.nparm-1][1] = grid.paramLimits[optimize.nparm-1][1]+safety;
00116 }
00117 }
00118
00119 return;
00120 }