30 fprintf(
ioQQQ,
"\n" );
31 fprintf(
ioQQQ,
" ConvEdenIoniz entered\n" );
36 " ConvEdenIoniz called, entering eden loop using solver %s.\n",
49 double n1, error1, n2, error2;
52 bool lgHysteresis =
false;
54 for(
int n=0; n < 3; ++n )
56 const int DEF_ITER = 10;
71 NeTrack.
add( n1, error1 );
75 else if( abs(
safe_div( error1, n1 )) < factor )
78 n2 = ( error1 > 0. ) ? n1*(1.-factor) : n1*(1.+factor);
85 NeTrack.
add( n2, error2 );
90 while( error1*error2 > 0. && j++ < DEF_ITER )
94 double deriv = NeTrack.
deriv(5);
96 double step =
safe_div( -1.2*error1, deriv, 0. );
97 step =
sign(
min( abs(step), factor*n1 ), step );
100 NeTrack.
add( n2, error2 );
105 fprintf(
ioQQQ,
" ConvEdenIoniz: bracket failure 1 n1: %e %e n2: %e %e\n",
106 n1, error1, n2, error2 );
112 while( error1*error2 > 0. && j++ < 20*DEF_ITER )
116 n2 = ( error1 > 0. ) ? n1*(1.-factor) : n1*(1.+factor);
118 NeTrack.
add( n2, error2 );
123 fprintf(
ioQQQ,
" ConvEdenIoniz: bracket failure 2 n1: %e %e n2: %e %e\n",
124 n1, error1, n2, error2 );
131 if( NeTrack.
init_bracket( n1, error1, n2, error2 ) == 0 )
137 NeTrack.
set_tol(2.*DBL_EPSILON*n2);
139 double NeNew = 0.5*(n1+n2);
140 for(
int i = 0; i < (1<<(n/2))*DEF_ITER; i++ )
157 if( abs(nBound) >= 3 )
161 fprintf(
ioQQQ,
" ConvEdenIoniz: hysteresis detected\n" );
172 fprintf(
ioQQQ,
" ConvEdenIoniz: brent fails\n" );
179 fprintf(
ioQQQ,
" ConvEdenIoniz: entry eden %.4e -> %.4e rel chng %.2f%% accuracy %.2f%%\n",
182 fprintf(
ioQQQ,
" ConvEdenIoniz returns converged=%c reason %s\n",
216 for(
int i=0; i < 5; ++i )
228 fprintf(
ioQQQ,
" EdenError: eden %.4e EdenTrue %.4e rel. err. %.4e\n",
sys_float safe_div(sys_float x, sys_float y, sys_float res_0by0)
bool fp_equal(sys_float x, sys_float y, int n=3)
#define DEBUG_ENTRY(funcname)
int in_bounds(double x) const
void add(double x, double fx)
void print_history() const
double bracket_width() const
int init_bracket(double x1, double fx1, double x2, double fx2)
double deriv(int n, double &sigma) const
void EdenChange(double EdenNew)
STATIC double EdenError(double eden)
void incrementCounter(const counter_type type)
void setConvIonizFail(const char *reason, double oldval, double newval)
const char * chConvIoniz() const