00001
00002
00003
00004 #include "cddefines.h"
00005 #define NPLXMX (LIMPAR*(LIMPAR+6)+1)
00006 #include "input.h"
00007 #include "called.h"
00008 #include "prt.h"
00009 #include "punch.h"
00010 #include "optimize.h"
00011
00012
00013 bool lgOptimize_do(void)
00014 {
00015 long int i,
00016 iflag,
00017 ii,
00018 iworke[NPLXMX],
00019 j,
00020 mode,
00021 need,
00022 nfe,
00023 np;
00024 float fret,
00025 fx,
00026 param[LIMPAR],
00027 ptem[LIMPAR],
00028 delta[LIMPAR],
00029 toler,
00030 worke[NPLXMX];
00031
00032
00033
00034
00035 DEBUG_ENTRY( "lgOptimize_do()" );
00036
00037
00038
00039
00040
00041
00042 toler = (float)log10(1. + optimize.OptGlobalErr);
00043
00044
00045
00046 if( strcmp(optimize.chOptRtn,"PHYM") == 0 )
00047 {
00048
00049 for( j=0; j < optimize.nvary; j++ )
00050 {
00051 ptem[j] = optimize.vparm[0][j];
00052 delta[j] = optimize.vincr[j];
00053 }
00054
00055 for( j=optimize.nvary; j < LIMPAR; j++ )
00056 {
00057 ptem[j] = -FLT_MAX;
00058 delta[j] = -FLT_MAX;
00059 }
00060 optimize_phymir(ptem,delta,optimize.nvary,&fret,toler);
00061 for( j=0; j < optimize.nvary; j++ )
00062 {
00063 optimize.vparm[0][j] = ptem[j];
00064 }
00065
00066 }
00067
00068 else if( strcmp(optimize.chOptRtn,"SUBP") == 0 )
00069 {
00070 fprintf( ioQQQ, " Begin optimization with SUBPLEX\n" );
00071 need = 2*optimize.nvary + optimize.nvary*(optimize.nvary + 4) + 1;
00072 if( need > NPLXMX )
00073 {
00074 fprintf( ioQQQ, " Increase size of NPLXMX in parameter statements to handle this many variables.\n" );
00075 fprintf( ioQQQ, " I need at least %5ld\n", need );
00076 puts( "[Stop in lgOptimize_do]" );
00077 cdEXIT(EXIT_FAILURE);
00078 }
00079 for( j=0; j < optimize.nvary; j++ )
00080 {
00081 ptem[j] = optimize.vparm[0][j];
00082 }
00083
00084
00085
00086
00087
00088 mode = 0;
00089
00090
00091 optimize_subplex(
00092
00093 optimize.nvary,
00094
00095 toler,
00096
00097 optimize.nIterOptim,
00098
00099 mode,
00100
00101 optimize.vincr,
00102
00103 ptem,
00104
00105 &fx,
00106
00107 &nfe,
00108
00109
00110 worke,
00111
00112
00113 iworke,
00114
00115 &iflag);
00116
00117 if( iflag == -1 )
00118 {
00119 fprintf( ioQQQ, " SUBPLEX exceeding maximum iterations.\n This can be reset with the OPTIMZE ITERATIONS command.\n" );
00120 }
00121
00122 for( j=0; j < optimize.nvary; j++ )
00123 {
00124 optimize.vparm[0][j] = ptem[j];
00125 }
00126
00127 if( optimize.lgOptimFlow )
00128 {
00129 fprintf( ioQQQ, " trace return optimize_subplex:\n" );
00130 for( j=0; j < optimize.nvary; j++ )
00131 {
00132 fprintf( ioQQQ, " Values:" );
00133 for( ii=1; ii <= optimize.nvarxt[j]; ii++ )
00134 {
00135 fprintf( ioQQQ, "%10.2e", optimize.vparm[ii-1][j] );
00136 }
00137 fprintf( ioQQQ, "\n" );
00138 }
00139 }
00140 }
00141 else
00142 TotalInsanity();
00143
00144
00145
00146 fprintf( ioQQQ, " **************************************************\n" );
00147 fprintf( ioQQQ, " **************************************************\n" );
00148 fprintf( ioQQQ, " **************************************************\n" );
00149 fprintf( ioQQQ, "\n Cloudy was called %4ld times.\n\n", optimize.nOptimiz );
00150
00151 for( i=0; i < optimize.nvary; i++ )
00152 {
00153 optimize.vparm[0][i] = (float)MIN2(optimize.vparm[0][i],optimize.varang[i][1]);
00154 optimize.vparm[0][i] = (float)MAX2(optimize.vparm[0][i],optimize.varang[i][0]);
00155 param[i] = optimize.vparm[0][i];
00156 np = optimize.nvfpnt[i];
00157
00158
00159
00160 if( optimize.nvarxt[i] == 1 )
00161 {
00162
00163 sprintf( input.chCardSav[np] , optimize.chVarFmt[i], optimize.vparm[0][i] );
00164 }
00165
00166 else if( optimize.nvarxt[i] == 2 )
00167 {
00168
00169 sprintf( input.chCardSav[np] , optimize.chVarFmt[i], optimize.vparm[0][i], optimize.vparm[1][i]);
00170 }
00171
00172 else if( optimize.nvarxt[i] == 3 )
00173 {
00174
00175 sprintf( input.chCardSav[np] , optimize.chVarFmt[i],
00176 optimize.vparm[0][i], optimize.vparm[1][i] , optimize.vparm[2][i] );
00177 }
00178
00179 else if( optimize.nvarxt[i] == 4 )
00180 {
00181
00182 sprintf( input.chCardSav[np] , optimize.chVarFmt[i],
00183 optimize.vparm[0][i], optimize.vparm[1][i] , optimize.vparm[2][i], optimize.vparm[3][i] );
00184 }
00185
00186 else if( optimize.nvarxt[i] == 5 )
00187 {
00188
00189 sprintf( input.chCardSav[np] , optimize.chVarFmt[i],
00190 optimize.vparm[0][i], optimize.vparm[1][i] , optimize.vparm[2][i] ,
00191 optimize.vparm[3][i] , optimize.vparm[4][i]);
00192 }
00193
00194 else
00195 {
00196 fprintf(ioQQQ,"The number of variable options on this line makes no sense to me3\n");
00197 puts( "[Stop in lgOptimize_do]" );
00198 cdEXIT(EXIT_FAILURE);
00199 }
00200
00201
00202 fprintf( ioQQQ, " Optimal command: %s\n", input.chCardSav[np]);
00203 fprintf( ioQQQ, " Smallest value:%10.2e Largest value:%10.2e Allowed range %10.2e to %10.2e\n",
00204 optimize.varmin[i], optimize.varmax[i], optimize.varang[i][0],
00205 optimize.varang[i][1] );
00206 }
00207
00208 called.lgTalk = true;
00209 called.lgTalkIsOK = true;
00210 prt.lgFaintOn = true;
00211
00212
00213 fprintf( ioQQQ, "\f" );
00214
00215
00216 if( optimize.ioOptim == NULL )
00217 {
00218
00219 optimize.ioOptim = fopen( chOptimFileName , "w" );
00220 if( optimize.ioOptim == NULL )
00221 {
00222 fprintf( ioQQQ," could not open optimal.in\n");
00223 cdEXIT(EXIT_FAILURE);
00224 }
00225 }
00226
00227 for( i=0; i <= input.nSave; i++ )
00228 {
00229 fprintf( optimize.ioOptim, "%s\n", input.chCardSav[i]);
00230 }
00231 fclose( optimize.ioOptim );
00232
00233
00234 punch.lgOpenUnits = true;
00235
00236
00237
00238 fret = (float)optimize_func(param);
00239
00240
00241 DEBUG_EXIT( "lgOptimize_do()" );
00242
00243 if( lgAbort )
00244 {
00245
00246 return true;
00247 }
00248 else
00249 {
00250
00251 return false;
00252 }
00253 }
00254