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 "init.h"
00010 #include "prt.h"
00011 #include "trace.h"
00012 #include "grainvar.h"
00013 #include "parse.h"
00014 #include "save.h"
00015 #include "optimize.h"
00016 #include "grid.h"
00017
00018
00019 bool grid_do()
00020 {
00021 char chLine[INPUT_LINE_LENGTH],
00022 chNote[8];
00023 long int i,
00024 ii,
00025 j;
00026 realnum ptem[LIMPAR];
00027
00028 DEBUG_ENTRY( "grid_do()" );
00029
00030
00031
00032
00033
00034
00035
00036 optimize.nOptimiz = 0;
00037
00038
00039 for( i=0; i < LIMPAR; i++ )
00040 {
00041 optimize.OptIncrm[i] = 0.;
00042 optimize.varang[i][0] = -FLT_MAX;
00043 optimize.varang[i][1] = FLT_MAX;
00044
00045 strcpy( optimize.chVarFmt[i], "error - no optimizer line image was set" );
00046 }
00047
00048
00049 prt.lgFaintOn = false;
00050 conv.LimFail = 1000;
00051
00052
00053
00054
00055 InitDefaultsPreparse();
00056
00057
00058
00059
00060
00061 ParseCommands();
00062
00063
00064 gv.clear();
00065
00066 optimize.nvary = optimize.nparm;
00067
00068
00069 for( i=0; i < LIMPAR; i++ )
00070 {
00071 if( optimize.OptIncrm[i] != 0. )
00072 {
00073 optimize.vincr[i] = optimize.OptIncrm[i];
00074 }
00075 }
00076
00077 if( called.lgTalk )
00078 {
00079
00080 unsigned long nObsQuant = optimize.xLineInt_Obs.size() + optimize.ContNFnu.size() +
00081 optimize.temp_obs.size() + optimize.ColDen_Obs.size();
00082 if( optimize.lgOptLum )
00083 nObsQuant++;
00084 if( optimize.lgOptDiam )
00085 nObsQuant++;
00086 if( nObsQuant == 0 && !grid.lgGrid )
00087 {
00088 fprintf( ioQQQ, " The input stream has vary commands, but\n" );
00089 fprintf( ioQQQ, " no observed quantities were entered. Whats up?\n" );
00090 fprintf( ioQQQ, " Use the NO VARY command if you intended to disable optimization.\n" );
00091 cdEXIT(EXIT_FAILURE);
00092 }
00093
00094
00095 if( optimize.nvary < 1 )
00096 {
00097 fprintf( ioQQQ, " No parameters to vary were entered. Whats up?\n" );
00098 cdEXIT(EXIT_FAILURE);
00099 }
00100
00101 if( optimize.nvary > long(nObsQuant) && !grid.lgGrid )
00102 {
00103 fprintf( ioQQQ, " PROBLEM - More parameters are varied then there are observables.\n" );
00104 fprintf( ioQQQ, " PROBLEM - This run may not converge as a result.\n" );
00105 fprintf( ioQQQ, " PROBLEM - Please reduce the number of free parameters,"
00106 " or add more observables.\n" );
00107 }
00108
00109 if( strcmp(optimize.chOptRtn,"XSPE") == 0 && optimize.nRangeSet != optimize.nvary )
00110 {
00111 fprintf( ioQQQ, " Every parameter with a VARY option must have a GRID specified,\n" );
00112 fprintf( ioQQQ, " and the GRID must be specified after the VARY option.\n" );
00113 fprintf( ioQQQ, " These requirements were not satisfied for %ld parameter(s).\n",
00114 abs(optimize.nvary - optimize.nRangeSet) );
00115 cdEXIT(EXIT_FAILURE);
00116 }
00117
00118
00119 if( trace.lgTrOptm )
00120 {
00121 for( i=0; i < optimize.nvary; i++ )
00122 {
00123
00124 fprintf( ioQQQ, "%s\n", optimize.chVarFmt[i]);
00125
00126
00127
00128 if( optimize.nvarxt[i] == 1 )
00129 {
00130
00131 sprintf( chLine, optimize.chVarFmt[i], optimize.vparm[0][i] );
00132 }
00133
00134 else if( optimize.nvarxt[i] == 2 )
00135 {
00136
00137 sprintf( chLine, optimize.chVarFmt[i], optimize.vparm[0][i],
00138 optimize.vparm[1][i]);
00139 }
00140
00141 else if( optimize.nvarxt[i] == 3 )
00142 {
00143
00144 sprintf( chLine, optimize.chVarFmt[i],
00145 optimize.vparm[0][i], optimize.vparm[1][i], optimize.vparm[2][i] );
00146 }
00147
00148 else if( optimize.nvarxt[i] == 4 )
00149 {
00150
00151 sprintf( chLine, optimize.chVarFmt[i],
00152 optimize.vparm[0][i], optimize.vparm[1][i], optimize.vparm[2][i],
00153 optimize.vparm[3][i] );
00154 }
00155
00156 else if( optimize.nvarxt[i] == 5 )
00157 {
00158
00159 sprintf( chLine, optimize.chVarFmt[i],
00160 optimize.vparm[0][i], optimize.vparm[1][i], optimize.vparm[2][i],
00161 optimize.vparm[3][i], optimize.vparm[4][i]);
00162 }
00163
00164 else
00165 {
00166 fprintf(ioQQQ,"The number of variable options on this line makes no sense to me1\n");
00167 cdEXIT(EXIT_FAILURE);
00168 }
00169
00170
00171 fprintf( ioQQQ, "%s\n", chLine );
00172 }
00173 }
00174
00175
00176 if( strcmp(optimize.chOptRtn,"XSPE") == 0 )
00177 fprintf( ioQQQ, "%58cGrid Driver\n", ' ' );
00178 else
00179 fprintf( ioQQQ, "%54cOptimization Driver\n", ' ' );
00180 int indent = (int)((122 - strlen(t_version::Inst().chVersion))/2);
00181 fprintf( ioQQQ, "%*cCloudy %s\n\n",indent,' ',t_version::Inst().chVersion);
00182 fprintf( ioQQQ, "%23c**************************************%7.7s**************************************\n",
00183 ' ', t_version::Inst().chDate );
00184 fprintf( ioQQQ, "%23c*%81c*\n", ' ', ' ' );
00185
00186
00187
00188 for( i=0; i <= input.nSave; i++ )
00189 {
00190
00191 strcpy( chNote, " " );
00192
00193 for( j=0; j < optimize.nvary; j++ )
00194 {
00195
00196 if( i == optimize.nvfpnt[j] )
00197 {
00198
00199 strcpy( chNote, "VARY>>>" );
00200 }
00201 }
00202
00203 fprintf( ioQQQ, "%22.7s * %-80s*\n", chNote, input.chCardSav[i] );
00204 }
00205 fprintf( ioQQQ, "%23c*%81c*\n", ' ', ' ' );
00206 fprintf( ioQQQ, "%23c***********************************************************************************\n\n\n", ' ' );
00207
00208
00209 if( optimize.lgOptimFlow )
00210 {
00211 for( j=0; j < optimize.nvary; j++ )
00212 {
00213 i = optimize.nvfpnt[j];
00214 fprintf( ioQQQ, " trace:%80.80s\n", input.chCardSav[i]);
00215 fprintf( ioQQQ, "%80.80s\n", optimize.chVarFmt[j]);
00216 fprintf( ioQQQ, " number of variables on line:%4ld\n",
00217 optimize.nvarxt[j] );
00218 fprintf( ioQQQ, " Values:" );
00219 for( ii=1; ii <= optimize.nvarxt[j]; ii++ )
00220 {
00221 fprintf( ioQQQ, "%10.2e", optimize.vparm[ii-1][j] );
00222 }
00223 fprintf( ioQQQ, "\n" );
00224 }
00225 }
00226
00227 if( strcmp(optimize.chOptRtn,"PHYM") == 0 )
00228 {
00229 fprintf( ioQQQ, " Up to %ld iterations will be performed,\n",
00230 optimize.nIterOptim );
00231 fprintf( ioQQQ, " and the final version of the input file will be written to the file %s\n",
00232 chOptimFileName );
00233
00234 fprintf( ioQQQ, " The Phymir method will be used" );
00235 if( optimize.lgParallel )
00236 {
00237 if( cpu.i().lgMPI() )
00238 fprintf( ioQQQ, " in MPI mode.\n" );
00239 else
00240 fprintf( ioQQQ, " in parallel mode.\n" );
00241
00242 fprintf( ioQQQ, " The maximum no. of CPU's to be used is %ld.\n",
00243 optimize.useCPU );
00244 }
00245 else
00246 fprintf( ioQQQ, " in sequential mode.\n" );
00247 }
00248
00249 else if( strcmp(optimize.chOptRtn,"SUBP") == 0 )
00250 {
00251 fprintf( ioQQQ, " Up to %ld iterations will be performed,\n",
00252 optimize.nIterOptim );
00253 fprintf( ioQQQ, " and the final version of the input file will be written to the file %s\n",
00254 chOptimFileName );
00255
00256 fprintf( ioQQQ, " The Subplex method will be used.\n" );
00257 }
00258
00259 else if( strcmp(optimize.chOptRtn,"XSPE") == 0 )
00260 {
00261 fprintf( ioQQQ, " Producing grid output.\n" );
00262 }
00263
00264 else
00265 {
00266 fprintf( ioQQQ, " I do not understand what method to use.\n" );
00267 fprintf( ioQQQ, " Sorry.\n" );
00268 cdEXIT(EXIT_FAILURE);
00269 }
00270
00271 fprintf( ioQQQ, "\n %ld parameter(s) will be varied. The first lines, and the increments are:\n",
00272 optimize.nvary );
00273
00274 for( i=0; i < optimize.nvary; i++ )
00275 {
00276 optimize.varmax[i] = -FLT_MAX;
00277 optimize.varmin[i] = FLT_MAX;
00278
00279
00280
00281
00282 if( optimize.nvarxt[i] == 1 )
00283 {
00284
00285 sprintf( chLine, optimize.chVarFmt[i], optimize.vparm[0][i] );
00286 }
00287
00288 else if( optimize.nvarxt[i] == 2 )
00289 {
00290
00291 sprintf( chLine, optimize.chVarFmt[i], optimize.vparm[0][i], optimize.vparm[1][i]);
00292 }
00293
00294 else if( optimize.nvarxt[i] == 3 )
00295 {
00296
00297 sprintf( chLine, optimize.chVarFmt[i],
00298 optimize.vparm[0][i], optimize.vparm[1][i], optimize.vparm[2][i] );
00299 }
00300
00301 else if( optimize.nvarxt[i] == 4 )
00302 {
00303
00304 sprintf( chLine, optimize.chVarFmt[i],
00305 optimize.vparm[0][i], optimize.vparm[1][i], optimize.vparm[2][i],
00306 optimize.vparm[3][i] );
00307 }
00308
00309 else if( optimize.nvarxt[i] == 5 )
00310 {
00311
00312 sprintf( chLine, optimize.chVarFmt[i],
00313 optimize.vparm[0][i], optimize.vparm[1][i], optimize.vparm[2][i],
00314 optimize.vparm[3][i], optimize.vparm[4][i]);
00315 }
00316
00317 else
00318 {
00319 fprintf(ioQQQ,"The number of variable options on this line makes no sense to me2\n");
00320 cdEXIT(EXIT_FAILURE);
00321 }
00322
00323 fprintf( ioQQQ, "\n %s\n", chLine );
00324 if( strcmp(optimize.chOptRtn,"XSPE") == 0 )
00325 fprintf( ioQQQ, " %s increment is %.3g, the limits are %.3g to %.3g\n",
00326 grid.lgLinearIncrements[i] ? "Linear" : "Log",
00327 grid.paramIncrements[i], grid.paramLimits[i][0], grid.paramLimits[i][1] );
00328 else
00329 fprintf( ioQQQ, " Initial increment is %.3g, the limits are %.3g to %.3g\n",
00330 optimize.vincr[i], optimize.varang[i][0], optimize.varang[i][1] );
00331 }
00332 }
00333
00334 if( strcmp(optimize.chOptRtn,"XSPE") == 0 )
00335 {
00336 if( called.lgTalk )
00337 {
00338 if( cpu.i().lgMPI() )
00339 fprintf( ioQQQ, "\n Running in MPI grid mode on %ld CPUs. ", cpu.i().nCPU() );
00340 else
00341 fprintf( ioQQQ, "\n Running in single-CPU grid mode. " );
00342 fprintf( ioQQQ, "I will now start to write the input files.\n\n" );
00343 }
00344
00345 for( j=0; j < optimize.nvary; j++ )
00346 ptem[j] = grid.paramLimits[j][0];
00347 for( j=optimize.nvary; j < LIMPAR; j++ )
00348 {
00349 ptem[j] = 0.f;
00350 grid.paramIncrements[j] = 0.f;
00351 grid.lgLinearIncrements[j] = false;
00352 }
00353
00354 gridXspec(ptem,optimize.nvary);
00355
00356 if( called.lgTalk )
00357 {
00358 fprintf( ioQQQ, " **************************************************\n" );
00359 fprintf( ioQQQ, " **************************************************\n" );
00360 fprintf( ioQQQ, " **************************************************\n" );
00361 fprintf( ioQQQ, "\n Writing input files has been completed.\n\n\n" );
00362 }
00363 }
00364 else
00365 {
00366 called.lgTalk = false;
00367
00368 called.lgTalkIsOK = false;
00369
00370 lgAbort = lgOptimize_do();
00371 }
00372
00373 return lgAbort;
00374 }