31 if( accuracy > 1 ) accuracy = 1.;
47 void *argList,
double accuracy,
int checkForRoots,
int biSectionMax ) {
58 for( i = 1; i < n; i++ ) {
59 if( xs[i-1] >= xs[i] ) {
61 "Non-ascending domain values: xs[%d] = %.17e >= xs[%d] = %.17e.",
62 (
int) (i-1), xs[i-1], (
int) i, xs[i] );
68 if( func( smr, x1, &y1, argList ) !=
nfu_Okay ) {
72 for( i = 1; i < n; i++ ) {
75 if( func( smr, x2, &y2, argList ) !=
nfu_Okay )
goto Err;
76 if( ptwXY_createFromFunctionBisect( smr, ptwXY, x1, y1, x2, y2, func, argList, 0, checkForRoots, eps ) !=
nfu_Okay )
goto Err;
84 for( i = ptwXY->
length - 1, p2 = NULL; i >= 0; i--, p2 = p1 ) {
87 if( ( p1->
y * p2->
y ) < 0. ) {
88 if( ptwXY_createFromFunctionZeroCrossing( smr, ptwXY, p1->
x, p1->
y, p2->
x, p2->
y, func, argList, eps ) !=
nfu_Okay )
goto Err;
105 void *argList,
double accuracy,
int checkForRoots,
int biSectionMax ) {
108 checkForRoots, biSectionMax );
124 x = 0.5 * ( x1 + x2 );
129 if( ( status = func( smr, x, &f, argList ) ) !=
nfu_Okay )
return( status );
130 if( fabs( f - y ) <= 0.8 * fabs( f * ptwXY->
accuracy ) )
return(
nfu_Okay );
131 if( ptwXY_createFromFunctionBisect( smr, ptwXY, x1, y1, x, f, func, argList, level + 1, checkForRoots, eps ) )
return( status );
133 return( ptwXY_createFromFunctionBisect( smr, ptwXY, x, f, x2, y2, func, argList, level + 1, checkForRoots, eps ) );
145 for( i = 0; i < 16; i++ ) {
146 if( y2 == y1 )
break;
147 x = ( y2 * x1 - y1 * x2 ) / ( y2 - y1 );
148 if( x <= x1 ) x = x1 + 0.1 * ( x2 - x1 );
149 if( x >= x2 ) x = x2 - 0.1 * ( x2 - x1 );
150 if( ( status = func( smr, x, &y, argList ) ) !=
nfu_Okay )
return( status );
166 void *argList,
int checkForRoots ) {
168 int64_t i, originalLength = ptwXY1->
length, notFirstPass = 0;
185 for( i = originalLength - 1; i >= 0; i-- ) {
187 if( ( status = func( smr, &(ptwXY1->
points[i]), argList ) ) !=
nfu_Okay ) {
193 if( ptwXY_applyFunction2( smr, ptwXY1, y1, y2, &p1, &p2, func, argList, 0, checkForRoots ) !=
nfu_Okay )
goto Err;
218 if( level >= ptwXY1->
biSectionMax )
goto checkForZeroCrossing;
219 p.
x = 0.5 * ( p1->
x + p2->
x );
225 if( ( status = func( smr, &p, argList ) ) !=
nfu_Okay )
return( status );
226 if( fabs( ( p.
x - p1->
x ) * ( p2->
y - p1->
y ) + ( p2->
x - p1->
x ) * ( p1->
y - p.
y ) ) <= 0.8 * fabs( ( p2->
x - p1->
x ) * p.
y * ptwXY1->
accuracy ) )
227 goto checkForZeroCrossing;
229 if( ( status = ptwXY_applyFunction2( smr, ptwXY1, y1, y, p1, &p, func, argList, level + 1, checkForRoots ) ) )
return( status );
230 return( ptwXY_applyFunction2( smr, ptwXY1, y, y2, &p, p2, func, argList, level + 1, checkForRoots ) );
233 if( checkForRoots && ( ( p1->
y * p2->
y ) < 0. ) )
234 return( ptwXY_applyFunctionZeroCrossing( smr, ptwXY1, y1, y2, p1, p2, func, argList ) );
244 double y, x1 = p1->
x, x2 = p2->
x, nY1 = p1->
y, nY2 = p2->
y, refY = 0.5 * ( fabs( p1->
y ) + fabs( p2->
y ) );
248 for( i = 0; i < 6; i++ ) {
249 if( nY2 == nY1 )
break;
250 p.
x = ( nY2 * x1 - nY1 * x2 ) / ( nY2 - nY1 );
251 if( p.
x <= x1 ) p.
x = 0.5 * ( x1 + x2 );
252 if( p.
x >= x2 ) p.
x = 0.5 * ( x1 + x2 );
258 if( ( status = func( smr, &p, argList ) ) !=
nfu_Okay )
return( status );
259 if( p.
y == 0 )
break;
260 if( 0.5 * refY < fabs( p.
y ) )
break;
262 if( p1->
y * p.
y < 0 ) {
276 char const *interpolationString,
double biSectionMax,
double accuracy,
char **endCharacter,
int useSystem_strtod ) {
278 int64_t numberConverted;
282 if( ( doublePtr =
nfu_stringToListOfDoubles( smr, str, sep, &numberConverted, endCharacter, useSystem_strtod ) ) == NULL ) {
286 if( ( numberConverted % 2 ) == 0 ) {
287 ptwXY =
ptwXY_create( smr, interpolation, interpolationString, biSectionMax, accuracy, numberConverted / 2, 10, numberConverted / 2, doublePtr, 0 ); }
305 fprintf( f,
"status = %d interpolation = %d length = %d allocatedSize = %d\n",
307 fprintf( f,
"userFlag = %d biSectionMax = %.8e accuracy = %.2e minFractional_dx = %.6e\n",
310 fprintf( f,
" overflowLength = %d overflowAllocatedSize = %d mallocFailedSize = %d\n",
312 fprintf( f,
" Points data, points = %20p\n", ( printPointersAsNull ? NULL : ptwXY->
points ) );
313 for( i = 0; i < n1; i++, point++ ) fprintf( f,
" %14.7e %14.7e\n", point->
x, point->
y );
314 fprintf( f,
" Overflow points data; %20p\n", ( printPointersAsNull ? NULL : &(ptwXY->
overflowHeader) ) );
316 fprintf( f,
" %14.7e %14.7e %8d %20p %20p %20p\n", overflowPoint->
point.
x, overflowPoint->
point.
y, (
int) overflowPoint->
index,
317 ( printPointersAsNull ? NULL : overflowPoint ), ( printPointersAsNull ? NULL : overflowPoint->prior ),
318 ( printPointersAsNull ? NULL : overflowPoint->next ) );
320 fprintf( f,
" Points in order\n" );
321 for( i = 0; i < ptwXY->
length; i++ ) {
323 fprintf( f,
" %14.7e %14.7e\n", point->
x, point->
y );
334 for( i = 0; i < ptwXY->
length; i++ ) {
336 fprintf( f, format, point->
x, point->
y );
double * nfu_stringToListOfDoubles(statusMessageReporting *smr, char const *str, char sep, int64_t *numberConverted, char **endCharacter, int useSystem_strtod)
enum nfu_status_e nfu_status
#define ptwXY_minAccuracy
nfu_status ptwXY_setValueAtX(statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, double y)
nfu_status(* ptwXY_createFromFunction_callback)(statusMessageReporting *smr, double x, double *y, void *argList)
int64_t ptwXY_getNonOverflowLength(statusMessageReporting *smr, ptwXYPoints const *ptwXY)
struct ptwXYOverflowPoint_s ptwXYOverflowPoint
nfu_status(* ptwXY_applyFunction_callback)(statusMessageReporting *smr, ptwXYPoint *point, void *argList)
enum ptwXY_interpolation_e ptwXY_interpolation
@ ptwXY_interpolationFlat
@ ptwXY_interpolationLinLin
@ ptwXY_interpolationOther
struct ptwXYPoints_s ptwXYPoints
#define ptwXY_maxBiSectionMax
nfu_status ptwXY_interpolatePoint(statusMessageReporting *smr, ptwXY_interpolation interpolation, double x, double *y, double x1, double y1, double x2, double y2)
ptwXYPoints * ptwXY_new(statusMessageReporting *smr, ptwXY_interpolation interpolation, char const *interpolationString, double biSectionMax, double accuracy, int64_t primarySize, int64_t secondarySize, int userFlag)
#define ClosestAllowXFactor
struct ptwXYPoint_s ptwXYPoint
ptwXYPoints * ptwXY_free(ptwXYPoints *ptwXY)
ptwXYPoint * ptwXY_getPointAtIndex_Unsafely(ptwXYPoints const *ptwXY, int64_t index)
ptwXYPoints * ptwXY_create(statusMessageReporting *smr, ptwXY_interpolation interpolation, char const *interpolationString, double biSectionMax, double accuracy, int64_t primarySize, int64_t secondarySize, int64_t length, double const *xy, int userFlag)
nfu_status ptwXY_simpleCoalescePoints(statusMessageReporting *smr, ptwXYPoints *ptwXY)
nfu_status ptwXY_setValueAtX_overrideIfClose(statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, double y, double eps, int override)
double ptwXY_limitAccuracy(double accuracy)
void ptwXY_showInteralStructure(ptwXYPoints *ptwXY, FILE *f, int printPointersAsNull)
ptwXYPoints * ptwXY_createFromFunction(statusMessageReporting *smr, int n, double *xs, ptwXY_createFromFunction_callback func, void *argList, double accuracy, int checkForRoots, int biSectionMax)
void ptwXY_simplePrint(ptwXYPoints *ptwXY, char const *format)
ptwXYPoints * ptwXY_createFromFunction2(statusMessageReporting *smr, ptwXPoints *xs, ptwXY_createFromFunction_callback func, void *argList, double accuracy, int checkForRoots, int biSectionMax)
void ptwXY_simpleWrite(ptwXYPoints *ptwXY, FILE *f, char const *format)
void ptwXY_update_biSectionMax(ptwXYPoints *ptwXY1, double oldLength)
nfu_status ptwXY_applyFunction(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXY_applyFunction_callback func, void *argList, int checkForRoots)
ptwXYPoints * ptwXY_fromString(statusMessageReporting *smr, char const *str, char sep, ptwXY_interpolation interpolation, char const *interpolationString, double biSectionMax, double accuracy, char **endCharacter, int useSystem_strtod)
struct ptwXPoints_s ptwXPoints
#define smr_setReportError2(smr, libraryID, code, fmt,...)
#define smr_setReportError2p(smr, libraryID, code, fmt)
#define smr_freeMemory2(p)
struct ptwXYOverflowPoint_s * next
ptwXYOverflowPoint overflowHeader
ptwXY_interpolation interpolation
int64_t overflowAllocatedSize
char const * interpolationString