cloudy  trunk
optimize_do.cpp
Go to the documentation of this file.
1 /* This file is part of Cloudy and is copyright (C)1978-2013 by Gary J. Ferland and
2  * others. For conditions of distribution and use see copyright notice in license.txt */
3 /*lgOptimize_do main driver for optimization runs*/
4 #include "cddefines.h"
5 #define NPLXMX (LIMPAR*(LIMPAR+6)+1)
6 #include "input.h"
7 #include "called.h"
8 #include "prt.h"
9 #include "save.h"
10 #include "optimize.h"
11 
12 /* called by cdDrive, this returns false if things went ok, true for disaster */
13 bool lgOptimize_do(void)
14 {
15  long int i,
16  iflag,
17  ii,
18  iworke[NPLXMX],
19  j,
20  mode,
21  need,
22  nfe,
23  np;
24  chi2_type fret;
25  realnum fx,
26  ptem[LIMPAR],
27  delta[LIMPAR],
28  toler,
29  worke[NPLXMX];
30 
31  DEBUG_ENTRY( "lgOptimize_do()" );
32 
33  /* main driver for optimization runs
34  * Drives cloudy to optimize variables;*/
35 
36  /* code originally written by R.F. Carswell, IOA Cambridge */
37 
38  toler = (realnum)log10(1. + optimize.OptGlobalErr);
39 
40  if( strcmp(optimize.chOptRtn,"PHYM") == 0 )
41  {
42  /* Phymir method */
43  for( j=0; j < optimize.nvary; j++ )
44  {
45  ptem[j] = optimize.vparm[0][j];
46  delta[j] = optimize.vincr[j];
47  }
48  /* >>chng 06 jan 02, fix uninitialized var problem detected by valgrind/purify, PvH */
49  for( j=optimize.nvary; j < LIMPAR; j++ )
50  {
51  ptem[j] = -FLT_MAX;
52  delta[j] = -FLT_MAX;
53  }
54  optimize_phymir(ptem,delta,optimize.nvary,&fret,toler);
55  for( j=0; j < optimize.nvary; j++ )
56  optimize.vparm[0][j] = ptem[j];
57  }
58 
59  else if( strcmp(optimize.chOptRtn,"SUBP") == 0 )
60  {
61  fprintf( ioQQQ, " Begin optimization with SUBPLEX\n" );
62  need = 2*optimize.nvary + optimize.nvary*(optimize.nvary + 4) + 1;
63  if( need > NPLXMX )
64  {
65  fprintf( ioQQQ, " Increase size of NPLXMX in parameter statements to handle this many variables.\n" );
66  fprintf( ioQQQ, " I need at least %5ld\n", need );
68  }
69  for( j=0; j < optimize.nvary; j++ )
70  ptem[j] = optimize.vparm[0][j];
71 
72  /* The subroutine SUBPLX input into cloudy 8/4/94.
73  * The program itself is very well commented.
74  * The mode must set to 0 for the default values.
75  * The switch iflag tells if the program terminated normally. */
76  mode = 0;
77 
78  /* >>chng 97 dec 08, remove first arg, optimize_func, since not used in routines */
80  /* the number of parameters to vary */
82  /* the relative error, single number */
83  toler,
84  /* maximum number of function evaluations before giving up */
86  /* mode of operation, we simply set to zero */
87  mode,
88  /* the initial changes in the guessed best coefficients, typically 0.2 to 1 */
90  /* a vector of nvary initial parameters that are the starting guesses for the parameters */
91  ptem,
92  /* a realnum, this is simply ignored */
93  &fx,
94  /* another parameter that is simply ignored, a long int */
95  &nfe,
96  /* a realnum that is NPLXMX long, used for working space by the routine */
97  /* an array that is 20*26 + 1 elements long, used for working space */
98  worke,
99  /* a long int that is NPLXMX long, used for working space by the routine */
100  /* an array that is 20*26 + 1 elements long, used for working space */
101  iworke,
102  /* a long int - says what happened, if -1 then exceeded nIterOptim iteration */
103  &iflag);
104 
105  if( iflag == -1 )
106  {
107  fprintf( ioQQQ, " SUBPLEX exceeding maximum iterations.\n"
108  " This can be reset with the OPTIMZE ITERATIONS command.\n" );
109  }
110 
111  for( j=0; j < optimize.nvary; j++ )
112  optimize.vparm[0][j] = ptem[j];
113 
114  if( optimize.lgOptimFlow )
115  {
116  fprintf( ioQQQ, " trace return optimize_subplex:\n" );
117  for( j=0; j < optimize.nvary; j++ )
118  {
119  fprintf( ioQQQ, " Values:" );
120  for( ii=1; ii <= optimize.nvarxt[j]; ii++ )
121  fprintf( ioQQQ, " %.2e", optimize.vparm[ii-1][j] );
122  fprintf( ioQQQ, "\n" );
123  }
124  }
125  }
126  else
127  TotalInsanity();
128 
129  // turn output back on for final model
130  called.lgTalk = cpu.i().lgMPI_talk();
132  prt.lgFaintOn = true;
133 
134  if( called.lgTalk )
135  {
136  fprintf( ioQQQ, " **************************************************\n" );
137  fprintf( ioQQQ, " **************************************************\n" );
138  fprintf( ioQQQ, " **************************************************\n" );
139  fprintf( ioQQQ, "\n Cloudy was called %4ld times.\n\n", optimize.nOptimiz );
140 
141  for( i=0; i < optimize.nvary; i++ )
142  {
143  np = optimize.nvfpnt[i];
144 
145  /* now generate the actual command with parameter */
146  if( optimize.nvarxt[i] == 1 )
147  {
148  sprintf( input.chCardSav[np], optimize.chVarFmt[i], optimize.vparm[0][i] );
149  }
150 
151  else if( optimize.nvarxt[i] == 2 )
152  {
153  sprintf( input.chCardSav[np], optimize.chVarFmt[i], optimize.vparm[0][i],
154  optimize.vparm[1][i]);
155  }
156 
157  else if( optimize.nvarxt[i] == 3 )
158  {
159  sprintf( input.chCardSav[np], optimize.chVarFmt[i],
160  optimize.vparm[0][i], optimize.vparm[1][i], optimize.vparm[2][i] );
161  }
162 
163  else if( optimize.nvarxt[i] == 4 )
164  {
165  sprintf( input.chCardSav[np], optimize.chVarFmt[i],
166  optimize.vparm[0][i], optimize.vparm[1][i], optimize.vparm[2][i],
167  optimize.vparm[3][i] );
168  }
169 
170  else if( optimize.nvarxt[i] == 5 )
171  {
172  sprintf( input.chCardSav[np], optimize.chVarFmt[i],
173  optimize.vparm[0][i], optimize.vparm[1][i], optimize.vparm[2][i],
174  optimize.vparm[3][i], optimize.vparm[4][i]);
175  }
176 
177  else
178  {
179  fprintf(ioQQQ,"The number of variable options on this line makes no sense to me.\n");
181  }
182 
183  fprintf( ioQQQ, " Optimal command: %s\n", input.chCardSav[np]);
184  fprintf( ioQQQ, " Smallest value:%10.2e Largest value:%10.2e Allowed range %10.2e to %10.2e\n",
185  optimize.varmin[i], optimize.varmax[i], optimize.varang[i][0],
186  optimize.varang[i][1] );
187  }
188  }
189 
190  if( cpu.i().lgMaster() )
191  {
192  /* save optimal parameters */
193  FILE *ioOptim = open_data( chOptimFileName, "w", AS_LOCAL_ONLY );
194  for( i=0; i <= input.nSave; i++ )
195  fprintf( ioOptim, "%s\n", input.chCardSav[i]);
196  fclose( ioOptim );
197 
198  /* recalculate values in cloudy for the best fit, and print out
199  * all the information */
200  fprintf( ioQQQ, "\f" );
201 
202  for( i=0; i < optimize.nvary; i++ )
203  ptem[i] = optimize.vparm[0][i];
204 
205  (void)optimize_func(ptem);
206  }
207 
208  return lgAbort;
209 }
t_optimize::nIterOptim
long int nIterOptim
Definition: optimize.h:205
lgAbort
bool lgAbort
Definition: cddefines.cpp:10
open_data
FILE * open_data(const char *fname, const char *mode, access_scheme scheme)
Definition: cpu.cpp:625
t_optimize::vincr
realnum vincr[LIMPAR]
Definition: optimize.h:191
t_optimize::nOptimiz
long int nOptimiz
Definition: optimize.h:246
ioQQQ
FILE * ioQQQ
Definition: cddefines.cpp:7
realnum
float realnum
Definition: cddefines.h:103
AS_LOCAL_ONLY
@ AS_LOCAL_ONLY
Definition: cpu.h:208
t_input::chCardSav
char chCardSav[NKRD][INPUT_LINE_LENGTH]
Definition: input.h:32
cpu
static t_cpu cpu
Definition: cpu.h:355
t_cpu_i::lgMaster
bool lgMaster() const
Definition: cpu.h:327
input
t_input input
Definition: input.cpp:12
t_optimize::chOptRtn
char chOptRtn[5]
Definition: optimize.h:264
NPLXMX
#define NPLXMX
Definition: optimize_do.cpp:5
t_optimize::varmax
realnum varmax[LIMPAR]
Definition: optimize.h:183
optimize
t_optimize optimize
Definition: optimize.cpp:5
t_cpu::i
t_cpu_i & i()
Definition: cpu.h:347
t_optimize::vparm
realnum vparm[LIMEXT][LIMPAR]
Definition: optimize.h:188
t_optimize::chVarFmt
char chVarFmt[LIMPAR][FILENAME_PATH_LENGTH_2]
Definition: optimize.h:263
EXIT_FAILURE
#define EXIT_FAILURE
Definition: cddefines.h:140
prt
t_prt prt
Definition: prt.cpp:10
cddefines.h
chi2_type
double chi2_type
Definition: optimize.h:49
optimize.h
lgOptimize_do
bool lgOptimize_do(void)
Definition: optimize_do.cpp:13
TotalInsanity
NORETURN void TotalInsanity(void)
Definition: service.cpp:886
t_called::lgTalk
bool lgTalk
Definition: called.h:12
t_optimize::nvarxt
long int nvarxt[LIMPAR]
Definition: optimize.h:194
t_optimize::lgOptimFlow
bool lgOptimFlow
Definition: optimize.h:248
cdEXIT
#define cdEXIT(FAIL)
Definition: cddefines.h:434
save.h
t_optimize::nvary
long int nvary
Definition: optimize.h:200
chOptimFileName
char chOptimFileName[INPUT_LINE_LENGTH]
Definition: optimize.cpp:6
t_cpu_i::lgMPI_talk
bool lgMPI_talk() const
Definition: cpu.h:328
prt.h
t_prt::lgFaintOn
bool lgFaintOn
Definition: prt.h:202
t_optimize::varang
realnum varang[LIMPAR][2]
Definition: optimize.h:198
t_input::nSave
long int nSave
Definition: input.h:46
t_optimize::OptGlobalErr
realnum OptGlobalErr
Definition: optimize.h:243
t_optimize::varmin
realnum varmin[LIMPAR]
Definition: optimize.h:184
LIMPAR
const long LIMPAR
Definition: optimize.h:61
called
t_called called
Definition: called.cpp:5
t_optimize::nvfpnt
long int nvfpnt[LIMPAR]
Definition: optimize.h:195
optimize_func
chi2_type optimize_func(const realnum param[], int grid_index=-1)
Definition: optimize_func.cpp:20
optimize_phymir
void optimize_phymir(realnum[], const realnum[], long, chi2_type *, realnum)
called.h
optimize_subplex
void optimize_subplex(long int n, double tol, long int maxnfe, long int mode, realnum scale[], realnum x[], realnum *fx, long int *nfe, realnum work[], long int iwork[], long int *iflag)
Definition: optimize_subplx.cpp:64
t_called::lgTalkIsOK
bool lgTalkIsOK
Definition: called.h:23
input.h
DEBUG_ENTRY
#define DEBUG_ENTRY(funcname)
Definition: cddefines.h:684