00001
00002
00003
00004 #include "cddefines.h"
00005 #include "conv.h"
00006 #include "input.h"
00007 #include "called.h"
00008 #include "version.h"
00009 #include "prt.h"
00010 #include "trace.h"
00011 #include "grains.h"
00012 #include "parse.h"
00013 #include "punch.h"
00014 #include "optimize.h"
00015 #include "grid.h"
00016
00017
00018 bool grid_do(void)
00019 {
00020 char chLine[INPUT_LINE_LENGTH],
00021 chNote[8];
00022 long int i,
00023 ii,
00024 j,
00025 nint;
00026 float ptem[LIMPAR];
00027
00028 DEBUG_ENTRY( "grid_do()" );
00029
00030
00031
00032
00033
00034
00035
00036 for( i=0; i < LIMPAR; i++ )
00037 {
00038 optimize.OptIncrm[i] = 0.;
00039 optimize.varang[i][0] = -FLT_MAX;
00040 optimize.varang[i][1] = FLT_MAX;
00041
00042 strcpy( optimize.chVarFmt[i], "error - no optimizer line image was set" );
00043 }
00044
00045
00046 optimize.nIterOptim = 20;
00047 optimize.ioOptim = NULL;
00048 optimize.OptGlobalErr = 0.10f;
00049 optimize.nlobs = 0;
00050 optimize.nTempObs = 0;
00051 optimize.ncobs = 0;
00052 optimize.nRangeSet = 0;
00053 strcpy( optimize.chOptRtn, "SUBP" );
00054
00055
00056 optimize.lgOptLin = false;
00057 optimize.lgOptLum = false;
00058 optimize.lgOptCol = false;
00059 optimize.lgOptTemp = false;
00060
00061
00062 optimize.lgTrOpt = false;
00063
00064 optimize.lgOptimFlow = false;
00065 optimize.optint = 0.;
00066 optimize.optier = 0.;
00067 # ifdef __unix
00068 optimize.lgParallel = true;
00069 # else
00070 optimize.lgParallel = false;
00071 # endif
00072 optimize.lgOptCont = false;
00073
00074
00075 prt.lgFaintOn = false;
00076 conv.LimFail = 1000;
00077
00078
00079
00080 punch.lgOpenUnits = true;
00081
00082
00083
00084
00085
00086 ParseCommands();
00087
00088 punch.lgPunHeader = false;
00089
00090
00091
00092 if( !grid.lgGrid )
00093 {
00094 called.lgTalk = false;
00095
00096 called.lgTalkIsOK = false;
00097 }
00098
00099
00100 ReturnGrainBins();
00101
00102 optimize.nvary = optimize.nparm;
00103
00104 if( optimize.lgOptLum )
00105 {
00106 nint = 1;
00107 }
00108 else
00109 {
00110 nint = 0;
00111 }
00112
00113
00114 if( ((optimize.nlobs + nint + optimize.nTempObs + optimize.ncobs) < 1 ) && ( grid.lgGrid == false ) )
00115 {
00116 fprintf( ioQQQ, " The input stream has vary commands, but\n" );
00117 fprintf( ioQQQ, " no observed quantities were entered. Whats up?\n" );
00118 fprintf( ioQQQ, " Use the NO VARY command to input vary options but not try to perform this.\n" );
00119 puts( "[Stop in grid_do]" );
00120 cdEXIT(EXIT_FAILURE);
00121 }
00122
00123
00124 if( optimize.nvary < 1 )
00125 {
00126 fprintf( ioQQQ, " No parameters to vary were entered. Whats up?\n" );
00127 puts( "[Stop in grid_do]" );
00128 cdEXIT(EXIT_FAILURE);
00129 }
00130
00131 if( ( strcmp(optimize.chOptRtn,"XSPE") == 0 ) && ( optimize.nRangeSet != optimize.nvary ) )
00132 {
00133 fprintf( ioQQQ, " Every parameter with a VARY option must have a GRID specified,\n" );
00134 fprintf( ioQQQ, " but %ld parameter(s) did not.", abs(optimize.nvary - optimize.nRangeSet) );
00135 puts( "[Stop in grid_do]" );
00136 cdEXIT(EXIT_FAILURE);
00137 }
00138
00139
00140 if( trace.lgTrOptm )
00141 {
00142 for( i=0; i < optimize.nvary; i++ )
00143 {
00144
00145 fprintf( ioQQQ, "%s\n", optimize.chVarFmt[i]);
00146
00147
00148
00149 if( optimize.nvarxt[i] == 1 )
00150 {
00151
00152 sprintf( chLine , optimize.chVarFmt[i], optimize.vparm[0][i] );
00153 }
00154
00155 else if( optimize.nvarxt[i] == 2 )
00156 {
00157
00158 sprintf( chLine , optimize.chVarFmt[i], optimize.vparm[0][i], optimize.vparm[1][i]);
00159 }
00160
00161 else if( optimize.nvarxt[i] == 3 )
00162 {
00163
00164 sprintf( chLine , optimize.chVarFmt[i],
00165 optimize.vparm[0][i], optimize.vparm[1][i] , optimize.vparm[2][i] );
00166 }
00167
00168 else if( optimize.nvarxt[i] == 4 )
00169 {
00170
00171 sprintf( chLine , optimize.chVarFmt[i],
00172 optimize.vparm[0][i], optimize.vparm[1][i] , optimize.vparm[2][i], optimize.vparm[3][i] );
00173 }
00174
00175 else if( optimize.nvarxt[i] == 5 )
00176 {
00177
00178 sprintf( chLine , optimize.chVarFmt[i],
00179 optimize.vparm[0][i], optimize.vparm[1][i] , optimize.vparm[2][i],
00180 optimize.vparm[3][i], optimize.vparm[4][i]);
00181 }
00182
00183 else
00184 {
00185 fprintf(ioQQQ,"The number of variable options on this line makes no sense to me1\n");
00186 puts( "[Stop in grid_do]" );
00187 cdEXIT(EXIT_FAILURE);
00188 }
00189
00190
00191 fprintf( ioQQQ, "%s\n", chLine );
00192 }
00193 }
00194
00195
00196 for( i=0; i < LIMPAR; i++ )
00197 {
00198 if( optimize.OptIncrm[i] != 0. )
00199 {
00200 optimize.vincr[i] = optimize.OptIncrm[i];
00201 }
00202 }
00203
00204
00205 if( strcmp(optimize.chOptRtn,"XSPE") == 0 )
00206 {
00207 fprintf( ioQQQ, " Grid Driver\n" );
00208 }
00209 else
00210 {
00211 fprintf( ioQQQ, " Optimization Driver\n" );
00212 }
00213 fprintf( ioQQQ, " Cloudy %s\n\n",version.chVersion);
00214 fprintf( ioQQQ, " **************************************%8.87s*************************************\n", version.chDate);
00215 fprintf( ioQQQ, " * *\n");
00216
00217
00218
00219
00220 for( i=0; i <= input.nSave; i++ )
00221 {
00222
00223 strcpy( chNote, " " );
00224
00225 for( j=0; j < optimize.nvary; j++ )
00226 {
00227
00228 if( i == optimize.nvfpnt[j] )
00229 {
00230
00231 strcpy( chNote, "VARY>>>" );
00232 }
00233 }
00234
00235 fprintf( ioQQQ, " %7.7s * ",chNote);
00236 j = 0;
00237
00238 while( input.chCardSav[i][j] !='\0' )
00239 {
00240 fprintf( ioQQQ, "%c", input.chCardSav[i][j] );
00241 ++j;
00242 }
00243
00244 while( j<80 )
00245 {
00246 fprintf( ioQQQ, "%c", ' ' );
00247 ++j;
00248 }
00249
00250 fprintf( ioQQQ, "*\n" );
00251 }
00252 fprintf( ioQQQ, " * *\n ***********************************************************************************\n\n\n" );
00253
00254
00255 if( optimize.lgOptimFlow )
00256 {
00257 for( j=0; j < optimize.nvary; j++ )
00258 {
00259 i = optimize.nvfpnt[j];
00260 fprintf( ioQQQ, " trace:%80.80s\n", input.chCardSav[i]);
00261 fprintf( ioQQQ, "%80.80s\n", optimize.chVarFmt[j]);
00262 fprintf( ioQQQ, " number of variables on line:%4ld\n",
00263 optimize.nvarxt[j] );
00264 fprintf( ioQQQ, " Values:" );
00265 for( ii=1; ii <= optimize.nvarxt[j]; ii++ )
00266 {
00267 fprintf( ioQQQ, "%10.2e", optimize.vparm[ii-1][j] );
00268 }
00269 fprintf( ioQQQ, "\n" );
00270 }
00271 }
00272
00273 fprintf( ioQQQ, " Up to%5ld iterations will be performed,\n",
00274 optimize.nIterOptim );
00275 fprintf( ioQQQ, " and the final version of the input file will be written to the file %s\n",
00276 chOptimFileName );
00277
00278 if( strcmp(optimize.chOptRtn,"PHYM") == 0 )
00279 {
00280 fprintf( ioQQQ, " The optimize_phymir method will be used" );
00281 if( optimize.lgParallel ) {
00282 fprintf( ioQQQ, " in parallel mode.\n The maximum no. of CPU's to be used is %1ld.\n",optimize.useCPU );
00283 }
00284 else {
00285 fprintf( ioQQQ, " in sequential mode.\n" );
00286 }
00287 }
00288
00289 else if( strcmp(optimize.chOptRtn,"SUBP") == 0 )
00290 {
00291 fprintf( ioQQQ, " Subplex method will be used.\n" );
00292 }
00293
00294 else if( strcmp(optimize.chOptRtn,"XSPE") == 0 )
00295 {
00296 fprintf( ioQQQ, " Producing XSPEC output.\n" );
00297 }
00298
00299 else
00300 {
00301 fprintf( ioQQQ, " I do not understand what method to use.\n" );
00302 fprintf( ioQQQ, " Sorry.\n" );
00303 puts( "[Stop in lgOptimize_do]" );
00304 cdEXIT(EXIT_FAILURE);
00305 }
00306
00307 fprintf( ioQQQ, "\n%4ld parameters will be varied. The first lines, and the increments are:\n",
00308 optimize.nvary );
00309
00310 for( i=0; i < optimize.nvary; i++ )
00311 {
00312 optimize.varmax[i] = -FLT_MAX;
00313 optimize.varmin[i] = FLT_MAX;
00314
00315
00316
00317
00318 if( optimize.nvarxt[i] == 1 )
00319 {
00320
00321 sprintf( chLine , optimize.chVarFmt[i], optimize.vparm[0][i] );
00322 }
00323
00324 else if( optimize.nvarxt[i] == 2 )
00325 {
00326
00327 sprintf( chLine , optimize.chVarFmt[i], optimize.vparm[0][i], optimize.vparm[1][i]);
00328 }
00329
00330 else if( optimize.nvarxt[i] == 3 )
00331 {
00332
00333 sprintf( chLine , optimize.chVarFmt[i],
00334 optimize.vparm[0][i], optimize.vparm[1][i] , optimize.vparm[2][i] );
00335 }
00336
00337 else if( optimize.nvarxt[i] == 4 )
00338 {
00339
00340 sprintf( chLine , optimize.chVarFmt[i],
00341 optimize.vparm[0][i], optimize.vparm[1][i] , optimize.vparm[2][i] , optimize.vparm[3][i] );
00342 }
00343
00344 else if( optimize.nvarxt[i] == 5 )
00345 {
00346
00347 sprintf( chLine , optimize.chVarFmt[i],
00348 optimize.vparm[0][i], optimize.vparm[1][i] , optimize.vparm[2][i],
00349 optimize.vparm[3][i] , optimize.vparm[4][i]);
00350 }
00351
00352 else
00353 {
00354 fprintf(ioQQQ,"The number of variable options on this line makes no sense to me2\n");
00355 puts( "[Stop in grid_do]" );
00356 cdEXIT(EXIT_FAILURE);
00357 }
00358
00359 fprintf( ioQQQ, "\n %s\n", chLine );
00360 fprintf( ioQQQ, " Initial increment is%6.3f, the limits are%10.2e to %10.2e\n",
00361 optimize.vincr[i], optimize.varang[i][0], optimize.varang[i][1] );
00362 }
00363
00364
00365 optimize.nOptimiz = 0;
00366
00367
00368
00369 if( strcmp(optimize.chOptRtn,"XSPE") == 0 )
00370 {
00371 for( j=0; j < optimize.nvary; j++ )
00372 {
00373
00374 ptem[j] = optimize.varang[j][0];
00375
00376
00377
00378
00379 }
00380
00381 for( j=optimize.nvary; j < LIMPAR; j++ )
00382 {
00383 ptem[j] = 0.f;
00384 grid.paramIncrements[j] = 0.f;
00385 }
00386
00387 gridXspec(ptem,optimize.nvary);
00388 for( j=0; j < optimize.nvary; j++ )
00389 {
00390 optimize.vparm[0][j] = ptem[j];
00391 }
00392
00393 fprintf( ioQQQ, " **************************************************\n" );
00394 fprintf( ioQQQ, " **************************************************\n" );
00395 fprintf( ioQQQ, " **************************************************\n" );
00396 fprintf( ioQQQ, "\n Cloudy was called %4ld times.\n\n", optimize.nOptimiz );
00397
00398
00399 fprintf( ioQQQ, "\f" );
00400
00401
00402
00403
00404
00405
00406
00407
00408 }
00409 else
00410 {
00411 lgAbort = lgOptimize_do();
00412 }
00413
00414 DEBUG_EXIT( "grid_do()" );
00415
00416 if( lgAbort )
00417 {
00418
00419 return 1;
00420 }
00421 else
00422 {
00423
00424 return 0;
00425 }
00426 }
00427