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         realnum 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 = (realnum)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                         cdEXIT(EXIT_FAILURE);
00077                 }
00078                 for( j=0; j < optimize.nvary; j++ )
00079                 {
00080                         ptem[j] = optimize.vparm[0][j];
00081                 }
00082 
00083                 
00084 
00085 
00086 
00087                 mode = 0;
00088 
00089                 
00090                 optimize_subplex(
00091                         
00092                         optimize.nvary,
00093                         
00094                         toler,
00095                         
00096                         optimize.nIterOptim,
00097                         
00098                         mode,
00099                         
00100                         optimize.vincr,
00101                         
00102                         ptem,
00103                         
00104                         &fx,
00105                         
00106                         &nfe,
00107                         
00108                         
00109                         worke,
00110                         
00111                         
00112                         iworke,
00113                         
00114                         &iflag);
00115 
00116                 if( iflag == -1 )
00117                 {
00118                         fprintf( ioQQQ, " SUBPLEX exceeding maximum iterations.\n This can be reset with the OPTIMZE ITERATIONS command.\n" );
00119                 }
00120 
00121                 for( j=0; j < optimize.nvary; j++ )
00122                 {
00123                         optimize.vparm[0][j] = ptem[j];
00124                 }
00125 
00126                 if( optimize.lgOptimFlow )
00127                 {
00128                         fprintf( ioQQQ, " trace return optimize_subplex:\n" );
00129                         for( j=0; j < optimize.nvary; j++ )
00130                         {
00131                                 fprintf( ioQQQ, " Values:" );
00132                                 for( ii=1; ii <= optimize.nvarxt[j]; ii++ )
00133                                 {
00134                                         fprintf( ioQQQ, "%10.2e", optimize.vparm[ii-1][j] );
00135                                 }
00136                                 fprintf( ioQQQ, "\n" );
00137                         }
00138                 }
00139         }
00140         else
00141                 TotalInsanity();
00142         
00143 
00144 
00145         fprintf( ioQQQ, " **************************************************\n" );
00146         fprintf( ioQQQ, " **************************************************\n" );
00147         fprintf( ioQQQ, " **************************************************\n" );
00148         fprintf( ioQQQ, "\n Cloudy was called %4ld times.\n\n", optimize.nOptimiz );
00149 
00150         for( i=0; i < optimize.nvary; i++ )
00151         {
00152                 optimize.vparm[0][i] = (realnum)MIN2(optimize.vparm[0][i],optimize.varang[i][1]);
00153                 optimize.vparm[0][i] = (realnum)MAX2(optimize.vparm[0][i],optimize.varang[i][0]);
00154                 param[i] = optimize.vparm[0][i];
00155                 np = optimize.nvfpnt[i];
00156 
00157                 
00158 
00159                 if( optimize.nvarxt[i] == 1 )
00160                 {
00161                         
00162                         sprintf( input.chCardSav[np] , optimize.chVarFmt[i], optimize.vparm[0][i] );
00163                 }
00164 
00165                 else if( optimize.nvarxt[i] == 2 )
00166                 {
00167                         
00168                         sprintf( input.chCardSav[np] , optimize.chVarFmt[i], optimize.vparm[0][i], optimize.vparm[1][i]);
00169                 }
00170 
00171                 else if( optimize.nvarxt[i] == 3 )
00172                 {
00173                         
00174                         sprintf( input.chCardSav[np] , optimize.chVarFmt[i], 
00175                                 optimize.vparm[0][i], optimize.vparm[1][i] , optimize.vparm[2][i] );
00176                 }
00177 
00178                 else if( optimize.nvarxt[i] == 4 )
00179                 {
00180                         
00181                         sprintf( input.chCardSav[np] , optimize.chVarFmt[i], 
00182                                 optimize.vparm[0][i], optimize.vparm[1][i] , optimize.vparm[2][i], optimize.vparm[3][i] );
00183                 }
00184 
00185                 else if( optimize.nvarxt[i] == 5 )
00186                 {
00187                         
00188                         sprintf( input.chCardSav[np] , optimize.chVarFmt[i], 
00189                                 optimize.vparm[0][i], optimize.vparm[1][i] , optimize.vparm[2][i] ,
00190                                 optimize.vparm[3][i] , optimize.vparm[4][i]);
00191                 }
00192 
00193                 else
00194                 {
00195                         fprintf(ioQQQ,"The number of variable options on this line makes no sense to me.\n");
00196                         cdEXIT(EXIT_FAILURE);
00197                 }
00198 
00199 
00200                 fprintf( ioQQQ, " Optimal command: %s\n", input.chCardSav[np]);
00201                 fprintf( ioQQQ, "  Smallest value:%10.2e Largest value:%10.2e Allowed range %10.2e to %10.2e\n", 
00202                   optimize.varmin[i], optimize.varmax[i], optimize.varang[i][0], 
00203                   optimize.varang[i][1] );
00204         }
00205 
00206         called.lgTalk = true;
00207         called.lgTalkIsOK = true;
00208         prt.lgFaintOn = true;
00209 
00210         
00211         fprintf( ioQQQ, "\f" );
00212 
00213         
00214         if( optimize.ioOptim == NULL )
00215         {
00216                 
00217                 optimize.ioOptim = open_data( chOptimFileName, "w", AS_LOCAL_ONLY );
00218         }
00219 
00220         for( i=0; i <= input.nSave; i++ )
00221         {
00222                 fprintf( optimize.ioOptim, "%s\n", input.chCardSav[i]);
00223         }
00224         fclose( optimize.ioOptim );
00225 
00226         
00227 
00228         fret = (realnum)optimize_func(param);
00229 
00230 
00231         if( lgAbort )
00232         {
00233                 
00234                 return true;
00235         }
00236         else
00237         {
00238                 
00239                 return false;
00240         }
00241 }