00001
00002
00003
00004
00005
00006 #include "cddefines.h"
00007 #include "punch.h"
00008 #include "warnings.h"
00009 #include "optimize.h"
00010 #include "cddrive.h"
00011 #include "rfield.h"
00012 #include "grid.h"
00013 #include "called.h"
00014 #include "prt.h"
00015
00016
00017 void gridXspec(realnum xc[], long int nInterpVars)
00018 {
00019 long int i, j, k;
00020 double averageChi2;
00021
00022 DEBUG_ENTRY( "gridXspec()" );
00023
00024 if( nInterpVars > LIMPAR )
00025 {
00026 fprintf( ioQQQ, "grid_do: too many parameters are varied, increase LIMPAR\n" );
00027 cdEXIT(EXIT_FAILURE);
00028 }
00029
00030 optimize.nOptimiz = 0;
00031 grid.nintparm = nInterpVars;
00032
00033
00034
00035 grid.naddparm = 0;
00036
00037 ASSERT( grid.nintparm + grid.naddparm <= LIMPAR );
00038
00039 grid.totNumModels = 1;
00040
00041 for( i=0; i<nInterpVars; i++ )
00042 {
00043
00044 grid.totNumModels *= grid.numParamValues[i];
00045 }
00046
00047 ASSERT( grid.totNumModels > 1 );
00048
00049 grid.paramNames = (char**)MALLOC(sizeof(char*)*(unsigned)(nInterpVars+grid.naddparm) );
00050 grid.paramMethods = (long*)MALLOC(sizeof(long)*(unsigned)(nInterpVars+grid.naddparm) );
00051 grid.paramRange = (realnum**)MALLOC(sizeof(realnum*)*(unsigned)(nInterpVars+grid.naddparm) );
00052 grid.paramData = (realnum**)MALLOC(sizeof(realnum*)*(unsigned)(nInterpVars+grid.naddparm) );
00053 grid.interpParameters = (realnum**)MALLOC(sizeof(realnum*)*(unsigned)(grid.totNumModels) );
00054
00055 grid.lgAbort = (bool*)MALLOC(sizeof(bool)*(unsigned)(grid.totNumModels) );
00056
00057 grid.lgWarn = (bool*)MALLOC(sizeof(bool)*(unsigned)(grid.totNumModels) );
00058
00059 for( i=0; i<nInterpVars+grid.naddparm; i++ )
00060 {
00061 grid.paramNames[i] = (char*)MALLOC(sizeof(char)*(unsigned)(12) );
00062 grid.paramRange[i] = (realnum*)MALLOC(sizeof(realnum)*(unsigned)(6) );
00063 grid.paramData[i] = (realnum*)MALLOC(sizeof(realnum)*(unsigned)(grid.numParamValues[i]) );
00064
00065 sprintf( grid.paramNames[i], "%s%ld", "PARAM", i+1 );
00066
00067 grid.paramMethods[i] = 0;
00068
00069 grid.paramRange[i][0] = xc[i]+grid.paramIncrements[i]*(grid.numParamValues[i]-1.f)/2.f;
00070
00071 grid.paramRange[i][1] = grid.paramIncrements[i]/10.f;
00072
00073 grid.paramRange[i][2] = xc[i]-grid.paramIncrements[i]/10.f;
00074
00075 grid.paramRange[i][3] = xc[i]-grid.paramIncrements[i]/10.f;
00076
00077 grid.paramRange[i][4] = xc[i]+grid.paramIncrements[i]*(grid.numParamValues[i]-1.f)+grid.paramIncrements[i]/10.f;
00078
00079 grid.paramRange[i][5] = xc[i]+grid.paramIncrements[i]*(grid.numParamValues[i]-1.f)+grid.paramIncrements[i]/10.f;
00080
00081 for( j=0; j<grid.numParamValues[i]; j++ )
00082 {
00083 grid.paramData[i][j] = xc[i]+grid.paramIncrements[i]*j;
00084 }
00085 }
00086
00087 for( i=0; i<grid.totNumModels; i++ )
00088 {
00089 grid.interpParameters[i] = (realnum*)MALLOC(sizeof(realnum)*(unsigned)(nInterpVars) );
00090 }
00091
00092
00093 for( i=0; i< grid.totNumModels; i++ )
00094 {
00095 realnum variableVector[LIMPAR];
00096
00097 for( j=0; j<nInterpVars; j++ )
00098 {
00099 int index;
00100 long volumeOtherDimensions = 1;
00101
00102
00103
00104
00105
00106
00107 for( k=j+1; k<nInterpVars; k++ )
00108 {
00109 volumeOtherDimensions *= grid.numParamValues[k];
00110 }
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133 index = (int)( (i/volumeOtherDimensions)%(grid.numParamValues[j]) );
00134
00135
00136 if( grid.lgStrictRepeat )
00137 variableVector[j] = xc[j];
00138 else
00139 variableVector[j] = xc[j] + grid.paramIncrements[j]*index;
00140
00141 grid.interpParameters[i][j] = variableVector[j];
00142 }
00143
00144 for( j=nInterpVars; j<LIMPAR; j++ )
00145 {
00146 variableVector[j] = xc[j];
00147 }
00148
00149 if( i == grid.totNumModels - 1 )
00150 {
00151 called.lgTalk = true;
00152 called.lgTalkIsOK = true;
00153 prt.lgFaintOn = true;
00154 grid.lgGridDone = true;
00155 }
00156
00157 averageChi2 = optimize_func(variableVector);
00158
00159
00160 if( averageChi2 < 0. && averageChi2 == 0 )
00161 fprintf( ioQQQ , "DEBUG interesting impossible print has occurred.\n");
00162
00163 }
00164 return;
00165 }
00166
00167
00168
00169 void GridGatherAfterCloudy(
00170
00171 const char *chTime)
00172 {
00173 DEBUG_ENTRY( "GridGatherAfterCloudy()" );
00174
00175 if( !grid.lgGrid )
00176 {
00177
00178 return;
00179 }
00180
00181
00182 if( chTime[0] == 'L' )
00183 {
00184 ASSERT( optimize.nOptimiz>= 0 && optimize.nOptimiz<grid.totNumModels );
00185 grid.lgAbort[optimize.nOptimiz] = lgAbort;
00186 grid.lgWarn[optimize.nOptimiz] = warnings.lgWarngs;
00187 }
00188 else if( chTime[0] != 'M' )
00189 TotalInsanity();
00190 return;
00191 }
00192
00193
00194 void GridGatherInCloudy( void )
00195 {
00196 long i;
00197 static bool lgFirstRun = true;
00198
00199 DEBUG_ENTRY( "GridGatherInCloudy()" );
00200
00201 if( !grid.lgGrid )
00202 {
00203 TotalInsanity();
00204
00205 return;
00206 }
00207
00208
00209 if( lgFirstRun )
00210 {
00211 long i1, i2;
00212 grid.numEnergies = rfield.nupper-2;
00213 grid.Energies = (realnum*)MALLOC(sizeof(realnum)*(unsigned)(grid.numEnergies) );
00214 grid.Spectra = (realnum***)MALLOC(sizeof(realnum**)*(unsigned)(NUM_OUTPUT_TYPES) );
00215
00216 for( i1=0; i1< NUM_OUTPUT_TYPES; i1++ )
00217 {
00218 if( grid.lgOutputTypeOn[i1] )
00219 {
00220 grid.Spectra[i1] = (realnum**)MALLOC(sizeof(realnum*)*(unsigned)(grid.totNumModels) );
00221 for( i2=0; i2<grid.totNumModels; i2++ )
00222 {
00223 grid.Spectra[i1][i2] = (realnum*)MALLOC(sizeof(realnum)*(unsigned)(grid.numEnergies) );
00224 }
00225 }
00226 }
00227
00228 for( i1=0; i1<grid.numEnergies; i1++ )
00229 {
00230 grid.Energies[i1] = rfield.AnuOrg[i1];
00231 }
00232 lgFirstRun = false;
00233 }
00234
00235 ASSERT( lgFirstRun == false );
00236 ASSERT( optimize.nOptimiz>=0 && optimize.nOptimiz<grid.totNumModels);
00237
00238 for( i=1; i< NUM_OUTPUT_TYPES; i++ )
00239 {
00240
00241
00242 if( grid.lgOutputTypeOn[i] )
00243 cdSPEC2( i, grid.numEnergies, grid.Spectra[i][optimize.nOptimiz]);
00244 }
00245 return;
00246 }