Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
ptwXY_binaryOperators.c File Reference
#include <math.h>
#include <float.h>
#include "ptwXY.h"

Go to the source code of this file.

Functions

nfu_status ptwXY_slopeOffset (statusMessageReporting *smr, ptwXYPoints *ptwXY, double slope, double offset)
nfu_status ptwXY_add_double (statusMessageReporting *smr, ptwXYPoints *ptwXY, double value)
nfu_status ptwXY_sub_doubleFrom (statusMessageReporting *smr, ptwXYPoints *ptwXY, double value)
nfu_status ptwXY_sub_fromDouble (statusMessageReporting *smr, ptwXYPoints *ptwXY, double value)
nfu_status ptwXY_mul_double (statusMessageReporting *smr, ptwXYPoints *ptwXY, double value)
nfu_status ptwXY_div_doubleFrom (statusMessageReporting *smr, ptwXYPoints *ptwXY, double value)
nfu_status ptwXY_div_fromDouble (statusMessageReporting *smr, ptwXYPoints *ptwXY, double value)
nfu_status ptwXY_mod (statusMessageReporting *smr, ptwXYPoints *ptwXY, double m, int pythonMod)
ptwXYPointsptwXY_binary_ptwXY (statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, double v1, double v2, double v1v2)
ptwXYPointsptwXY_add_ptwXY (statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2)
ptwXYPointsptwXY_sub_ptwXY (statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2)
ptwXYPointsptwXY_mul_ptwXY (statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2)
ptwXYPointsptwXY_mul2_ptwXY (statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2)
ptwXYPointsptwXY_div_ptwXY (statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, int safeDivide)

Function Documentation

◆ ptwXY_add_double()

nfu_status ptwXY_add_double ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double value )

Definition at line 45 of file ptwXY_binaryOperators.c.

45 {
46
47 if( ptwXY_slopeOffset( smr, ptwXY, 1., value ) != nfu_Okay )
49 return( ptwXY->status );
50}
@ nfu_Okay
@ nfu_Error
int nfu_SMR_libraryID
nfu_status ptwXY_slopeOffset(statusMessageReporting *smr, ptwXYPoints *ptwXY, double slope, double offset)
#define smr_setReportError2p(smr, libraryID, code, fmt)
nfu_status status
Definition ptwXY.h:80

◆ ptwXY_add_ptwXY()

ptwXYPoints * ptwXY_add_ptwXY ( statusMessageReporting * smr,
ptwXYPoints * ptwXY1,
ptwXYPoints * ptwXY2 )

Definition at line 228 of file ptwXY_binaryOperators.c.

228 {
229
230 ptwXYPoints *sum;
231
232 if( ptwXY1->length == 0 ) {
233 sum = ptwXY_clone( smr, ptwXY2 ); }
234 else if( ptwXY2->length == 0 ) {
235 sum = ptwXY_clone( smr, ptwXY1 ); }
236 else {
237 sum = ptwXY_binary_ptwXY( smr, ptwXY1, ptwXY2, 1., 1., 0. );
238 }
239 if( sum == NULL ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via." );
240 return( sum );
241}
ptwXYPoints * ptwXY_clone(statusMessageReporting *smr, ptwXYPoints *ptwXY)
Definition ptwXY_core.c:302
struct ptwXYPoints_s ptwXYPoints
ptwXYPoints * ptwXY_binary_ptwXY(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, double v1, double v2, double v1v2)
int64_t length
Definition ptwXY.h:87

Referenced by GIDI::Functions::XYs1d::operator+=(), and ptwXY_unitbaseInterpolate().

◆ ptwXY_binary_ptwXY()

ptwXYPoints * ptwXY_binary_ptwXY ( statusMessageReporting * smr,
ptwXYPoints * ptwXY1,
ptwXYPoints * ptwXY2,
double v1,
double v2,
double v1v2 )

Definition at line 165 of file ptwXY_binaryOperators.c.

166 {
167
168 int64_t i;
170 double y;
171 ptwXYPoints *ptwXYNew;
172 ptwXYPoint *p;
173
174 if( ptwXY1->interpolation == ptwXY_interpolationOther ) {
175 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Source1: Other interpolation not allowed." );
176 return( NULL );
177 }
178 if( ptwXY2->interpolation == ptwXY_interpolationOther ) {
179 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Source2: Other interpolation not allowed." );
180 return( NULL );
181 }
182
183 if( ptwXY1->interpolation != ptwXY2->interpolation ) {
185 "Source1 interpolation '%s' not same as Source2 interpolation '%s'.",
186 ptwXY1->interpolationString, ptwXY2->interpolationString );
187 return( NULL );
188 }
189
191 ( ptwXY1->interpolation != ptwXY_interpolationFlat ) ) {
193 "Only '%s' and '%s' interpolation supported, not '%s' interpolation.", ptwXY_interpolationToString( ptwXY_interpolationLinLin ),
195 return( NULL );
196 }
197
198 if( ptwXY_areDomainsMutual( smr, ptwXY1, ptwXY2 ) != nfu_Okay ) {
199 double domainMin1, domainMax1, domainMin2, domainMax2;
200
201 ptwXY_domainMin( NULL, ptwXY1, &domainMin1 );
202 ptwXY_domainMax( NULL, ptwXY1, &domainMax1 );
203 ptwXY_domainMin( NULL, ptwXY2, &domainMin2 );
204 ptwXY_domainMax( NULL, ptwXY2, &domainMax2 );
205
206 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_domainsNotMutual, "Domains not mutual (%.17e, %.17e) vs (%.17e, %.17e).",
207 domainMin1, domainMax1, domainMin2, domainMax2 );
208 return( NULL );
209 }
210
211 if( ( ptwXYNew = ptwXY_union( smr, ptwXY1, ptwXY2, unionOptions ) ) == NULL ) {
213 else {
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;
217 }
218 }
219 return( ptwXYNew );
220Err:
222 if( ptwXYNew ) ptwXY_free( ptwXYNew );
223 return( NULL );
224}
@ nfu_domainsNotMutual
@ nfu_invalidInterpolation
@ nfu_otherInterpolation
char const * ptwXY_interpolationToString(ptwXY_interpolation interpolation)
nfu_status ptwXY_areDomainsMutual(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2)
@ ptwXY_interpolationFlat
Definition ptwXY.h:38
@ ptwXY_interpolationLinLog
Definition ptwXY.h:37
@ ptwXY_interpolationLinLin
Definition ptwXY.h:37
@ ptwXY_interpolationOther
Definition ptwXY.h:38
#define ptwXY_union_fill
Definition ptwXY.h:34
#define ptwXY_union_mergeClosePoints
Definition ptwXY.h:36
ptwXYPoints * ptwXY_union(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, int unionOptions)
struct ptwXYPoint_s ptwXYPoint
ptwXYPoints * ptwXY_free(ptwXYPoints *ptwXY)
Definition ptwXY_core.c:782
nfu_status ptwXY_domainMax(statusMessageReporting *smr, ptwXYPoints *ptwXY, double *value)
nfu_status ptwXY_domainMin(statusMessageReporting *smr, ptwXYPoints *ptwXY, double *value)
#define smr_setReportError2(smr, libraryID, code, fmt,...)
double y
Definition ptwXY.h:64
double x
Definition ptwXY.h:64
ptwXYPoint * points
Definition ptwXY.h:93
ptwXY_interpolation interpolation
Definition ptwXY.h:81
char const * interpolationString
Definition ptwXY.h:82

Referenced by ptwXY_add_ptwXY(), ptwXY_mul_ptwXY(), and ptwXY_sub_ptwXY().

◆ ptwXY_div_doubleFrom()

nfu_status ptwXY_div_doubleFrom ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double value )

Definition at line 81 of file ptwXY_binaryOperators.c.

81 {
82
83 if( value == 0. ) {
85 ptwXY->status = nfu_divByZero; }
86 else {
87 if( ptwXY_slopeOffset( smr, ptwXY, 1. / value, 0. ) != nfu_Okay )
89 }
90 return( ptwXY->status );
91}
@ nfu_divByZero

◆ ptwXY_div_fromDouble()

nfu_status ptwXY_div_fromDouble ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double value )

Definition at line 95 of file ptwXY_binaryOperators.c.

95 {
96/*
97* This does not do any infilling and it should?????????
98*/
99
100 int64_t i, nonOverflowLength;
101 ptwXYPoint *p;
102 ptwXYOverflowPoint *o, *overflowHeader = &(ptwXY->overflowHeader);
103
104 if( ( nonOverflowLength = ptwXY_getNonOverflowLength( smr, ptwXY ) ) < 0 ) {
106 return( ptwXY->status );
107 }
109 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not allowed." );
110 return( nfu_otherInterpolation );
111 }
112
113 for( i = 0, p = ptwXY->points; i < nonOverflowLength; i++, p++ ) if( p->y == 0. ) ptwXY->status = nfu_divByZero;
114 for( o = overflowHeader->next; o != overflowHeader; o = o->next ) if( o->point.y == 0. ) ptwXY->status = nfu_divByZero;
115 if( ptwXY->status == nfu_divByZero ) {
116 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_divByZero, "Divide by 0." ); }
117 else {
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;
120 }
121 return( ptwXY->status );
122}
int64_t ptwXY_getNonOverflowLength(statusMessageReporting *smr, ptwXYPoints const *ptwXY)
Definition ptwXY_core.c:805
struct ptwXYOverflowPoint_s ptwXYOverflowPoint
struct ptwXYOverflowPoint_s * next
Definition ptwXY.h:73
ptwXYPoint point
Definition ptwXY.h:75
ptwXYOverflowPoint overflowHeader
Definition ptwXY.h:92

◆ ptwXY_div_ptwXY()

ptwXYPoints * ptwXY_div_ptwXY ( statusMessageReporting * smr,
ptwXYPoints * ptwXY1,
ptwXYPoints * ptwXY2,
int safeDivide )

Definition at line 387 of file ptwXY_binaryOperators.c.

387 {
388
389 int isNAN1, isNAN2;
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;
392 ptwXYPoints *div = NULL;
393 ptwXYPoint *p;
394 nfu_status status = ptwXY_simpleCoalescePoints( smr, ptwXY1 );
395
396 if( status != nfu_Okay ) goto Err;
397 if( ptwXY_simpleCoalescePoints( smr, ptwXY2 ) != nfu_Okay ) goto Err;
398
399 if( ptwXY1->interpolation == ptwXY_interpolationOther ) {
400 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Source1: Other interpolation not allowed." );
401 return( NULL );
402 }
403 if( ptwXY2->interpolation == ptwXY_interpolationOther ) {
404 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Source2: Other interpolation not allowed." );
405 return( NULL );
406 }
407
408 if( ( ptwXY1->interpolation == ptwXY_interpolationFlat ) || ( ptwXY1->interpolation == ptwXY_interpolationFlat ) ) {
409 div = ptwXY_div_ptwXY_forFlats( smr, ptwXY1, ptwXY2, safeDivide );
410 if( div == NULL ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via." );
411 return( div );
412 }
413
414 if( ptwXY_areDomainsMutual( smr, ptwXY1, ptwXY2 ) != nfu_Okay ) {
415 double domainMin1, domainMax1, domainMin2, domainMax2;
416
417 ptwXY_domainMin( NULL, ptwXY1, &domainMin1 );
418 ptwXY_domainMax( NULL, ptwXY1, &domainMax1 );
419 ptwXY_domainMin( NULL, ptwXY2, &domainMin2 );
420 ptwXY_domainMax( NULL, ptwXY2, &domainMax2 );
421
422 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_domainsNotMutual, "Domains not mutual (%.17e, %.17e) vs (%.17e, %.17e).",
423 domainMin1, domainMax1, domainMin2, domainMax2 );
424 return( NULL );
425 }
426
427 if( ( div = ptwXY_union( smr, ptwXY1, ptwXY2, ptwXY_union_fill | ptwXY_union_mergeClosePoints ) ) == NULL ) goto Err;
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;
430 if( y == 0. ) {
431 if( p->y == 0. ) {
432 iYs = 0;
433 y1 = 0.;
434 y2 = 0.;
435 if( i > 0 ) {
436 if( ( status = ptwXY_getSlopeAtX( smr, ptwXY1, p->x, '-', &s1 ) ) != nfu_Okay ) {
437 if( status != nfu_XOutsideDomain ) goto Err;
438 s1 = 0.;
439 }
440 if( ( status = ptwXY_getSlopeAtX( smr, ptwXY2, p->x, '-', &s2 ) ) != nfu_Okay ) goto Err;
441 if( s2 == 0. ) {
442 y1 = nan; }
443 else {
444 y1 = s1 / s2;
445 }
446 iYs++;
447 }
448 if( i < ( div->length - 1 ) ) {
449 if( ( status = ptwXY_getSlopeAtX( smr, ptwXY1, p->x, '+', &s1 ) ) != nfu_Okay ) {
450 if( status != nfu_XOutsideDomain ) goto Err;
451 s1 = 0.;
452 }
453 if( ( status = ptwXY_getSlopeAtX( smr, ptwXY2, p->x, '+', &s2 ) ) != nfu_Okay ) goto Err;
454 if( s2 == 0. ) {
455 y2 = nan; }
456 else {
457 y2 = s1 / s2;
458 }
459 iYs++;
460 }
461 p->y = ( y1 + y2 ) / iYs;
462 if( nfu_isNAN( p->y ) ) zeros++; }
463 else {
464 if( !safeDivide ) {
466 goto Err2;
467 }
468 zeros++;
469 p->y = nan;
470 } }
471 else {
472 p->y /= y;
473 }
474 }
475 length = div->length - 1;
476 if( length > 0 ) {
477 x2 = div->points[length].x;
478 for( i = length - 1; i >= 0; i-- ) { /* Find and add y zeros and NAN not currently in div's. */
479 x1 = div->points[i].x;
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;
484 if( u1 * u2 < 0 ) {
485 xz = ( u1 * x2 - u2 * x1 ) / ( u1 - u2 );
486 if( ptwXY_setValueAtX( smr, div, xz, 0. ) != nfu_Okay ) goto Err;
487 }
488 if( v1 * v2 < 0 ) {
489 if( !safeDivide ) {
491 goto Err2;
492 }
493 zeros++;
494 xz = ( v1 * x2 - v2 * x1 ) / ( v1 - v2 );
495 if( ptwXY_setValueAtX( smr, div, xz, nan ) != nfu_Okay ) goto Err;
496 }
497 x2 = x1;
498 }
499 if( ptwXY_simpleCoalescePoints( smr, div ) != nfu_Okay ) goto Err;
500 length = div->length;
501 x2 = div->points[div->length-1].x;
502 y2 = div->points[div->length-1].y;
503 isNAN2 = nfu_isNAN( y2 );
504 for( i = div->length - 2; i >= 0; i-- ) { /* Make interpolation fit accuracy. Work backwards so new points will not mess up loop. */
505 x1 = div->points[i].x;
506 y1 = div->points[i].y;
507 isNAN1 = nfu_isNAN( y1 );
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;
510 }
511 x2 = x1;
512 y2 = y1;
513 isNAN2 = isNAN1;
514 }
515 ptwXY_update_biSectionMax( div, (double) length );
516 if( zeros ) {
517 if( ptwXY_simpleCoalescePoints( smr, div ) != nfu_Okay ) goto Err;
518 for( i = 0; i < div->length; i++ ) if( !nfu_isNAN( div->points[i].y ) ) break;
519 if( nfu_isNAN( div->points[0].y ) ) { /* Special case for first point. */
520 if( i == div->length ) { /* They are all nan's, what now? */
521 zeros = 0;
522 for( i = 0; i < div->length; i++ ) div->points[i].y = 0.; }
523 else {
524 div->points[0].y = 2. * div->points[i].y;
525 zeros--;
526 }
527 }
528 for( i = div->length - 1; i > 0; i-- ) if( !nfu_isNAN( div->points[i].y ) ) break;
529 if( nfu_isNAN( div->points[div->length - 1].y ) ) { /* Special case for last point. */
530 div->points[div->length - 1].y = 2. * div->points[i].y;
531 zeros--;
532 }
533 if( zeros ) {
534 for( i = 0; i < div->length; i++ ) if( nfu_isNAN( div->points[i].y ) ) break;
535 for( k = i + 1, j = i; k < div->length; k++ ) {
536 if( nfu_isNAN( div->points[k].y ) ) continue;
537 div->points[j] = div->points[k];
538 j++;
539 }
540 div->length = j;
541 }
542 }
543 }
544 return( div );
545
546Err:
547 if( status == nfu_XOutsideDomain ) {
548 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_XOutsideDomain, "x-value outside domain." ); }
549 else {
551 }
552Err2:
553 if( div ) ptwXY_free( div );
554 return( NULL );
555}
int nfu_isNAN(double d)
@ nfu_XOutsideDomain
enum nfu_status_e nfu_status
double nfu_getNAN(void)
nfu_status ptwXY_setValueAtX(statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, double y)
void ptwXY_update_biSectionMax(ptwXYPoints *ptwXY1, double oldLength)
Definition ptwXY_misc.c:37
nfu_status ptwXY_getSlopeAtX(statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, char side, double *slope)
nfu_status ptwXY_simpleCoalescePoints(statusMessageReporting *smr, ptwXYPoints *ptwXY)
Definition ptwXY_core.c:734

◆ ptwXY_mod()

nfu_status ptwXY_mod ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double m,
int pythonMod )

Definition at line 126 of file ptwXY_binaryOperators.c.

126 {
127
128 int64_t i, nonOverflowLength;
129 ptwXYPoint *p;
130 ptwXYOverflowPoint *o, *overflowHeader = &(ptwXY->overflowHeader);
131
132 if( ( nonOverflowLength = ptwXY_getNonOverflowLength( smr, ptwXY ) ) < 0 ) {
134 return( ptwXY->status );
135 }
136
137 if( m == 0 ) {
139 ptwXY->status = nfu_divByZero;
140 }
141
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 );
144 return( ptwXY->status );
145}

◆ ptwXY_mul2_ptwXY()

ptwXYPoints * ptwXY_mul2_ptwXY ( statusMessageReporting * smr,
ptwXYPoints * ptwXY1,
ptwXYPoints * ptwXY2 )

Definition at line 282 of file ptwXY_binaryOperators.c.

282 {
283
284 int64_t i, length;
285 ptwXYPoints *mul = NULL;
286 int found;
287 double x1, y1, x2, y2, u1, u2, v1, v2, xz1 = 0, xz2 = 0, x;
288
289 if( ( mul = ptwXY_mul_ptwXY( smr, ptwXY1, ptwXY2 ) ) == NULL ) {
291 return( NULL );
292 }
293 if( mul->length == 0 ) return( mul );
294 if( ptwXY1->interpolation == ptwXY_interpolationFlat ) return( mul );
295 if( ptwXY2->interpolation == ptwXY_interpolationFlat ) return( mul );
296
297 length = mul->length - 1;
298 if( length > 0 ) {
299 x2 = mul->points[length].x;
300 for( i = length - 1; i >= 0; i-- ) { /* Find and add y zeros not currently in mul's. */
301 x1 = mul->points[i].x;
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;
306 found = 0;
307 if( u1 * u2 < 0 ) {
308 xz1 = ( u1 * x2 - u2 * x1 ) / ( u1 - u2 );
309 if( ptwXY_setValueAtX( smr, mul, xz1, 0. ) != nfu_Okay ) goto Err;
310 found = 1;
311 }
312 if( v1 * v2 < 0 ) {
313 xz2 = ( v1 * x2 - v2 * x1 ) / ( v1 - v2 );
314 if( ptwXY_setValueAtX( smr, mul, xz2, 0. ) != nfu_Okay ) goto Err;
315 found += 1;
316 }
317 if( found > 1 ) {
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;
321 if( ptwXY_setValueAtX( smr, mul, x, u1 * v1 ) != nfu_Okay ) goto Err;
322 }
323 x2 = x1;
324 }
325
326 if( ptwXY_simpleCoalescePoints( smr, mul ) != nfu_Okay ) goto Err;
327 length = mul->length;
328 x2 = mul->points[mul->length-1].x;
329 y2 = mul->points[mul->length-1].y;
330 for( i = mul->length - 2; i >= 0; i-- ) { /* Make interpolation fit accuracy. Work backwards so new */
331 x1 = mul->points[i].x; /* points will not mess up loop. */
332 y1 = mul->points[i].y;
333 if( ptwXY_mul2_s_ptwXY( smr, mul, ptwXY1, ptwXY2, x1, y1, x2, y2, 0 ) != nfu_Okay ) goto Err;
334 x2 = x1;
335 y2 = y1;
336 }
337 ptwXY_update_biSectionMax( mul, (double) length );
338 }
339 return( mul );
340
341Err:
343 if( mul ) ptwXY_free( mul );
344 return( NULL );
345}
ptwXYPoints * ptwXY_mul_ptwXY(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2)

Referenced by GIDI::Functions::XYs1d::operator*=(), and ptwXY_scaleAndOffsetDomainWith_ptwXYs().

◆ ptwXY_mul_double()

nfu_status ptwXY_mul_double ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double value )

Definition at line 72 of file ptwXY_binaryOperators.c.

72 {
73
74 if( ptwXY_slopeOffset( smr, ptwXY, value, 0. ) != nfu_Okay )
76 return( ptwXY->status );
77}

Referenced by GIDI::Functions::XYs1d::operator*=().

◆ ptwXY_mul_ptwXY()

ptwXYPoints * ptwXY_mul_ptwXY ( statusMessageReporting * smr,
ptwXYPoints * ptwXY1,
ptwXYPoints * ptwXY2 )

Definition at line 265 of file ptwXY_binaryOperators.c.

265 {
266
267 ptwXYPoints *mul;
268
269 if( ptwXY1->length == 0 ) {
270 mul = ptwXY_clone( smr, ptwXY1 ); }
271 else if( ptwXY2->length == 0 ) {
272 mul = ptwXY_clone( smr, ptwXY2 ); }
273 else {
274 mul = ptwXY_binary_ptwXY( smr, ptwXY1, ptwXY2, 0., 0., 1. );
275 }
276 if( mul == NULL ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via." );
277 return( mul );
278}

Referenced by ptwXY_mul2_ptwXY().

◆ ptwXY_slopeOffset()

nfu_status ptwXY_slopeOffset ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double slope,
double offset )

Definition at line 27 of file ptwXY_binaryOperators.c.

27 {
28
29 int64_t i, nonOverflowLength;
30 ptwXYPoint *p;
31 ptwXYOverflowPoint *o, *overflowHeader = &(ptwXY->overflowHeader);
32
33 if( ( nonOverflowLength = ptwXY_getNonOverflowLength( smr, ptwXY ) ) < 0 ) {
35 return( ptwXY->status );
36 }
37
38 for( i = 0, p = ptwXY->points; i < nonOverflowLength; i++, p++ ) p->y = slope * p->y + offset;
39 for( o = overflowHeader->next; o != overflowHeader; o = o->next ) o->point.y = slope * o->point.y + offset;
40 return( ptwXY->status );
41}
G4ThreadLocal T * G4GeomSplitter< T >::offset

Referenced by ptwXY_add_double(), ptwXY_div_doubleFrom(), ptwXY_mul_double(), ptwXY_sub_doubleFrom(), and ptwXY_sub_fromDouble().

◆ ptwXY_sub_doubleFrom()

nfu_status ptwXY_sub_doubleFrom ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double value )

Definition at line 54 of file ptwXY_binaryOperators.c.

54 {
55
56 if( ptwXY_slopeOffset( smr, ptwXY, 1., -value ) != nfu_Okay )
58 return( ptwXY->status );
59}

◆ ptwXY_sub_fromDouble()

nfu_status ptwXY_sub_fromDouble ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double value )

Definition at line 63 of file ptwXY_binaryOperators.c.

63 {
64
65 if( ptwXY_slopeOffset( smr, ptwXY, -1., value ) != nfu_Okay )
67 return( ptwXY->status );
68}

◆ ptwXY_sub_ptwXY()

ptwXYPoints * ptwXY_sub_ptwXY ( statusMessageReporting * smr,
ptwXYPoints * ptwXY1,
ptwXYPoints * ptwXY2 )

Definition at line 245 of file ptwXY_binaryOperators.c.

245 {
246
247 ptwXYPoints *diff = NULL;
248
249 if( ptwXY1->length == 0 ) {
250 diff = ptwXY_clone( smr, ptwXY2 );
251 if( diff != NULL ) {
252 if( ptwXY_neg( smr, diff ) != nfu_Okay ) diff = ptwXY_free( diff );
253 } }
254 else if( ptwXY2->length == 0 ) {
255 diff = ptwXY_clone( smr, ptwXY1 ); }
256 else {
257 diff = ptwXY_binary_ptwXY( smr, ptwXY1, ptwXY2, 1., -1., 0. );
258 }
259 if( diff == NULL ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via." );
260 return( diff );
261}
nfu_status ptwXY_neg(statusMessageReporting *smr, ptwXYPoints *ptwXY)

Referenced by GIDI::Functions::XYs1d::operator-=().