30 fprintf(
ioQQQ,
"\n" );
31 fprintf(
ioQQQ,
" ConvEdenIoniz entered\n" );
33 if(
trace.nTrConvg>=3 )
36 " ConvEdenIoniz called, entering eden loop using solver %s.\n",
41 double EdenEntry =
dense.eden;
44 if( strcmp(
conv.chSolverEden ,
"vWDB" )== 0 )
46 conv.lgConvEden =
false;
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 );
103 if( error1*error2 > 0. &&
trace.nTrConvg >= 3 )
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 );
121 if( error1*error2 > 0. &&
trace.nTrConvg >= 3 )
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 )
160 if(
trace.nTrConvg >= 3 )
161 fprintf(
ioQQQ,
" ConvEdenIoniz: hysteresis detected\n" );
167 if(
conv.lgConvEden )
170 if(
trace.nTrConvg >= 3 )
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",
188 fprintf(
ioQQQ,
"ConvEdenIoniz finds insane solver %s\n",
conv.chSolverEden );