15static double ptwXY_mod2(
double v,
double m,
int pythonMod );
17 double x1,
double y1,
double x2,
double y2,
int level );
19 double x1,
double y1,
double x2,
double y2,
int level,
int isNAN1,
int isNAN2 );
29 int64_t i, nonOverflowLength;
38 for( i = 0, p = ptwXY->
points; i < nonOverflowLength; i++, p++ ) p->
y = slope * p->
y +
offset;
100 int64_t i, nonOverflowLength;
118 for( i = 0, p = ptwXY->
points; i < nonOverflowLength; i++, p++ ) p->
y = value / p->
y;
119 for( o = overflowHeader->
next; o != overflowHeader; o = o->
next ) o->
point.
y = value / o->
point.
y;
128 int64_t i, nonOverflowLength;
142 for( i = 0, p = ptwXY->
points; i < nonOverflowLength; i++, p++ ) p->
y = ptwXY_mod2( p->
y, m, pythonMod );
143 for( o = overflowHeader->
next; o != overflowHeader; o = o->
next ) o->
point.
y = ptwXY_mod2( o->
point.
y, m, pythonMod );
149static double ptwXY_mod2(
double v,
double m,
int pythonMod ) {
151 double r = fmod( fabs( v ), fabs( m ) );
154 if( ( v * m ) < 0. ) r = fabs( m ) - fabs( r );
155 if( m < 0. ) r *= -1.; }
157 if( v < 0. ) r *= -1.;
166 double v1,
double v2,
double v1v2 ) {
185 "Source1 interpolation '%s' not same as Source2 interpolation '%s'.",
199 double domainMin1, domainMax1, domainMin2, domainMax2;
207 domainMin1, domainMax1, domainMin2, domainMax2 );
211 if( ( ptwXYNew =
ptwXY_union( smr, ptwXY1, ptwXY2, unionOptions ) ) == NULL ) {
214 for( i = 0, p = ptwXYNew->
points; i < ptwXYNew->length; i++, p++ ) {
215 if( ptwXY_getValueAtX_ignore_XOutsideDomainError( smr, ptwXY2, p->
x, &y ) !=
nfu_Okay )
goto Err;
216 p->
y = v1 * p->
y + v2 * y + v1v2 * y * p->
y;
232 if( ptwXY1->
length == 0 ) {
234 else if( ptwXY2->
length == 0 ) {
249 if( ptwXY1->
length == 0 ) {
254 else if( ptwXY2->
length == 0 ) {
269 if( ptwXY1->
length == 0 ) {
271 else if( ptwXY2->
length == 0 ) {
287 double x1, y1, x2, y2, u1, u2, v1, v2, xz1 = 0, xz2 = 0, x;
293 if( mul->
length == 0 )
return( mul );
300 for( i = length - 1; i >= 0; i-- ) {
302 if( ptwXY_getValueAtX_ignore_XOutsideDomainError( smr, ptwXY1, x1, &u1 ) !=
nfu_Okay )
goto Err;
303 if( ptwXY_getValueAtX_ignore_XOutsideDomainError( smr, ptwXY1, x2, &u2 ) !=
nfu_Okay )
goto Err;
304 if( ptwXY_getValueAtX_ignore_XOutsideDomainError( smr, ptwXY2, x1, &v1 ) !=
nfu_Okay )
goto Err;
305 if( ptwXY_getValueAtX_ignore_XOutsideDomainError( smr, ptwXY2, x2, &v2 ) !=
nfu_Okay )
goto Err;
308 xz1 = ( u1 * x2 - u2 * x1 ) / ( u1 - u2 );
313 xz2 = ( v1 * x2 - v2 * x1 ) / ( v1 - v2 );
318 x = 0.5 * ( xz1 + xz2 );
319 if( ptwXY_getValueAtX_ignore_XOutsideDomainError( smr, ptwXY1, x, &u1 ) !=
nfu_Okay )
goto Err;
320 if( ptwXY_getValueAtX_ignore_XOutsideDomainError( smr, ptwXY2, x, &v1 ) !=
nfu_Okay )
goto Err;
330 for( i = mul->
length - 2; i >= 0; i-- ) {
333 if( ptwXY_mul2_s_ptwXY( smr, mul, ptwXY1, ptwXY2, x1, y1, x2, y2, 0 ) !=
nfu_Okay )
goto Err;
350 double x1,
double y1,
double x2,
double y2,
int level ) {
352 double u1, u2, v1, v2, x, y, yp, dx, a1, a2;
358 if( ( status = ptwXY_getValueAtX_ignore_XOutsideDomainError( smr, ptwXY1, x1, &u1 ) ) !=
nfu_Okay )
return( status );
359 if( ( status = ptwXY_getValueAtX_ignore_XOutsideDomainError( smr, ptwXY1, x2, &u2 ) ) !=
nfu_Okay )
return( status );
360 if( ( status = ptwXY_getValueAtX_ignore_XOutsideDomainError( smr, ptwXY2, x1, &v1 ) ) !=
nfu_Okay )
return( status );
361 if( ( status = ptwXY_getValueAtX_ignore_XOutsideDomainError( smr, ptwXY2, x2, &v2 ) ) !=
nfu_Okay )
return( status );
362 if( ( u1 == u2 ) || ( v1 == v2 ) )
return(
nfu_Okay );
364 if( y1 == 0 ) a1 = 0.;
366 if( y2 == 0 ) a2 = 0.;
367 if( ( a1 == 0. ) || ( a2 == 0. ) ) {
368 x = 0.5 * ( x1 + x2 ); }
370 if( ( a1 * a2 < 0. ) )
return(
nfu_Okay );
371 a1 = sqrt( fabs( a1 ) );
372 a2 = sqrt( fabs( a2 ) );
373 x = ( a2 * x1 + a1 * x2 ) / ( a2 + a1 );
376 yp = ( u1 * v1 * ( x2 - x ) + u2 * v2 * ( x - x1 ) ) / dx;
377 y = ( u1 * ( x2 - x ) + u2 * ( x - x1 ) ) * ( v1 * ( x2 - x ) + v2 * ( x - x1 ) ) / ( dx * dx );
380 if( ptwXY_mul2_s_ptwXY( smr, mul, ptwXY1, ptwXY2, x, y, x2, y2, level ) !=
nfu_Okay )
return( mul->
status );
381 ptwXY_mul2_s_ptwXY( smr, mul, ptwXY1, ptwXY2, x1, y1, x, y, level );
390 int64_t i, j, k, zeros = 0, length, iYs;
391 double x1, x2, y1, y2, u1, u2, v1, v2, y, xz, nan =
nfu_getNAN( ), s1, s2;
409 div = ptwXY_div_ptwXY_forFlats( smr, ptwXY1, ptwXY2, safeDivide );
415 double domainMin1, domainMax1, domainMin2, domainMax2;
423 domainMin1, domainMax1, domainMin2, domainMax2 );
428 for( i = 0, p = div->
points; i < div->length; i++, p++ ) {
429 if( ptwXY_getValueAtX_ignore_XOutsideDomainError( smr, ptwXY2, p->
x, &y ) !=
nfu_Okay )
goto Err;
448 if( i < ( div->
length - 1 ) ) {
461 p->
y = ( y1 + y2 ) / iYs;
478 for( i = length - 1; i >= 0; i-- ) {
480 if( ptwXY_getValueAtX_ignore_XOutsideDomainError( smr, ptwXY1, x1, &u1 ) !=
nfu_Okay )
goto Err;
481 if( ptwXY_getValueAtX_ignore_XOutsideDomainError( smr, ptwXY1, x2, &u2 ) !=
nfu_Okay )
goto Err;
482 if( ptwXY_getValueAtX_signal_XOutsideDomainError( smr, __LINE__, __func__, ptwXY2, x1, &v1 ) !=
nfu_Okay )
goto Err;
483 if( ptwXY_getValueAtX_signal_XOutsideDomainError( smr, __LINE__, __func__, ptwXY2, x2, &v2 ) !=
nfu_Okay )
goto Err;
485 xz = ( u1 * x2 - u2 * x1 ) / ( u1 - u2 );
494 xz = ( v1 * x2 - v2 * x1 ) / ( v1 - v2 );
504 for( i = div->
length - 2; i >= 0; i-- ) {
508 if( !isNAN1 || !isNAN2 ) {
509 if( ptwXY_div_s_ptwXY( smr, div, ptwXY1, ptwXY2, x1, y1, x2, y2, 0, isNAN1, isNAN2 ) !=
nfu_Okay )
goto Err;
535 for( k = i + 1, j = i; k < div->
length; k++ ) {
560 double x1,
double y1,
double x2,
double y2,
int level,
int isNAN1,
int isNAN2 ) {
563 double u1, u2, v1, v2, v, x, y, yp, dx, a1, a2;
568 if( ( status = ptwXY_getValueAtX_ignore_XOutsideDomainError( smr, ptwXY1, x1, &u1 ) ) !=
nfu_Okay )
return( status );
569 if( ( status = ptwXY_getValueAtX_ignore_XOutsideDomainError( smr, ptwXY1, x2, &u2 ) ) !=
nfu_Okay )
return( status );
570 if( ( status = ptwXY_getValueAtX_signal_XOutsideDomainError( smr, __LINE__, __func__, ptwXY2, x1, &v1 ) ) !=
nfu_Okay )
return( status );
571 if( ( status = ptwXY_getValueAtX_signal_XOutsideDomainError( smr, __LINE__, __func__, ptwXY2, x2, &v2 ) ) !=
nfu_Okay )
return( status );
573 x = 0.5 * ( x1 + x2 );
574 if( ( status = ptwXY_getValueAtX_ignore_XOutsideDomainError( smr, ptwXY1, x, &u1 ) ) !=
nfu_Okay )
return( status );
575 if( ( status = ptwXY_getValueAtX_signal_XOutsideDomainError( smr, __LINE__, __func__, ptwXY2, x, &v1 ) ) !=
nfu_Okay )
return( status );
578 x = 0.5 * ( x1 + x2 );
579 if( ( status = ptwXY_getValueAtX_ignore_XOutsideDomainError( smr, ptwXY1, x, &u2 ) ) !=
nfu_Okay )
return( status );
580 if( ( status = ptwXY_getValueAtX_signal_XOutsideDomainError( smr, __LINE__, __func__, ptwXY2, x, &v2 ) ) !=
nfu_Okay )
return( status );
583 if( ( u1 == u2 ) || ( v1 == v2 ) )
return(
nfu_Okay );
584 if( ( y1 == 0. ) || ( y2 == 0. ) ) {
585 x = 0.5 * ( x1 + x2 ); }
587 if( ( u1 * u2 < 0. ) )
return(
nfu_Okay );
588 a1 = sqrt( fabs( u1 ) );
589 a2 = sqrt( fabs( u2 ) );
590 x = ( a2 * x1 + a1 * x2 ) / ( a2 + a1 );
593 v = v1 * ( x2 - x ) + v2 * ( x - x1 );
594 if( ( v1 == 0. ) || ( v2 == 0. ) || ( v == 0. ) )
return(
nfu_Okay );
595 yp = ( u1 / v1 * ( x2 - x ) + u2 / v2 * ( x - x1 ) ) / dx;
596 y = ( u1 * ( x2 - x ) + u2 * ( x - x1 ) ) / v;
600 if( ( status = ptwXY_div_s_ptwXY( smr, div, ptwXY1, ptwXY2, x, y, x2, y2, level, 0, isNAN2 ) ) !=
nfu_Okay )
return( status );
601 status = ptwXY_div_s_ptwXY( smr, div, ptwXY1, ptwXY2, x1, y1, x, y, level, isNAN1, 0 );
626 for( i = 0, p = div->
points; i < div->length; i++, p++ ) {
627 if( ptwXY_getValueAtX_ignore_XOutsideDomainError( smr, ptwXY2, p->
x, &y ) !=
nfu_Okay )
goto Err;
629 if( ( safeDivide ) && ( p->
y == 0 ) ) {
663 double domainMin, domainMax;
669 x, domainMin, domainMin );
G4double(*)(G4double) function
G4ThreadLocal T * G4GeomSplitter< T >::offset
@ nfu_invalidInterpolation
enum nfu_status_e nfu_status
nfu_status ptwXY_neg(statusMessageReporting *smr, ptwXYPoints *ptwXY)
nfu_status ptwXY_setValueAtX(statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, double y)
char const * ptwXY_interpolationToString(ptwXY_interpolation interpolation)
int64_t ptwXY_getNonOverflowLength(statusMessageReporting *smr, ptwXYPoints const *ptwXY)
ptwXYPoints * ptwXY_clone(statusMessageReporting *smr, ptwXYPoints *ptwXY)
struct ptwXYOverflowPoint_s ptwXYOverflowPoint
nfu_status ptwXY_areDomainsMutual(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2)
@ ptwXY_interpolationFlat
@ ptwXY_interpolationLinLog
@ ptwXY_interpolationLinLin
@ ptwXY_interpolationOther
struct ptwXYPoints_s ptwXYPoints
void ptwXY_update_biSectionMax(ptwXYPoints *ptwXY1, double oldLength)
#define ClosestAllowXFactor
#define ptwXY_union_mergeClosePoints
ptwXYPoints * ptwXY_union(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, int unionOptions)
struct ptwXYPoint_s ptwXYPoint
ptwXYPoints * ptwXY_free(ptwXYPoints *ptwXY)
nfu_status ptwXY_getSlopeAtX(statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, char side, double *slope)
nfu_status ptwXY_domainMax(statusMessageReporting *smr, ptwXYPoints *ptwXY, double *value)
nfu_status ptwXY_getValueAtX(statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, double *y)
nfu_status ptwXY_simpleCoalescePoints(statusMessageReporting *smr, ptwXYPoints *ptwXY)
nfu_status ptwXY_domainMin(statusMessageReporting *smr, ptwXYPoints *ptwXY, double *value)
nfu_status ptwXY_div_fromDouble(statusMessageReporting *smr, ptwXYPoints *ptwXY, double value)
nfu_status ptwXY_add_double(statusMessageReporting *smr, ptwXYPoints *ptwXY, double value)
ptwXYPoints * ptwXY_mul_ptwXY(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2)
nfu_status ptwXY_sub_doubleFrom(statusMessageReporting *smr, ptwXYPoints *ptwXY, double value)
nfu_status ptwXY_div_doubleFrom(statusMessageReporting *smr, ptwXYPoints *ptwXY, double value)
ptwXYPoints * ptwXY_add_ptwXY(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2)
ptwXYPoints * ptwXY_binary_ptwXY(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, double v1, double v2, double v1v2)
nfu_status ptwXY_slopeOffset(statusMessageReporting *smr, ptwXYPoints *ptwXY, double slope, double offset)
nfu_status ptwXY_mul_double(statusMessageReporting *smr, ptwXYPoints *ptwXY, double value)
ptwXYPoints * ptwXY_sub_ptwXY(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2)
ptwXYPoints * ptwXY_div_ptwXY(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, int safeDivide)
ptwXYPoints * ptwXY_mul2_ptwXY(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2)
nfu_status ptwXY_mod(statusMessageReporting *smr, ptwXYPoints *ptwXY, double m, int pythonMod)
nfu_status ptwXY_sub_fromDouble(statusMessageReporting *smr, ptwXYPoints *ptwXY, double value)
#define smr_setReportError2(smr, libraryID, code, fmt,...)
#define smr_setReportError2p(smr, libraryID, code, fmt)
int smr_setReportError(statusMessageReporting *smr, void *userInterface, char const *file, int line, char const *function, int libraryID, int code, char const *fmt,...)
struct ptwXYOverflowPoint_s * next
ptwXYOverflowPoint overflowHeader
ptwXY_interpolation interpolation
char const * interpolationString