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;
51 for(
int n=0; n < 3; ++n )
53 const int DEF_ITER = 10;
55 const double factor = 0.02;
66 NeTrack.
add( n1, error1 );
70 else if( abs(
safe_div( error1, n1 )) < factor )
73 n2 = ( error1 > 0. ) ? n1*(1.-factor) : n1*(1.+factor);
80 NeTrack.
add( n2, error2 );
85 while( error1*error2 > 0. && j++ < DEF_ITER )
89 double deriv = NeTrack.
deriv(5);
91 double step =
safe_div( -1.2*error1, deriv, 0. );
92 step =
sign(
min( abs(step), factor*n1 ), step );
95 NeTrack.
add( n2, error2 );
100 fprintf(
ioQQQ,
" ConvEdenIoniz: bracket failure 1 n1: %e %e n2: %e %e\n",
101 n1, error1, n2, error2 );
107 while( error1*error2 > 0. && j++ < 20*DEF_ITER )
111 n2 = ( error1 > 0. ) ? n1*(1.-factor) : n1*(1.+factor);
113 NeTrack.
add( n2, error2 );
118 fprintf(
ioQQQ,
" ConvEdenIoniz: bracket failure 2 n1: %e %e n2: %e %e\n",
119 n1, error1, n2, error2 );
126 if( NeTrack.
init_bracket( n1, error1, n2, error2 ) == 0 )
130 NeTrack.
set_tol(2.*DBL_EPSILON*n2);
132 double NeNew = 0.5*(n1+n2);
133 for(
int i = 0; i < (1<<(n/2))*DEF_ITER; i++ )
149 fprintf(
ioQQQ,
" ConvEdenIoniz: brent fails\n" );
156 fprintf(
ioQQQ,
" ConvEdenIoniz: entry eden %.4e -> %.4e rel chng %.2f%% accuracy %.2f%%\n",
159 fprintf(
ioQQQ,
" ConvEdenIoniz returns converged=%c reason %s\n",
193 for(
int i=0; i < 5; ++i )
205 fprintf(
ioQQQ,
" EdenError: eden %.4e EdenTrue %.4e rel. err. %.4e\n",
double bracket_width() const
void add(double x, double fx)
void print_history() const
void incrementCounter(const counter_type type)
STATIC double EdenError(double eden)
bool fp_equal(sys_float x, sys_float y, int n=3)
const char * chConvIoniz() const
int init_bracket(double x1, double fx1, double x2, double fx2)
STATIC bool lgConvEden(void)
sys_float safe_div(sys_float x, sys_float y, sys_float res_0by0)
#define DEBUG_ENTRY(funcname)
double deriv(int n, double &sigma) const
void setConvIonizFail(const char *reason, double oldval, double newval)
void EdenChange(double EdenNew)