Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
ptwXY.h File Reference
#include <stdio.h>
#include <stdint.h>
#include <nf_utilities.h>
#include <ptwX.h>

Go to the source code of this file.

Classes

struct  ptwXYPoint_s
struct  ptwXYOverflowPoint_s
struct  ptwXYPoints_s

Macros

#define ptwXY_minimumSize   10 /* This must be > 0 otherwise some logic will fail. */
#define ptwXY_minimumOverflowSize   4 /* This must be > 0 otherwise some logic will fail. */
#define ptwXY_maxBiSectionMax   20
#define ptwXY_minAccuracy   1e-14
#define ptwXY_sectionSubdivideMax   1 << 16
#define ClosestAllowXFactor   10
#define ptwXY_union_fill   1 /* If filling, union is filled with y value of first ptw. */
#define ptwXY_union_trim   2 /* If trimming, union in only over common domain of ptw1 and ptw2. */
#define ptwXY_union_mergeClosePoints   4 /* If true, union calls ptwXY_mergeClosePoints with eps = 4 * DBL_EPSILON. */

Typedefs

typedef enum ptwXY_dataFrom_e ptwXY_dataFrom
typedef enum ptwXY_group_normType_e ptwXY_group_normType
typedef enum ptwXY_interpolation_e ptwXY_interpolation
typedef enum ptwXY_lessEqualGreaterX_e ptwXY_lessEqualGreaterX
typedef struct ptwXYPoint_s ptwXYPoint
typedef nfu_status(* ptwXY_createFromFunction_callback) (statusMessageReporting *smr, double x, double *y, void *argList)
typedef nfu_status(* ptwXY_applyFunction_callback) (statusMessageReporting *smr, ptwXYPoint *point, void *argList)
typedef struct ptwXYOverflowPoint_s ptwXYOverflowPoint
typedef struct ptwXYPoints_s ptwXYPoints

Enumerations

enum  ptwXY_dataFrom_e { ptwXY_dataFrom_Unknown , ptwXY_dataFrom_Points , ptwXY_dataFrom_Overflow }
enum  ptwXY_group_normType_e { ptwXY_group_normType_none , ptwXY_group_normType_dx , ptwXY_group_normType_norm }
enum  ptwXY_interpolation_e {
  ptwXY_interpolationLinLin , ptwXY_interpolationLogLin , ptwXY_interpolationLinLog , ptwXY_interpolationLogLog ,
  ptwXY_interpolationFlat , ptwXY_interpolationOther
}
enum  ptwXY_lessEqualGreaterX_e {
  ptwXY_lessEqualGreaterX_empty , ptwXY_lessEqualGreaterX_lessThan , ptwXY_lessEqualGreaterX_equal , ptwXY_lessEqualGreaterX_between ,
  ptwXY_lessEqualGreaterX_greater , ptwXY_lessEqualGreaterX_Error
}

Functions

ptwXYPointsptwXY_new (statusMessageReporting *smr, ptwXY_interpolation interpolation, char const *interpolationString, double biSectionMax, double accuracy, int64_t primarySize, int64_t secondarySize, int userFlag)
ptwXYPointsptwXY_new2 (statusMessageReporting *smr, ptwXY_interpolation interpolation, int64_t primarySize, int64_t secondarySize)
nfu_status ptwXY_initialize (statusMessageReporting *smr, ptwXYPoints *ptwXY, ptwXY_interpolation interpolation, char const *interpolationString, double biSectionMax, double accuracy, int64_t primarySize, int64_t secondarySize, int userFlag)
ptwXYPointsptwXY_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)
ptwXYPointsptwXY_create2 (statusMessageReporting *smr, ptwXY_interpolation interpolation, int64_t primarySize, int64_t secondarySize, int64_t length, double const *xy, int userFlag)
ptwXYPointsptwXY_createFrom_Xs_Ys (statusMessageReporting *smr, ptwXY_interpolation interpolation, char const *interpolationString, double biSectionMax, double accuracy, int64_t primarySize, int64_t secondarySize, int64_t length, double const *Xs, double const *Ys, int userFlag)
ptwXYPointsptwXY_createFrom_Xs_Ys2 (statusMessageReporting *smr, ptwXY_interpolation interpolation, int64_t primarySize, int64_t secondarySize, int64_t length, double const *Xs, double const *Ys, int userFlag)
nfu_status ptwXY_copy (statusMessageReporting *smr, ptwXYPoints *dest, ptwXYPoints *src)
nfu_status ptwXY_copyPointsOnly (statusMessageReporting *smr, ptwXYPoints *dest, ptwXYPoints *src)
ptwXYPointsptwXY_clone (statusMessageReporting *smr, ptwXYPoints *ptwXY)
ptwXYPointsptwXY_clone2 (statusMessageReporting *smr, ptwXYPoints const *ptwXY)
ptwXYPointsptwXY_cloneToInterpolation (statusMessageReporting *smr, ptwXYPoints *ptwXY, ptwXY_interpolation interpolationTo)
ptwXYPointsptwXY_slice (statusMessageReporting *smr, ptwXYPoints *ptwXY, int64_t index1, int64_t index2, int64_t secondarySize)
ptwXYPointsptwXY_domainSlice (statusMessageReporting *smr, ptwXYPoints *ptwXY, double domainMin, double domainMax, int64_t secondarySize, int fill)
ptwXYPointsptwXY_domainMinSlice (statusMessageReporting *smr, ptwXYPoints *ptwXY, double domainMin, int64_t secondarySize, int fill)
ptwXYPointsptwXY_domainMaxSlice (statusMessageReporting *smr, ptwXYPoints *ptwXY, double domainMax, int64_t secondarySize, int fill)
ptwXY_interpolation ptwXY_getInterpolation (ptwXYPoints *ptwXY)
char const * ptwXY_getInterpolationString (ptwXYPoints *ptwXY)
nfu_status ptwXY_setInterpolationString (ptwXYPoints *ptwXY, char const *interpolationString)
nfu_status ptwXY_getStatus (ptwXYPoints *ptwXY)
int ptwXY_getUserFlag (ptwXYPoints *ptwXY)
void ptwXY_setUserFlag (ptwXYPoints *ptwXY, int userFlag)
double ptwXY_getAccuracy (ptwXYPoints *ptwXY)
double ptwXY_setAccuracy (ptwXYPoints *ptwXY, double accuracy)
double ptwXY_getBiSectionMax (ptwXYPoints *ptwXY)
double ptwXY_setBiSectionMax (ptwXYPoints *ptwXY, double biSectionMax)
nfu_status ptwXY_reallocatePoints (statusMessageReporting *smr, ptwXYPoints *ptwXY, int64_t size, int forceSmallerResize)
nfu_status ptwXY_reallocateOverflowPoints (statusMessageReporting *smr, ptwXYPoints *ptwXY, int64_t size)
nfu_status ptwXY_coalescePoints (statusMessageReporting *smr, ptwXYPoints *ptwXY, int64_t size, ptwXYPoint *newPoint, int forceSmallerResize)
nfu_status ptwXY_simpleCoalescePoints (statusMessageReporting *smr, ptwXYPoints *ptwXY)
nfu_status ptwXY_clear (statusMessageReporting *smr, ptwXYPoints *ptwXY)
nfu_status ptwXY_release (statusMessageReporting *smr, ptwXYPoints *ptwXY)
ptwXYPointsptwXY_free (ptwXYPoints *ptwXY)
int64_t ptwXY_length (statusMessageReporting *smr, ptwXYPoints *ptwXY)
int64_t ptwXY_getNonOverflowLength (statusMessageReporting *smr, ptwXYPoints const *ptwXY)
nfu_status ptwXY_startIndex (statusMessageReporting *a_smr, ptwXYPoints *a_ptwXY, double a_x, int64_t *a_startIndex, int64_t *a_length)
nfu_status ptwXY_setXYData (statusMessageReporting *smr, ptwXYPoints *ptwXY, int64_t length, double const *xy)
nfu_status ptwXY_setXYDataFromXsAndYs (statusMessageReporting *smr, ptwXYPoints *ptwXY, int64_t length, double const *x, double const *y)
nfu_status ptwXY_deletePoints (statusMessageReporting *smr, ptwXYPoints *ptwXY, int64_t i1, int64_t i2)
nfu_status ptwXY_getLowerIndexBoundingX (statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, int64_t *index)
ptwXYPointptwXY_getPointAtIndex (statusMessageReporting *smr, ptwXYPoints *ptwXY, int64_t index)
ptwXYPointptwXY_getPointAtIndex_Unsafely (ptwXYPoints const *ptwXY, int64_t index)
nfu_status ptwXY_getXYPairAtIndex (statusMessageReporting *smr, ptwXYPoints *ptwXY, int64_t index, double *x, double *y)
ptwXY_lessEqualGreaterX ptwXY_getPointsAroundX (statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, ptwXYOverflowPoint *lessThanEqualXPoint, ptwXYOverflowPoint *greaterThanXPoint)
ptwXY_lessEqualGreaterX ptwXY_getPointsAroundX_closeIsEqual (statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, ptwXYOverflowPoint *lessThanEqualXPoint, ptwXYOverflowPoint *greaterThanXPoint, double eps, int *closeIsEqual, ptwXYPoint **closePoint)
nfu_status ptwXY_getValueAtX (statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, double *y)
nfu_status ptwXY_setValueAtX (statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, double y)
nfu_status ptwXY_setValueAtX_overrideIfClose (statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, double y, double eps, int override)
nfu_status ptwXY_mergeFromXsAndYs (statusMessageReporting *smr, ptwXYPoints *ptwXY, int length, double *xs, double *ys)
nfu_status ptwXY_mergeFromXYs (statusMessageReporting *smr, ptwXYPoints *ptwXY, int length, double *xys)
nfu_status ptwXY_appendXY (statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, double y)
nfu_status ptwXY_setXYPairAtIndex (statusMessageReporting *smr, ptwXYPoints *ptwXY, int64_t index, double x, double y)
nfu_status ptwXY_getSlopeAtX (statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, char side, double *slope)
nfu_status ptwXY_domainMinAndFrom (statusMessageReporting *smr, ptwXYPoints *ptwXY, ptwXY_dataFrom *dataFrom, double *value)
nfu_status ptwXY_domainMin (statusMessageReporting *smr, ptwXYPoints *ptwXY, double *value)
nfu_status ptwXY_domainMaxAndFrom (statusMessageReporting *smr, ptwXYPoints *ptwXY, ptwXY_dataFrom *dataFrom, double *value)
nfu_status ptwXY_domainMax (statusMessageReporting *smr, ptwXYPoints *ptwXY, double *value)
nfu_status ptwXY_range (statusMessageReporting *smr, ptwXYPoints *ptwXY, double *rangeMin, double *rangeMax)
nfu_status ptwXY_rangeMin (statusMessageReporting *smr, ptwXYPoints *ptwXY, double *value)
nfu_status ptwXY_rangeMax (statusMessageReporting *smr, ptwXYPoints *ptwXY, double *value)
char const * ptwXY_interpolationToString (ptwXY_interpolation interpolation)
ptwXY_interpolation ptwXY_stringToInterpolation (char const *interpolationString)
nfu_status ptwXY_clip (statusMessageReporting *smr, ptwXYPoints *ptwXY1, double rangeMin, double rangeMax)
nfu_status ptwXY_thicken (statusMessageReporting *smr, ptwXYPoints *ptwXY1, int sectionSubdivideMax, double dDomainMax, double fDomainMax)
ptwXYPointsptwXY_thin (statusMessageReporting *smr, ptwXYPoints *ptwXY1, double accuracy)
ptwXYPointsptwXY_thinDomain (statusMessageReporting *smr, ptwXYPoints *ptwXY1, double epsilon)
nfu_status ptwXY_trim (statusMessageReporting *smr, ptwXYPoints *ptwXY)
ptwXYPointsptwXY_union (statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, int unionOptions)
nfu_status ptwXY_scaleOffsetXAndY (statusMessageReporting *smr, ptwXYPoints *ptwXY, double xScale, double xOffset, double yScale, double yOffset)
nfu_status ptwXY_scaleAndOffsetDomainWith_ptwXYs (statusMessageReporting *smr, ptwXYPoints *ptwXY, ptwXYPoints *offset, ptwXYPoints *slope, int skipLastPoint)
nfu_status ptwXY_abs (statusMessageReporting *smr, ptwXYPoints *ptwXY)
nfu_status ptwXY_neg (statusMessageReporting *smr, ptwXYPoints *ptwXY)
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)
nfu_status ptwXY_pow (statusMessageReporting *smr, ptwXYPoints *ptwXY, double p)
nfu_status ptwXY_exp (statusMessageReporting *smr, ptwXYPoints *ptwXY, double a)
ptwXYPointsptwXY_convolution (statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, int mode)
ptwXYPointsptwXY_inverse (statusMessageReporting *smr, ptwXYPoints *ptwXY)
nfu_status ptwXY_interpolatePoint (statusMessageReporting *smr, ptwXY_interpolation interpolation, double x, double *y, double x1, double y1, double x2, double y2)
ptwXYPointsptwXY_flatInterpolationToLinear (statusMessageReporting *smr, ptwXYPoints *ptwXY, double lowerEps, double upperEps)
ptwXYPointsptwXY_toOtherInterpolation (statusMessageReporting *smr, ptwXYPoints *ptwXY, ptwXY_interpolation interpolation, double accuracy)
ptwXYPointsptwXY_unitbaseInterpolate (statusMessageReporting *smr, double w, double w1, ptwXYPoints *ptwXY1, double w2, ptwXYPoints *ptwXY2, int scaleRange)
ptwXYPointsptwXY_toUnitbase (statusMessageReporting *smr, ptwXYPoints *ptwXY, int scaleRange)
ptwXYPointsptwXY_fromUnitbase (statusMessageReporting *smr, ptwXYPoints *ptwXY, double domainMin, double domainMax, int scaleRange)
ptwXPointsptwXY_getXArray (statusMessageReporting *smr, ptwXYPoints *ptwXY)
ptwXPointsptwXY_ysMappedToXs (statusMessageReporting *smr, ptwXYPoints *ptwXY, ptwXPoints *Xs, int64_t *offset)
nfu_status ptwXY_mapToXsAndAdd (statusMessageReporting *a_smr, ptwXYPoints *a_ptwXY, int64_t a_offset, int64_t a_length, double const *a_Xs, double *a_results, double a_scaleFractor)
nfu_status ptwXY_dullEdges (statusMessageReporting *smr, ptwXYPoints *ptwXY, double lowerEps, double upperEps, int positiveXOnly)
nfu_status ptwXY_mergeClosePoints (statusMessageReporting *smr, ptwXYPoints *ptwXY, double epsilon)
ptwXYPointsptwXY_intersectionWith_ptwX (statusMessageReporting *smr, ptwXYPoints *ptwXY, ptwXPoints *ptwX)
nfu_status ptwXY_areDomainsMutual (statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2)
nfu_status ptwXY_tweakDomainsToMutualify (statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, int epsilonFactor, double epsilon)
nfu_status ptwXY_mutualifyDomains (statusMessageReporting *smr, ptwXYPoints *ptwXY1, double lowerEps1, double upperEps1, int positiveXOnly1, ptwXYPoints *ptwXY2, double lowerEps2, double upperEps2, int positiveXOnly2)
nfu_status ptwXY_copyToC_XY (statusMessageReporting *smr, ptwXYPoints *ptwXY, int64_t index1, int64_t index2, int64_t allocatedSize, int64_t *numberOfPoints, double *xy)
nfu_status ptwXY_valuesToC_XsAndYs (statusMessageReporting *smr, ptwXYPoints *ptwXY, double **xs, double **ys)
ptwXYPointsptwXY_valueTo_ptwXY (statusMessageReporting *smr, double x1, double x2, double y)
ptwXYPointsptwXY_createGaussianCenteredSigma1 (statusMessageReporting *smr, double accuracy)
ptwXYPointsptwXY_createGaussian (statusMessageReporting *smr, double accuracy, double xCenter, double sigma, double amplitude, double domainMin, double domainMax, double dullEps)
double ptwXY_limitAccuracy (double accuracy)
void ptwXY_update_biSectionMax (ptwXYPoints *ptwXY1, double oldLength)
ptwXYPointsptwXY_createFromFunction (statusMessageReporting *smr, int n, double *xs, ptwXY_createFromFunction_callback func, void *argList, double accuracy, int checkForRoots, int biSectionMax)
ptwXYPointsptwXY_createFromFunction2 (statusMessageReporting *smr, ptwXPoints *xs, ptwXY_createFromFunction_callback func, void *argList, double accuracy, int checkForRoots, int biSectionMax)
nfu_status ptwXY_applyFunction (statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXY_applyFunction_callback func, void *argList, int checkForRoots)
ptwXYPointsptwXY_fromString (statusMessageReporting *smr, char const *str, char sep, ptwXY_interpolation interpolation, char const *interpolationString, double biSectionMax, double accuracy, char **endCharacter, int useSystem_strtod)
void ptwXY_showInteralStructure (ptwXYPoints *ptwXY, FILE *f, int printPointersAsNull)
void ptwXY_simpleWrite (ptwXYPoints *ptwXY, FILE *f, char const *format)
void ptwXY_simplePrint (ptwXYPoints *ptwXY, char const *format)
nfu_status ptwXY_f_integrate (statusMessageReporting *smr, ptwXY_interpolation interpolation, double x1, double y1, double x2, double y2, double *value)
nfu_status ptwXY_integrate (statusMessageReporting *smr, ptwXYPoints *ptwXY, double domainMin, double domainMax, double *value)
nfu_status ptwXY_integrateDomain (statusMessageReporting *smr, ptwXYPoints *ptwXY, double *value)
nfu_status ptwXY_normalize (statusMessageReporting *smr, ptwXYPoints *ptwXY1)
nfu_status ptwXY_integrateDomainWithWeight_x (statusMessageReporting *smr, ptwXYPoints *ptwXY, double *value)
nfu_status ptwXY_integrateWithWeight_x (statusMessageReporting *smr, ptwXYPoints *ptwXY, double domainMin, double domainMax, double *value)
nfu_status ptwXY_integrateDomainWithWeight_sqrt_x (statusMessageReporting *smr, ptwXYPoints *ptwXY, double *value)
nfu_status ptwXY_integrateWithWeight_sqrt_x (statusMessageReporting *smr, ptwXYPoints *ptwXY, double domainMin, double domainMax, double *value)
ptwXPointsptwXY_groupOneFunction (statusMessageReporting *smr, ptwXYPoints *ptwXY, ptwXPoints *groupBoundaries, ptwXY_group_normType normType, ptwXPoints *ptwX_norm)
ptwXPointsptwXY_groupTwoFunctions (statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, ptwXPoints *groupBoundaries, ptwXY_group_normType normType, ptwXPoints *ptwX_norm)
ptwXPointsptwXY_groupThreeFunctions (statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, ptwXYPoints *ptwXY3, ptwXPoints *groupBoundaries, ptwXY_group_normType normType, ptwXPoints *ptwX_norm)
ptwXPointsptwXY_runningIntegral (statusMessageReporting *smr, ptwXYPoints *ptwXY)
nfu_status ptwXY_integrateWithFunction (statusMessageReporting *smr, ptwXYPoints *ptwXY, ptwXY_createFromFunction_callback func, void *argList, double domainMin, double domainMax, int degree, int recursionLimit, double tolerance, double *value)
ptwXPointsptwXY_equalProbableBins (statusMessageReporting *smr, ptwXYPoints *ptwXY, int numberOfBins)

Macro Definition Documentation

◆ ClosestAllowXFactor

#define ClosestAllowXFactor   10

Definition at line 28 of file ptwXY.h.

Referenced by ptwXY_createFromFunction().

◆ ptwXY_maxBiSectionMax

#define ptwXY_maxBiSectionMax   20

◆ ptwXY_minAccuracy

#define ptwXY_minAccuracy   1e-14

Definition at line 26 of file ptwXY.h.

Referenced by ptwXY_initialize(), ptwXY_limitAccuracy(), and ptwXY_valueTo_ptwXY().

◆ ptwXY_minimumOverflowSize

#define ptwXY_minimumOverflowSize   4 /* This must be > 0 otherwise some logic will fail. */

Definition at line 24 of file ptwXY.h.

Referenced by ptwXY_reallocateOverflowPoints().

◆ ptwXY_minimumSize

#define ptwXY_minimumSize   10 /* This must be > 0 otherwise some logic will fail. */

Definition at line 23 of file ptwXY.h.

Referenced by ptwXY_reallocatePoints(), and ptwXY_union().

◆ ptwXY_sectionSubdivideMax

#define ptwXY_sectionSubdivideMax   1 << 16

Definition at line 27 of file ptwXY.h.

Referenced by ptwXY_thicken().

◆ ptwXY_union_fill

#define ptwXY_union_fill   1 /* If filling, union is filled with y value of first ptw. */

◆ ptwXY_union_mergeClosePoints

#define ptwXY_union_mergeClosePoints   4 /* If true, union calls ptwXY_mergeClosePoints with eps = 4 * DBL_EPSILON. */

Definition at line 36 of file ptwXY.h.

Referenced by ptwXY_binary_ptwXY(), ptwXY_div_ptwXY(), and ptwXY_union().

◆ ptwXY_union_trim

#define ptwXY_union_trim   2 /* If trimming, union in only over common domain of ptw1 and ptw2. */

Definition at line 35 of file ptwXY.h.

Referenced by ptwXY_union().

Typedef Documentation

◆ ptwXY_applyFunction_callback

typedef nfu_status(* ptwXY_applyFunction_callback) (statusMessageReporting *smr, ptwXYPoint *point, void *argList)

Definition at line 68 of file ptwXY.h.

◆ ptwXY_createFromFunction_callback

typedef nfu_status(* ptwXY_createFromFunction_callback) (statusMessageReporting *smr, double x, double *y, void *argList)

Definition at line 67 of file ptwXY.h.

◆ ptwXY_dataFrom

◆ ptwXY_group_normType

◆ ptwXY_interpolation

◆ ptwXY_lessEqualGreaterX

◆ ptwXYOverflowPoint

◆ ptwXYPoint

typedef struct ptwXYPoint_s ptwXYPoint

◆ ptwXYPoints

typedef struct ptwXYPoints_s ptwXYPoints

Enumeration Type Documentation

◆ ptwXY_dataFrom_e

Enumerator
ptwXY_dataFrom_Unknown 
ptwXY_dataFrom_Points 
ptwXY_dataFrom_Overflow 

Definition at line 30 of file ptwXY.h.

enum ptwXY_dataFrom_e ptwXY_dataFrom
@ ptwXY_dataFrom_Overflow
Definition ptwXY.h:30
@ ptwXY_dataFrom_Points
Definition ptwXY.h:30
@ ptwXY_dataFrom_Unknown
Definition ptwXY.h:30

◆ ptwXY_group_normType_e

Enumerator
ptwXY_group_normType_none 
ptwXY_group_normType_dx 
ptwXY_group_normType_norm 

Definition at line 31 of file ptwXY.h.

enum ptwXY_group_normType_e ptwXY_group_normType
@ ptwXY_group_normType_dx
Definition ptwXY.h:31
@ ptwXY_group_normType_none
Definition ptwXY.h:31
@ ptwXY_group_normType_norm
Definition ptwXY.h:31

◆ ptwXY_interpolation_e

Enumerator
ptwXY_interpolationLinLin 
ptwXY_interpolationLogLin 
ptwXY_interpolationLinLog 
ptwXY_interpolationLogLog 
ptwXY_interpolationFlat 
ptwXY_interpolationOther 

Definition at line 37 of file ptwXY.h.

enum ptwXY_interpolation_e ptwXY_interpolation
@ ptwXY_interpolationFlat
Definition ptwXY.h:38
@ ptwXY_interpolationLinLog
Definition ptwXY.h:37
@ ptwXY_interpolationLogLog
Definition ptwXY.h:38
@ ptwXY_interpolationLinLin
Definition ptwXY.h:37
@ ptwXY_interpolationOther
Definition ptwXY.h:38
@ ptwXY_interpolationLogLin
Definition ptwXY.h:37

◆ ptwXY_lessEqualGreaterX_e

Enumerator
ptwXY_lessEqualGreaterX_empty 
ptwXY_lessEqualGreaterX_lessThan 
ptwXY_lessEqualGreaterX_equal 
ptwXY_lessEqualGreaterX_between 
ptwXY_lessEqualGreaterX_greater 
ptwXY_lessEqualGreaterX_Error 

Definition at line 59 of file ptwXY.h.

enum ptwXY_lessEqualGreaterX_e ptwXY_lessEqualGreaterX
@ ptwXY_lessEqualGreaterX_equal
Definition ptwXY.h:59
@ ptwXY_lessEqualGreaterX_Error
Definition ptwXY.h:60
@ ptwXY_lessEqualGreaterX_empty
Definition ptwXY.h:59
@ ptwXY_lessEqualGreaterX_between
Definition ptwXY.h:60
@ ptwXY_lessEqualGreaterX_lessThan
Definition ptwXY.h:59
@ ptwXY_lessEqualGreaterX_greater
Definition ptwXY.h:60

Function Documentation

◆ ptwXY_abs()

nfu_status ptwXY_abs ( statusMessageReporting * smr,
ptwXYPoints * ptwXY )

Definition at line 18 of file ptwXY_unitaryOperators.c.

18 {
19
20 int64_t i, nonOverflowLength;
21 ptwXYPoint *p;
22 ptwXYOverflowPoint *o, *overflowHeader = &(ptwXY->overflowHeader);
23
24 if( ( nonOverflowLength = ptwXY_getNonOverflowLength( smr, ptwXY ) ) < 0 ) {
26 return( ptwXY->status );
27 }
28
29 for( i = 0, p = ptwXY->points; i < nonOverflowLength; i++, p++ ) p->y = fabs( p->y );
30 for( o = overflowHeader->next; o != overflowHeader; o = o->next ) o->point.y = fabs( o->point.y );
31 return( ptwXY->status );
32}
@ nfu_Error
int nfu_SMR_libraryID
int64_t ptwXY_getNonOverflowLength(statusMessageReporting *smr, ptwXYPoints const *ptwXY)
Definition ptwXY_core.c:805
struct ptwXYOverflowPoint_s ptwXYOverflowPoint
struct ptwXYPoint_s ptwXYPoint
#define smr_setReportError2p(smr, libraryID, code, fmt)
struct ptwXYOverflowPoint_s * next
Definition ptwXY.h:73
ptwXYPoint point
Definition ptwXY.h:75
double y
Definition ptwXY.h:64
ptwXYOverflowPoint overflowHeader
Definition ptwXY.h:92
ptwXYPoint * points
Definition ptwXY.h:93
nfu_status status
Definition ptwXY.h:80

◆ 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_status ptwXY_slopeOffset(statusMessageReporting *smr, ptwXYPoints *ptwXY, double slope, double offset)

◆ 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_appendXY()

nfu_status ptwXY_appendXY ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double x,
double y )

Definition at line 1432 of file ptwXY_core.c.

1432 {
1433
1434 int64_t nonOverflowLength = ptwXY_getNonOverflowLength( smr, ptwXY );
1435 ptwXY_dataFrom dataFrom;
1436
1437 if( nonOverflowLength < 0 ) {
1439 return( nfu_Error );
1440 }
1441
1442 if( ptwXY->length != 0 ) {
1443 double domainMax;
1444 nfu_status status;
1445
1446 if( ( status = ptwXY_domainMaxAndFrom( smr, ptwXY, &dataFrom, &domainMax ) ) != nfu_Okay ) {
1448 return( status );
1449 }
1450 if( domainMax >= x ) {
1451 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_XNotAscending, "domainMax = %17.e >= x = %.17e", domainMax, x );
1452 return( ptwXY->status = nfu_XNotAscending );
1453 }
1454 }
1455
1456 if( nonOverflowLength < ptwXY->allocatedSize ) { /* Room at end of points. Also handles the case when length = 0. */
1457 ptwXY->points[nonOverflowLength].x = x;
1458 ptwXY->points[nonOverflowLength].y = y; }
1459 else {
1460 if( ptwXY->overflowLength == ptwXY->overflowAllocatedSize ) {
1461 ptwXYPoint newPoint = { x, y };
1462 if( ptwXY_coalescePoints( smr, ptwXY, ptwXY->length + ptwXY->overflowAllocatedSize, &newPoint, 0 ) != nfu_Okay ) {
1464 return( ptwXY->status ); } }
1465 else { /* Add to end of overflow. */
1466 ptwXYOverflowPoint *overflowPoint = &(ptwXY->overflowPoints[ptwXY->overflowLength]);
1467
1468 overflowPoint->prior = ptwXY->overflowHeader.prior;
1469 overflowPoint->next = overflowPoint->prior->next;
1470 overflowPoint->index = ptwXY->length;
1471 overflowPoint->prior->next = overflowPoint;
1472 overflowPoint->next->prior = overflowPoint;
1473 overflowPoint->point.x = x;
1474 overflowPoint->point.y = y;
1475 ptwXY->overflowLength++;
1476 }
1477 }
1478 ptwXY->length++;
1479 return( nfu_Okay );
1480}
@ nfu_XNotAscending
enum nfu_status_e nfu_status
int64_t ptwXY_getNonOverflowLength(statusMessageReporting *smr, ptwXYPoints const *ptwXY)
Definition ptwXY_core.c:805
nfu_status ptwXY_coalescePoints(statusMessageReporting *smr, ptwXYPoints *ptwXY, int64_t size, ptwXYPoint *newPoint, int forceSmallerResize)
Definition ptwXY_core.c:667
nfu_status ptwXY_domainMaxAndFrom(statusMessageReporting *smr, ptwXYPoints *ptwXY, ptwXY_dataFrom *dataFrom, double *domainMax)
#define smr_setReportError2(smr, libraryID, code, fmt,...)
struct ptwXYOverflowPoint_s * prior
Definition ptwXY.h:72
double x
Definition ptwXY.h:64
int64_t overflowLength
Definition ptwXY.h:89
int64_t overflowAllocatedSize
Definition ptwXY.h:90
ptwXYOverflowPoint * overflowPoints
Definition ptwXY.h:94

◆ ptwXY_applyFunction()

nfu_status ptwXY_applyFunction ( statusMessageReporting * smr,
ptwXYPoints * ptwXY1,
ptwXY_applyFunction_callback func,
void * argList,
int checkForRoots )

Definition at line 165 of file ptwXY_misc.c.

166 {
167
168 int64_t i, originalLength = ptwXY1->length, notFirstPass = 0;
169 double y1, y2 = 0;
170 nfu_status status;
171 ptwXYPoint p1, p2;
172
173 checkForRoots = checkForRoots && ptwXY1->biSectionMax;
174
175 if( ptwXY1->interpolation == ptwXY_interpolationOther ) {
176 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not allowed." );
177 return( ptwXY1->status = nfu_otherInterpolation );
178 }
179 if( ptwXY1->interpolation == ptwXY_interpolationFlat ) {
180 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_flatInterpolation, "Flat interpolation not allowed." );
181 return( ptwXY1->status = nfu_flatInterpolation );
182 }
183
184 if( ptwXY_simpleCoalescePoints( smr, ptwXY1 ) != nfu_Okay ) goto Err;
185 for( i = originalLength - 1; i >= 0; i-- ) {
186 y1 = ptwXY1->points[i].y;
187 if( ( status = func( smr, &(ptwXY1->points[i]), argList ) ) != nfu_Okay ) {
188 if( ptwXY1->status == nfu_Okay ) ptwXY1->status = status;
189 return( status );
190 }
191 p1 = ptwXY1->points[i];
192 if( notFirstPass ) {
193 if( ptwXY_applyFunction2( smr, ptwXY1, y1, y2, &p1, &p2, func, argList, 0, checkForRoots ) != nfu_Okay ) goto Err;
194 }
195 notFirstPass = 1;
196 p2 = p1;
197 y2 = y1;
198 }
199 ptwXY_update_biSectionMax( ptwXY1, (double) originalLength );
200 return( status );
201
202Err:
204 if( ptwXY1->status == nfu_Okay ) ptwXY1->status = nfu_Error;
205 return( nfu_Error );
206}
@ nfu_flatInterpolation
@ nfu_otherInterpolation
nfu_status ptwXY_simpleCoalescePoints(statusMessageReporting *smr, ptwXYPoints *ptwXY)
Definition ptwXY_core.c:734
void ptwXY_update_biSectionMax(ptwXYPoints *ptwXY1, double oldLength)
Definition ptwXY_misc.c:37
ptwXY_interpolation interpolation
Definition ptwXY.h:81
double biSectionMax
Definition ptwXY.h:84

Referenced by ptwXY_pow().

◆ ptwXY_areDomainsMutual()

nfu_status ptwXY_areDomainsMutual ( statusMessageReporting * smr,
ptwXYPoints * ptwXY1,
ptwXYPoints * ptwXY2 )

Definition at line 431 of file ptwXY_convenient.c.

431 {
432
433 nfu_status status = nfu_Okay;
434 int64_t n1 = ptwXY1->length, n2 = ptwXY2->length;
435 ptwXYPoint *xy1, *xy2;
436
437 if( ptwXY1->status != nfu_Okay ) {
438 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source1." );
439 return( ptwXY1->status );
440 }
441
442 if( ptwXY2->status != nfu_Okay ) {
443 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source2." );
444 return( ptwXY2->status );
445 }
446
447 if( n1 == 0 ) return( nfu_empty );
448 if( n2 == 0 ) return( nfu_empty );
449 if( n1 < 2 ) {
450 status = nfu_tooFewPoints; }
451 else if( n2 < 2 ) {
452 status = nfu_tooFewPoints; }
453 else {
454 xy1 = ptwXY_getPointAtIndex_Unsafely( ptwXY1, 0 );
455 xy2 = ptwXY_getPointAtIndex_Unsafely( ptwXY2, 0 );
456 if( xy1->x < xy2->x ) {
457 if( xy2->y != 0. ) status = nfu_domainsNotMutual; }
458 else if( xy1->x > xy2->x ) {
459 if( xy1->y != 0. ) status = nfu_domainsNotMutual;
460 }
461
462 if( status == nfu_Okay ) {
463 xy1 = ptwXY_getPointAtIndex_Unsafely( ptwXY1, n1 - 1 );
464 xy2 = ptwXY_getPointAtIndex_Unsafely( ptwXY2, n2 - 1 );
465 if( xy1->x < xy2->x ) {
466 if( xy1->y != 0. ) status = nfu_domainsNotMutual; }
467 else if( xy1->x > xy2->x ) {
468 if( xy2->y != 0. ) status = nfu_domainsNotMutual;
469 }
470 }
471 }
472 return( status );
473}
@ nfu_domainsNotMutual
@ nfu_badSelf
@ nfu_tooFewPoints
@ nfu_empty
ptwXYPoint * ptwXY_getPointAtIndex_Unsafely(ptwXYPoints const *ptwXY, int64_t index)

Referenced by ptwXY_binary_ptwXY(), ptwXY_div_ptwXY(), and ptwXY_mutualifyDomains().

◆ 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_invalidInterpolation
char const * ptwXY_interpolationToString(ptwXY_interpolation interpolation)
nfu_status ptwXY_areDomainsMutual(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2)
#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)
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)
char const * interpolationString
Definition ptwXY.h:82

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

◆ ptwXY_clear()

nfu_status ptwXY_clear ( statusMessageReporting * smr,
ptwXYPoints * ptwXY )

Definition at line 743 of file ptwXY_core.c.

743 {
744
745 if( ptwXY->status != nfu_Okay ) {
746 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
747 return( ptwXY->status );
748 }
749
750 ptwXY->length = 0;
751 ptwXY->overflowLength = 0;
752 ptwXY->overflowHeader.prior = &(ptwXY->overflowHeader);
753 ptwXY->overflowHeader.next = &(ptwXY->overflowHeader);
754 return( nfu_Okay );
755}

Referenced by ptwXY_clip(), ptwXY_copy(), ptwXY_copyPointsOnly(), and ptwXY_setXYDataFromXsAndYs().

◆ ptwXY_clip()

nfu_status ptwXY_clip ( statusMessageReporting * smr,
ptwXYPoints * ptwXY1,
double rangeMin,
double rangeMax )

Definition at line 21 of file ptwXY_methods.c.

21 {
22/*
23 This function acts oddly for xy = [ [ 1, 0 ], [ 3, -2 ], [ 4, 1 ] ] and rangeMin = 0.2, why???????
24 This function probably only works for linear, linear interpolation (mainly because of ptwXY_clip2).
25*/
26 int64_t i, j, n;
27 double x2, y2, _rangeMin, _rangeMax;
28 ptwXYPoints *clipped;
29 ptwXYPoint *points;
30
31 if( ptwXY_simpleCoalescePoints( smr, ptwXY1 ) != nfu_Okay ) {
33 return( ptwXY1->status );
34 }
35
37 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not allowed." );
38 return( nfu_otherInterpolation );
39 }
40 n = ptwXY1->length;
41 if( n > 0 ) {
42 i = 0;
43 if( ptwXY_range( smr, ptwXY1, &_rangeMin, &_rangeMax ) != nfu_Okay ) {
45 return( nfu_Error );
46 }
47 if( _rangeMax < rangeMin ) i = 1;
48 if( _rangeMin > rangeMax ) i = 1;
49 if( i == 1 ) {
50 if( ptwXY_clear( smr, ptwXY1 ) != nfu_Okay ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via." );
51 return( ptwXY1->status );
52 }
53 }
54 if( n == 1 ) {
55 y2 = ptwXY1->points[0].y;
56 if( y2 < rangeMin ) {
57 ptwXY1->points[0].y = rangeMin; }
58 else if( y2 > rangeMax ) {
59 ptwXY1->points[0].y = rangeMax;
60 } }
61 else if( n > 1 ) {
62 if( ( clipped = ptwXY_new( smr, ptwXY1->interpolation, ptwXY1->interpolationString,
63 ptwXY1->biSectionMax, ptwXY1->accuracy, n, 10, ptwXY1->userFlag ) ) == NULL ) {
65 return( ptwXY1->status );
66 }
67 for( i = 0; i < n; i++ ) {
68 x2 = ptwXY1->points[i].x;
69 y2 = ptwXY1->points[i].y;
70 if( y2 < rangeMin ) {
71 if( i > 0 ) {
72 points = ptwXY_getPointAtIndex_Unsafely( clipped, clipped->length - 1 );
73 if( points->y > rangeMin ) {
74 if( ptwXY_clip2( smr, clipped, rangeMin, points->x, points->y, x2, y2 ) != nfu_Okay ) goto Err;
75 }
76 }
77 if( ptwXY_setValueAtX( smr, clipped, x2, rangeMin ) != nfu_Okay ) goto Err;
78 j = i;
79 for( i++; i < n; i++ ) if( !( ptwXY1->points[i].y < rangeMin ) ) break;
80 if( i < n ) {
81 x2 = ptwXY1->points[i].x;
82 y2 = ptwXY1->points[i].y;
83 if( ptwXY_clip2( smr, clipped, rangeMin, ptwXY1->points[i-1].x, ptwXY1->points[i-1].y, x2, y2 ) != nfu_Okay ) goto Err;
84 if( y2 > rangeMax ) {
85 if( ptwXY_clip2( smr, clipped, rangeMax, ptwXY1->points[i-1].x, ptwXY1->points[i-1].y, x2, y2 ) != nfu_Okay ) goto Err;
86 } }
87 else if( j != n - 1 ) {
88 if( ptwXY_setValueAtX( smr, clipped, ptwXY1->points[n - 1].x, rangeMin ) != nfu_Okay ) goto Err;
89 }
90 i--; }
91 else if( y2 > rangeMax ) {
92 if( i > 0 ) {
93 points = ptwXY_getPointAtIndex_Unsafely( clipped, clipped->length - 1 );
94 if( points->y < rangeMax ) {
95 if( ptwXY_clip2( smr, clipped, rangeMax, points->x, points->y, x2, y2 ) != nfu_Okay ) goto Err;
96 }
97 }
98 if( ptwXY_setValueAtX( smr, clipped, x2, rangeMax ) != nfu_Okay ) goto Err;
99 j = i;
100 for( i++; i < n; i++ ) if( !( ptwXY1->points[i].y > rangeMax ) ) break;
101 if( i < n ) {
102 x2 = ptwXY1->points[i].x;
103 y2 = ptwXY1->points[i].y;
104 if( ptwXY_clip2( smr, clipped, rangeMax, ptwXY1->points[i-1].x, ptwXY1->points[i-1].y, x2, y2 ) != nfu_Okay ) goto Err;
105 if( y2 < rangeMin ) {
106 if( ptwXY_clip2( smr, clipped, rangeMin, ptwXY1->points[i-1].x, ptwXY1->points[i-1].y, x2, y2 ) != nfu_Okay ) goto Err;
107 } }
108 else if( j != n - 1 ) {
109 if( ptwXY_setValueAtX( smr, clipped, ptwXY1->points[n - 1].x, rangeMax ) != nfu_Okay ) goto Err;
110 }
111 i--; }
112 else {
113 if( ptwXY_setValueAtX( smr, clipped, x2, y2 ) != nfu_Okay ) goto Err;
114 }
115 }
116 if( ptwXY_simpleCoalescePoints( smr, clipped ) != nfu_Okay ) goto Err;
117 ptwXY1->length = clipped->length; /* The squeamish may want to skip the next few lines. */
118 clipped->length = n;
119 n = ptwXY1->allocatedSize;
120 ptwXY1->allocatedSize = clipped->allocatedSize;
121 clipped->allocatedSize = n;
122 points = clipped->points;
123 clipped->points = ptwXY1->points;
124 ptwXY1->points = points;
125 ptwXY_free( clipped );
126 }
127
128 return( ptwXY1->status );
129
130Err:
132 ptwXY_free( clipped );
133 return( ptwXY1->status );
134}
nfu_status ptwXY_setValueAtX(statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, double y)
nfu_status ptwXY_range(statusMessageReporting *smr, ptwXYPoints *ptwXY, double *rangeMin, double *rangeMax)
nfu_status ptwXY_clear(statusMessageReporting *smr, ptwXYPoints *ptwXY)
Definition ptwXY_core.c:743
ptwXYPoints * ptwXY_new(statusMessageReporting *smr, ptwXY_interpolation interpolation, char const *interpolationString, double biSectionMax, double accuracy, int64_t primarySize, int64_t secondarySize, int userFlag)
Definition ptwXY_core.c:28
int userFlag
Definition ptwXY.h:83
double accuracy
Definition ptwXY.h:85
int64_t allocatedSize
Definition ptwXY.h:88

◆ ptwXY_clone()

ptwXYPoints * ptwXY_clone ( statusMessageReporting * smr,
ptwXYPoints * ptwXY )

Definition at line 302 of file ptwXY_core.c.

302 {
303
304 ptwXYPoints *ptwXY2 = ptwXY_slice( smr, ptwXY, 0, ptwXY->length, ptwXY->overflowAllocatedSize );
305
306 if( ptwXY2 == NULL ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via." );
307 return( ptwXY2 );
308}
ptwXYPoints * ptwXY_slice(statusMessageReporting *smr, ptwXYPoints *ptwXY, int64_t index1, int64_t index2, int64_t secondarySize)
Definition ptwXY_core.c:388

Referenced by ptwXY_add_ptwXY(), ptwXY_cloneToInterpolation(), ptwXY_domainSlice(), ptwXY_fromUnitbase(), ptwXY_intersectionWith_ptwX(), ptwXY_mul_ptwXY(), ptwXY_sub_ptwXY(), ptwXY_thin(), ptwXY_thinDomain(), ptwXY_toOtherInterpolation(), ptwXY_toUnitbase(), and ptwXY_unitbaseInterpolate().

◆ ptwXY_clone2()

ptwXYPoints * ptwXY_clone2 ( statusMessageReporting * smr,
ptwXYPoints const * ptwXY )

Definition at line 312 of file ptwXY_core.c.

312 {
313
314 int64_t length = ptwXY->length;
315 ptwXYPoints *ptwXY2 = NULL;
316 ptwXYPoint *pointsFrom, *pointsTo;
317 ptwXYOverflowPoint *last = ptwXY->overflowHeader.prior;
318
319 if( ptwXY->status != nfu_Okay ) {
320 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
321 return( NULL );
322 }
323
324 ptwXY2 = ptwXY_new( smr, ptwXY->interpolation, ptwXY->interpolationString,
325 ptwXY->biSectionMax, ptwXY->accuracy, length, ptwXY->overflowAllocatedSize, ptwXY->userFlag );
326 if( ptwXY2 == NULL ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via." );
327
328 pointsFrom = &(ptwXY->points[ptwXY_getNonOverflowLength( smr, ptwXY ) - 1]);
329 pointsTo = &(ptwXY2->points[length - 1]);
330 while( last != &(ptwXY->overflowHeader) ) {
331 if( ( pointsFrom >= ptwXY->points ) && ( pointsFrom->x > last->point.x ) ) {
332 *pointsTo = *pointsFrom;
333 --pointsFrom; }
334 else {
335 *pointsTo = last->point;
336 last = last->prior;
337 }
338 --pointsTo;
339 }
340
341 for( ; pointsFrom >= ptwXY->points; --pointsFrom, --pointsTo ) *pointsTo = *pointsFrom;
342 ptwXY2->length = length;
343
344 return( ptwXY2 );
345}
ptwXYPoints * ptwXY_new(statusMessageReporting *smr, ptwXY_interpolation interpolation, char const *interpolationString, double biSectionMax, double accuracy, int64_t primarySize, int64_t secondarySize, int userFlag)
Definition ptwXY_core.c:28

Referenced by GIDI::Functions::XYs1d::domainSlice(), GIDI::Functions::XYs1d::domainSliceMax(), GIDI::multiGroupTwoXYs1ds(), GIDI::multiGroupXYs1d(), GIDI::Functions::XYs1d::operator=(), and GIDI::Functions::XYs1d::XYs1d().

◆ ptwXY_cloneToInterpolation()

ptwXYPoints * ptwXY_cloneToInterpolation ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
ptwXY_interpolation interpolationTo )

Definition at line 349 of file ptwXY_core.c.

349 {
350
351 ptwXYPoints *n1;
352
353 if( ptwXY->status != nfu_Okay ) {
354 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
355 return( NULL );
356 }
357
358/* Other interpolation should probably be allowed. */
359 if( interpolationTo == ptwXY_interpolationOther ) {
360 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not allowed." );
361 return( NULL );
362 }
363 if( ( n1 = ptwXY_clone( smr, ptwXY ) ) == NULL ) {
365 else {
367 n1->interpolation = interpolationTo;
368 switch( interpolationTo ) {
370 n1->interpolationString = linLinInterpolationString; break;
372 n1->interpolationString = logLinInterpolationString; break;
374 n1->interpolationString = linLogInterpolationString; break;
376 n1->interpolationString = logLogInterpolationString; break;
378 n1->interpolationString = flatInterpolationString; break;
379 case ptwXY_interpolationOther : /* Does not happen, but needed to stop compilers from complaining. */
380 break;
381 }
382 }
383 return( n1 );
384}
ptwXYPoints * ptwXY_clone(statusMessageReporting *smr, ptwXYPoints *ptwXY)
Definition ptwXY_core.c:302
#define smr_freeMemory2(p)

Referenced by ptwXY_toOtherInterpolation().

◆ ptwXY_coalescePoints()

nfu_status ptwXY_coalescePoints ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
int64_t size,
ptwXYPoint * newPoint,
int forceSmallerResize )

Definition at line 667 of file ptwXY_core.c.

668 {
669
670 int addNewPoint;
671 int64_t length = ptwXY->length + ( ( newPoint != NULL ) ? 1 : 0 );
673 ptwXYPoint *pointsFrom, *pointsTo;
674
675 if( ptwXY->status != nfu_Okay ) {
676 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
677 return( ptwXY->status );
678 }
679 if( ptwXY->overflowLength == 0 ) return( nfu_Okay );
680
681 if( size < length ) size = length;
682 if( size > ptwXY->allocatedSize ) {
683 if( ptwXY_reallocatePoints( smr, ptwXY, size, forceSmallerResize ) != nfu_Okay ) {
685 return( ptwXY->status );
686 }
687 }
688 pointsFrom = &(ptwXY->points[ptwXY_getNonOverflowLength( smr, ptwXY ) - 1]);
689 pointsTo = &(ptwXY->points[length - 1]);
690 while( last != &(ptwXY->overflowHeader) ) {
691 addNewPoint = 0;
692 if( newPoint != NULL ) {
693 if( ( pointsFrom >= ptwXY->points ) && ( pointsFrom->x > last->point.x ) ) {
694 if( newPoint->x > pointsFrom->x ) addNewPoint = 1; }
695 else {
696 if( newPoint->x > last->point.x ) addNewPoint = 1;
697 }
698 if( addNewPoint == 1 ) {
699 *pointsTo = *newPoint;
700 newPoint = NULL;
701 }
702 }
703 if( addNewPoint == 0 ) {
704 if( ( pointsFrom >= ptwXY->points ) && ( pointsFrom->x > last->point.x ) ) {
705 *pointsTo = *pointsFrom;
706 pointsFrom--; }
707 else {
708 *pointsTo = last->point;
709 last = last->prior;
710 }
711 }
712 pointsTo--;
713 }
714 while( ( newPoint != NULL ) && ( pointsFrom >= ptwXY->points ) ) {
715 if( newPoint->x > pointsFrom->x ) {
716 *pointsTo = *newPoint;
717 newPoint = NULL; }
718 else {
719 *pointsTo = *pointsFrom;
720 pointsFrom--;
721 }
722 pointsTo--;
723 }
724 if( newPoint != NULL ) *pointsTo = *newPoint;
725 ptwXY->overflowHeader.prior = &(ptwXY->overflowHeader);
726 ptwXY->overflowHeader.next = &(ptwXY->overflowHeader);
727 ptwXY->length = length;
728 ptwXY->overflowLength = 0;
729 return( nfu_Okay );
730}
nfu_status ptwXY_reallocatePoints(statusMessageReporting *smr, ptwXYPoints *ptwXY, int64_t size, int forceSmallerResize)
Definition ptwXY_core.c:602

Referenced by ptwXY_appendXY(), ptwXY_createGaussianCenteredSigma1(), ptwXY_domainSlice(), ptwXY_reallocateOverflowPoints(), ptwXY_setValueAtX_overrideIfClose(), and ptwXY_simpleCoalescePoints().

◆ ptwXY_convolution()

ptwXYPoints * ptwXY_convolution ( statusMessageReporting * smr,
ptwXYPoints * ptwXY1,
ptwXYPoints * ptwXY2,
int mode )

Definition at line 111 of file ptwXY_functions.c.

111 {
112/*
113* Currently, only supports linear-linear interpolation.
114*
115* This function calculates c(y) = integral dx f1(x) * f2(y-x)
116*
117*/
118 int64_t i1, i2, n1, n2, n;
119 ptwXYPoints *f1 = ptwXY1, *f2 = ptwXY2, *convolute;
120 double accuracy = ptwXY1->accuracy, rangeMin, rangeMax, c, y, dy;
121
122 if( ptwXY_simpleCoalescePoints( smr, ptwXY1 ) != nfu_Okay ) {
123 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via (source1)." );
124 return( NULL );
125 }
126 if( ptwXY_simpleCoalescePoints( smr, ptwXY2 ) != nfu_Okay ) {
127 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via (source2)." );
128 return( NULL );
129 }
130
133 "Source1: unsupported interpolation = '%s'", ptwXY1->interpolationString );
134 return( NULL );
135 }
138 "Source2: unsupported interpolation = '%s'", ptwXY2->interpolationString );
139 return( NULL );
140 }
141
142 n1 = f1->length;
143 n2 = f2->length;
144
145 if( ( n1 == 0 ) || ( n2 == 0 ) ) {
146 convolute = ptwXY_new( smr, ptwXY_interpolationLinLin, NULL, 1., accuracy, 0, 0, 0 );
147 if( convolute == NULL ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via." );
148 return( convolute );
149 }
150
151 if( ( n1 == 1 ) || ( n2 == 1 ) ) {
153 "Too few points: len( source1 ) = %d, len( source1 ) = %d.", (int) n1, (int) n2 );
154 return( NULL );
155 }
156
157 if( accuracy < ptwXY2->accuracy ) accuracy = ptwXY2->accuracy;
158 n = n1 * n2;
159 if( mode == 0 ) {
160 mode = 1;
161 if( n > 10000 ) mode = -1;
162 }
163 if( n > 100000 ) mode = -1;
164 if( ( convolute = ptwXY_new( smr, ptwXY_interpolationLinLin, NULL, 1., accuracy, 400, 40, 0 ) ) == NULL ) {
166 return( NULL );
167 }
168
169 rangeMin = f1->points[0].x + f2->points[0].x;
170 rangeMax = f1->points[n1 - 1].x + f2->points[n2 - 1].x;
171
172 if( ptwXY_setValueAtX( smr, convolute, rangeMin, 0. ) != nfu_Okay ) goto Err;
173
174 if( mode < 0 ) {
175 dy = ( rangeMax - rangeMin ) / 2000;
176 for( y = rangeMin + dy; y < rangeMax; y += dy ) {
177 if( ptwXY_convolution2( smr, f1, f2, y, rangeMin, &c ) != nfu_Okay ) goto Err;
178 if( ptwXY_setValueAtX( smr, convolute, y, c ) != nfu_Okay ) goto Err;
179 } }
180 else {
181 for( i1 = 0; i1 < n1; i1++ ) {
182 for( i2 = 0; i2 < n2; i2++ ) {
183 y = rangeMin + ( f1->points[i1].x - f1->points[0].x ) + ( f2->points[i2].x - f2->points[0].x );
184 if( y <= rangeMin ) continue;
185 if( y >= rangeMax ) continue;
186 if( ptwXY_convolution2( smr, f1, f2, y, rangeMin, &c ) != nfu_Okay ) goto Err;
187 if( ptwXY_setValueAtX( smr, convolute, y, c ) != nfu_Okay ) goto Err;
188 }
189 }
190 }
191 if( ptwXY_setValueAtX( smr, convolute, rangeMax, 0. ) != nfu_Okay ) goto Err;
192 if( ptwXY_simpleCoalescePoints( smr, convolute ) != nfu_Okay ) goto Err;
193 for( i1 = convolute->length - 1; i1 > 0; i1-- ) {
194 if( ptwXY_convolution3( smr, convolute, f1, f2, convolute->points[i1 - 1].x, convolute->points[i1 - 1].y,
195 convolute->points[i1].x, convolute->points[i1].y, rangeMin ) != nfu_Okay ) goto Err;
196 }
197
198 return( convolute );
199
200Err:
201 ptwXY_free( convolute );
203 return( NULL );
204}
@ nfu_unsupportedInterpolation

◆ ptwXY_copy()

nfu_status ptwXY_copy ( statusMessageReporting * smr,
ptwXYPoints * dest,
ptwXYPoints * src )

Definition at line 171 of file ptwXY_core.c.

171 {
172
173 int64_t i, nonOverflowLength;
174 ptwXYPoint *pointFrom, *pointTo;
175 ptwXYOverflowPoint *o, *overflowHeader = &(src->overflowHeader);
176
177 if( dest->status != nfu_Okay ) {
178 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid destination." );
179 return( dest->status );
180 }
181 if( src->status != nfu_Okay ) {
182 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
183 return( src->status );
184 }
185
186 nonOverflowLength = ptwXY_getNonOverflowLength( smr, src ); /* No need to check return value. */
187
188 if( ptwXY_clear( smr, dest ) != nfu_Okay ) {
190 return( dest->status );
191 }
193 if( dest->interpolationString != NULL ) {
194 dest->interpolationString = (char const *) smr_freeMemory2( dest->interpolationString );
195 }
196 }
197 dest->interpolation = ptwXY_interpolationLinLin; /* This and prior lines are in case interpolation is 'other' and ptwXY_reallocatePoints fails. */
198 if( dest->allocatedSize < src->length ) {
199 if( ptwXY_reallocatePoints( smr, dest, src->length, 0 ) != nfu_Okay ) {
201 return( dest->status );
202 }
203 }
204 if( dest->status != nfu_Okay ) return( dest->status );
205 dest->interpolation = src->interpolation;
207 if( src->interpolationString != NULL ) {
208 if( ( dest->interpolationString = smr_allocateCopyString2( smr, src->interpolationString, "interpolationString" ) ) == NULL ) {
210 return( dest->status = nfu_Error );
211 }
212 } }
213 else {
215 }
216 dest->userFlag = src->userFlag;
217 dest->biSectionMax = src->biSectionMax;
218 dest->accuracy = src->accuracy;
220 pointFrom = src->points;
221 o = src->overflowHeader.next;
222 pointTo = dest->points;
223 i = 0;
224 while( o != overflowHeader ) {
225 if( i < nonOverflowLength ) {
226 if( pointFrom->x < o->point.x ) {
227 *pointTo = *pointFrom;
228 i++;
229 pointFrom++; }
230 else {
231 *pointTo = o->point;
232 o = o->next;
233 } }
234 else {
235 *pointTo = o->point;
236 o = o->next;
237 }
238 pointTo++;
239 }
240 for( ; i < nonOverflowLength; i++, pointFrom++, pointTo++ ) *pointTo = *pointFrom;
241 dest->length = src->length;
242 return( dest->status );
243}
nfu_status ptwXY_clear(statusMessageReporting *smr, ptwXYPoints *ptwXY)
Definition ptwXY_core.c:743
#define smr_allocateCopyString2(smr, s, forItem)
double minFractional_dx
Definition ptwXY.h:86

Referenced by ptwXY_scaleAndOffsetDomainWith_ptwXYs().

◆ ptwXY_copyPointsOnly()

nfu_status ptwXY_copyPointsOnly ( statusMessageReporting * smr,
ptwXYPoints * dest,
ptwXYPoints * src )

Definition at line 247 of file ptwXY_core.c.

247 {
248
249 int64_t i, nonOverflowLength;
250 ptwXYPoint *pointFrom, *pointTo;
251 ptwXYOverflowPoint *o, *overflowHeader = &(src->overflowHeader);
252
253 if( dest->status != nfu_Okay ) {
254 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid destination." );
255 return( dest->status );
256 }
257 if( src->status != nfu_Okay ) {
258 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
259 return( src->status );
260 }
261
262 nonOverflowLength = ptwXY_getNonOverflowLength( smr, src ); /* No need to check return value. */
263
264 if( ptwXY_clear( smr, dest ) != nfu_Okay ) {
266 return( dest->status );
267 }
268
269 if( dest->allocatedSize < src->length ) {
270 if( ptwXY_reallocatePoints( smr, dest, src->length, 0 ) != nfu_Okay ) {
272 return( dest->status );
273 }
274 }
275 pointFrom = src->points;
276 o = src->overflowHeader.next;
277 pointTo = dest->points;
278 i = 0;
279 while( o != overflowHeader ) {
280 if( i < nonOverflowLength ) {
281 if( pointFrom->x < o->point.x ) {
282 *pointTo = *pointFrom;
283 i++;
284 pointFrom++; }
285 else {
286 *pointTo = o->point;
287 o = o->next;
288 } }
289 else {
290 *pointTo = o->point;
291 o = o->next;
292 }
293 pointTo++;
294 }
295 for( ; i < nonOverflowLength; i++, pointFrom++, pointTo++ ) *pointTo = *pointFrom;
296 dest->length = src->length;
297 return( dest->status );
298}

◆ ptwXY_copyToC_XY()

nfu_status ptwXY_copyToC_XY ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
int64_t index1,
int64_t index2,
int64_t allocatedSize,
int64_t * numberOfPoints,
double * xy )

Definition at line 699 of file ptwXY_convenient.c.

700 {
701
702 int64_t i;
703 double *d = xys;
704 ptwXYPoint *pointFrom;
705
706 if( ptwXY_simpleCoalescePoints( smr, ptwXY ) != nfu_Okay ) {
707 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
708 return( ptwXY->status );
709 }
710
711 if( index1 < 0 ) index1 = 0;
712 if( index2 > ptwXY->length ) index2 = ptwXY->length;
713 if( index2 < index1 ) index2 = index1;
714 *numberOfPoints = index2 - index1;
715 if( allocatedSize < ( index2 - index1 ) ) return( nfu_insufficientMemory );
716
717 for( i = index1, pointFrom = ptwXY->points; i < index2; i++, pointFrom++ ) {
718 *(d++) = pointFrom->x;
719 *(d++) = pointFrom->y;
720 }
721
722 return( nfu_Okay );
723}
@ nfu_insufficientMemory

◆ ptwXY_create()

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 )

Definition at line 110 of file ptwXY_core.c.

112 {
113
114 ptwXYPoints *ptwXY;
115
116 if( primarySize < length ) primarySize = length;
117 if( ( ptwXY = ptwXY_new( smr, interpolation, interpolationString, biSectionMax, accuracy, primarySize,
118 secondarySize, userFlag ) ) != NULL ) {
119 if( ptwXY_setXYData( smr, ptwXY, length, xy ) != nfu_Okay ) ptwXY = ptwXY_free( ptwXY );
120 }
121
122 if( ptwXY == NULL ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via." );
123 return( ptwXY );
124}
nfu_status ptwXY_setXYData(statusMessageReporting *smr, ptwXYPoints *ptwXY, int64_t length, double const *xy)
Definition ptwXY_core.c:866
ptwXYPoints * ptwXY_free(ptwXYPoints *ptwXY)
Definition ptwXY_core.c:782

Referenced by ptwXY_create2(), ptwXY_fromString(), and GIDI::Functions::XYs1d::XYs1d().

◆ ptwXY_create2()

ptwXYPoints * ptwXY_create2 ( statusMessageReporting * smr,
ptwXY_interpolation interpolation,
int64_t primarySize,
int64_t secondarySize,
int64_t length,
double const * xy,
int userFlag )

Definition at line 128 of file ptwXY_core.c.

129 {
130
131 char const *interpolationString = ptwXY_interpolationToString( interpolation );
132
133 return( ptwXY_create( smr, interpolation, interpolationString, 12, 1e-3, primarySize, secondarySize, length, xy, userFlag ) );
134}
char const * ptwXY_interpolationToString(ptwXY_interpolation interpolation)
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)
Definition ptwXY_core.c:110

Referenced by GIDI::Functions::XYs1d::XYs1d(), GIDI::Functions::XYs1d::XYs1d(), and GIDI::Functions::XYs1d::XYs1d().

◆ ptwXY_createFrom_Xs_Ys()

ptwXYPoints * ptwXY_createFrom_Xs_Ys ( statusMessageReporting * smr,
ptwXY_interpolation interpolation,
char const * interpolationString,
double biSectionMax,
double accuracy,
int64_t primarySize,
int64_t secondarySize,
int64_t length,
double const * Xs,
double const * Ys,
int userFlag )

Definition at line 138 of file ptwXY_core.c.

140 {
141
142 int i;
143 ptwXYPoints *ptwXY;
144
145 if( primarySize < length ) primarySize = length;
146 if( ( ptwXY = ptwXY_new( smr, interpolation, interpolationString, biSectionMax, accuracy, primarySize,
147 secondarySize, userFlag ) ) != NULL ) {
148 for( i = 0; i < length; i++ ) {
149 ptwXY->points[i].x = Xs[i];
150 ptwXY->points[i].y = Ys[i];
151 }
152 ptwXY->length = length;
153 }
154
155 if( ptwXY == NULL ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via." );
156 return( ptwXY );
157}

Referenced by GIDI::multiGroupXYs1d(), GIDI::Transporting::Flux::process(), and ptwXY_createFrom_Xs_Ys2().

◆ ptwXY_createFrom_Xs_Ys2()

ptwXYPoints * ptwXY_createFrom_Xs_Ys2 ( statusMessageReporting * smr,
ptwXY_interpolation interpolation,
int64_t primarySize,
int64_t secondarySize,
int64_t length,
double const * Xs,
double const * Ys,
int userFlag )

Definition at line 161 of file ptwXY_core.c.

162 {
163
164 char const *interpolationString = ptwXY_interpolationToString( interpolation );
165
166 return( ptwXY_createFrom_Xs_Ys( smr, interpolation, interpolationString, 12, 1e-3, primarySize, secondarySize, length, Xs, Ys, userFlag ) );
167}
ptwXYPoints * ptwXY_createFrom_Xs_Ys(statusMessageReporting *smr, ptwXY_interpolation interpolation, char const *interpolationString, double biSectionMax, double accuracy, int64_t primarySize, int64_t secondarySize, int64_t length, double const *Xs, double const *Ys, int userFlag)
Definition ptwXY_core.c:138

Referenced by GIDI::Functions::XYs1d::XYs1d().

◆ ptwXY_createFromFunction()

ptwXYPoints * ptwXY_createFromFunction ( statusMessageReporting * smr,
int n,
double * xs,
ptwXY_createFromFunction_callback func,
void * argList,
double accuracy,
int checkForRoots,
int biSectionMax )

Definition at line 46 of file ptwXY_misc.c.

47 {
48
49 int64_t i;
50 double x1, y1, x2, y2, eps = ClosestAllowXFactor * DBL_EPSILON;
51 ptwXYPoints *ptwXY;
52 ptwXYPoint *p1, *p2;
53
54 if( n < 2 ) {
55 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_tooFewPoints, "Too few point = %d.", (int) n );
56 return( NULL );
57 }
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] );
63 return( NULL );
64 }
65 }
66
67 x1 = xs[0];
68 if( func( smr, x1, &y1, argList ) != nfu_Okay ) {
69 return( NULL );
70 }
71 if( ( ptwXY = ptwXY_new( smr, ptwXY_interpolationLinLin, NULL, biSectionMax, accuracy, 500, 50, 0 ) ) == NULL ) goto Err;
72 for( i = 1; i < n; i++ ) {
73 if( ptwXY_setValueAtX_overrideIfClose( smr, ptwXY, x1, y1, eps, 0 ) != nfu_Okay ) goto Err;
74 x2 = xs[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;
77 x1 = x2;
78 y1 = y2;
79 }
80 if( ptwXY_setValueAtX_overrideIfClose( smr, ptwXY, x2, y2, eps, 1 ) != nfu_Okay ) goto Err;
81
82 if( checkForRoots ) {
83 if( ptwXY_simpleCoalescePoints( NULL, ptwXY ) != nfu_Okay ) goto Err;
84 for( i = ptwXY->length - 1, p2 = NULL; i >= 0; i--, p2 = p1 ) { /* Work backward so lower points are still valid if a new point is added. */
85 p1 = &(ptwXY->points[i]);
86 if( p2 != NULL ) {
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;
89 }
90 }
91 }
92 }
93
94 return( ptwXY );
95
96Err:
98 if( ptwXY != NULL ) ptwXY_free( ptwXY );
99 return( NULL );
100}
#define ClosestAllowXFactor
Definition ptwXY.h:28
nfu_status ptwXY_setValueAtX_overrideIfClose(statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, double y, double eps, int override)
#define DBL_EPSILON
Definition templates.hh:66

Referenced by GIDI::Functions::Polynomial1d::asXYs1d(), MCGIDI::Probabilities::NBodyPhaseSpace2d::NBodyPhaseSpace2d(), nf_Legendre_to_ptwXY(), and ptwXY_createFromFunction2().

◆ ptwXY_createFromFunction2()

ptwXYPoints * ptwXY_createFromFunction2 ( statusMessageReporting * smr,
ptwXPoints * xs,
ptwXY_createFromFunction_callback func,
void * argList,
double accuracy,
int checkForRoots,
int biSectionMax )

Definition at line 104 of file ptwXY_misc.c.

105 {
106
107 ptwXYPoints *ptwXY = ptwXY_createFromFunction( smr, (int) xs->length, xs->points, func, argList, accuracy,
108 checkForRoots, biSectionMax );
109
110 if( ptwXY == NULL ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via." );
111 return( ptwXY );
112}
ptwXYPoints * ptwXY_createFromFunction(statusMessageReporting *smr, int n, double *xs, ptwXY_createFromFunction_callback func, void *argList, double accuracy, int checkForRoots, int biSectionMax)
Definition ptwXY_misc.c:46
int64_t length
Definition ptwX.h:29
double * points
Definition ptwX.h:32

◆ ptwXY_createGaussian()

ptwXYPoints * ptwXY_createGaussian ( statusMessageReporting * smr,
double accuracy,
double xCenter,
double sigma,
double amplitude,
double domainMin,
double domainMax,
double dullEps )

Definition at line 864 of file ptwXY_convenient.c.

865 {
866
867 int64_t i;
868 ptwXYPoints *gaussian, *sliced;
869 ptwXYPoint *point;
870
871 if( ( gaussian = ptwXY_createGaussianCenteredSigma1( smr, accuracy ) ) == NULL ) {
873 return( NULL );
874 }
875
876 for( i = 0, point = gaussian->points; i < gaussian->length; i++, point++ ) {
877 point->x = point->x * sigma + xCenter;
878 point->y *= amplitude;
879 }
880 if( ( gaussian->points[0].x < domainMin ) || ( gaussian->points[gaussian->length - 1].x > domainMax ) ) {
881 if( ( sliced = ptwXY_domainSlice( smr, gaussian, domainMin, domainMax, 10, 1 ) ) == NULL ) goto Err;
882 ptwXY_free( gaussian );
883 gaussian = sliced;
884 }
885
886 return( gaussian );
887
888Err:
890 ptwXY_free( gaussian );
891 return( NULL );
892}
ptwXYPoints * ptwXY_domainSlice(statusMessageReporting *smr, ptwXYPoints *ptwXY, double domainMin, double domainMax, int64_t secondarySize, int fill)
Definition ptwXY_core.c:422
ptwXYPoints * ptwXY_createGaussianCenteredSigma1(statusMessageReporting *smr, double accuracy)

◆ ptwXY_createGaussianCenteredSigma1()

ptwXYPoints * ptwXY_createGaussianCenteredSigma1 ( statusMessageReporting * smr,
double accuracy )

Definition at line 784 of file ptwXY_convenient.c.

784 {
785
786 int64_t i, n;
787 ptwXYPoint *pm, *pp;
788 double x1, y1, x2, y2, accuracy2, rangeMin = 1e-10;
789 ptwXYPoints *gaussian;
790
791 if( accuracy < 1e-5 ) accuracy = 1e-5;
792 if( accuracy > 1e-1 ) accuracy = 1e-1;
793 if( ( gaussian = ptwXY_new( smr, ptwXY_interpolationLinLin, NULL, 1., accuracy, 200, 100, 0 ) ) == NULL ) {
795 return( NULL );
796 }
797
798 accuracy2 = accuracy = gaussian->accuracy;
799 if( accuracy2 > 5e-3 ) accuracy2 = 5e-3;
800
801 x1 = -sqrt( -2. * log( rangeMin ) );
802 y1 = rangeMin;
803 x2 = -5.2;
804 y2 = exp( -0.5 * x2 * x2 );
805 if( ptwXY_setValueAtX( smr, gaussian, x1, y1 ) != nfu_Okay ) goto Err;
806 gaussian->accuracy = 20 * accuracy2;
807 if( ptwXY_createGaussianCenteredSigma1_2( smr, gaussian, x1, y1, x2, y2, 1 ) != nfu_Okay ) goto Err;
808 x1 = x2;
809 y1 = y2;
810 x2 = -4.;
811 y2 = exp( -0.5 * x2 * x2 );
812 gaussian->accuracy = 5 * accuracy2;
813 if( ptwXY_createGaussianCenteredSigma1_2( smr, gaussian, x1, y1, x2, y2, 1 ) != nfu_Okay ) goto Err;
814 x1 = x2;
815 y1 = y2;
816 x2 = -1;
817 y2 = exp( -0.5 * x2 * x2 );
818 gaussian->accuracy = accuracy;
819 if( ptwXY_createGaussianCenteredSigma1_2( smr, gaussian, x1, y1, x2, y2, 1 ) != nfu_Okay ) goto Err;
820 x1 = x2;
821 y1 = y2;
822 x2 = 0;
823 y2 = exp( -0.5 * x2 * x2 );
824 if( ptwXY_createGaussianCenteredSigma1_2( smr, gaussian, x1, y1, x2, y2, 1 ) != nfu_Okay ) goto Err;
825
826 n = gaussian->length;
827 if( ptwXY_coalescePoints( smr, gaussian, 2 * n + 1, NULL, 0 ) != nfu_Okay ) goto Err;
828 if( ptwXY_setValueAtX( smr, gaussian, 0., 1. ) != nfu_Okay ) goto Err;
829 pp = &(gaussian->points[gaussian->length]);
830 for( i = 0, pm = pp - 2; i < n; i++, pp++, pm-- ) {
831 *pp = *pm;
832 pp->x *= -1;
833 }
834 gaussian->length = 2 * n + 1;
835
836 return( gaussian );
837
838Err:
839 ptwXY_free( gaussian );
841 return( NULL );
842}
nfu_status ptwXY_coalescePoints(statusMessageReporting *smr, ptwXYPoints *ptwXY, int64_t size, ptwXYPoint *newPoint, int forceSmallerResize)
Definition ptwXY_core.c:667

Referenced by ptwXY_createGaussian().

◆ ptwXY_deletePoints()

nfu_status ptwXY_deletePoints ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
int64_t i1,
int64_t i2 )

Definition at line 943 of file ptwXY_core.c.

943 {
944
945 int64_t n = ptwXY->length - ( i2 - i1 );
946
947 if( ptwXY_simpleCoalescePoints( smr, ptwXY ) != nfu_Okay ) {
949 return( ptwXY->status );
950 }
951
952 if( ( i1 < 0 ) || ( i2 < i1 ) || ( i2 > ptwXY->length ) ) {
953 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_badIndex, "Indices = %d, %d out of bounds: length = %d",
954 (int) i1, (int) i2, (int) ptwXY->length );
955 return( ptwXY->status = nfu_badIndex );
956 }
957
958 if( i1 != i2 ) {
959 for( ; i2 < ptwXY->length; i1++, i2++ ) ptwXY->points[i1] = ptwXY->points[i2];
960 ptwXY->length = n;
961 }
962 return( ptwXY->status );
963}
@ nfu_badIndex
nfu_status ptwXY_simpleCoalescePoints(statusMessageReporting *smr, ptwXYPoints *ptwXY)
Definition ptwXY_core.c:734

◆ 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}

◆ 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
double nfu_getNAN(void)
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)

◆ ptwXY_domainMax()

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

Definition at line 1668 of file ptwXY_core.c.

1668 {
1669
1670 ptwXY_dataFrom dataFrom;
1671 nfu_status status;
1672
1673 if( ( status = ptwXY_domainMaxAndFrom( smr, ptwXY, &dataFrom, domainMax ) ) != nfu_Okay ) {
1674 if( status == nfu_empty ) return( status );
1676 return( nfu_Error );
1677 }
1678 return( nfu_Okay );
1679}

Referenced by GIDI::multiGroupTwoXYs1ds(), ptwXY_binary_ptwXY(), ptwXY_div_ptwXY(), ptwXY_domainMinSlice(), ptwXY_domainSlice(), ptwXY_integrateDomain(), ptwXY_integrateDomainWithWeight_sqrt_x(), ptwXY_integrateDomainWithWeight_x(), and ptwXY_scaleAndOffsetDomainWith_ptwXYs().

◆ ptwXY_domainMaxAndFrom()

nfu_status ptwXY_domainMaxAndFrom ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
ptwXY_dataFrom * dataFrom,
double * value )

Definition at line 1636 of file ptwXY_core.c.

1636 {
1637
1638 int64_t nonOverflowLength = ptwXY_getNonOverflowLength( smr, ptwXY );
1639
1640 *domainMax = 0;
1641 *dataFrom = ptwXY_dataFrom_Unknown;
1642
1643 if( nonOverflowLength < 0 ) {
1645 return( nfu_Error );
1646 }
1647
1648 if( ptwXY->overflowLength > 0 ) {
1649 *dataFrom = ptwXY_dataFrom_Overflow;
1650 *domainMax = ptwXY->overflowHeader.prior->point.x;
1651 if( ( nonOverflowLength > 0 ) ) {
1652 if( *domainMax < ptwXY->points[nonOverflowLength-1].x ) {
1653 *dataFrom = ptwXY_dataFrom_Points;
1654 *domainMax = ptwXY->points[nonOverflowLength-1].x;
1655 }
1656 } }
1657 else if( ptwXY->length > 0 ) {
1658 *dataFrom = ptwXY_dataFrom_Points;
1659 *domainMax = ptwXY->points[nonOverflowLength-1].x; }
1660 else {
1661 return( nfu_empty );
1662 }
1663 return( nfu_Okay );
1664}

Referenced by ptwXY_appendXY(), ptwXY_domainMax(), and ptwXY_getPointsAroundX_closeIsEqual().

◆ ptwXY_domainMaxSlice()

ptwXYPoints * ptwXY_domainMaxSlice ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double domainMax,
int64_t secondarySize,
int fill )

Definition at line 499 of file ptwXY_core.c.

499 {
500
501 double domainMin = 0.9 * domainMax - 1;
502 ptwXYPoints *ptwXY2;
503
504 if( domainMax < 0 ) domainMin = 1.1 * domainMax - 1;
505 if( ptwXY->length > 0 ) {
506 if( ptwXY_domainMin( smr, ptwXY, &domainMin ) != nfu_Okay ) {
508 return( NULL );
509 }
510 }
511 if( ( ptwXY2 = ptwXY_domainSlice( smr, ptwXY, domainMin, domainMax, secondarySize, fill ) ) == NULL )
513 return( ptwXY2 );
514}
ptwXYPoints * ptwXY_domainSlice(statusMessageReporting *smr, ptwXYPoints *ptwXY, double domainMin, double domainMax, int64_t secondarySize, int fill)
Definition ptwXY_core.c:422
nfu_status ptwXY_domainMin(statusMessageReporting *smr, ptwXYPoints *ptwXY, double *domainMin)

Referenced by GIDI::Functions::XYs1d::domainSliceMax(), and GIDI::ProtareTNSL::TNSL_crossSectionSumCorrection().

◆ ptwXY_domainMin()

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

Definition at line 1620 of file ptwXY_core.c.

1620 {
1621
1622 ptwXY_dataFrom dataFrom;
1623 nfu_status status;
1624
1625 if( ( status = ptwXY_domainMinAndFrom( smr, ptwXY, &dataFrom, domainMin ) ) != nfu_Okay ) {
1626 if( status == nfu_empty ) return( status );
1628 return( nfu_Error );
1629 }
1630
1631 return( nfu_Okay );
1632}
nfu_status ptwXY_domainMinAndFrom(statusMessageReporting *smr, ptwXYPoints *ptwXY, ptwXY_dataFrom *dataFrom, double *domainMin)

Referenced by GIDI::multiGroupTwoXYs1ds(), ptwXY_binary_ptwXY(), ptwXY_div_ptwXY(), ptwXY_domainMaxSlice(), ptwXY_domainSlice(), ptwXY_integrateDomain(), ptwXY_integrateDomainWithWeight_sqrt_x(), ptwXY_integrateDomainWithWeight_x(), and ptwXY_scaleAndOffsetDomainWith_ptwXYs().

◆ ptwXY_domainMinAndFrom()

nfu_status ptwXY_domainMinAndFrom ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
ptwXY_dataFrom * dataFrom,
double * value )

Definition at line 1588 of file ptwXY_core.c.

1588 {
1589
1590 int64_t nonOverflowLength = ptwXY_getNonOverflowLength( smr, ptwXY );
1591
1592 *domainMin = 0;
1593 *dataFrom = ptwXY_dataFrom_Unknown;
1594
1595 if( nonOverflowLength < 0 ) {
1597 return( nfu_Error );
1598 }
1599
1600 if( ptwXY->overflowLength > 0 ) {
1601 *dataFrom = ptwXY_dataFrom_Overflow;
1602 *domainMin = ptwXY->overflowHeader.next->point.x;
1603 if( nonOverflowLength >= 0 ) {
1604 if( *domainMin > ptwXY->points[0].x ) {
1605 *dataFrom = ptwXY_dataFrom_Points;
1606 *domainMin = ptwXY->points[0].x;
1607 }
1608 } }
1609 else if( nonOverflowLength > 0 ) {
1610 *dataFrom = ptwXY_dataFrom_Points;
1611 *domainMin = ptwXY->points[0].x; }
1612 else {
1613 return( nfu_empty );
1614 }
1615 return( nfu_Okay );
1616}

Referenced by ptwXY_domainMin(), and ptwXY_getPointsAroundX_closeIsEqual().

◆ ptwXY_domainMinSlice()

ptwXYPoints * ptwXY_domainMinSlice ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double domainMin,
int64_t secondarySize,
int fill )

Definition at line 482 of file ptwXY_core.c.

482 {
483
484 double domainMax = 1.1 * domainMin + 1;
485 ptwXYPoints *ptwXY2;
486
487 if( domainMin < 0 ) domainMax = 0.9 * domainMin + 1;
488 if( ptwXY->length > 0 ) {
489 if( ptwXY_domainMax( smr, ptwXY, &domainMax ) != nfu_Okay )
491 }
492 if( ( ptwXY2 = ptwXY_domainSlice( smr, ptwXY, domainMin, domainMax, secondarySize, fill ) ) == NULL )
494 return( ptwXY2 );
495}
nfu_status ptwXY_domainMax(statusMessageReporting *smr, ptwXYPoints *ptwXY, double *domainMax)

◆ ptwXY_domainSlice()

ptwXYPoints * ptwXY_domainSlice ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double domainMin,
double domainMax,
int64_t secondarySize,
int fill )

Definition at line 422 of file ptwXY_core.c.

423 {
424
425 int64_t i, i1, i2;
426 double y, _domainMin, _domainMax;
427 ptwXYPoints *n = NULL;
428
429 if( ptwXY->status != nfu_Okay ) {
430 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
431 return( NULL );
432 }
433
434 if( ptwXY_domainMin( smr, ptwXY, &_domainMin ) != nfu_Okay ) {
436 return( NULL );
437 }
438 if( ptwXY_domainMax( smr, ptwXY, &_domainMax ) != nfu_Okay ) {
440 return( NULL );
441 }
442
443 if( ( ptwXY->length == 0 ) || ( _domainMin >= domainMax ) || ( _domainMax <= domainMin ) ) {
444 if( ( n = ptwXY_new( smr, ptwXY->interpolation, ptwXY->interpolationString, ptwXY->biSectionMax,
445 ptwXY->accuracy, 0, secondarySize, ptwXY->userFlag ) ) == NULL ) {
447 } }
448 else {
449 if( ( n = ptwXY_clone( smr, ptwXY ) ) == NULL ) {
451 return( NULL );
452 }
453 if( ( n->points[0].x < domainMin ) || ( n->points[n->length - 1].x > domainMax ) ) {
454 if( fill && ( n->points[n->length - 1].x > domainMax ) ) {
455 if( ptwXY_getValueAtX( smr, n, domainMax, &y ) != nfu_Okay ) goto Err;
456 if( ptwXY_setValueAtX( smr, n, domainMax, y ) != nfu_Okay ) goto Err;
457 }
458 if( fill && ( n->points[0].x < domainMin ) ) {
459 if( ptwXY_getValueAtX( smr, n, domainMin, &y ) != nfu_Okay ) goto Err;
460 if( ptwXY_setValueAtX( smr, n, domainMin, y ) != nfu_Okay ) goto Err;
461 }
462 if( ptwXY_coalescePoints( smr, n, n->length + n->overflowAllocatedSize, NULL, 0 ) != nfu_Okay ) goto Err;
463 for( i1 = 0; i1 < n->length; i1++ ) if( n->points[i1].x >= domainMin ) break;
464 for( i2 = n->length - 1; i2 > 0; i2-- ) if( n->points[i2].x <= domainMax ) break;
465 i2++;
466 if( i1 > 0 ) {
467 for( i = i1; i < i2; i++ ) n->points[i- i1] = n->points[i];
468 }
469 n->length = i2 - i1;
470 }
471 }
472 return( n );
473
474Err:
476 if( n != NULL ) ptwXY_free( n );
477 return( NULL );
478}
nfu_status ptwXY_setValueAtX(statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, double y)
nfu_status ptwXY_getValueAtX(statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, double *y)

Referenced by GIDI::Functions::XYs1d::domainSlice(), GIDI::multiGroupTwoXYs1ds(), ptwXY_createGaussian(), ptwXY_domainMaxSlice(), ptwXY_domainMinSlice(), and ptwXY_scaleAndOffsetDomainWith_ptwXYs().

◆ ptwXY_dullEdges()

nfu_status ptwXY_dullEdges ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double lowerEps,
double upperEps,
int positiveXOnly )

Definition at line 185 of file ptwXY_convenient.c.

185 {
186
187#define minEps 5e-16
188
189 nfu_status status;
190 double xm, xp, dx, y, x1, y1, x2, y2, sign;
191 ptwXYPoint *p;
192
193/* This routine can only be used for linear interpolation for the y-axes since for log interpolation, y cannot be 0.
194This needs to be fixed and documented. */
195 if( ptwXY->status != nfu_Okay ) {
196 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
197 return( ptwXY->status );
198 }
199
201 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not allowed." );
202 return( nfu_otherInterpolation );
203 }
204
205 if( ptwXY->interpolation == ptwXY_interpolationFlat ) {
206 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_invalidInterpolation, "Flat interpolation not allowed." );
207 return( nfu_invalidInterpolation );
208 }
209
210 if( ptwXY->length < 2 ) return( nfu_Okay );
211
212 if( lowerEps != 0. ) {
213 if( fabs( lowerEps ) < minEps ) {
214 sign = 1;
215 if( lowerEps < 0. ) sign = -1;
216 lowerEps = sign * minEps;
217 }
218
219 p = ptwXY_getPointAtIndex_Unsafely( ptwXY, 0 );
220 x1 = p->x;
221 y1 = p->y;
222 p = ptwXY_getPointAtIndex_Unsafely( ptwXY, 1 );
223 x2 = p->x;
224 y2 = p->y;
225
226 if( y1 != 0. ) {
227 dx = fabs( x1 * lowerEps );
228 if( x1 == 0 ) dx = fabs( lowerEps );
229 xm = x1 - dx;
230 xp = x1 + dx;
231 if( ( xp + dx ) < x2 ) {
232 if( ( status = ptwXY_getValueAtX( smr, ptwXY, xp, &y ) ) != nfu_Okay ) return( ptwXY->status = status );
233 if( ( status = ptwXY_setValueAtX( smr, ptwXY, xp, y ) ) != nfu_Okay ) return( ptwXY->status = status ); }
234 else {
235 xp = x2;
236 y = y2;
237 }
238 if( lowerEps > 0 ) {
239 if( ( status = ptwXY_setValueAtX( smr, ptwXY, x1, 0. ) ) != nfu_Okay ) return( ptwXY->status = status ); }
240 else {
241 if( ( xm < 0. ) && ( x1 >= 0. ) && positiveXOnly ) {
242 if( ( status = ptwXY_setValueAtX( smr, ptwXY, x1, 0. ) ) != nfu_Okay ) return( ptwXY->status = status ); }
243 else {
244 if( ( status = ptwXY_setValueAtX( smr, ptwXY, xm, 0. ) ) != nfu_Okay ) return( ptwXY->status = status );
245 if( ( status = ptwXY_interpolatePoint( smr, ptwXY->interpolation, x1, &y, xm, 0., xp, y ) ) != nfu_Okay )
246 return( ptwXY->status = status );
247 if( ( status = ptwXY_setValueAtX( smr, ptwXY, x1, y ) ) != nfu_Okay ) return( ptwXY->status = status );
248 }
249 }
250 }
251 }
252
253 if( upperEps != 0. ) {
254 if( fabs( upperEps ) < minEps ) {
255 sign = 1;
256 if( upperEps < 0. ) sign = -1;
257 upperEps = sign * minEps;
258 }
259
260 p = ptwXY_getPointAtIndex_Unsafely( ptwXY, ptwXY->length - 2 );
261 x1 = p->x;
262 y1 = p->y;
263 p = ptwXY_getPointAtIndex_Unsafely( ptwXY, ptwXY->length - 1 );
264 x2 = p->x;
265 y2 = p->y;
266
267 if( y2 != 0. ) {
268 dx = fabs( x2 * upperEps );
269 if( x2 == 0 ) dx = fabs( upperEps );
270 xm = x2 - dx;
271 xp = x2 + dx;
272 if( ( xm - dx ) > x1 ) {
273 if( ( status = ptwXY_getValueAtX( smr, ptwXY, xm, &y ) ) != nfu_Okay ) return( ptwXY->status = status );
274 if( ( status = ptwXY_setValueAtX( smr, ptwXY, xm, y ) ) != nfu_Okay ) return( ptwXY->status = status ); }
275 else {
276 xm = x1;
277 y = y1;
278 }
279 if( upperEps < 0 ) {
280 if( ( status = ptwXY_setValueAtX( smr, ptwXY, x2, 0. ) ) != nfu_Okay ) return( ptwXY->status = status ); }
281 else {
282 if( ( status = ptwXY_setValueAtX( smr, ptwXY, xp, 0. ) ) != nfu_Okay ) return( ptwXY->status = status );
283 if( ( status = ptwXY_interpolatePoint( smr, ptwXY->interpolation, x2, &y, xm, y, xp, 0. ) ) != nfu_Okay )
284 return( ptwXY->status = status );
285 if( ( status = ptwXY_setValueAtX( smr, ptwXY, x2, y ) ) != nfu_Okay ) return( ptwXY->status = status );
286 }
287 }
288 }
289
290 return( ptwXY->status );
291
292#undef minEps
293}
G4int sign(const T t)
nfu_status ptwXY_interpolatePoint(statusMessageReporting *smr, ptwXY_interpolation interpolation, double x, double *y, double x1, double y1, double x2, double y2)
nfu_status ptwXY_getValueAtX(statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, double *y)
#define minEps

Referenced by ptwXY_mutualifyDomains().

◆ ptwXY_equalProbableBins()

ptwXPoints * ptwXY_equalProbableBins ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
int numberOfBins )

Definition at line 1036 of file ptwXY_integration.c.

1036 {
1037
1038 int index = 1;
1039 int64_t i1, length = ptwXY->length;
1040 double x1, y1, x2, y2, integral, runningIntegral1 = 0., runningIntegral2, nextCDF, dIntegral;
1041 double dx, temp, norm;
1042 ptwXYPoint *point;
1043 ptwXPoints *equalProbableBins = NULL;
1044
1045 if( ptwXY->status != nfu_Okay ) {
1047 goto Err;
1048 }
1049
1050 switch( ptwXY->interpolation ) {
1053 break;
1054 default :
1056 "interpolation = %d not supported", ptwXY->interpolation );
1057 goto Err;
1058 }
1059
1060 if( length < 2 ) {
1061 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_tooFewPoints, "number of points = %lld < 2", length );
1062 goto Err;
1063 }
1064
1065 if( numberOfBins < 1 ) {
1066 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_badInput, "numberOfBins = %d < 1", numberOfBins );
1067 goto Err;
1068 }
1069 if( ( equalProbableBins = ptwX_new( smr, numberOfBins ) ) == NULL ) goto Err;
1070
1071 if( ptwXY_integrateDomain( smr, ptwXY, &norm ) != nfu_Okay ) goto Err;
1072 if( norm <= 0 ) {
1073 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_badNorm, "norm = %e <= 0", norm );
1074 goto Err;
1075 }
1076
1077 point = ptwXY->points;
1078 x1 = point->x;
1079 y1 = point->y;
1080 ++point;
1081 if( ptwX_setPointAtIndex( smr, equalProbableBins, 0, x1 ) != nfu_Okay ) goto Err;
1082 for( i1 = 1; i1 < length; ++i1, ++point ) {
1083 x2 = point->x;
1084 y2 = point->y;
1085 if( ptwXY_f_integrate( smr, ptwXY->interpolation, x1, y1, x2, y2, &integral ) != nfu_Okay ) goto Err;
1086 runningIntegral2 = runningIntegral1 + integral;
1087 while( index < numberOfBins ) {
1088 nextCDF = norm * index / (double) numberOfBins;
1089 if( runningIntegral2 < nextCDF ) break;
1090 dIntegral = nextCDF - runningIntegral1;
1091
1093 temp = ( y2 - y1 ) / ( x2 - x1 ); /* slope. */
1094 dx = 2. * dIntegral / ( y1 + sqrt( y1 * y1 + 2. * temp * dIntegral ) ); }
1095 else {
1096 dx = dIntegral / y1;
1097 }
1098
1099 if( ptwX_setPointAtIndex( smr, equalProbableBins, index, dx + x1 ) != nfu_Okay ) goto Err;
1100 ++index;
1101 }
1102 runningIntegral1 = runningIntegral2;
1103
1104 x1 = x2;
1105 y1 = y2;
1106 }
1107 if( ptwX_setPointAtIndex( smr, equalProbableBins, index, x2 ) != nfu_Okay ) goto Err;
1108
1109 return( equalProbableBins );
1110
1111Err:
1112 if( equalProbableBins != NULL ) ptwX_free( equalProbableBins );
1113 return( NULL );
1114}
@ nfu_badNorm
@ nfu_badInput
nfu_status ptwXY_f_integrate(statusMessageReporting *smr, ptwXY_interpolation interpolation, double x1, double y1, double x2, double y2, double *value)
nfu_status ptwXY_integrateDomain(statusMessageReporting *smr, ptwXYPoints *ptwXY, double *value)
struct ptwXPoints_s ptwXPoints
nfu_status ptwX_setPointAtIndex(statusMessageReporting *smr, ptwXPoints *ptwX, int64_t index, double x)
Definition ptwX_core.c:304
ptwXPoints * ptwX_free(ptwXPoints *ptwX)
Definition ptwX_core.c:213
ptwXPoints * ptwX_new(statusMessageReporting *smr, int64_t size)
Definition ptwX_core.c:22

◆ ptwXY_exp()

nfu_status ptwXY_exp ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double a )

Definition at line 46 of file ptwXY_functions.c.

46 {
47
48 int64_t i, length;
49 nfu_status status;
50 double x1, y1, z1, x2, y2, z2;
51
52 length = ptwXY->length;
53 if( length < 1 ) return( ptwXY->status );
54
56 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not allowed." );
57 return( ptwXY->status = nfu_otherInterpolation );
58 }
60 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_flatInterpolation, "Flat interpolation not allowed." );
61 return( ptwXY->status = nfu_flatInterpolation );
62 }
63
64 if( ( status = ptwXY_simpleCoalescePoints( smr, ptwXY ) ) != nfu_Okay ) goto Err;
65 x2 = ptwXY->points[length-1].x;
66 y2 = a * ptwXY->points[length-1].y;
67 z2 = ptwXY->points[length-1].y = exp( y2 );
68 for( i = length - 2; i >= 0; i-- ) {
69 x1 = ptwXY->points[i].x;
70 y1 = a * ptwXY->points[i].y;
71 z1 = ptwXY->points[i].y = exp( y1 );
72 if( ( status = ptwXY_exp_s( smr, ptwXY, x1, y1, z1, x2, y2, z2, 0 ) ) != nfu_Okay ) goto Err;
73 x2 = x1;
74 y2 = y1;
75 }
76 return( status );
77
78Err:
79 if( status != nfu_Okay ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via." );
80 if( ptwXY->status != nfu_Okay ) ptwXY->status = status;
81 return( status );
82}

◆ ptwXY_f_integrate()

nfu_status ptwXY_f_integrate ( statusMessageReporting * smr,
ptwXY_interpolation interpolation,
double x1,
double y1,
double x2,
double y2,
double * value )

Definition at line 31 of file ptwXY_integration.c.

32 {
33
34 nfu_status status = nfu_Okay;
35 double r, _sign = 1.0;
36 double ratioX, logX, ratioY, logY, numerator;
37
38 if( x2 < x1 ) {
39 double x = x1;
40 x1 = x2;
41 x2 = x;
42 _sign = -1.;
43 }
44
45 *value = 0.;
46 switch( interpolation ) {
47 case ptwXY_interpolationLinLin : /* x linear, y linear */
48 *value = 0.5 * ( y1 + y2 ) * ( x2 - x1 );
49 break;
50 case ptwXY_interpolationLogLin : /* x linear, y log */
51 if( ( y1 <= 0. ) || ( y2 <= 0. ) ) {
53 "0 or negative values for log-y integration: y1 = %.17e, y2 = %.17e", y1, y2 );
54 status = nfu_badIntegrationInput; }
55 else {
56 r = y2 / y1;
57 if( fabs( r - 1. ) < 1e-4 ) {
58 r = r - 1.;
59 *value = y1 * ( x2 - x1 ) / ( 1. + r * ( -0.5 + r * ( 1. / 3. + r * ( -0.25 + .2 * r ) ) ) ); }
60 else {
61 *value = ( y2 - y1 ) * ( x2 - x1 ) / log( r );
62 }
63 }
64 break;
65 case ptwXY_interpolationLinLog : /* x log, y linear */
66 if( ( x1 <= 0. ) || ( x2 <= 0. ) ) {
68 "0 or negative values for log-x integration: x1 = %.17e, x2 = %.17e", x1, x2 );
69 status = nfu_badIntegrationInput; }
70 else {
71 r = x2 / x1;
72 if( fabs( r - 1. ) < 1e-4 ) {
73 r = r - 1.;
74 r = r * ( -0.5 + r * ( 1. / 3. + r * ( -0.25 + .2 * r ) ) );
75 *value = x1 * ( y2 - y1 ) * r / ( 1. + r ) + y2 * ( x2 - x1 ); }
76 else {
77 *value = ( y1 - y2 ) * ( x2 - x1 ) / log( r ) + x2 * y2 - x1 * y1;
78 }
79 }
80 break;
81 case ptwXY_interpolationLogLog : /* x log, y log */
82 ratioX = x2 / x1;
83 if( fabs( ratioX - 1. ) < 1e-4 ) {
84 ratioX -= 1.0;
85 logX = ratioX * ( 1. + ratioX * ( -0.5 + ratioX * ( 1. / 3. - 0.25 * ratioX ) ) );
86 ratioX = x2 / x1; }
87 else {
88 logX = log( ratioX );
89 }
90
91 ratioY = y2 / y1;
92 if( fabs( ratioY - 1. ) < 1e-4 ) {
93 ratioY -= 1.0;
94 logY = ratioY * ( 1. + ratioY * ( -0.5 + ratioY * ( 1. / 3. - 0.25 * ratioY ) ) );
95 ratioY = y2 / y1; }
96 else {
97 logY = log( ratioY );
98 }
99
100 numerator = ratioX * ratioY - 1.0;
101 if( numerator < 1e-4 ) {
102 *value = y1 * x1 * logX * ( 1.0 + 0.5 * numerator * ( 1.0 + numerator * ( 1 + 0.5 * numerator * ( 1 + 19.0 * numerator / 30.0 ) ) / 6.0 ) ); }
103 else {
104 *value = y1 * x1 * numerator / ( logY / logX + 1.0 );
105 }
106 break;
107 case ptwXY_interpolationFlat : /* x ?, y flat */
108 *value = y1 * ( x2 - x1 );
109 break;
111 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not supported for integration." );
112 status = nfu_otherInterpolation;
113 }
114
115 *value *= _sign;
116
117 return( status );
118}
@ nfu_badIntegrationInput

Referenced by ptwXY_equalProbableBins(), ptwXY_integrate(), and ptwXY_runningIntegral().

◆ ptwXY_flatInterpolationToLinear()

ptwXYPoints * ptwXY_flatInterpolationToLinear ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double lowerEps,
double upperEps )

Definition at line 100 of file ptwXY_interpolation.c.

100 {
101
102 int64_t i, length;
103 double x;
104 ptwXYPoints *n;
105 ptwXYPoint *p1 = NULL, *p2 = NULL, *p3;
106
107#define minEps 5e-16
108
109 if( ptwXY_simpleCoalescePoints( smr, ptwXY ) != nfu_Okay ) {
111 return( NULL );
112 }
113
114 if( ptwXY->interpolation != ptwXY_interpolationFlat ) {
115 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_invalidInterpolation, "Source interpolation not 'flat' but '%s'.",
116 ptwXY->interpolationString );
117 return( NULL );
118 }
119
120 if( ( lowerEps < 0 ) || ( upperEps < 0 ) || ( ( lowerEps == 0 ) && ( upperEps == 0 ) ) ) {
121 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_badInput, "Bad epsilons: lowerEps = %.17e and upperEps = %.17e.",
122 lowerEps, upperEps );
123 return( NULL );
124 }
125 if( ( lowerEps != 0 ) && ( lowerEps < minEps ) ) lowerEps = minEps;
126 if( ( upperEps != 0 ) && ( upperEps < minEps ) ) upperEps = minEps;
127
128 length = ptwXY->length * ( 1 + ( lowerEps == 0 ? 0 : 1 ) + ( lowerEps == 0 ? 0 : 1 ) );
129 if( ( n = ptwXY_new( smr, ptwXY_interpolationLinLin, NULL, ptwXY->biSectionMax, ptwXY->accuracy, length,
130 ptwXY->overflowLength, ptwXY->userFlag ) ) == NULL ) {
132 return( NULL );
133 }
134
135 p3 = ptwXY->points;
136 if( ptwXY->length > 0 ) {
137 if( ptwXY_setValueAtX( smr, n, p3->x, p3->y ) != nfu_Okay ) goto Err;
138 }
139 for( i = 0; i < ptwXY->length; i++, p3++ ) {
140 if( i > 1 ) {
141 if( lowerEps > 0 ) {
142 x = ptwXY_flatInterpolationToLinear_eps( p2->x, -lowerEps );
143 if( x > p1->x ) {
144 if( ptwXY_setValueAtX( smr, n, x, p1->y ) != nfu_Okay ) goto Err;
145 }
146 }
147 if( lowerEps == 0 ) if( ptwXY_setValueAtX( smr, n, p2->x, p1->y ) != nfu_Okay ) goto Err;
148 if( upperEps == 0 ) if( ptwXY_setValueAtX( smr, n, p2->x, p2->y ) != nfu_Okay ) goto Err;
149 if( upperEps > 0 ) {
150 x = ptwXY_flatInterpolationToLinear_eps( p2->x, upperEps );
151 if( x < p3->x ) {
152 if( ptwXY_setValueAtX( smr, n, x, p2->y ) != nfu_Okay ) goto Err;
153 }
154 }
155 }
156 p1 = p2;
157 p2 = p3;
158 }
159 if( ptwXY->length > 1 ) {
160 if( ( lowerEps != 0 ) && ( p1->y != p2->y ) ) {
161 x = ptwXY_flatInterpolationToLinear_eps( p2->x, -lowerEps );
162 if( x > p1->x ) {
163 if( ptwXY_setValueAtX( smr, n, x, p1->y ) != nfu_Okay ) goto Err;
164 }
165 }
166 if( ptwXY_setValueAtX( smr, n, p2->x, p2->y ) != nfu_Okay ) goto Err;
167 }
168
169 return( n );
170
171Err:
173 ptwXY_free( n );
174 return( NULL );
175
176#undef minEps
177}

Referenced by GIDI::Functions::XYs1d::asXYs1d().

◆ ptwXY_free()

◆ ptwXY_fromString()

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 )

Definition at line 275 of file ptwXY_misc.c.

276 {
277
278 int64_t numberConverted;
279 double *doublePtr;
280 ptwXYPoints *ptwXY = NULL;
281
282 if( ( doublePtr = nfu_stringToListOfDoubles( smr, str, sep, &numberConverted, endCharacter, useSystem_strtod ) ) == NULL ) {
284 return( NULL );
285 }
286 if( ( numberConverted % 2 ) == 0 ) {
287 ptwXY = ptwXY_create( smr, interpolation, interpolationString, biSectionMax, accuracy, numberConverted / 2, 10, numberConverted / 2, doublePtr, 0 ); }
288 else {
289 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_oddNumberOfValues, "Odd number = %d of float for ptwXY.", (int) numberConverted );
290 }
291 smr_freeMemory2( doublePtr );
292 return( ptwXY );
293}
double * nfu_stringToListOfDoubles(statusMessageReporting *smr, char const *str, char sep, int64_t *numberConverted, char **endCharacter, int useSystem_strtod)
@ nfu_oddNumberOfValues
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)
Definition ptwXY_core.c:110

◆ ptwXY_fromUnitbase()

ptwXYPoints * ptwXY_fromUnitbase ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double domainMin,
double domainMax,
int scaleRange )

Definition at line 403 of file ptwXY_interpolation.c.

404 {
405
406 int64_t i, length;
407 ptwXYPoints *n;
408 ptwXYPoint *p, *p2;
409 double dx, inverseDx, xLast = 0.;
410
411 if( ptwXY->length < 2 ) {
412 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_tooFewPoints, "Too few points %d", (int) ptwXY->length );
413 return( NULL );
414 }
415 if( ( n = ptwXY_clone( smr, ptwXY ) ) == NULL ) {
417 return( NULL );
418 }
419
420 dx = domainMax - domainMin;
421 inverseDx = 1. / dx;
422 length = n->length;
423 for( i = 0, p2 = p = n->points; i < length; ++i, ++p ) {
424 p2->x = p->x * dx + domainMin;
425 if( i > 0 ) {
426 if( fabs( p2->x - xLast ) <= 10. * DBL_EPSILON * ( fabs( p2->x ) + fabs( xLast ) ) ) {
427 --(n->length);
428 continue;
429 }
430 }
431 if( scaleRange ) p2->y = p->y * inverseDx;
432 xLast = p2->x;
433 ++p2;
434 }
435 n->points[n->length-1].x = domainMax; /* Make sure last point is realy domainMax. */
436 return( n );
437}

Referenced by ptwXY_unitbaseInterpolate().

◆ ptwXY_getAccuracy()

double ptwXY_getAccuracy ( ptwXYPoints * ptwXY)

Definition at line 566 of file ptwXY_core.c.

566 {
567
568 return( ptwXY->accuracy );
569}

Referenced by ptwXY_inverse().

◆ ptwXY_getBiSectionMax()

double ptwXY_getBiSectionMax ( ptwXYPoints * ptwXY)

Definition at line 582 of file ptwXY_core.c.

582 {
583
584 return( ptwXY->biSectionMax );
585}

Referenced by ptwXY_inverse().

◆ ptwXY_getInterpolation()

ptwXY_interpolation ptwXY_getInterpolation ( ptwXYPoints * ptwXY)

Definition at line 518 of file ptwXY_core.c.

518 {
519
520 return( ptwXY->interpolation );
521}

Referenced by GIDI::Functions::Regions1d::asXYs1d(), ptwXY_mapToXsAndAdd(), ptwXY_ysMappedToXs(), and GIDI::Functions::XYs1d::XYs1d().

◆ ptwXY_getInterpolationString()

char const * ptwXY_getInterpolationString ( ptwXYPoints * ptwXY)

Definition at line 525 of file ptwXY_core.c.

525 {
526
527 return( ptwXY->interpolationString );
528}

◆ ptwXY_getLowerIndexBoundingX()

nfu_status ptwXY_getLowerIndexBoundingX ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double x,
int64_t * index )

Definition at line 967 of file ptwXY_core.c.

967 {
968
969 int64_t i1, length = ptwXY->length;
970
971 *index = -1;
972
973 if( ptwXY->status != nfu_Okay ) {
974 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
975 return( ptwXY->status );
976 }
977
978 if( ptwXY_simpleCoalescePoints( smr, ptwXY ) != nfu_Okay ) {
980 return( ptwXY->status );
981 }
982
983 if( x < ptwXY->points[0].x ) return( nfu_Okay );
984 if( x > ptwXY->points[length-1].x ) return( nfu_Okay );
985 for( i1 = 1; i1 < length; ++i1 ) {
986 if( x < ptwXY->points[i1].x ) break;
987 }
988 *index = i1 - 1;
989 return( ptwXY->status );
990}

◆ ptwXY_getNonOverflowLength()

int64_t ptwXY_getNonOverflowLength ( statusMessageReporting * smr,
ptwXYPoints const * ptwXY )

◆ ptwXY_getPointAtIndex()

ptwXYPoint * ptwXY_getPointAtIndex ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
int64_t index )

Definition at line 994 of file ptwXY_core.c.

994 {
995
996 if( ptwXY->status != nfu_Okay ) {
997 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
998 return( NULL );
999 }
1000
1001 if( ( index < 0 ) || ( index >= ptwXY->length ) ) return( NULL );
1002 return( ptwXY_getPointAtIndex_Unsafely( ptwXY, index ) );
1003}
ptwXYPoint * ptwXY_getPointAtIndex_Unsafely(ptwXYPoints const *ptwXY, int64_t index)

Referenced by ptwXY_getXYPairAtIndex().

◆ ptwXY_getPointAtIndex_Unsafely()

ptwXYPoint * ptwXY_getPointAtIndex_Unsafely ( ptwXYPoints const * ptwXY,
int64_t index )

Definition at line 1007 of file ptwXY_core.c.

1007 {
1008
1009 int64_t i;
1010 ptwXYOverflowPoint *overflowPoint;
1011
1012 for( overflowPoint = ptwXY->overflowHeader.next, i = 0; overflowPoint != &(ptwXY->overflowHeader); overflowPoint = overflowPoint->next, i++ ) {
1013 if( overflowPoint->index == index ) return( &(overflowPoint->point) );
1014 if( overflowPoint->index > index ) break;
1015 }
1016 return( &(ptwXY->points[index - i]) );
1017}

Referenced by GIDI::Functions::XYs1d::evaluate(), GIDI::Functions::XYs1d::operator[](), ptwXY_areDomainsMutual(), ptwXY_clip(), ptwXY_dullEdges(), ptwXY_getPointAtIndex(), ptwXY_getSlopeAtX(), ptwXY_mutualifyDomains(), ptwXY_showInteralStructure(), ptwXY_simpleWrite(), ptwXY_tweakDomainsToMutualify(), GIDI::Functions::XYs1d::xs(), GIDI::Functions::XYs1d::ys(), and GIDI::Functions::XYs1d::ysMappedToXs().

◆ ptwXY_getPointsAroundX()

ptwXY_lessEqualGreaterX ptwXY_getPointsAroundX ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double x,
ptwXYOverflowPoint * lessThanEqualXPoint,
ptwXYOverflowPoint * greaterThanXPoint )

Definition at line 1036 of file ptwXY_core.c.

1037 {
1038
1039 int closeIsEqual;
1040 ptwXYPoint *closePoint;
1041 ptwXY_lessEqualGreaterX lessEqualGreaterX;
1042
1043 if( ptwXY->status != nfu_Okay ) {
1044 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
1046 }
1047
1048 lessEqualGreaterX = ptwXY_getPointsAroundX_closeIsEqual( smr, ptwXY, x, lessThanEqualXPoint, greaterThanXPoint,
1049 0, &closeIsEqual, &closePoint );
1050 if( lessEqualGreaterX == ptwXY_lessEqualGreaterX_Error ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via." );
1051 return( lessEqualGreaterX );
1052}
ptwXY_lessEqualGreaterX ptwXY_getPointsAroundX_closeIsEqual(statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, ptwXYOverflowPoint *lessThanEqualXPoint, ptwXYOverflowPoint *greaterThanXPoint, double eps, int *closeIsEqual, ptwXYPoint **closePoint)

Referenced by ptwXY_getSlopeAtX(), and ptwXY_getValueAtX().

◆ ptwXY_getPointsAroundX_closeIsEqual()

ptwXY_lessEqualGreaterX ptwXY_getPointsAroundX_closeIsEqual ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double x,
ptwXYOverflowPoint * lessThanEqualXPoint,
ptwXYOverflowPoint * greaterThanXPoint,
double eps,
int * closeIsEqual,
ptwXYPoint ** closePoint )

Definition at line 1056 of file ptwXY_core.c.

1058 {
1059
1060 int64_t overflowIndex, nonOverflowLength = ptwXY_getNonOverflowLength( smr, ptwXY );
1061 int64_t indexMin, indexMid, indexMax;
1062 ptwXY_dataFrom domainMinFrom, domainMaxFrom;
1063 double domainMin, domainMax;
1064 ptwXYOverflowPoint *overflowPoint, *overflowHeader = &(ptwXY->overflowHeader);
1066 ptwXYPoint *lowerPoint = NULL, *upperPoint = NULL;
1067
1068 if( nonOverflowLength < 0 ) {
1071 }
1072
1073 *closeIsEqual = 0;
1074 if( ptwXY->length == 0 ) return( status );
1075
1076 if( ptwXY_domainMinAndFrom( smr, ptwXY, &domainMinFrom, &domainMin ) != nfu_Okay ) {
1079 }
1080
1081 if( ptwXY_domainMaxAndFrom( smr, ptwXY, &domainMaxFrom, &domainMax ) != nfu_Okay ) {
1084 }
1085
1086 ptwXY_initialOverflowPoint( lessThanEqualXPoint, overflowHeader, NULL );
1087 ptwXY_initialOverflowPoint( greaterThanXPoint, overflowHeader, NULL );
1088 if( x < domainMin ) {
1090 if( domainMinFrom == ptwXY_dataFrom_Points ) {
1091 greaterThanXPoint->prior = overflowHeader;
1092 greaterThanXPoint->index = 0;
1093 greaterThanXPoint->point = ptwXY->points[0];
1094 *closePoint = &(ptwXY->points[0]); }
1095 else {
1096 *greaterThanXPoint = *(overflowHeader->next);
1097 *closePoint = &(overflowHeader->next->point);
1098 } }
1099 else if( x > domainMax ) {
1101 if( domainMaxFrom == ptwXY_dataFrom_Points ) {
1102 lessThanEqualXPoint->prior = overflowHeader->prior;
1103 lessThanEqualXPoint->index = nonOverflowLength - 1;
1104 lessThanEqualXPoint->point = ptwXY->points[lessThanEqualXPoint->index];
1105 *closePoint = &(ptwXY->points[lessThanEqualXPoint->index]); }
1106 else {
1107 *lessThanEqualXPoint = *(overflowHeader->prior);
1108 *closePoint = &(overflowHeader->prior->point);
1109 } }
1110 else { /* domainMin <= x <= domainMax */
1111 status = ptwXY_lessEqualGreaterX_between; /* Default for this condition, can only be between or equal. */
1112 for( overflowPoint = overflowHeader->next, overflowIndex = 0; overflowPoint != overflowHeader;
1113 overflowPoint = overflowPoint->next, overflowIndex++ ) if( overflowPoint->point.x > x ) break;
1114 overflowPoint = overflowPoint->prior;
1115 if( ( overflowPoint != overflowHeader ) && ( overflowPoint->point.x == x ) ) {
1117 *lessThanEqualXPoint = *overflowPoint; }
1118 else if( ptwXY->length == 1 ) { /* If here and length = 1, then ptwXY->points[0].x == x. */
1120 lessThanEqualXPoint->index = 0;
1121 lessThanEqualXPoint->point = ptwXY->points[0]; }
1122 else { /* ptwXY->length > 1 */
1123 indexMin = 0;
1124 indexMax = nonOverflowLength - 1;
1125 indexMid = ( indexMin + indexMax ) >> 1;
1126 while( ( indexMin != indexMid ) && ( indexMid != indexMax ) ) {
1127 if( ptwXY->points[indexMid].x > x ) {
1128 indexMax = indexMid; }
1129 else {
1130 indexMin = indexMid;
1131 }
1132 indexMid = ( indexMin + indexMax ) >> 1;
1133 }
1134 if( ptwXY->points[indexMin].x == x ) {
1136 lessThanEqualXPoint->index = indexMin;
1137 lessThanEqualXPoint->point = ptwXY->points[indexMin]; }
1138 else if( ptwXY->points[indexMax].x == x ) {
1140 lessThanEqualXPoint->index = indexMax;
1141 lessThanEqualXPoint->point = ptwXY->points[indexMax]; }
1142 else {
1143 if( ptwXY->points[indexMin].x > x ) indexMax = 0;
1144 if( ptwXY->points[indexMax].x < x ) indexMin = indexMax;
1145 if( ( overflowPoint == overflowHeader ) || /* x < domainMin of overflow points. */
1146 ( ( ptwXY->points[indexMin].x > overflowPoint->point.x ) && ( ptwXY->points[indexMin].x < x ) ) ) {
1147 if( overflowPoint != overflowHeader ) lessThanEqualXPoint->prior = overflowPoint;
1148 lowerPoint = &(ptwXY->points[indexMin]);
1149 lessThanEqualXPoint->index = indexMin;
1150 lessThanEqualXPoint->point = ptwXY->points[indexMin]; }
1151 else {
1152 lowerPoint = &(overflowPoint->point);
1153 *lessThanEqualXPoint = *overflowPoint;
1154 }
1155 if( ( overflowPoint->next == overflowHeader ) || /* x > domainMax of overflow points. */
1156 ( ( ptwXY->points[indexMax].x < overflowPoint->next->point.x ) && ( ptwXY->points[indexMax].x > x ) ) ) {
1157 upperPoint = &(ptwXY->points[indexMax]);
1158 greaterThanXPoint->index = indexMax;
1159 greaterThanXPoint->point = ptwXY->points[indexMax]; }
1160 else {
1161 upperPoint = &(overflowPoint->next->point);
1162 *greaterThanXPoint = *(overflowPoint->next);
1163 }
1164 }
1165 }
1166 }
1167
1168 if( eps > 0 ) {
1169 double absX = fabs( x );
1170
1171 if( status == ptwXY_lessEqualGreaterX_lessThan ) {
1172 if( absX < fabs( greaterThanXPoint->point.x ) ) absX = fabs( greaterThanXPoint->point.x );
1173 if( ( greaterThanXPoint->point.x - x ) < eps * absX ) *closeIsEqual = 1; }
1174 else if( status == ptwXY_lessEqualGreaterX_greater ) {
1175 if( absX < fabs( lessThanEqualXPoint->point.x ) ) absX = fabs( lessThanEqualXPoint->point.x );
1176 if( ( x - lessThanEqualXPoint->point.x ) < eps * absX ) *closeIsEqual = -1; }
1177 else if( status == ptwXY_lessEqualGreaterX_between ) {
1178 if( ( x - lessThanEqualXPoint->point.x ) < ( greaterThanXPoint->point.x - x ) ) { /* x is closer to lower point. */
1179 *closePoint = lowerPoint;
1180 if( absX < fabs( lessThanEqualXPoint->point.x ) ) absX = fabs( lessThanEqualXPoint->point.x );
1181 if( ( x - lessThanEqualXPoint->point.x ) < eps * absX ) *closeIsEqual = -1; }
1182 else { /* x is closer to upper point. */
1183 *closePoint = upperPoint;
1184 if( absX < fabs( greaterThanXPoint->point.x ) ) absX = fabs( greaterThanXPoint->point.x );
1185 if( ( greaterThanXPoint->point.x - x ) < eps * absX ) *closeIsEqual = 1;
1186 } }
1187 else if( status == ptwXY_lessEqualGreaterX_equal ) {
1188 *closeIsEqual = 1;
1189 }
1190 }
1191 return( status );
1192}

Referenced by ptwXY_getPointsAroundX(), and ptwXY_setValueAtX_overrideIfClose().

◆ ptwXY_getSlopeAtX()

nfu_status ptwXY_getSlopeAtX ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double x,
char side,
double * slope )

Definition at line 1533 of file ptwXY_core.c.

1533 {
1534
1535 nfu_status status = nfu_Okay;
1536 ptwXYOverflowPoint lessThanEqualXPoint = { NULL, NULL, 0, {0.0, 0.0}}, greaterThanXPoint;
1537 ptwXY_lessEqualGreaterX legx = ptwXY_getPointsAroundX( smr, ptwXY, x, &lessThanEqualXPoint, &greaterThanXPoint );
1538 ptwXYPoint *point;
1539 greaterThanXPoint = lessThanEqualXPoint; /* Done to stop a compiler from complaining. */
1540
1541 *slope = 0.;
1542
1543 if( ptwXY->status != nfu_Okay ) {
1544 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
1545 return( ptwXY->status );
1546 }
1547 if( ( side != '-' ) && ( side != '+' ) ) {
1548 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid side = '%c'.", side );
1549 return( nfu_badInput );
1550 }
1551
1552 switch( legx ) {
1555 return( nfu_Error );
1559 status = nfu_XOutsideDomain;
1560 break;
1562 *slope = ( greaterThanXPoint.point.y - lessThanEqualXPoint.point.y ) /
1563 ( greaterThanXPoint.point.x - lessThanEqualXPoint.point.x );
1564 break;
1566 if( side == '-' ) {
1567 if( lessThanEqualXPoint.index == 0 ) {
1568 status = nfu_XOutsideDomain; }
1569 else {
1570 point = ptwXY_getPointAtIndex_Unsafely( ptwXY, lessThanEqualXPoint.index - 1 );
1571 *slope = ( lessThanEqualXPoint.point.y - point->y ) / ( lessThanEqualXPoint.point.x - point->x );
1572 } }
1573 else {
1574 if( lessThanEqualXPoint.index == ( ptwXY->length - 1 ) ) {
1575 status = nfu_XOutsideDomain; }
1576 else {
1577 point = ptwXY_getPointAtIndex_Unsafely( ptwXY, lessThanEqualXPoint.index + 1 );
1578 *slope = ( point->y - lessThanEqualXPoint.point.y ) / ( point->x - lessThanEqualXPoint.point.x );
1579 }
1580 }
1581 }
1582
1583 return( status );
1584}
ptwXY_lessEqualGreaterX ptwXY_getPointsAroundX(statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, ptwXYOverflowPoint *lessThanEqualXPoint, ptwXYOverflowPoint *greaterThanXPoint)

Referenced by ptwXY_div_ptwXY().

◆ ptwXY_getStatus()

nfu_status ptwXY_getStatus ( ptwXYPoints * ptwXY)

Definition at line 545 of file ptwXY_core.c.

545 {
546
547 return( ptwXY->status );
548}

◆ ptwXY_getUserFlag()

int ptwXY_getUserFlag ( ptwXYPoints * ptwXY)

Definition at line 552 of file ptwXY_core.c.

552 {
553
554 return( ptwXY->userFlag );
555}

◆ ptwXY_getValueAtX()

nfu_status ptwXY_getValueAtX ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double x,
double * y )

Definition at line 1196 of file ptwXY_core.c.

1196 {
1197
1199 ptwXYOverflowPoint lessThanEqualXPoint, greaterThanXPoint;
1200 ptwXY_lessEqualGreaterX legx = ptwXY_getPointsAroundX( smr, ptwXY, x, &lessThanEqualXPoint, &greaterThanXPoint );
1201
1202 *y = 0.;
1203 switch( legx ) {
1206 return( ptwXY->status );
1210 break;
1212 status = nfu_Okay;
1213 *y = lessThanEqualXPoint.point.y;
1214 break;
1216 status = ptwXY_interpolatePoint( smr, ptwXY->interpolation, x, y, lessThanEqualXPoint.point.x, lessThanEqualXPoint.point.y,
1217 greaterThanXPoint.point.x, greaterThanXPoint.point.y );
1218 break;
1219 }
1220 return( status );
1221}

Referenced by GIDI::Functions::XYs1d::evaluate(), ptwXY_domainSlice(), ptwXY_dullEdges(), ptwXY_intersectionWith_ptwX(), and ptwXY_thinDomain().

◆ ptwXY_getXArray()

ptwXPoints * ptwXY_getXArray ( statusMessageReporting * smr,
ptwXYPoints * ptwXY )

Definition at line 21 of file ptwXY_convenient.c.

21 {
22
23 int64_t i, n;
24 ptwXPoints *xArray;
25
26 if( ptwXY_simpleCoalescePoints( smr, ptwXY ) != nfu_Okay ) {
28 return( NULL );
29 }
30 n = ptwXY->length;
31
32 if( ( xArray = ptwX_new( smr, n ) ) == NULL ) {
34 return( NULL );
35 }
36 for( i = 0; i < n; i++ ) xArray->points[i] = ptwXY->points[i].x;
37 xArray->length = n;
38
39 return( xArray );
40}

◆ ptwXY_getXYPairAtIndex()

nfu_status ptwXY_getXYPairAtIndex ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
int64_t index,
double * x,
double * y )

Definition at line 1021 of file ptwXY_core.c.

1021 {
1022
1023 ptwXYPoint *p = ptwXY_getPointAtIndex( smr, ptwXY, index );
1024
1025 if( p == NULL ) {
1027 return( ptwXY->status );
1028 }
1029 *x = p->x;
1030 *y = p->y;
1031 return( nfu_Okay );
1032}
ptwXYPoint * ptwXY_getPointAtIndex(statusMessageReporting *smr, ptwXYPoints *ptwXY, int64_t index)
Definition ptwXY_core.c:994

Referenced by nf_Legendre_from_ptwXY().

◆ ptwXY_groupOneFunction()

ptwXPoints * ptwXY_groupOneFunction ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
ptwXPoints * groupBoundaries,
ptwXY_group_normType normType,
ptwXPoints * ptwX_norm )

Definition at line 552 of file ptwXY_integration.c.

553 {
554
555 int64_t i, igs, ngs;
556 double x1, y1, x2, y2, y2p, xg1, xg2, sum;
557 ptwXYPoints *f;
558 ptwXPoints *groupedData = NULL;
559
560 if( ptwXY_simpleCoalescePoints( smr, ptwXY ) != nfu_Okay ) {
562 return( NULL );
563 }
564 if( groupBoundaries->status != nfu_Okay ) {
565 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Via: groupBoundaries." );
566 return( NULL );
567 }
569 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not supported for integration." );
570 return( NULL );
571 }
572
573 ngs = ptwX_length( smr, groupBoundaries ) - 1;
574 if( normType == ptwXY_group_normType_norm ) {
575 if( ptwX_norm == NULL ) {
576 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badNorm, "Norm function required but is NULL." );
577 return( NULL );
578 }
579 if( ptwX_norm->status != nfu_Okay ) {
581 return( NULL );
582 }
583 if( ptwX_length( smr, ptwX_norm ) != ngs ) {
584 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_badNorm, "Norm length = %d but there are %d groups.",
585 (int) ptwX_length( NULL, ptwX_norm ), (int) ngs );
586 return( NULL );
587 }
588 }
589
590 if( ( f = ptwXY_intersectionWith_ptwX( smr, ptwXY, groupBoundaries ) ) == NULL ) {
592 return( NULL );
593 }
594 if( f->length == 0 ) {
595 groupedData = ptwX_createLine( smr, ngs, ngs, 0, 0 );
596 if( groupedData == NULL ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via." );
597 return( groupedData );
598 }
599
600 if( ( groupedData = ptwX_new( smr, ngs ) ) == NULL ) goto Err;
601 xg1 = groupBoundaries->points[0];
602 x1 = f->points[0].x;
603 y1 = f->points[0].y;
604 for( igs = 0, i = 1; igs < ngs; igs++ ) {
605 xg2 = groupBoundaries->points[igs+1];
606 sum = 0;
607 if( xg2 > x1 ) {
608 for( ; i < f->length; i++, x1 = x2, y1 = y2 ) {
609 x2 = f->points[i].x;
610 if( x2 > xg2 ) break;
611 y2p = y2 = f->points[i].y;
612 if( f->interpolation == ptwXY_interpolationFlat ) y2p = y1;
613 sum += ( y1 + y2p ) * ( x2 - x1 );
614 }
615 }
616 if( sum != 0. ) {
617 if( normType == ptwXY_group_normType_dx ) {
618 sum /= ( xg2 - xg1 ); }
619 else if( normType == ptwXY_group_normType_norm ) {
620 if( ptwX_norm->points[igs] == 0. ) {
621 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_divByZero, "Divide by 0. Norm at index %d is 0.", (int) igs );
622 goto Err;
623 }
624 sum /= ptwX_norm->points[igs];
625 }
626 }
627 groupedData->points[igs] = 0.5 * sum;
628 groupedData->length++;
629 xg1 = xg2;
630 }
631
632 ptwXY_free( f );
633 return( groupedData );
634
635Err:
637 ptwXY_free( f );
638 if( groupedData != NULL ) ptwX_free( groupedData );
639 return( NULL );
640}
ptwXYPoints * ptwXY_intersectionWith_ptwX(statusMessageReporting *smr, ptwXYPoints *ptwXY, ptwXPoints *ptwX)
int64_t ptwX_length(statusMessageReporting *smr, ptwXPoints *ptwX)
Definition ptwX_core.c:222
ptwXPoints * ptwX_createLine(statusMessageReporting *smr, int64_t size, int64_t length, double slope, double offset)
Definition ptwX_core.c:71
nfu_status status
Definition ptwX.h:28

Referenced by GIDI::multiGroupXYs1d(), and GIDI::Transporting::Flux::process().

◆ ptwXY_groupThreeFunctions()

ptwXPoints * ptwXY_groupThreeFunctions ( statusMessageReporting * smr,
ptwXYPoints * ptwXY1,
ptwXYPoints * ptwXY2,
ptwXYPoints * ptwXY3,
ptwXPoints * groupBoundaries,
ptwXY_group_normType normType,
ptwXPoints * ptwX_norm )

Definition at line 764 of file ptwXY_integration.c.

765 {
766
767 int64_t i, igs, ngs;
768 nfu_status status = nfu_Okay;
769 double x1, fy1, gy1, hy1, x2, fy2, gy2, hy2, fy2p, gy2p, hy2p, xg1, xg2, sum;
770 ptwXYPoints *f = NULL, *ff, *fff = NULL, *g = NULL, *gg = NULL, *h = NULL, *hh = NULL;
771 ptwXPoints *groupedData = NULL;
772
773 if( ptwXY_simpleCoalescePoints( smr, ptwXY1 ) != nfu_Okay ) {
774 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via: source1." );
775 return( NULL );
776 }
777 if( ptwXY_simpleCoalescePoints( smr, ptwXY2 ) != nfu_Okay ) {
778 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via: source2." );
779 return( NULL );
780 }
781 if( ptwXY_simpleCoalescePoints( smr, ptwXY3 ) != nfu_Okay ) {
782 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via: source3." );
783 return( NULL );
784 }
785 if( groupBoundaries->status != nfu_Okay ) {
786 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Via: groupBoundaries." );
787 return( NULL );
788 }
789
790 if( ptwXY1->interpolation == ptwXY_interpolationOther ) {
791 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not supported for integration: source1." );
792 return( NULL );
793 }
794 if( ptwXY2->interpolation == ptwXY_interpolationOther ) {
795 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not supported for integration: source2." );
796 return( NULL );
797 }
798 if( ptwXY3->interpolation == ptwXY_interpolationOther ) {
799 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not supported for integration: source3." );
800 return( NULL );
801 }
802
803 ngs = ptwX_length( smr, groupBoundaries ) - 1;
804 if( normType == ptwXY_group_normType_norm ) {
805 if( ptwX_norm == NULL ) {
806 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badNorm, "Norm function required but is NULL." );
807 return( NULL );
808 }
809 if( ptwX_norm->status != nfu_Okay ) {
811 return( NULL );
812 }
813 if( ptwX_length( smr, ptwX_norm ) != ngs ) {
814 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_badNorm, "Norm length = %d but there are %d groups.",
815 (int) ptwX_length( NULL, ptwX_norm ), (int) ngs );
816 return( NULL );
817 }
818 }
819
820 if( ( ff = ptwXY_intersectionWith_ptwX( smr, ptwXY1, groupBoundaries ) ) == NULL ) goto Err;
821 if( ( gg = ptwXY_intersectionWith_ptwX( smr, ptwXY2, groupBoundaries ) ) == NULL ) goto Err;
822 if( ( hh = ptwXY_intersectionWith_ptwX( smr, ptwXY3, groupBoundaries ) ) == NULL ) goto Err;
823 if( ( ff->length == 0 ) || ( gg->length == 0 ) || ( hh->length == 0 ) ) {
824 ptwXY_free( ff );
825 ptwXY_free( gg );
826 ptwXY_free( hh );
827 groupedData = ptwX_createLine( smr, ngs, ngs, 0, 0 );
828 if( groupedData == NULL ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via." );
829 return( groupedData );
830 }
831
832 if( ( status = ptwXY_tweakDomainsToMutualify( smr, ff, gg, 4, 0 ) ) != nfu_Okay ) goto Err2;
833 if( ( status = ptwXY_tweakDomainsToMutualify( smr, ff, hh, 4, 0 ) ) != nfu_Okay ) goto Err2;
834 if( ( status = ptwXY_tweakDomainsToMutualify( smr, gg, hh, 4, 0 ) ) != nfu_Okay ) goto Err2;
835 if( ( fff = ptwXY_union( smr, ff, gg, ptwXY_union_fill ) ) == NULL ) goto Err;
836 if( ( h = ptwXY_union( smr, hh, fff, ptwXY_union_fill ) ) == NULL ) goto Err;
837 if( ( f = ptwXY_union( smr, fff, h, ptwXY_union_fill ) ) == NULL ) goto Err;
838 if( ( g = ptwXY_union( smr, gg, h, ptwXY_union_fill ) ) == NULL ) goto Err;
839
840 if( ( groupedData = ptwX_new( smr, ngs ) ) == NULL ) goto Err;
841 xg1 = groupBoundaries->points[0];
842 x1 = f->points[0].x;
843 fy1 = f->points[0].y;
844 gy1 = g->points[0].y;
845 hy1 = h->points[0].y;
846 for( igs = 0, i = 1; igs < ngs; igs++ ) {
847 xg2 = groupBoundaries->points[igs+1];
848 sum = 0;
849 if( xg2 > x1 ) {
850 for( ; i < f->length; i++, x1 = x2, fy1 = fy2, gy1 = gy2, hy1 = hy2 ) {
851 x2 = f->points[i].x;
852 if( x2 > xg2 ) break;
853 fy2p = fy2 = f->points[i].y;
854 if( f->interpolation == ptwXY_interpolationFlat ) fy2p = fy1;
855 gy2p = gy2 = g->points[i].y;
856 if( g->interpolation == ptwXY_interpolationFlat ) gy2p = gy1;
857 hy2p = hy2 = h->points[i].y;
858 if( h->interpolation == ptwXY_interpolationFlat ) hy2p = hy1;
859 sum += ( ( fy1 + fy2p ) * ( gy1 + gy2p ) * ( hy1 + hy2p ) + 2 * fy1 * gy1 * hy1 + 2 * fy2p * gy2p * hy2p ) * ( x2 - x1 );
860 }
861 }
862 if( sum != 0. ) {
863 if( normType == ptwXY_group_normType_dx ) {
864 sum /= ( xg2 - xg1 ); }
865 else if( normType == ptwXY_group_normType_norm ) {
866 if( ptwX_norm->points[igs] == 0. ) {
867 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_divByZero, "Divide by 0. Norm at index %d is 0.", (int) igs );
868 goto Err;
869 }
870 sum /= ptwX_norm->points[igs];
871 }
872 }
873 groupedData->points[igs] = sum / 12.;
874 groupedData->length++;
875 xg1 = xg2;
876 }
877
878 ptwXY_free( f );
879 ptwXY_free( g );
880 ptwXY_free( h );
881 ptwXY_free( ff );
882 ptwXY_free( gg );
883 ptwXY_free( hh );
884 ptwXY_free( fff );
885 return( groupedData );
886
887Err:
889 if( fff != NULL ) ptwXY_free( fff );
890 if( ff != NULL ) ptwXY_free( ff );
891 if( gg != NULL ) ptwXY_free( gg );
892 if( hh != NULL ) ptwXY_free( hh );
893 if( f != NULL ) ptwXY_free( f );
894 if( g != NULL ) ptwXY_free( g );
895 if( h != NULL ) ptwXY_free( h );
896 if( groupedData != NULL ) ptwX_free( groupedData );
897 return( NULL );
898
899Err2:
900 smr_setReportError2p( smr, nfu_SMR_libraryID, status, "ptwXY_tweakDomainsToMutualify failed: most likely functions cannot be mutualified by tweaking." );
901 goto Err;
902}
nfu_status ptwXY_tweakDomainsToMutualify(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2, int epsilonFactor, double epsilon)

Referenced by GIDI::multiGroupTwoXYs1ds().

◆ ptwXY_groupTwoFunctions()

ptwXPoints * ptwXY_groupTwoFunctions ( statusMessageReporting * smr,
ptwXYPoints * ptwXY1,
ptwXYPoints * ptwXY2,
ptwXPoints * groupBoundaries,
ptwXY_group_normType normType,
ptwXPoints * ptwX_norm )

Definition at line 644 of file ptwXY_integration.c.

645 {
646
647 int64_t i, igs, ngs;
648 nfu_status status = nfu_Okay;
649 double x1, fy1, gy1, x2, fy2, gy2, fy2p, gy2p, xg1, xg2, sum;
650 ptwXYPoints *f = NULL, *ff, *g = NULL, *gg = NULL;
651 ptwXPoints *groupedData = NULL;
652
653 if( ptwXY_simpleCoalescePoints( smr, ptwXY1 ) != nfu_Okay ) {
654 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via: source1." );
655 return( NULL );
656 }
657 if( ptwXY_simpleCoalescePoints( smr, ptwXY2 ) != nfu_Okay ) {
658 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via: source2." );
659 return( NULL );
660 }
661 if( groupBoundaries->status != nfu_Okay ) {
662 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Via: groupBoundaries." );
663 return( NULL );
664 }
665
666 if( ptwXY1->interpolation == ptwXY_interpolationOther ) {
668 "Other interpolation not supported for integration: source1." );
669 return( NULL );
670 }
671 if( ptwXY2->interpolation == ptwXY_interpolationOther ) {
673 "Other interpolation not supported for integration: source2." );
674 return( NULL );
675 }
676
677 ngs = ptwX_length( smr, groupBoundaries ) - 1;
678 if( normType == ptwXY_group_normType_norm ) {
679 if( ptwX_norm == NULL ) {
680 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badNorm, "Norm function required but is NULL." );
681 return( NULL );
682 }
683 if( ptwX_norm->status != nfu_Okay ) {
685 return( NULL );
686 }
687 if( ptwX_length( smr, ptwX_norm ) != ngs ) {
688 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_badNorm, "Norm length = %d but there are %d groups.",
689 (int) ptwX_length( NULL, ptwX_norm ), (int) ngs );
690 return( NULL );
691 }
692 }
693
694 if( ( ff = ptwXY_intersectionWith_ptwX( smr, ptwXY1, groupBoundaries ) ) == NULL ) goto Err;
695 if( ( gg = ptwXY_intersectionWith_ptwX( smr, ptwXY2, groupBoundaries ) ) == NULL ) goto Err;
696 if( ( ff->length == 0 ) || ( gg->length == 0 ) ) {
697 ptwXY_free( ff );
698 ptwXY_free( gg );
699 groupedData = ptwX_createLine( smr, ngs, ngs, 0, 0 );
700 if( groupedData == NULL ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via." );
701 return( groupedData );
702 }
703
704 if( ( status = ptwXY_tweakDomainsToMutualify( smr, ff, gg, 4, 0 ) ) != nfu_Okay ) {
705 smr_setReportError2p( smr, nfu_SMR_libraryID, status, "ptwXY_tweakDomainsToMutualify failed: most likely functions cannot be mutualified by tweaking." );
706 goto Err;
707 }
708 if( ( f = ptwXY_union( smr, ff, gg, ptwXY_union_fill ) ) == NULL ) goto Err;
709 if( ( g = ptwXY_union( smr, gg, f, ptwXY_union_fill ) ) == NULL ) goto Err;
710
711 if( ( groupedData = ptwX_new( smr, ngs ) ) == NULL ) goto Err;
712 xg1 = groupBoundaries->points[0];
713 x1 = f->points[0].x;
714 fy1 = f->points[0].y;
715 gy1 = g->points[0].y;
716 for( igs = 0, i = 1; igs < ngs; igs++ ) {
717 xg2 = groupBoundaries->points[igs+1];
718 sum = 0;
719 if( xg2 > x1 ) {
720 for( ; i < f->length; i++, x1 = x2, fy1 = fy2, gy1 = gy2 ) {
721 x2 = f->points[i].x;
722 if( x2 > xg2 ) break;
723 fy2p = fy2 = f->points[i].y;
724 if( f->interpolation == ptwXY_interpolationFlat ) fy2p = fy1;
725 gy2p = gy2 = g->points[i].y;
726 if( g->interpolation == ptwXY_interpolationFlat ) gy2p = gy1;
727 sum += ( ( fy1 + fy2p ) * ( gy1 + gy2p ) + fy1 * gy1 + fy2p * gy2p ) * ( x2 - x1 );
728 }
729 }
730 if( sum != 0. ) {
731 if( normType == ptwXY_group_normType_dx ) {
732 sum /= ( xg2 - xg1 ); }
733 else if( normType == ptwXY_group_normType_norm ) {
734 if( ptwX_norm->points[igs] == 0. ) {
735 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_divByZero, "Divide by 0. Norm at index %d is 0.", (int) igs );
736 goto Err;
737 }
738 sum /= ptwX_norm->points[igs];
739 }
740 }
741 groupedData->points[igs] = sum / 6.;
742 groupedData->length++;
743 xg1 = xg2;
744 }
745
746 ptwXY_free( f );
747 ptwXY_free( g );
748 ptwXY_free( ff );
749 ptwXY_free( gg );
750 return( groupedData );
751
752Err:
754 if( ff != NULL ) ptwXY_free( ff );
755 if( gg != NULL ) ptwXY_free( gg );
756 if( f != NULL ) ptwXY_free( f );
757 if( g != NULL ) ptwXY_free( g );
758 if( groupedData != NULL ) ptwX_free( groupedData );
759 return( NULL );
760}

Referenced by GIDI::multiGroupXYs1d().

◆ ptwXY_initialize()

nfu_status ptwXY_initialize ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
ptwXY_interpolation interpolation,
char const * interpolationString,
double biSectionMax,
double accuracy,
int64_t primarySize,
int64_t secondarySize,
int userFlag )

Definition at line 53 of file ptwXY_core.c.

55 {
56
57 ptwXY->status = nfu_Okay;
58 ptwXY->interpolation = interpolation;
59 ptwXY->interpolationString = NULL;
60 switch( interpolation ) {
62 ptwXY->interpolationString = linLinInterpolationString; break;
64 ptwXY->interpolationString = logLinInterpolationString; break;
66 ptwXY->interpolationString = linLogInterpolationString; break;
68 ptwXY->interpolationString = logLogInterpolationString; break;
70 ptwXY->interpolationString = flatInterpolationString; break;
71 case ptwXY_interpolationOther : /* For ptwXY_interpolationOther, interpolationString must be defined. */
72 if( interpolationString == NULL ) {
74 "Invalid other interplation. interpolationString is NULL, it must be a defined string" );
75 ptwXY->status = nfu_Error; }
76 else {
77 if( ( ptwXY->interpolationString = smr_allocateCopyString2( smr, interpolationString, "interpolationString" ) ) == NULL )
78 ptwXY->status = nfu_Error;
79 }
80 }
81 ptwXY->userFlag = 0;
82 ptwXY_setUserFlag( ptwXY, userFlag );
84 ptwXY_setBiSectionMax( ptwXY, biSectionMax );
86 ptwXY_setAccuracy( ptwXY, accuracy );
87
88 ptwXY->length = 0;
89 ptwXY->allocatedSize = 0;
90 ptwXY->overflowLength = 0;
91 ptwXY->overflowAllocatedSize = 0;
92 ptwXY->mallocFailedSize = 0;
93
94 ptwXY_initialOverflowPoint( &(ptwXY->overflowHeader), &(ptwXY->overflowHeader), &(ptwXY->overflowHeader) );
95
96 ptwXY->points = NULL;
97 ptwXY->overflowPoints = NULL;
98
99 if( ptwXY_reallocatePoints( smr, ptwXY, primarySize, 0 ) == nfu_Okay )
100 ptwXY_reallocateOverflowPoints( smr, ptwXY, secondarySize );
101 if( ptwXY->status != nfu_Okay ) {
103 ptwXY_release( smr, ptwXY );
104 }
105 return( ptwXY->status );
106}
#define ptwXY_minAccuracy
Definition ptwXY.h:26
#define ptwXY_maxBiSectionMax
Definition ptwXY.h:25
double ptwXY_setAccuracy(ptwXYPoints *ptwXY, double accuracy)
Definition ptwXY_core.c:573
void ptwXY_setUserFlag(ptwXYPoints *ptwXY, int userFlag)
Definition ptwXY_core.c:559
nfu_status ptwXY_reallocateOverflowPoints(statusMessageReporting *smr, ptwXYPoints *ptwXY, int64_t size)
Definition ptwXY_core.c:634
double ptwXY_setBiSectionMax(ptwXYPoints *ptwXY, double biSectionMax)
Definition ptwXY_core.c:589
int64_t mallocFailedSize
Definition ptwXY.h:91

Referenced by ptwXY_new().

◆ ptwXY_integrate()

nfu_status ptwXY_integrate ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double domainMin,
double domainMax,
double * value )

Definition at line 122 of file ptwXY_integration.c.

122 {
123
124 int64_t i, n = ptwXY->length;
125 double dSum, x, y, x1, x2, y1, y2, _sign = 1.;
126 ptwXYPoint *point;
127 nfu_status status;
128
129 *value = 0.;
130
131 if( ptwXY->status != nfu_Okay ) {
133 return( nfu_badSelf );
134 }
136 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not supported for integration." );
137 return( nfu_otherInterpolation );
138 }
139
140 if( n < 2 ) return( nfu_Okay );
141
142 if( domainMax < domainMin ) {
143 x = domainMin;
144 domainMin = domainMax;
145 domainMax = x;
146 _sign = -1.;
147 }
148
149 if( ( status = ptwXY_simpleCoalescePoints( smr, ptwXY ) ) != nfu_Okay ) {
151 return( status );
152 }
153
154 for( i = 0, point = ptwXY->points; i < n; i++, point++ ) {
155 if( point->x >= domainMin ) break;
156 }
157 if( i == n ) return( nfu_Okay );
158
159 x2 = point->x;
160 y2 = point->y;
161 if( i > 0 ) {
162 if( x2 > domainMin ) {
163 x1 = point[-1].x;
164 y1 = point[-1].y;
165 if( ( status = ptwXY_interpolatePoint( smr, ptwXY->interpolation, domainMin, &y, x1, y1, x2, y2 ) ) != nfu_Okay ) {
167 return( status );
168 }
169 if( x2 > domainMax ) {
170 double rangeMax;
171
172 if( ( status = ptwXY_interpolatePoint( smr, ptwXY->interpolation, domainMax, &rangeMax, x1, y1, x2, y2 ) ) == nfu_Okay ) {
173 status = ptwXY_f_integrate( smr, ptwXY->interpolation, domainMin, y, domainMax, rangeMax, value );
174 }
175 if( status != nfu_Okay ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Via." );
176 return( status ); }
177 else {
178 if( ( status = ptwXY_f_integrate( smr, ptwXY->interpolation, domainMin, y, x2, y2, value ) ) != nfu_Okay ) {
180 return( status );
181 }
182 }
183 }
184 }
185 i++;
186 point++;
187 for( ; i < n; i++, point++ ) {
188 x1 = x2;
189 y1 = y2;
190 x2 = point->x;
191 y2 = point->y;
192 if( x2 > domainMax ) {
193 if( ( status = ptwXY_interpolatePoint( smr, ptwXY->interpolation, domainMax, &y, x1, y1, x2, y2 ) ) != nfu_Okay ) {
195 return( status );
196 }
197 if( ( status = ptwXY_f_integrate( smr, ptwXY->interpolation, x1, y1, domainMax, y, &dSum ) ) != nfu_Okay ) {
199 return( status );
200 }
201 *value += dSum;
202 break;
203 }
204 if( ( status = ptwXY_f_integrate( smr, ptwXY->interpolation, x1, y1, x2, y2, &dSum ) ) != nfu_Okay ) {
206 return( status );
207 }
208 *value += dSum;
209 }
210
211 *value *= _sign;
212
213 return( nfu_Okay );
214}

Referenced by GIDI::Functions::XYs1d::integrate(), and ptwXY_integrateDomain().

◆ ptwXY_integrateDomain()

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

Definition at line 218 of file ptwXY_integration.c.

218 {
219
220 nfu_status status = nfu_Okay;
221
222 *value = 0;
223
224 if( ptwXY->status != nfu_Okay ) {
226 return( nfu_badSelf );
227 }
228
229 if( ptwXY->length > 0 ) {
230 double domainMin, domainMax;
231
232 if( ptwXY_domainMin( smr, ptwXY, &domainMin ) != nfu_Okay ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Via." );
233 if( ptwXY_domainMax( smr, ptwXY, &domainMax ) != nfu_Okay ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Via." );
234 if( ( status = ptwXY_integrate( smr, ptwXY, domainMin, domainMax, value ) ) != nfu_Okay )
236 }
237 return( status );
238}
nfu_status ptwXY_integrate(statusMessageReporting *smr, ptwXYPoints *ptwXY, double domainMin, double domainMax, double *value)

Referenced by GIDI::Functions::XYs1d::normalize(), ptwXY_equalProbableBins(), and ptwXY_normalize().

◆ ptwXY_integrateDomainWithWeight_sqrt_x()

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

Definition at line 436 of file ptwXY_integration.c.

436 {
437
438 nfu_status status;
439 double domainMin, domainMax;
440
441 *value = 0.;
442
443 if( ptwXY->status != nfu_Okay ) {
445 return( nfu_badSelf );
446 }
447
448 if( ptwXY->length < 2 ) return( nfu_Okay );
449
450 if( ptwXY_domainMin( smr, ptwXY, &domainMin ) != nfu_Okay ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Via." );
451 if( ptwXY_domainMax( smr, ptwXY, &domainMax ) != nfu_Okay ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Via." );
452 if( ( status = ptwXY_integrateWithWeight_sqrt_x( smr, ptwXY, domainMin, domainMax, value ) ) != nfu_Okay )
454 return( status );
455}
nfu_status ptwXY_integrateWithWeight_sqrt_x(statusMessageReporting *smr, ptwXYPoints *ptwXY, double domainMin, double domainMax, double *value)

◆ ptwXY_integrateDomainWithWeight_x()

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

Definition at line 271 of file ptwXY_integration.c.

271 {
272
273 nfu_status status = nfu_Okay;
274 double domainMin, domainMax;
275
276 *value = 0.;
277
278 if( ptwXY->status != nfu_Okay ) {
280 return( nfu_badSelf );
281 }
282
283 if( ptwXY->length < 2 ) return( nfu_Okay );
284
285 if( ptwXY_domainMin( smr, ptwXY, &domainMin ) != nfu_Okay ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Via." );
286 if( ptwXY_domainMax( smr, ptwXY, &domainMax ) != nfu_Okay ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Via." );
287 if( ( status = ptwXY_integrateWithWeight_x( smr, ptwXY, domainMin, domainMax, value ) ) != nfu_Okay )
289 return( status );
290}
nfu_status ptwXY_integrateWithWeight_x(statusMessageReporting *smr, ptwXYPoints *ptwXY, double domainMin, double domainMax, double *value)

◆ ptwXY_integrateWithFunction()

nfu_status ptwXY_integrateWithFunction ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
ptwXY_createFromFunction_callback func,
void * argList,
double domainMin,
double domainMax,
int degree,
int recursionLimit,
double tolerance,
double * value )

Definition at line 938 of file ptwXY_integration.c.

939 {
940
941 int64_t i1, i2, n1 = ptwXY->length;
942 long evaluations;
943 double integral = 0., integral_, sign = -1., xa, xb;
944 ptwXY_integrateWithFunctionInfo integrateWithFunctionInfo;
945 ptwXYPoint *point;
946 nfu_status status;
947
948 *value = 0;
949
950 if( ptwXY_simpleCoalescePoints( smr, ptwXY ) != nfu_Okay ) {
952 return( nfu_Error );
953 }
954
955 if( domainMin == domainMax ) return( nfu_Okay );
956 if( n1 < 2 ) return( nfu_Okay );
957
958 if( domainMin > domainMax ) {
959 sign = domainMin;
960 domainMin = domainMax;
961 domainMax = sign;
962 sign = -1.;
963 }
964 if( domainMin >= ptwXY->points[n1-1].x ) return( nfu_Okay );
965 if( domainMax <= ptwXY->points[0].x ) return( nfu_Okay );
966
967 for( i1 = 0; i1 < ( n1 - 1 ); i1++ ) {
968 if( ptwXY->points[i1+1].x > domainMin ) break;
969 }
970 for( i2 = n1 - 1; i2 > i1; i2-- ) {
971 if( ptwXY->points[i2-1].x < domainMax ) break;
972 }
973 point = &(ptwXY->points[i1]);
974
975 integrateWithFunctionInfo.degree = degree;
976 integrateWithFunctionInfo.func = func;
977 integrateWithFunctionInfo.argList = argList;
978 integrateWithFunctionInfo.interpolation = ptwXY->interpolation;
979 integrateWithFunctionInfo.x2 = point->x;
980 integrateWithFunctionInfo.y2 = point->y;
981
982 xa = domainMin;
983 for( ; i1 < i2; i1++ ) {
984 integrateWithFunctionInfo.x1 = integrateWithFunctionInfo.x2;
985 integrateWithFunctionInfo.y1 = integrateWithFunctionInfo.y2;
986 ++point;
987 integrateWithFunctionInfo.x2 = point->x;
988 integrateWithFunctionInfo.y2 = point->y;
989 xb = point->x;
990 if( xb > domainMax ) xb = domainMax;
991 status = nf_GnG_adaptiveQuadrature( ptwXY_integrateWithFunction2, ptwXY_integrateWithFunction3, &integrateWithFunctionInfo,
992 xa, xb, recursionLimit, tolerance, &integral_, &evaluations );
993 if( status != nfu_Okay ) {
994 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via. Error from nf_GnG_adaptiveQuadrature." );
995 return( status );
996 }
997 integral += integral_;
998 xa = xb;
999 }
1000 *value = sign * integral;
1001
1002 return( nfu_Okay );
1003}
nfu_status nf_GnG_adaptiveQuadrature(nf_GnG_adaptiveQuadrature_callback quadratureFunction, nf_Legendre_GaussianQuadrature_callback integrandFunction, void *argList, double x1, double x2, int maxDepth, double tolerance, double *integral, long *evaluations)
struct ptwXY_integrateWithFunctionInfo_s ptwXY_integrateWithFunctionInfo
ptwXY_createFromFunction_callback func

◆ ptwXY_integrateWithWeight_sqrt_x()

nfu_status ptwXY_integrateWithWeight_sqrt_x ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double domainMin,
double domainMax,
double * value )

Definition at line 459 of file ptwXY_integration.c.

460 {
461
462 int64_t i, n = ptwXY->length;
463 double sum = 0., x, y, x1, x2, y1, y2, _sign = 1., sqrt_x1, sqrt_x2, inv_apb, c;
464 ptwXYPoint *point;
465 nfu_status status;
466
467 *value = 0.;
468
469 if( ptwXY->status != nfu_Okay ) {
471 return( nfu_badSelf );
472 }
473
474 if( ( ptwXY->interpolation != ptwXY_interpolationLinLin ) &&
475 ( ptwXY->interpolation != ptwXY_interpolationFlat ) ) {
477 "Unsupported interpolation = '%s'", ptwXY->interpolationString );
479 }
480
481 if( n < 2 ) return( nfu_Okay );
482 if( domainMax < domainMin ) {
483 x = domainMin;
484 domainMin = domainMax;
485 domainMax = x;
486 _sign = -1.;
487 }
488
489 if( ptwXY_simpleCoalescePoints( smr, ptwXY ) != nfu_Okay ) {
491 return( nfu_Error );
492 }
493
494 for( i = 0, point = ptwXY->points; i < n; ++i, ++point ) {
495 if( point->x >= domainMin ) break;
496 }
497 if( i == n ) return( nfu_Okay );
498 x2 = point->x;
499 y2 = point->y;
500 if( i > 0 ) {
501 if( x2 > domainMin ) {
502 if( ( status = ptwXY_interpolatePoint( smr, ptwXY->interpolation, domainMin, &y, point[-1].x, point[-1].y, x2, y2 ) ) != nfu_Okay ) {
504 return( status );
505 }
506 x2 = domainMin;
507 y2 = y;
508 --i;
509 --point;
510 }
511 }
512 ++i;
513 ++point;
514 sqrt_x2 = sqrt( x2 );
515 for( ; i < n; ++i, ++point ) {
516 x1 = x2;
517 y1 = y2;
518 sqrt_x1 = sqrt_x2;
519 x2 = point->x;
520 y2 = point->y;
521 if( x2 > domainMax ) {
522 if( ( status = ptwXY_interpolatePoint( smr, ptwXY->interpolation, domainMax, &y, x1, y1, x2, y2 ) ) != nfu_Okay ) {
524 return( status );
525 }
526 x2 = domainMax;
527 y2 = y;
528 }
529 sqrt_x2 = sqrt( x2 );
530 inv_apb = sqrt_x1 + sqrt_x2;
531 c = 2. * ( sqrt_x1 * sqrt_x2 + x1 + x2 );
532 switch( ptwXY->interpolation ) {
534 sum += ( sqrt_x2 - sqrt_x1 ) * y1 * 2.5 * c;
535 break;
537 sum += ( sqrt_x2 - sqrt_x1 ) * ( y1 * ( c + x1 * ( 1. + sqrt_x2 / inv_apb ) ) + y2 * ( c + x2 * ( 1. + sqrt_x1 / inv_apb ) ) );
538 break;
539 default : /* Only to stop compilers from complaining. */
540 break;
541 }
542 if( x2 == domainMax ) break;
543 }
544
545 *value = 2. / 15. * _sign * sum;
546
547 return( nfu_Okay );
548}

Referenced by ptwXY_integrateDomainWithWeight_sqrt_x().

◆ ptwXY_integrateWithWeight_x()

nfu_status ptwXY_integrateWithWeight_x ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double domainMin,
double domainMax,
double * value )

Definition at line 294 of file ptwXY_integration.c.

295 {
296
297 int64_t i, n = ptwXY->length;
298 double sum = 0., x, y, x1, x2, y1, y2, _sign = 1., invLog, dx, dy, ratioX, logX, ratioY, logY, numerator;
299 ptwXYPoint *point;
300 nfu_status status;
301
302 *value = 0.;
303
304 if( ptwXY->status != nfu_Okay ) {
306 return( nfu_badSelf );
307 }
308
310 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_unsupportedInterpolation, "Unsupported interpolation = '%s'", ptwXY->interpolationString );
312 }
313
314 if( n < 2 ) return( nfu_Okay );
315
316 if( domainMax < domainMin ) {
317 x = domainMin;
318 domainMin = domainMax;
319 domainMax = x;
320 _sign = -1.;
321 }
322
323 if( ptwXY_simpleCoalescePoints( smr, ptwXY ) != nfu_Okay ) {
325 return( nfu_Error );
326 }
327
328 for( i = 0, point = ptwXY->points; i < n; ++i, ++point ) {
329 if( point->x >= domainMin ) break;
330 }
331 if( i == n ) return( nfu_Okay );
332
333 x2 = point->x;
334 y2 = point->y;
335 if( i > 0 ) {
336 if( x2 > domainMin ) {
337 if( ( status = ptwXY_interpolatePoint( smr, ptwXY->interpolation, domainMin, &y, point[-1].x, point[-1].y, x2, y2 ) ) != nfu_Okay ) {
339 return( status );
340 }
341 x2 = domainMin;
342 y2 = y;
343 --i;
344 --point;
345 }
346 }
347 ++i;
348 ++point;
349 for( ; i < n; ++i, ++point ) {
350 x1 = x2;
351 y1 = y2;
352 x2 = point->x;
353 y2 = point->y;
354 if( x2 > domainMax ) {
355 if( ( status = ptwXY_interpolatePoint( smr, ptwXY->interpolation, domainMax, &y, x1, y1, x2, y2 ) ) != nfu_Okay ) {
357 return( status );
358 }
359 x2 = domainMax;
360 y2 = y;
361 }
362 switch( ptwXY->interpolation ) {
364 sum += 0.5 * ( x2 - x1 ) * y1 * ( x1 + x2 );
365 break;
367 sum += ( x2 - x1 ) * ( y1 * ( 2 * x1 + x2 ) + y2 * ( x1 + 2 * x2 ) ) / 6.;
368 break;
370 ratioY = y2 / y1;
371 dx = x2 - x1;
372 dy = y2 - y1;
373 if( fabs( ratioY - 1 ) < 1e-3 ) {
374 double sum2 = 0.0;
375
376 ratioY -= 1.0;
377 sum2 = x1 * ( 1.0 + 0.5 * ratioY * ( 1.0 + ratioY * ( -1.0 + 0.5 * ratioY * ( 1.0 - 19 * ratioY / 30 ) ) / 6.0 ) );
378 sum2 += 0.5 * ( x2 - x1 ) * ( 1.0 + ratioY * ( 2.0 + 0.25 * ratioY * ( -1.0 + ratioY * ( 7 - 4.25 * ratioY ) / 15.0 ) ) / 3.0 );
379 sum += y1 * ( x2 - x1 ) * sum2;
380 }
381 else {
382 invLog = 1.0 / log( ratioY );
383 sum += dx * invLog * ( dx * ( y2 - dy * invLog ) + x1 * dy );
384 }
385 break;
387 sum += 0.5 * ( x2 - x1 ) * y1 * ( x1 + x2 );
388 ratioX = x2 / x1;
389 if( fabs( ratioX - 1 ) < 1e-3 ) {
390 ratioX -= 1.0;
391 sum += 0.5 * ( y2 - y1 ) * x1 * ( x2 - x1 ) * ( 1.0 + ratioX * ( 5.0 + ratioX * ratioX * ( 1.0 + ratioX ) / 30.0 ) / 6.0 ); }
392 else {
393 logX = log( ratioX );
394 sum += 0.25 * ( y2 - y1 ) * x1 * x1 * ( 1.0 + ratioX * ratioX * ( 2.0 * logX - 1.0 ) ) / logX;
395 }
396 break;
398 ratioX = x2 / x1;
399 if( fabs( ratioX - 1. ) < 1e-4 ) {
400 ratioX -= 1.0;
401 logX = ratioX * ( 1. + ratioX * ( -0.5 + ratioX * ( 1. / 3. - 0.25 * ratioX ) ) );
402 ratioX = x2 / x1; }
403 else {
404 logX = log( ratioX );
405 }
406
407 ratioY = y2 / y1;
408 if( fabs( ratioY - 1. ) < 1e-4 ) {
409 ratioY -= 1.0;
410 logY = ratioY * ( 1. + ratioY * ( -0.5 + ratioY * ( 1. / 3. - 0.25 * ratioY ) ) );
411 ratioY = y2 / y1; }
412 else {
413 logY = log( ratioY );
414 }
415
416 numerator = ratioX * ratioX * ratioY - 1.0;
417 if( numerator < 1e-4 ) {
418 sum += y1 * x1 * x1 * logX * ( 1.0 + 0.5 * numerator * ( 1.0 + numerator * ( 1 + 0.5 * numerator * ( 1 + 19.0 * numerator / 30.0 ) ) / 6.0 ) ); }
419 else {
420 sum += y1 * x1 * x1 * numerator / ( logY / logX + 2.0 );
421 }
422 break;
423 default : /* Only to stop compilers from complaining. */
424 break;
425 }
426 if( x2 == domainMax ) break;
427 }
428
429 *value = _sign * sum;
430
431 return( nfu_Okay );
432}

Referenced by ptwXY_integrateDomainWithWeight_x().

◆ ptwXY_interpolatePoint()

nfu_status ptwXY_interpolatePoint ( statusMessageReporting * smr,
ptwXY_interpolation interpolation,
double x,
double * y,
double x1,
double y1,
double x2,
double y2 )

Definition at line 30 of file ptwXY_interpolation.c.

31 {
32
33 nfu_status status = nfu_Okay;
34
35 if( interpolation == ptwXY_interpolationOther ) {
36 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not allow." );
37 return( nfu_otherInterpolation );
38 }
39 if( ( x1 > x2 ) || ( x < x1 ) || ( x > x2 ) ) {
41 "Interpolation point.x = %.17e not between function points x1 = %.17e and x2 = %.17e.", x, x1, x2 );
43 }
44 if( y1 == y2 ) {
45 *y = y1; }
46 else if( x1 == x2 ) {
47 *y = 0.5 * ( y1 + y2 ); }
48 else if( x == x1 ) {
49 *y = y1; }
50 else if( x == x2 ) {
51 *y = y2; }
52 else {
53 switch( interpolation ) {
55 *y = ( y1 * ( x2 - x ) + y2 * ( x - x1 ) ) / ( x2 - x1 );
56 break;
58 if( ( x <= 0. ) || ( x1 <= 0. ) || ( x2 <= 0. ) ) {
60 "For log(x), some x-values less than equal to 0, x1 = %.17e, x = %.17e, x2 = %.17e.", x1, x, x2 );
62 }
63 *y = ( y1 * log( x2 / x ) + y2 * log( x / x1 ) ) / log( x2 / x1 );
64 break;
66 if( ( y1 <= 0. ) || ( y2 <= 0. ) ) {
68 "For log(y), some y-values less than equal to 0, y1 = %.17e, y2 = %.17e.", y1, y2 );
70 }
71 *y = exp( ( log( y1 ) * ( x2 - x ) + log( y2 ) * ( x - x1 ) ) / ( x2 - x1 ) );
72 break;
74 if( ( x <= 0. ) || ( x1 <= 0. ) || ( x2 <= 0. ) ) {
76 "For log(x), some x-values less than equal to 0, x1 = %.17e, x = %.17e, x2 = %.17e.", x1, x, x2 );
78 }
79 if( ( y1 <= 0. ) || ( y2 <= 0. ) ) {
81 "For log(y), some y-values less than equal to 0, y1 = %.17e, y2 = %.17e.", y1, y2 );
83 }
84 *y = exp( ( log( y1 ) * log( x2 / x ) + log( y2 ) * log( x / x1 ) ) / log( x2 / x1 ) );
85 break;
87 *y = y1;
88 break;
89 default :
91 "Invalid interpolation token = %d.", interpolation );
93 }
94 }
95 return( status );
96}

Referenced by ptwXY_dullEdges(), ptwXY_getValueAtX(), ptwXY_integrate(), ptwXY_integrateWithWeight_sqrt_x(), ptwXY_integrateWithWeight_x(), ptwXY_mapToXsAndAdd(), ptwXY_thicken(), ptwXY_union(), ptwXY_ysMappedToXs(), and GIDI::Functions::XYs1d::ysMappedToXs().

◆ ptwXY_interpolationToString()

char const * ptwXY_interpolationToString ( ptwXY_interpolation interpolation)

Definition at line 1780 of file ptwXY_core.c.

1780 {
1781
1782 switch( interpolation ) {
1783 case ptwXY_interpolationLinLin : return( linLinInterpolationString );
1784 case ptwXY_interpolationLogLin : return( logLinInterpolationString );
1785 case ptwXY_interpolationLinLog : return( linLogInterpolationString );
1786 case ptwXY_interpolationLogLog : return( logLogInterpolationString );
1787 case ptwXY_interpolationFlat : return( flatInterpolationString );
1788 default :
1789 break;
1790 }
1791 return( NULL );
1792}

Referenced by GIDI::Functions::FunctionForm::FunctionForm(), GIDI::Functions::FunctionForm::FunctionForm(), GIDI::multiGroupXYs1d(), GIDI::Transporting::Flux::process(), ptwXY_binary_ptwXY(), ptwXY_create2(), ptwXY_createFrom_Xs_Ys2(), ptwXY_new2(), ptwXY_setInterpolationString(), and GIDI::Functions::FunctionForm::setInterpolation().

◆ ptwXY_intersectionWith_ptwX()

ptwXYPoints * ptwXY_intersectionWith_ptwX ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
ptwXPoints * ptwX )

Definition at line 353 of file ptwXY_convenient.c.

353 {
354
355 int64_t i, i1, i2, lengthX = ptwX_length( smr, ptwX );
356 double x, y, domainMin, domainMax;
357 ptwXYPoints *n = NULL;
358
359 if( ptwX->status != nfu_Okay ) {
360 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid ptwXPoints." );
361 return( NULL );
362 }
363
364 if( ptwXY_simpleCoalescePoints( smr, ptwXY ) != nfu_Okay ) {
366 return( NULL );
367 }
368
370 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not allowed." );
371 return( NULL );
372 }
373
374 if( ( n = ptwXY_clone( smr, ptwXY ) ) == NULL ) {
376 return( NULL );
377 }
378
379 if( ptwXY->length == 0 ) return( n );
380 domainMin = ptwXY->points[0].x;
381 domainMax = ptwXY->points[ptwXY->length - 1].x;
382
383 if( ( domainMin >= ptwX->points[lengthX-1] ) || ( domainMax <= ptwX->points[0] ) ) { /* No overlap. */
384 n->length = 0;
385 return( n );
386 }
387
388 for( i = 0; i < lengthX; i++ ) { /* Fill in ptwXY at x-points in ptwX. */
389 x = ptwX->points[i];
390 if( x <= domainMin ) continue;
391 if( x >= domainMax ) break;
392 if( ptwXY_getValueAtX( smr, ptwXY, x, &y ) != nfu_Okay ) goto Err;
393 if( ptwXY_setValueAtX( smr, n, x, y ) != nfu_Okay ) goto Err;
394 }
395 if( ptwXY_simpleCoalescePoints( smr, n ) != nfu_Okay ) goto Err;
396
397 i1 = 0;
398 i2 = n->length - 1;
399 if( lengthX > 0 ) {
400 x = ptwX->points[0];
401 if( x > n->points[i1].x ) {
402 for( ; i1 < n->length; i1++ ) {
403 if( n->points[i1].x == x ) break;
404 }
405 }
406
407 x = ptwX->points[lengthX - 1];
408 if( x < n->points[i2].x ) {
409 for( ; i2 > i1; i2-- ) {
410 if( n->points[i2].x == x ) break;
411 }
412 }
413 }
414 i2++;
415
416 if( i1 != 0 ) {
417 for( i = i1; i < i2; i++ ) n->points[i - i1] = n->points[i];
418 }
419 n->length = i2 - i1;
420
421 return( n );
422
423Err:
425 ptwXY_free( n );
426 return( NULL );
427}

Referenced by ptwXY_groupOneFunction(), ptwXY_groupThreeFunctions(), and ptwXY_groupTwoFunctions().

◆ ptwXY_inverse()

ptwXYPoints * ptwXY_inverse ( statusMessageReporting * smr,
ptwXYPoints * ptwXY )

Definition at line 356 of file ptwXY_functions.c.

356 {
357
358 int64_t length;
359 ptwXY_interpolation interpolation;
360 ptwXYPoints *ptwXYInverse;
361
362 length = ptwXY_length( NULL, ptwXY );
363
364 if( ptwXY->interpolation == ptwXY_interpolationFlat ) {
365 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_flatInterpolation, "flat interpolation not allowed." );
366 return( NULL );
367 }
368
370 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not allowed." );
371 return( NULL );
372 }
373
374 if( ptwXY_simpleCoalescePoints( smr, ptwXY ) != nfu_Okay ) {
376 return( NULL );
377 }
378
379 switch( ptwXY->interpolation ) {
381 interpolation = ptwXY_interpolationLinLog;
382 break;
384 interpolation = ptwXY_interpolationLogLin;
385 break;
386 default :
387 interpolation = ptwXY->interpolation;
388 break;
389 }
390
391 if( ( ptwXYInverse = ptwXY_new( smr, interpolation, NULL, ptwXY_getBiSectionMax( ptwXY ), ptwXY_getAccuracy( ptwXY ),
392 length, 10, 0 ) ) == NULL ) {
394 return( NULL );
395 }
396
397 if( length == 1 ) {
398 ptwXYInverse->points[0].x = ptwXY->points[0].y;
399 ptwXYInverse->points[0].y = ptwXY->points[0].x; }
400 else if( length > 1 ) {
401 int64_t i1, start = 0, order = 1;
402
403 if( ptwXY->points[0].y > ptwXY->points[1].y ) {
404 start = length - 1;
405 order = -1;
406 }
407 ptwXYInverse->points[0].x = ptwXY->points[start].y;
408 ptwXYInverse->points[0].y = ptwXY->points[start].x;
409 for( i1 = 1, start += order; i1 < length; ++i1, start += order ) {
410 ptwXYInverse->points[i1].x = ptwXY->points[start].y;
411 ptwXYInverse->points[i1].y = ptwXY->points[start].x;
412 if( ptwXYInverse->points[i1-1].x >= ptwXYInverse->points[i1].x ) {
414 "Non-ascending domain values: x[%d] = %.17e >= x[%d] = %.17e.",
415 (int) (i1-1), ptwXYInverse->points[i1-1].x, (int) i1, ptwXYInverse->points[i1].x );
416 ptwXY_free( ptwXYInverse );
417 return( NULL );
418 }
419 }
420 }
421 ptwXYInverse->length = length;
422 return( ptwXYInverse );
423}
double ptwXY_getAccuracy(ptwXYPoints *ptwXY)
Definition ptwXY_core.c:566
double ptwXY_getBiSectionMax(ptwXYPoints *ptwXY)
Definition ptwXY_core.c:582
int64_t ptwXY_length(statusMessageReporting *smr, ptwXYPoints *ptwXY)
Definition ptwXY_core.c:793

◆ ptwXY_length()

◆ ptwXY_limitAccuracy()

double ptwXY_limitAccuracy ( double accuracy)

Definition at line 28 of file ptwXY_misc.c.

28 {
29
30 if( accuracy < ptwXY_minAccuracy ) accuracy = ptwXY_minAccuracy;
31 if( accuracy > 1 ) accuracy = 1.;
32 return( accuracy );
33}

Referenced by ptwXY_setAccuracy(), ptwXY_thin(), and ptwXY_toOtherInterpolation().

◆ ptwXY_mapToXsAndAdd()

nfu_status ptwXY_mapToXsAndAdd ( statusMessageReporting * a_smr,
ptwXYPoints * a_ptwXY,
int64_t a_offset,
int64_t a_length,
double const * a_Xs,
double * a_results,
double a_scaleFractor )

Definition at line 131 of file ptwXY_convenient.c.

132 {
133
134 int64_t offset, startIndex, length, length_m1;
135 double x1, x2, y1, y2;
136 ptwXYPoint *point;
137 ptwXY_interpolation interpolation = ptwXY_getInterpolation( a_ptwXY );
138 double xValue, yValue;
139
140 if( a_offset < 0 ) a_offset = 0; /* This and next line also ensure that a_length > 0. */
141 if( a_offset >= a_length ) return( nfu_Okay );
142
143 offset = a_offset;
144 nfu_status status = ptwXY_startIndex( a_smr, a_ptwXY, a_Xs[a_offset], &startIndex, &length );
145 if( status != nfu_Okay ) return( status );
146 if( startIndex < 0 ) {
147 if( startIndex == -2 ) {
148 if( a_Xs[a_length-1] >= a_ptwXY->points[0].x ) startIndex = 0; /* Case A. */
149 }
150 if( startIndex < 0 ) return( nfu_Okay );
151 }
152
153 length_m1 = length - 1;
154 point = &a_ptwXY->points[startIndex];
155 x1 = point->x;
156 y1 = point->y;
157 while( startIndex < length_m1 ) {
158 ++startIndex;
159 point = &a_ptwXY->points[startIndex];
160 x2 = point->x;
161 y2 = point->y;
162
163 for( ; offset < a_length; ++offset ) {
164 xValue = a_Xs[offset];
165
166 if( xValue < x1 ) continue; /* Can happend per case A above. */
167 if( xValue > x2 ) break;
168
169 if( ( status = ptwXY_interpolatePoint( a_smr, interpolation, xValue, &yValue, x1, y1, x2, y2 ) ) != nfu_Okay ) {
171 return( status );
172 }
173 a_results[offset] += a_scaleFractor * yValue;
174 }
175 x1 = x2;
176 y1 = y2;
177 }
178
179 return( nfu_Okay );
180}
G4ThreadLocal T * G4GeomSplitter< T >::offset
ptwXY_interpolation ptwXY_getInterpolation(ptwXYPoints *ptwXY)
Definition ptwXY_core.c:518
nfu_status ptwXY_startIndex(statusMessageReporting *a_smr, ptwXYPoints *a_ptwXY, double a_x, int64_t *a_startIndex, int64_t *a_length)
Definition ptwXY_core.c:818

Referenced by GIDI::Functions::XYs1d::mapToXsAndAdd().

◆ ptwXY_mergeClosePoints()

nfu_status ptwXY_mergeClosePoints ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double epsilon )

Definition at line 297 of file ptwXY_convenient.c.

297 {
298
299 int64_t i, i1, j, k, n = ptwXY->length;
300 double x, y;
301 ptwXYPoint *p1, *p2;
302
303 if( n < 2 ) return( ptwXY->status );
304 if( epsilon < 4 * DBL_EPSILON ) epsilon = 4 * DBL_EPSILON;
305 if( ptwXY_simpleCoalescePoints( smr, ptwXY ) != nfu_Okay ) {
307 return( ptwXY->status );
308 }
309
310 p2 = ptwXY->points;
311 x = p2->x;
312 for( i1 = 1, p2++; i1 < ( n - 1 ); i1++, p2++ ) { /* The first point shall remain the first point and all points close to it are deleted. */
313 if( ( p2->x - x ) > 0.5 * epsilon * ( fabs( x ) + fabs( p2->x ) ) ) break;
314 }
315 if( i1 != 1 ) {
316 for( i = i1, p1 = &(ptwXY->points[1]); i < n; i++, p1++, p2++ ) *p1 = *p2;
317 n = ptwXY->length = ptwXY->length - i1 + 1;
318 }
319
320 p1 = &(ptwXY->points[n-1]);
321 x = p1->x;
322 for( i1 = n - 2, p1--; i1 > 0; i1--, p1-- ) { /* The last point shall remain the last point and all points close to it are deleted. */
323 if( x - p1->x > 0.5 * epsilon * ( fabs( x ) + fabs( p1->x ) ) ) break;
324 }
325 if( i1 != ( n - 2 ) ) {
326 ptwXY->points[i1 + 1] = ptwXY->points[n - 1];
327 n = ptwXY->length = i1 + 2;
328 }
329
330 for( i = 1; i < n - 1; i++ ) {
331 p1 = &(ptwXY->points[i]);
332 x = p1->x;
333 y = p1->y;
334 for( j = i + 1, p2 = &(ptwXY->points[i+1]); j < n - 1; j++, p2++ ) {
335 if( ( p2->x - p1->x ) > 0.5 * epsilon * ( fabs( p2->x ) + fabs( p1->x ) ) ) break;
336 x += p2->x;
337 y += p2->y;
338 }
339 if( ( k = ( j - i ) ) > 1 ) {
340 p1->x = x / k;
341 p1->y = y / k;
342 for( p1 = &(ptwXY->points[i+1]); j < n; j++, p1++, p2++ ) *p1 = *p2;
343 n -= ( k - 1 );
344 }
345 }
346 ptwXY->length = n;
347
348 return( ptwXY->status );
349}
G4double epsilon(G4double density, G4double temperature)

Referenced by ptwXY_union().

◆ ptwXY_mergeFromXsAndYs()

nfu_status ptwXY_mergeFromXsAndYs ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
int length,
double * xs,
double * ys )

Definition at line 1325 of file ptwXY_core.c.

1325 {
1326
1327 if( ptwXY_mergeFrom( smr, ptwXY, 1, length, xs, ys ) != nfu_Okay )
1329 return( ptwXY->status );
1330}

◆ ptwXY_mergeFromXYs()

nfu_status ptwXY_mergeFromXYs ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
int length,
double * xys )

Definition at line 1334 of file ptwXY_core.c.

1334 {
1335
1336 int i;
1337 double *xs, *p1, *p2;
1338
1339 if( length == 0 ) return( nfu_Okay );
1340 if( length < 0 ) {
1341 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_badInput, "Negative length = %d.", length );
1342 return( nfu_badInput );
1343 }
1344
1345 if( ( xs = (double *) smr_malloc2( smr, length * sizeof( double ), 0, "xs" ) ) == NULL ) return( nfu_mallocError );
1346 for( i = 0, p1 = xs, p2 = xys; i < length; i++, p1++, p2 += 2 ) *p1 = *p2;
1347 if( ptwXY_mergeFrom( smr, ptwXY, 2, length, xs, xys ) != nfu_Okay )
1349 smr_freeMemory2( xs );
1350
1351 return( ptwXY->status );
1352}
@ nfu_mallocError
#define smr_malloc2(smr, size, zero, forItem)

◆ 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_mutualifyDomains()

nfu_status ptwXY_mutualifyDomains ( statusMessageReporting * smr,
ptwXYPoints * ptwXY1,
double lowerEps1,
double upperEps1,
int positiveXOnly1,
ptwXYPoints * ptwXY2,
double lowerEps2,
double upperEps2,
int positiveXOnly2 )

Definition at line 558 of file ptwXY_convenient.c.

559 {
560
561 nfu_status status;
562 int64_t n1 = ptwXY1->length, n2 = ptwXY2->length;
563 int code1, code2;
564 ptwXYPoint *xy1, *xy2;
565
566 switch( status = ptwXY_areDomainsMutual( smr, ptwXY1, ptwXY2 ) ) {
567 case nfu_Okay :
568 case nfu_empty :
569 return( nfu_Okay );
571 break;
572 default :
574 return( status );
575 }
576
577 if( ptwXY1->interpolation == ptwXY_interpolationOther ) {
578 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not allowed for source1." );
579 return( nfu_otherInterpolation );
580 }
581 if( ptwXY2->interpolation == ptwXY_interpolationOther ) {
582 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not allowed for source2." );
583 return( nfu_otherInterpolation );
584 }
585
586 if( ptwXY1->interpolation == ptwXY_interpolationFlat ) {
587 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_invalidInterpolation, "Flat interpolation not allowed for source1." );
588 return( nfu_invalidInterpolation );
589 }
590 if( ptwXY2->interpolation == ptwXY_interpolationFlat ) {
591 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_invalidInterpolation, "Flat interpolation not allowed for source2." );
592 return( nfu_invalidInterpolation );
593 }
594
595 xy1 = ptwXY_getPointAtIndex_Unsafely( ptwXY1, 0 );
596 xy2 = ptwXY_getPointAtIndex_Unsafely( ptwXY2, 0 );
597 code1 = 0;
598 if( xy1->x < xy2->x ) {
599 lowerEps1 = 0.;
600 if( xy2->y == 0. ) {
601 lowerEps2 = 0.; }
602 else {
603 if( lowerEps2 == 0 ) {
604 code1 = -1; }
605 else {
606 if( ( xy2->x - xy1->x ) < lowerEps2 * ( fabs( xy1->x ) + fabs( xy2->x ) ) ) {
607 lowerEps2 = 0;
608 xy1->x = xy2->x;
609 status = ptwXY_areDomainsMutual( smr, ptwXY1, ptwXY2 );
610 }
611 }
612 } }
613 else if( xy1->x > xy2->x ) {
614 lowerEps2 = 0.;
615 if( xy1->y == 0. ) {
616 lowerEps1 = 0.; }
617 else {
618 if( lowerEps1 == 0 ) {
619 code1 = 1; }
620 else {
621 if( ( xy1->x - xy2->x ) < lowerEps1 * ( fabs( xy1->x ) + fabs( xy2->x ) ) ) {
622 lowerEps1 = 0;
623 xy2->x = xy1->x;
624 status = ptwXY_areDomainsMutual( smr, ptwXY1, ptwXY2 );
625 }
626 }
627 } }
628 else {
629 lowerEps1 = lowerEps2 = 0.;
630 }
631
632 xy1 = ptwXY_getPointAtIndex_Unsafely( ptwXY1, n1 - 1 );
633 xy2 = ptwXY_getPointAtIndex_Unsafely( ptwXY2, n2 - 1 );
634 code2 = 0;
635 if( xy1->x < xy2->x ) {
636 upperEps2 = 0.;
637 if( xy1->y == 0. ) {
638 upperEps1 = 0.; }
639 else {
640 if( upperEps1 == 0 ) {
641 code2 = -1; }
642 else {
643 if( ( xy2->x - xy1->x ) < upperEps1 * ( fabs( xy1->x ) + fabs( xy2->x ) ) ) {
644 upperEps1 = 0;
645 xy2->x = xy1->x;
646 status = ptwXY_areDomainsMutual( smr, ptwXY1, ptwXY2 );
647 }
648 }
649 } }
650 else if( xy1->x > xy2->x ) {
651 upperEps1 = 0.;
652 if( xy2->y == 0. ) {
653 upperEps2 = 0.; }
654 else {
655 if( upperEps2 == 0 ) {
656 code2 = 1; }
657 else {
658 if( ( xy1->x - xy2->x ) < upperEps2 * ( fabs( xy1->x ) + fabs( xy2->x ) ) ) {
659 upperEps2 = 0;
660 xy1->x = xy2->x;
661 status = ptwXY_areDomainsMutual( smr, ptwXY1, ptwXY2 );
662 }
663 }
664 } }
665 else {
666 upperEps1 = upperEps2 = 0.;
667 }
668
669 if( ( lowerEps1 != 0. ) || ( upperEps1 != 0. ) ) {
670 if( ( status = ptwXY_dullEdges( smr, ptwXY1, lowerEps1, upperEps1, positiveXOnly1 ) ) != nfu_Okay ) {
672 return( status );
673 }
674 }
675 if( ( lowerEps2 != 0. ) || ( upperEps2 != 0. ) ) {
676 if( ( status = ptwXY_dullEdges( smr, ptwXY2, lowerEps2, upperEps2, positiveXOnly2 ) ) != nfu_Okay ) {
678 return( status );
679 }
680 }
681
682 if( status == nfu_domainsNotMutual ) {
683 char str[256] = "";
684
685 if( code1 == 1 ) strcat( str, " lowerEps1" );
686 if( code1 == -1 ) strcat( str, " lowerEps2" );
687 if( code2 == 1 ) strcat( str, " upperEps2" );
688 if( code2 == -1 ) strcat( str, " upperEps1" );
690 "The following inputs are 0 and must be a non 0 value: %s.", str );
691 status = nfu_badInput;
692 }
693
694 return( status );
695}
nfu_status ptwXY_dullEdges(statusMessageReporting *smr, ptwXYPoints *ptwXY, double lowerEps, double upperEps, int positiveXOnly)
nfu_status ptwXY_areDomainsMutual(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2)

Referenced by GIDI::multiGroupTwoXYs1ds(), and GIDI::multiGroupXYs1d().

◆ ptwXY_neg()

nfu_status ptwXY_neg ( statusMessageReporting * smr,
ptwXYPoints * ptwXY )

Definition at line 36 of file ptwXY_unitaryOperators.c.

36 {
37
38 int64_t i, nonOverflowLength;
39 ptwXYPoint *p;
40 ptwXYOverflowPoint *o, *overflowHeader = &(ptwXY->overflowHeader);
41
42 if( ( nonOverflowLength = ptwXY_getNonOverflowLength( smr, ptwXY ) ) < 0 ) {
44 return( ptwXY->status );
45 }
46
50 "Negation of non-linear y-interpolation not allowed: interpolation = '%s'.",
51 ptwXY->interpolationString );
53 }
54
55 for( i = 0, p = ptwXY->points; i < nonOverflowLength; i++, p++ ) p->y = -p->y;
56 for( o = overflowHeader->next; o != overflowHeader; o = o->next ) o->point.y = -o->point.y;
57 return( ptwXY->status );
58}

Referenced by ptwXY_sub_ptwXY().

◆ ptwXY_new()

ptwXYPoints * ptwXY_new ( statusMessageReporting * smr,
ptwXY_interpolation interpolation,
char const * interpolationString,
double biSectionMax,
double accuracy,
int64_t primarySize,
int64_t secondarySize,
int userFlag )

Definition at line 28 of file ptwXY_core.c.

29 {
30
31 ptwXYPoints *ptwXY = (ptwXYPoints *) smr_malloc2( smr, sizeof( ptwXYPoints ), 1, "ptwXY" );
32
33 if( ptwXY == NULL ) return( NULL );
34 if( ptwXY_initialize( smr, ptwXY, interpolation, interpolationString, biSectionMax, accuracy, primarySize, secondarySize, userFlag ) != nfu_Okay ) {
36 smr_freeMemory2( ptwXY );
37 }
38 return( ptwXY );
39}
nfu_status ptwXY_initialize(statusMessageReporting *smr, ptwXYPoints *ptwXY, ptwXY_interpolation interpolation, char const *interpolationString, double biSectionMax, double accuracy, int64_t primarySize, int64_t secondarySize, int userFlag)
Definition ptwXY_core.c:53

Referenced by ptwXY_clip(), ptwXY_clone2(), ptwXY_convolution(), ptwXY_create(), ptwXY_createFrom_Xs_Ys(), ptwXY_createFromFunction(), ptwXY_createGaussianCenteredSigma1(), ptwXY_domainSlice(), ptwXY_flatInterpolationToLinear(), ptwXY_inverse(), ptwXY_new2(), ptwXY_slice(), ptwXY_thin(), ptwXY_thinDomain(), ptwXY_union(), and ptwXY_valueTo_ptwXY().

◆ ptwXY_new2()

ptwXYPoints * ptwXY_new2 ( statusMessageReporting * smr,
ptwXY_interpolation interpolation,
int64_t primarySize,
int64_t secondarySize )

Definition at line 44 of file ptwXY_core.c.

44 {
45
46 char const *interpolationString = ptwXY_interpolationToString( interpolation );
47
48 return( ptwXY_new( smr, interpolation, interpolationString, 12, 1e-3, primarySize, secondarySize, 0 ) );
49}

◆ ptwXY_normalize()

nfu_status ptwXY_normalize ( statusMessageReporting * smr,
ptwXYPoints * ptwXY1 )

Definition at line 242 of file ptwXY_integration.c.

242 {
243/*
244* This function assumes ptwXY_integrateDomain coalesces the points.
245*/
246 int64_t i1;
247 nfu_status status = nfu_Okay;
248 double sum;
249
250 if( status != nfu_Okay ) {
252 return( nfu_badSelf );
253 }
254
255 if( ( status = ptwXY_integrateDomain( smr, ptwXY, &sum ) ) != nfu_Okay ) {
257 return( status );
258 }
259
260 if( sum == 0. ) {
261 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badNorm, "Cannot normalize curve with 0 norm." );
262 status = nfu_badNorm; }
263 else {
264 for( i1 = 0; i1 < ptwXY->length; i1++ ) ptwXY->points[i1].y /= sum;
265 }
266 return( status );
267}

Referenced by GIDI::Functions::XYs1d::normalize().

◆ ptwXY_pow()

nfu_status ptwXY_pow ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double p )

Definition at line 24 of file ptwXY_functions.c.

24 {
25
26 nfu_status status = ptwXY_applyFunction( smr, ptwXY, ptwXY_pow_callback, (void *) &v, 0 );
27
28 if( status != nfu_Okay ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via." );
29 return( status );
30}
nfu_status ptwXY_applyFunction(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXY_applyFunction_callback func, void *argList, int checkForRoots)
Definition ptwXY_misc.c:165

◆ ptwXY_range()

nfu_status ptwXY_range ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double * rangeMin,
double * rangeMax )

Definition at line 1683 of file ptwXY_core.c.

1683 {
1684
1685 int64_t i, nonOverflowLength = ptwXY_getNonOverflowLength( smr, ptwXY );
1686 ptwXYPoint *p = ptwXY->points;
1687 ptwXYOverflowPoint *overflowPoint = ptwXY->overflowHeader.next;
1688
1689 *rangeMin = *rangeMax = 0.;
1690
1691 if( nonOverflowLength < 0 ) {
1693 return( nfu_Error );
1694 }
1695
1696 if( ptwXY->length == 0 ) return( nfu_empty );
1697 if( nonOverflowLength > 0 ) {
1698 *rangeMin = *rangeMax = p->y;
1699 for( i = 1, p++; i < nonOverflowLength; i++, p++ ) {
1700 *rangeMin = ( ( *rangeMin < p->y ) ? *rangeMin : p->y );
1701 *rangeMax = ( ( *rangeMax > p->y ) ? *rangeMax : p->y );
1702 } }
1703 else {
1704 *rangeMin = *rangeMax = overflowPoint->point.y;
1705 }
1706 for( ; overflowPoint != &(ptwXY->overflowHeader); overflowPoint = overflowPoint->next ) {
1707 *rangeMin = ( ( *rangeMin < overflowPoint->point.y ) ? *rangeMin : overflowPoint->point.y );
1708 *rangeMax = ( ( *rangeMax < overflowPoint->point.y ) ? *rangeMax : overflowPoint->point.y );
1709 }
1710 return( nfu_Okay );
1711}

Referenced by ptwXY_clip().

◆ ptwXY_rangeMax()

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

Definition at line 1742 of file ptwXY_core.c.

1742 {
1743
1744 int64_t i, nonOverflowLength = ptwXY_getNonOverflowLength( smr, ptwXY );
1745 ptwXYPoint *p = ptwXY->points;
1746 ptwXYOverflowPoint *overflowPoint = ptwXY->overflowHeader.next;
1747
1748 *rangeMax = 0.;
1749
1750 if( nonOverflowLength < 0 ) {
1752 return( nfu_Error );
1753 }
1754
1755 if( ptwXY->length == 0 ) return( nfu_empty );
1756 if( nonOverflowLength > 0 ) {
1757 *rangeMax = p->y;
1758 for( i = 1, p++; i < nonOverflowLength; i++, p++ ) *rangeMax = ( ( *rangeMax > p->y ) ? *rangeMax : p->y ); }
1759 else {
1760 *rangeMax = overflowPoint->point.y;
1761 }
1762 for( ; overflowPoint != &(ptwXY->overflowHeader); overflowPoint = overflowPoint->next )
1763 *rangeMax = ( ( *rangeMax > overflowPoint->point.y ) ? *rangeMax : overflowPoint->point.y );
1764 return( nfu_Okay );
1765}

◆ ptwXY_rangeMin()

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

Definition at line 1715 of file ptwXY_core.c.

1715 {
1716
1717 int64_t i, nonOverflowLength = ptwXY_getNonOverflowLength( smr, ptwXY );
1718 ptwXYPoint *p = ptwXY->points;
1719 ptwXYOverflowPoint *overflowPoint = ptwXY->overflowHeader.next;
1720
1721 *rangeMin = 0.;
1722
1723 if( nonOverflowLength < 0 ) {
1725 return( nfu_Error );
1726 }
1727
1728 if( ptwXY->length == 0 ) return( nfu_empty );
1729 if( nonOverflowLength > 0 ) {
1730 *rangeMin = p->y;
1731 for( i = 1, p++; i < nonOverflowLength; i++, p++ ) *rangeMin = ( ( *rangeMin < p->y ) ? *rangeMin : p->y ); }
1732 else {
1733 *rangeMin = overflowPoint->point.y;
1734 }
1735 for( ; overflowPoint != &(ptwXY->overflowHeader); overflowPoint = overflowPoint->next )
1736 *rangeMin = ( ( *rangeMin < overflowPoint->point.y ) ? *rangeMin : overflowPoint->point.y );
1737 return( nfu_Okay );
1738}

◆ ptwXY_reallocateOverflowPoints()

nfu_status ptwXY_reallocateOverflowPoints ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
int64_t size )

Definition at line 634 of file ptwXY_core.c.

634 {
635/*
636* This is for allocating/reallocating the secondary data memory.
637*/
638 if( ptwXY->status != nfu_Okay ) {
639 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
640 return( ptwXY->status );
641 }
642
643 if( size < ptwXY_minimumOverflowSize ) size = ptwXY_minimumOverflowSize; /* ptwXY_minimumOverflowSize must be > 0. */
644 if( size < ptwXY->overflowLength ) {
645 if( ptwXY_coalescePoints( smr, ptwXY, ptwXY->length + ptwXY->overflowAllocatedSize, NULL, 0 ) != nfu_Okay ) {
647 return( ptwXY->status );
648 }
649 }
650 if( size != ptwXY->overflowAllocatedSize ) {
652 (size_t) size * sizeof( ptwXYOverflowPoint ), "ptwXY->overflowPoints" );
653 if( ptwXY->overflowPoints == NULL ) {
654 ptwXY->length = 0;
655 ptwXY->overflowLength = 0;
656 ptwXY->mallocFailedSize = size;
657 size = 0;
658 ptwXY->status = nfu_mallocError;
659 }
660 }
661 ptwXY->overflowAllocatedSize = size;
662 return( ptwXY->status );
663}
#define ptwXY_minimumOverflowSize
Definition ptwXY.h:24
#define smr_realloc2(smr, old, size, forItem)

Referenced by ptwXY_initialize().

◆ ptwXY_reallocatePoints()

nfu_status ptwXY_reallocatePoints ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
int64_t size,
int forceSmallerResize )

Definition at line 602 of file ptwXY_core.c.

602 {
603/*
604* This is for allocating/reallocating the primary data memory.
605*/
606 if( ptwXY->status != nfu_Okay ) {
607 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
608 return( ptwXY->status );
609 }
610
611 if( size < ptwXY_minimumSize ) size = ptwXY_minimumSize; /* ptwXY_minimumSize must be > 0. */
612 if( size < ptwXY->length ) size = ptwXY->length;
613 if( size != ptwXY->allocatedSize ) {
614 if( size > ptwXY->allocatedSize ) { /* Increase size of allocated points. */
615 ptwXY->points = (ptwXYPoint *) smr_realloc2( smr, ptwXY->points, (size_t) size * sizeof( ptwXYPoint ), "ptwXY->points" ); }
616 else if( ( ptwXY->allocatedSize > 2 * size ) || forceSmallerResize ) { /* Decrease size, if at least 1/2 size reduction or if forced to. */
617 ptwXY->points = (ptwXYPoint *) smr_realloc2( smr, ptwXY->points, (size_t) size * sizeof( ptwXYPoint ), "ptwXY->points" ); }
618 else {
619 size = ptwXY->allocatedSize; /* Size is < ptwXY->allocatedSize, but realloc not called. */
620 }
621 if( ptwXY->points == NULL ) {
622 ptwXY->length = 0;
623 ptwXY->mallocFailedSize = size;
624 size = 0;
625 ptwXY->status = nfu_mallocError;
626 }
627 ptwXY->allocatedSize = size;
628 }
629 return( ptwXY->status );
630}
#define ptwXY_minimumSize
Definition ptwXY.h:23

Referenced by ptwXY_coalescePoints(), ptwXY_copy(), ptwXY_copyPointsOnly(), ptwXY_initialize(), ptwXY_setXYData(), and ptwXY_setXYDataFromXsAndYs().

◆ ptwXY_release()

nfu_status ptwXY_release ( statusMessageReporting * smr,
ptwXYPoints * ptwXY )

Definition at line 759 of file ptwXY_core.c.

759 {
760/*
761* Note, this routine does not free ptwXY (i.e., it does not undo all of ptwXY_new).
762*/
763
765 if( ptwXY->interpolationString != NULL )
766 ptwXY->interpolationString = (char const *) smr_freeMemory2( ptwXY->interpolationString );
767 }
769 ptwXY->length = 0;
770 ptwXY->allocatedSize = 0;
771 ptwXY->points = (ptwXYPoint *) smr_freeMemory2( ptwXY->points );
772
773 ptwXY->overflowLength = 0;
774 ptwXY->overflowAllocatedSize = 0;
776
777 return( nfu_Okay );
778}

Referenced by ptwXY_free(), and ptwXY_initialize().

◆ ptwXY_runningIntegral()

ptwXPoints * ptwXY_runningIntegral ( statusMessageReporting * smr,
ptwXYPoints * ptwXY )

Definition at line 906 of file ptwXY_integration.c.

906 {
907
908 int i;
909 ptwXPoints *runningIntegral = NULL;
910 double integral = 0., sum;
911
912 if( ptwXY_simpleCoalescePoints( smr, ptwXY ) != nfu_Okay ) {
914 return( NULL );
915 }
916
917 if( ( runningIntegral = ptwX_new( smr, ptwXY->length ) ) == NULL ) goto Err;
918
919 if( ptwXY->length == 0 ) return( runningIntegral );
920
921 if( ptwX_setPointAtIndex( smr, runningIntegral, 0, 0. ) != nfu_Okay ) goto Err;
922 for( i = 1; i < ptwXY->length; i++ ) {
923 if( ptwXY_f_integrate( smr, ptwXY->interpolation, ptwXY->points[i-1].x, ptwXY->points[i-1].y,
924 ptwXY->points[i].x, ptwXY->points[i].y, &sum ) != nfu_Okay ) goto Err;
925 integral += sum;
926 if( ptwX_setPointAtIndex( smr, runningIntegral, i, integral ) != nfu_Okay ) goto Err;
927 }
928 return( runningIntegral );
929
930Err:
932 if( runningIntegral != NULL ) ptwX_free( runningIntegral );
933 return( NULL );
934}

Referenced by GIDI::Functions::XYs1d::toXs_pdf_cdf1d().

◆ ptwXY_scaleAndOffsetDomainWith_ptwXYs()

nfu_status ptwXY_scaleAndOffsetDomainWith_ptwXYs ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
ptwXYPoints * offset,
ptwXYPoints * slope,
int skipLastPoint )

Definition at line 709 of file ptwXY_methods.c.

710 {
711/*
712 This function only modifies ptwXY over the domain defined by offsetXY via the equation ptwXY = offsetXY + slopeXY * ptwXY.
713 slopeXY must have the same domain as offsetXY. If skipLastPoint is non-zero, the last point modified is reverted by to its
714 origial value. This allows one to call this function multiple times with abutting domains for the offset and slope without
715 getting weird jumps at the boundaries. For example, suppose ptwXY is initially defined to be 1 in the domain [0,10]. Let,
716 ptwXY have the points [ [ 0, 1 ], [ 5, 1 ], [ 10, 1 ] ]. Calling this function with an offset and slope with the points
717 [ [ 0, 0 ], [ 5, 0 ] ] and [ 0, 2 ], [ 5, 2 ], respectively would return ptwXY as [ [ 0, 2 ], [ 5, 2 ], [ 10, 1 ] ]
718 if skipLastPoint is 0 and [ [ 0, 2 ], [ 5, 1 ], [ 10, 1 ] ] otherwise. Now calling the returned ptwXYPoints instances with an
719 offset and slope with the points [ [ 5, 0 ], [ 10, 0 ] ] and [ 5, 2 ], [ 10, 2 ], respectively would return ptwXY as
720 [ [ 0, 2 ], [ 5, 4 ], [ 10, 2 ] ] and [ [ 0, 2 ], [ 5, 2 ], [ 10, 2 ] ], respectively.
721*/
722
723 int64_t i1;
724 ptwXYPoint *p1;
725 nfu_status status1, status2;
726 double offsetXYMin, offsetXYMax, slopeXYMin, slopeXYMax, domainMin, domainMax, domainMinXY, domainMaxXY;
727 ptwXYPoints *ptwXY2 = NULL, *offsetXY2 = NULL, *slopeXY2 = NULL;
728 ptwXYPoints *mulXY = NULL, *addXY = NULL;
729
730 if( ptwXY_simpleCoalescePoints( smr, ptwXY ) != nfu_Okay ) {
732 return( ptwXY->status );
733 }
734
735 status1 = ptwXY_domainMin( smr, offsetXY, &offsetXYMin ); /* Also verifies that offsetXY has no issues. */
736 if( ( status1 != nfu_Okay ) && ( status1 != nfu_empty ) ) {
738 return( status1 );
739 }
740 ptwXY_domainMax( smr, offsetXY, &offsetXYMax ); /* If ptwXY_domainMin succeeded, this will succeed. */
741
742 status2 = ptwXY_domainMin( smr, slopeXY, &slopeXYMin );
743 if( ( status2 != nfu_Okay ) && ( status2 != nfu_empty ) ) {
745 return( status2 );
746 }
747 ptwXY_domainMax( smr, slopeXY, &slopeXYMax );
748
749 if( ( status1 == nfu_empty ) && ( status2 == nfu_empty ) ) return( nfu_Okay );
750
751 if( ( offsetXYMin != slopeXYMin ) || ( offsetXYMax != slopeXYMax ) ) {
752 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_domainsNotMutual, "Offset and slope do not have the same domain." );
753 return( ptwXY->status = nfu_domainsNotMutual );
754 }
755
756 if( ptwXY->length == 0 ) return( nfu_Okay );
757
758 ptwXY_domainMin( smr, ptwXY, &domainMinXY );
759 ptwXY_domainMax( smr, ptwXY, &domainMaxXY );
760
761 if( ( domainMinXY >= offsetXYMax ) || ( domainMaxXY <= offsetXYMin ) ) return( nfu_Okay );
762
763 domainMin = ( domainMinXY > offsetXYMin ? domainMinXY : offsetXYMin );
764 domainMax = ( domainMaxXY < offsetXYMax ? domainMaxXY : offsetXYMax );
765
766 if( ( domainMinXY == offsetXYMin ) && ( domainMaxXY == offsetXYMax ) ) {
767 ptwXY2 = ptwXY;
768 offsetXY2 = offsetXY;
769 slopeXY2 = slopeXY; }
770 else {
771 if( ( ptwXY2 = ptwXY_domainSlice( smr, ptwXY, domainMin, domainMax, 0, 1 ) ) == NULL ) {
773 goto Err;
774 }
775
776 if( ( offsetXY2 = ptwXY_domainSlice( smr, offsetXY, domainMin, domainMax, 0, 1 ) ) == NULL ) {
778 goto Err;
779 }
780
781 if( ( slopeXY2 = ptwXY_domainSlice( smr, slopeXY, domainMin, domainMax, 0, 1 ) ) == NULL ) {
783 goto Err;
784 }
785 }
786
787 if( ( mulXY = ptwXY_mul2_ptwXY( smr, ptwXY2, slopeXY2 ) ) == NULL ) {
789 goto Err;
790 }
791 if( ( addXY = ptwXY_mul2_ptwXY( smr, mulXY, offsetXY2 ) ) == NULL ) {
793 goto Err;
794 }
795 if( skipLastPoint != 0 ) addXY->points[addXY->length-1].y = ptwXY2->points[ptwXY2->length-1].y;
796
797 if( domainMin > domainMinXY ) {
798 for( i1 = 0, p1 = ptwXY2->points; i1 < ptwXY2->length; i1++, p1++ ) {
799 if( p1->x >= domainMin ) break;
800 if( ptwXY_setValueAtX( smr, addXY, p1->x, p1->y ) != nfu_Okay ) goto Err;
801 }
802 }
803
804 if( domainMax < domainMaxXY ) {
805 for( i1 = 0, p1 = ptwXY2->points; i1 < ptwXY2->length; i1++, p1++ ) if( p1->x > domainMax ) break;
806 for( ; i1 < ptwXY2->length; i1++, p1++ ) {
807 if( ptwXY_setValueAtX( smr, addXY, p1->x, p1->y ) != nfu_Okay ) goto Err;
808 }
809 }
810
811 ptwXY_copy( smr, ptwXY, addXY );
812
813TheEnd:
814 if( offsetXY2 != offsetXY ) ptwXY_free( offsetXY2 );
815 if( slopeXY2 != slopeXY ) ptwXY_free( slopeXY2 );
816 if( ptwXY2 != ptwXY ) ptwXY_free( ptwXY2 );
817 ptwXY_free( mulXY );
818 ptwXY_free( addXY );
819
820 return( ptwXY->status );
821
822Err:
823 ptwXY->status = nfu_Error;
824 goto TheEnd;
825}
ptwXYPoints * ptwXY_mul2_ptwXY(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2)
nfu_status ptwXY_copy(statusMessageReporting *smr, ptwXYPoints *dest, ptwXYPoints *src)
Definition ptwXY_core.c:171

◆ ptwXY_scaleOffsetXAndY()

nfu_status ptwXY_scaleOffsetXAndY ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double xScale,
double xOffset,
double yScale,
double yOffset )

Definition at line 666 of file ptwXY_methods.c.

667 {
668
669 int64_t i1, length = ptwXY->length;
670 ptwXYPoint *p1;
671 nfu_status status;
672
673 if( ptwXY->status != nfu_Okay ) {
674 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid destination." );
675 return( ptwXY->status );
676 }
677
678 if( xScale == 0 ) {
679 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_XNotAscending, "xScale is 0 that will cause a non-ascending domain." );
680 return( ptwXY->status = nfu_XNotAscending );
681 }
682
683 if( ( status = ptwXY_simpleCoalescePoints( smr, ptwXY ) ) != nfu_Okay ) {
685 return( status );
686 }
687
688 for( i1 = 0, p1 = ptwXY->points; i1 < length; i1++, p1++ ) {
689 p1->x = xScale * p1->x + xOffset;
690 p1->y = yScale * p1->y + yOffset;
691 }
692
693 if( xScale < 0 ) {
694 int64_t length_2 = length / 2;
695 ptwXYPoint tmp, *p2;
696
697 for( i1 = 0, p1 = ptwXY->points, p2 = &(ptwXY->points[length-1]); i1 < length_2; i1++ ) {
698 tmp = *p1;
699 *p1 = *p2;
700 *p2 = tmp;
701 }
702 }
703
704 return( ptwXY->status );
705}

◆ ptwXY_setAccuracy()

double ptwXY_setAccuracy ( ptwXYPoints * ptwXY,
double accuracy )

Definition at line 573 of file ptwXY_core.c.

573 {
574
575 accuracy = ptwXY_limitAccuracy( accuracy );
576 ptwXY->accuracy = accuracy;
577 return( ptwXY->accuracy );
578}
double ptwXY_limitAccuracy(double accuracy)
Definition ptwXY_misc.c:28

Referenced by ptwXY_initialize().

◆ ptwXY_setBiSectionMax()

double ptwXY_setBiSectionMax ( ptwXYPoints * ptwXY,
double biSectionMax )

Definition at line 589 of file ptwXY_core.c.

589 {
590
591 if( biSectionMax < 0 ) {
592 biSectionMax = 0; }
593 else if( biSectionMax > ptwXY_maxBiSectionMax ) {
594 biSectionMax = ptwXY_maxBiSectionMax;
595 }
596 ptwXY->biSectionMax = biSectionMax;
597 return( ptwXY->biSectionMax );
598}

Referenced by ptwXY_initialize().

◆ ptwXY_setInterpolationString()

nfu_status ptwXY_setInterpolationString ( ptwXYPoints * ptwXY,
char const * interpolationString )

Definition at line 532 of file ptwXY_core.c.

532 {
533
534 ptwXY_interpolation interpolation = ptwXY_stringToInterpolation( interpolationString );
535
536 if( interpolation == ptwXY_interpolationOther ) return( nfu_invalidInterpolation );
537
538 ptwXY->interpolation = interpolation;
539 ptwXY->interpolationString = ptwXY_interpolationToString( interpolation );
540 return( nfu_Okay );
541}
ptwXY_interpolation ptwXY_stringToInterpolation(char const *interpolationString)

◆ ptwXY_setUserFlag()

void ptwXY_setUserFlag ( ptwXYPoints * ptwXY,
int userFlag )

Definition at line 559 of file ptwXY_core.c.

559 {
560
561 ptwXY->userFlag = userFlag;
562}

Referenced by ptwXY_initialize().

◆ ptwXY_setValueAtX()

nfu_status ptwXY_setValueAtX ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double x,
double y )

Definition at line 1225 of file ptwXY_core.c.

1225 {
1226
1227 if( ptwXY_setValueAtX_overrideIfClose( smr, ptwXY, x, y, 0., 0 ) != nfu_Okay )
1229 return( ptwXY->status );
1230}
nfu_status ptwXY_setValueAtX_overrideIfClose(statusMessageReporting *smr, ptwXYPoints *ptwXY, double x, double y, double eps, int override)

Referenced by ptwXY_clip(), ptwXY_convolution(), ptwXY_createGaussianCenteredSigma1(), ptwXY_div_ptwXY(), ptwXY_domainSlice(), ptwXY_dullEdges(), ptwXY_flatInterpolationToLinear(), ptwXY_intersectionWith_ptwX(), ptwXY_mul2_ptwXY(), ptwXY_scaleAndOffsetDomainWith_ptwXYs(), ptwXY_thicken(), and ptwXY_valueTo_ptwXY().

◆ ptwXY_setValueAtX_overrideIfClose()

nfu_status ptwXY_setValueAtX_overrideIfClose ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double x,
double y,
double eps,
int override )

Definition at line 1234 of file ptwXY_core.c.

1235 {
1236
1237 int closeIsEqual;
1238 int64_t nonOverflowLength = ptwXY_getNonOverflowLength( smr, ptwXY ), i;
1240 ptwXYPoint *point = NULL, newPoint = { x, y };
1241 ptwXYOverflowPoint *overflowPoint, *p, *overflowHeader = &(ptwXY->overflowHeader);
1242 ptwXYOverflowPoint lessThanEqualXPoint, greaterThanXPoint;
1243 ptwXYPoint *closePoint;
1244
1245 if( nonOverflowLength < 0 ) {
1247 return( nfu_Error );
1248 }
1249
1250 legx = ptwXY_getPointsAroundX_closeIsEqual( smr, ptwXY, x, &lessThanEqualXPoint, &greaterThanXPoint, eps, &closeIsEqual, &closePoint );
1251 switch( legx ) {
1254 return( nfu_Error );
1258 if( closeIsEqual ) {
1259 if( !override ) return( nfu_Okay );
1260 point = closePoint;
1262 x = point->x; }
1263 else {
1264 if( ( legx == ptwXY_lessEqualGreaterX_greater ) && ( nonOverflowLength < ptwXY->allocatedSize ) ) {
1265 point = &(ptwXY->points[nonOverflowLength]); }
1266 else {
1267 if( ptwXY->overflowLength == ptwXY->overflowAllocatedSize ) {
1268 if( ptwXY_coalescePoints( smr, ptwXY, ptwXY->length + ptwXY->overflowAllocatedSize, &newPoint, 0 ) != nfu_Okay )
1270 return( ptwXY->status );
1271 }
1272 overflowPoint = &(ptwXY->overflowPoints[ptwXY->overflowLength]);
1273 if( legx == ptwXY_lessEqualGreaterX_lessThan ) {
1274 overflowPoint->prior = greaterThanXPoint.prior;
1275 overflowPoint->index = 0; }
1276 else { /* Between or greater and must go in overflow area. */
1277 if( legx == ptwXY_lessEqualGreaterX_greater ) {
1278 overflowPoint->prior = overflowHeader->prior;
1279 overflowPoint->index = ptwXY->length; }
1280 else {
1281 overflowPoint->prior = lessThanEqualXPoint.prior;
1282 if( lessThanEqualXPoint.next != NULL ) {
1283 if( lessThanEqualXPoint.point.x < x )
1284 overflowPoint->prior = lessThanEqualXPoint.prior->next;
1285 i = 1; }
1286 else {
1287 for( p = overflowHeader->next, i = 1; p != overflowHeader; p = p->next, i++ )
1288 if( p->point.x > x ) break;
1289 }
1290 overflowPoint->index = lessThanEqualXPoint.index + i;
1291 }
1292 }
1293 overflowPoint->next = overflowPoint->prior->next;
1294 overflowPoint->prior->next = overflowPoint;
1295 overflowPoint->next->prior = overflowPoint;
1296 point = &(overflowPoint->point);
1297 for( overflowPoint = overflowPoint->next; overflowPoint != overflowHeader; overflowPoint = overflowPoint->next ) {
1298 overflowPoint->index++;
1299 }
1300 ptwXY->overflowLength++;
1301 }
1302 }
1303 break;
1305 point = ptwXY->points; /* ptwXY_minimumSize must be > 0 so there is always space here. */
1306 break;
1308 if( closeIsEqual && !override ) return( nfu_Okay );
1309 if( lessThanEqualXPoint.next == NULL ) {
1310 point = &(ptwXY->points[lessThanEqualXPoint.index]); }
1311 else {
1312 point = &(lessThanEqualXPoint.prior->next->point);
1313 }
1314 break;
1315 }
1316
1317 point->x = x;
1318 point->y = y;
1319 if( legx != ptwXY_lessEqualGreaterX_equal ) ptwXY->length++;
1320 return( nfu_Okay );
1321}

Referenced by ptwXY_createFromFunction(), and ptwXY_setValueAtX().

◆ ptwXY_setXYData()

nfu_status ptwXY_setXYData ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
int64_t length,
double const * xy )

Definition at line 866 of file ptwXY_core.c.

866 {
867
868 int64_t index;
869 ptwXYPoint *p;
870 double const *d = xy;
871 double priorX = 0.;
872
873 if( ptwXY->status != nfu_Okay ) {
874 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
875 return( ptwXY->status );
876 }
877
878 if( length > ptwXY->allocatedSize ) {
879 if( ptwXY_reallocatePoints( smr, ptwXY, length, 0 ) != nfu_Okay ) {
881 return( ptwXY->status );
882 }
883 }
884 for( index = 0, p = ptwXY->points; index < length; index++, p++ ) {
885 if( index != 0 ) {
886 if( *d <= priorX ) {
888 "X value at index = %d of %.17e is <= prior value of %.17e", (int) index, *d, priorX );
889 ptwXY->status = nfu_XNotAscending;
890 length = 0;
891 break;
892 }
893 }
894 priorX = *d;
895 p->x = *(d++);
896 p->y = *(d++);
897 }
898 ptwXY->overflowHeader.next = &(ptwXY->overflowHeader);
899 ptwXY->overflowHeader.prior = &(ptwXY->overflowHeader);
900 ptwXY->overflowLength = 0;
901 ptwXY->length = length;
902 return( ptwXY->status );
903}

Referenced by ptwXY_create().

◆ ptwXY_setXYDataFromXsAndYs()

nfu_status ptwXY_setXYDataFromXsAndYs ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
int64_t length,
double const * x,
double const * y )

Definition at line 907 of file ptwXY_core.c.

908 {
909
910 int64_t i;
911 ptwXYPoint *p;
912 double xOld = 0.;
913
914 if( ptwXY_clear( smr, ptwXY ) != nfu_Okay ) {
916 return( ptwXY->status );
917 }
918
919 if( length > ptwXY->allocatedSize ) {
920 if( ptwXY_reallocatePoints( smr, ptwXY, length, 0 ) != nfu_Okay ) {
922 return( ptwXY->status );
923 }
924 }
925 for( i = 0, p = ptwXY->points; i < length; i++, p++, x++, y++ ) {
926 if( i != 0 ) {
927 if( *x <= xOld ) {
928 ptwXY->status = nfu_XNotAscending;
929 length = 0;
930 break;
931 }
932 }
933 xOld = *x;
934 p->x = *x;
935 p->y = *y;
936 }
937 ptwXY->length = length;
938 return( ptwXY->status );
939}

◆ ptwXY_setXYPairAtIndex()

nfu_status ptwXY_setXYPairAtIndex ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
int64_t index,
double x,
double y )

Definition at line 1484 of file ptwXY_core.c.

1484 {
1485
1486 int64_t i, ip1;
1487 ptwXYOverflowPoint *overflowPoint, *pm1, *pp1;
1488
1489 if( ptwXY->status != nfu_Okay ) {
1490 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
1491 return( ptwXY->status );
1492 }
1493
1494 if( ( index < 0 ) || ( index >= ptwXY->length ) ) {
1495 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_badIndex, "Index = %d, out of bounds: length = %d",
1496 (int) index, (int) ptwXY->length );
1497 return( ptwXY->status = nfu_badIndex );
1498 }
1499
1500 for( overflowPoint = ptwXY->overflowHeader.next, i = 0; overflowPoint != &(ptwXY->overflowHeader); overflowPoint = overflowPoint->next, i++ ) {
1501 if( overflowPoint->index >= index ) break;
1502 }
1503 ip1 = i;
1504 pm1 = pp1 = overflowPoint;
1505 if( overflowPoint->index == index ) { /* Note, if overflowPoint is header, then its index = -1. */
1506 pp1 = overflowPoint->next;
1507 ip1++;
1508 }
1509 if( ( pp1 != &(ptwXY->overflowHeader) ) && ( pp1->index == ( index + 1 ) ) ) { /* This if and else check that x < element[index+1]'s x values. */
1510 if( pp1->point.x <= x ) return( nfu_badIndexForX ); }
1511 else {
1512 if( ( ( index + 1 ) < ptwXY->length ) && ( ptwXY->points[index + 1 - ip1].x <= x ) ) return( nfu_badIndexForX );
1513 }
1514 if( overflowPoint != &(ptwXY->overflowHeader) ) pm1 = overflowPoint->prior;
1515 if( ( pm1 != &(ptwXY->overflowHeader) ) && ( pm1->index == ( index - 1 ) ) ) { /* This if and else check that x > element[index-1]'s x values. */
1516 if( pm1->point.x >= x ) return( nfu_badIndexForX ); }
1517 else {
1518 if( ( ( index - 1 ) >= 0 ) && ( ptwXY->points[index - 1 - i].x >= x ) ) return( nfu_badIndexForX );
1519 }
1520 if( ( overflowPoint != &(ptwXY->overflowHeader) ) && ( overflowPoint->index == index ) ) {
1521 overflowPoint->point.x = x;
1522 overflowPoint->point.y = y; }
1523 else {
1524 index -= i;
1525 ptwXY->points[index].x = x;
1526 ptwXY->points[index].y = y;
1527 }
1528 return( nfu_Okay );
1529}
@ nfu_badIndexForX

◆ ptwXY_showInteralStructure()

void ptwXY_showInteralStructure ( ptwXYPoints * ptwXY,
FILE * f,
int printPointersAsNull )

Definition at line 297 of file ptwXY_misc.c.

297 {
298
299 int64_t i, n1;
300 ptwXYPoint *point = ptwXY->points;
301 ptwXYOverflowPoint *overflowPoint;
302
303 n1 = ptwXY_getNonOverflowLength( NULL, ptwXY );
304
305 fprintf( f, "status = %d interpolation = %d length = %d allocatedSize = %d\n",
306 (int) ptwXY->status, (int) ptwXY->interpolation, (int) ptwXY->length, (int) ptwXY->allocatedSize );
307 fprintf( f, "userFlag = %d biSectionMax = %.8e accuracy = %.2e minFractional_dx = %.6e\n",
308 ptwXY->userFlag, ptwXY->biSectionMax, ptwXY->accuracy, ptwXY->minFractional_dx );
309 fprintf( f, "interpolationString = %s\n", ptwXY->interpolationString );
310 fprintf( f, " overflowLength = %d overflowAllocatedSize = %d mallocFailedSize = %d\n",
311 (int) ptwXY->overflowLength, (int) ptwXY->overflowAllocatedSize, (int) ptwXY->mallocFailedSize );
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) ) );
315 for( overflowPoint = ptwXY->overflowHeader.next; overflowPoint != &(ptwXY->overflowHeader); overflowPoint = overflowPoint->next ) {
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 ) );
319 }
320 fprintf( f, " Points in order\n" );
321 for( i = 0; i < ptwXY->length; i++ ) {
322 point = ptwXY_getPointAtIndex_Unsafely( ptwXY, i );
323 fprintf( f, " %14.7e %14.7e\n", point->x, point->y );
324 }
325}

◆ ptwXY_simpleCoalescePoints()

◆ ptwXY_simplePrint()

void ptwXY_simplePrint ( ptwXYPoints * ptwXY,
char const * format )

Definition at line 342 of file ptwXY_misc.c.

342 {
343
344 ptwXY_simpleWrite( ptwXY, stdout, format );
345}
void ptwXY_simpleWrite(ptwXYPoints *ptwXY, FILE *f, char const *format)
Definition ptwXY_misc.c:329

◆ ptwXY_simpleWrite()

void ptwXY_simpleWrite ( ptwXYPoints * ptwXY,
FILE * f,
char const * format )

Definition at line 329 of file ptwXY_misc.c.

329 {
330
331 int64_t i;
332 ptwXYPoint *point;
333
334 for( i = 0; i < ptwXY->length; i++ ) {
335 point = ptwXY_getPointAtIndex_Unsafely( ptwXY, i );
336 fprintf( f, format, point->x, point->y );
337 }
338}

Referenced by ptwXY_simplePrint(), and GIDI::Functions::XYs1d::write().

◆ ptwXY_slice()

ptwXYPoints * ptwXY_slice ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
int64_t index1,
int64_t index2,
int64_t secondarySize )

Definition at line 388 of file ptwXY_core.c.

388 {
389
390 int64_t i, length;
391 ptwXYPoints *n;
392
393 if( ptwXY->status != nfu_Okay ) {
394 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
395 return( NULL );
396 }
397
398 if( ( index1 < 0 ) || ( index2 < index1 ) || ( index2 > ptwXY->length ) ) {
399 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_badIndex, "Indices = %d, %d out of bounds: length = %d",
400 (int) index1, (int) index2, (int) ptwXY->length );
401 return( NULL );
402 }
403
404 length = index2 - index1;
405 if( ptwXY_simpleCoalescePoints( smr, ptwXY ) != nfu_Okay ) {
407 return( NULL );
408 }
409 if( ( n = ptwXY_new( smr, ptwXY->interpolation, ptwXY->interpolationString, ptwXY->biSectionMax,
410 ptwXY->accuracy, length, secondarySize, ptwXY->userFlag ) ) == NULL ) {
412 return( NULL );
413 }
414
415 for( i = index1; i < index2; i++ ) n->points[i - index1] = ptwXY->points[i];
416 n->length = length;
417 return( n );
418}

Referenced by ptwXY_clone().

◆ 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}

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

◆ ptwXY_startIndex()

nfu_status ptwXY_startIndex ( statusMessageReporting * a_smr,
ptwXYPoints * a_ptwXY,
double a_x,
int64_t * a_startIndex,
int64_t * a_length )

Definition at line 818 of file ptwXY_core.c.

818 {
819/*
820 Sets *a_startIndex to -2 if a_x < domainMin, -1 if a_x > domainMax, otherwise to the lowest index in a_ptwXY->points
821where a_x >= a_ptwXY->points[*a_startIndex]. The logic below guarantees that *a_startIndex < (*a_length - 1 ). For example, if
822a_x == domainMax, then *a_startIndex = *a_length - 2, or the next to the last point.
823*/
824
825 int64_t lower = 0, mid, upper;
826 ptwXYPoint *point;
827 *a_length = ptwXY_length( NULL, a_ptwXY );
828
829 if( ptwXY_simpleCoalescePoints( a_smr, a_ptwXY ) != nfu_Okay ) {
831 return( a_ptwXY->status );
832 }
833
834 if( *a_length < 2 ) {
835 smr_setReportError2( a_smr, nfu_SMR_libraryID, nfu_tooFewPoints, "number of points = %lld < 2", *a_length );
836 return( nfu_tooFewPoints );
837 }
838
839 *a_startIndex = -2;
840 point = &a_ptwXY->points[lower];
841 if( a_x < point->x ) return( nfu_Okay );
842
843 upper = *a_length - 1;
844 *a_startIndex = -1;
845 point = &a_ptwXY->points[upper];
846 if( a_x > point->x ) return( nfu_Okay );
847
848 while( 1 ) {
849 mid = ( lower + upper ) >> 1;
850 if( mid == lower ) break;
851 point = &a_ptwXY->points[mid];
852 if( a_x < point->x ) {
853 upper = mid; }
854 else {
855 lower = mid;
856 }
857 }
858
859 *a_startIndex = mid;
860 return( nfu_Okay );
861}
int64_t ptwXY_length(statusMessageReporting *smr, ptwXYPoints *ptwXY)
Definition ptwXY_core.c:793

Referenced by ptwXY_mapToXsAndAdd().

◆ ptwXY_stringToInterpolation()

ptwXY_interpolation ptwXY_stringToInterpolation ( char const * interpolationString)

Definition at line 1796 of file ptwXY_core.c.

1796 {
1797
1798 if( strcmp( interpolationString, "" ) == 0 ) return( ptwXY_interpolationLinLin );
1799 if( strcmp( interpolationString, linLinInterpolationString ) == 0 ) return( ptwXY_interpolationLinLin );
1800 if( strcmp( interpolationString, logLinInterpolationString ) == 0 ) return( ptwXY_interpolationLogLin );
1801 if( strcmp( interpolationString, linLogInterpolationString ) == 0 ) return( ptwXY_interpolationLinLog );
1802 if( strcmp( interpolationString, logLogInterpolationString ) == 0 ) return( ptwXY_interpolationLogLog );
1803 if( strcmp( interpolationString, flatInterpolationString ) == 0 ) return( ptwXY_interpolationFlat );
1804 return( ptwXY_interpolationOther );
1805}

Referenced by MCGIDI::Distributions::CoherentElasticTNSL::CoherentElasticTNSL(), and ptwXY_setInterpolationString().

◆ 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-=().

◆ ptwXY_thicken()

nfu_status ptwXY_thicken ( statusMessageReporting * smr,
ptwXYPoints * ptwXY1,
int sectionSubdivideMax,
double dDomainMax,
double fDomainMax )

Definition at line 155 of file ptwXY_methods.c.

156 {
157
158 double x1, x2 = 0., y1, y2 = 0., fx = 1.1, x, dx, dxp, lfx, y; /* fx initialized so compilers want complain. */
159 int64_t i, notFirstPass = 0;
160 int nfx, nDone, doLinear;
161
162 if( ptwXY1->interpolation == ptwXY_interpolationOther ) {
163 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not allowed." );
164 return( nfu_otherInterpolation );
165 }
166 if( ( sectionSubdivideMax < 1 ) || ( dDomainMax < 0. ) || ( fDomainMax < 1. ) ) {
168 "ptwXY_thicken: One or more of the following not satisfied: sectionSubdivideMax = %d > 0, dDomainMax = %e >= 0.0, fDomainMax = %e >= 1.0",
169 sectionSubdivideMax, dDomainMax, fDomainMax );
170 return( nfu_badInput );
171 }
172 if( sectionSubdivideMax > ptwXY_sectionSubdivideMax ) sectionSubdivideMax = ptwXY_sectionSubdivideMax;
173 if( ptwXY_simpleCoalescePoints( smr, ptwXY1 ) != nfu_Okay ) {
175 return( ptwXY1->status );
176 }
177 for( i = ptwXY1->length - 1; i >= 0; i-- ) {
178 x1 = ptwXY1->points[i].x;
179 y1 = ptwXY1->points[i].y;
180 if( notFirstPass ) {
181 dx = ptwXY_thicken_linear_dx( sectionSubdivideMax, dDomainMax, x1, x2 );
182
183 if( x1 == 0. ) {
184 doLinear = 1; }
185 else {
186 fx = x2 / x1;
187 if( fx > 0. ) {
188 lfx = log( fx );
189 if( fDomainMax == 1. ) {
190 nfx = sectionSubdivideMax; }
191 else {
192 nfx = ( (int) ( lfx / log( fDomainMax ) ) ) + 1;
193 if( nfx > sectionSubdivideMax ) nfx = sectionSubdivideMax;
194 }
195 if( nfx > 0 ) fx = exp( lfx / nfx );
196 doLinear = 0;
197 if( dx < ( fx - 1 ) * x1 ) doLinear = 1; }
198 else {
199 doLinear = 1;
200 }
201 }
202 x = x1;
203 dxp = dx;
204 nDone = 0;
205 while( 1 ) {
206 if( doLinear ) {
207 x += dx; }
208 else {
209 dx = ptwXY_thicken_linear_dx( sectionSubdivideMax - nDone, dDomainMax, x, x2 );
210 if( dx <= ( fx - 1 ) * x ) {
211 dxp = dx;
212 doLinear = 1;
213 continue;
214 }
215 dxp = ( fx - 1. ) * x;
216 x *= fx;
217 }
218 if( ( x2 - x ) < 0.05 * fabs( dxp ) ) break;
219 if( ( ptwXY1->status = ptwXY_interpolatePoint( smr, ptwXY1->interpolation, x, &y, x1, y1, x2, y2 ) ) != nfu_Okay ) {
221 return( ptwXY1->status );
222 }
223 if( ( ptwXY1->status = ptwXY_setValueAtX( smr, ptwXY1, x, y ) ) != nfu_Okay ) {
225 return( ptwXY1->status );
226 }
227 nDone++;
228 }
229 }
230 notFirstPass = 1;
231 x2 = x1;
232 y2 = y1;
233 }
234 return( ptwXY1->status );
235}
#define ptwXY_sectionSubdivideMax
Definition ptwXY.h:27

◆ ptwXY_thin()

ptwXYPoints * ptwXY_thin ( statusMessageReporting * smr,
ptwXYPoints * ptwXY1,
double accuracy )

Definition at line 259 of file ptwXY_methods.c.

259 {
260
261 int64_t i, j, length = ptwXY1->length;
262 ptwXYPoints *thinned = NULL;
263 double y1, y2, y3, accuracyNew;
264 char *thin = NULL;
265
266 if( length < 3 ) { /* Logic below requires at least 2 points. */
267 if( ( thinned = ptwXY_clone( smr, ptwXY1 ) ) == NULL )
269 return( thinned );
270 }
271
272 if( ptwXY_simpleCoalescePoints( smr, ptwXY1 ) != nfu_Okay ) {
274 return( NULL );
275 }
276
277 if( ptwXY1->interpolation == ptwXY_interpolationOther ) {
278 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not allowed." );
279 return( NULL );
280 }
281
282 accuracy = ptwXY_limitAccuracy( accuracy );
283 accuracyNew = accuracy;
284 if( accuracyNew < ptwXY1->accuracy ) accuracyNew = ptwXY1->accuracy;
285 if( ( thinned = ptwXY_new( smr, ptwXY1->interpolation, ptwXY1->interpolationString,
286 ptwXY1->biSectionMax, accuracyNew, length, ptwXY1->overflowLength, ptwXY1->userFlag ) ) == NULL ) {
288 return( NULL );
289 }
290
291 thinned->points[0] = ptwXY1->points[0]; /* This sections removes middle point if surrounding points have the same y-value. */
292 y1 = ptwXY1->points[0].y;
293 y2 = ptwXY1->points[1].y;
294 for( i = 2, j = 1; i < length; i++ ) {
295 y3 = ptwXY1->points[i].y;
296 if( ( y1 != y2 ) || ( y2 != y3 ) ) {
297 thinned->points[j++] = ptwXY1->points[i - 1];
298 y1 = y2;
299 y2 = y3;
300 }
301 }
302 thinned->points[j++] = ptwXY1->points[length - 1];
303
304 if( ptwXY1->interpolation != ptwXY_interpolationFlat ) { /* Now call ptwXY_thin2 for more thinning. */
305 length = thinned->length = j;
306 if( ( thin = (char *) smr_malloc2( smr, (size_t) length, 1, "thin" ) ) == NULL ) goto Err2;
307 if( ptwXY_thin2( smr, thinned, thin, accuracy, 0, length - 1 ) != nfu_Okay ) goto Err1;
308 for( j = 1; j < length; j++ ) if( thin[j] != 0 ) break;
309 for( i = j + 1; i < length; i++ ) {
310 if( thin[i] == 0 ) {
311 thinned->points[j] = thinned->points[i];
312 j++;
313 }
314 }
315 smr_freeMemory2( thin );
316 }
317 thinned->length = j;
318
319 return( thinned );
320
321Err1:
323Err2:
324 ptwXY_free( thinned );
325 if( thin != NULL ) smr_freeMemory2( thin );
326 return( NULL );
327}

◆ ptwXY_thinDomain()

ptwXYPoints * ptwXY_thinDomain ( statusMessageReporting * smr,
ptwXYPoints * ptwXY1,
double epsilon )

Definition at line 365 of file ptwXY_methods.c.

365 {
366/*
367* Thins domain points that are closer the '0.5 * (x[i+1] + x[i]) * epsilon'.
368*/
369 int64_t i1, i2, length = ptwXY1->length, lengthm1 = length - 1, thinnedLength = 0;
370 ptwXYPoint *points;
371 ptwXYPoints *thinned = NULL;
372 double x1, x2, x3, dx, y2, half_epsilon = 0.5 * epsilon;
373
374 if( ptwXY1->interpolation == ptwXY_interpolationFlat ) {
375 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_invalidInterpolation, "Flat interpolation not allowed." );
376 return( NULL );
377 }
378
379 if( ptwXY1->interpolation == ptwXY_interpolationOther ) {
380 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not allowed." );
381 return( NULL );
382 }
383
384 if( ptwXY_simpleCoalescePoints( smr, ptwXY1 ) != nfu_Okay ) {
386 return( NULL );
387 }
388
389 if( length > 1 ) {
390 if( ( ptwXY1->points[length-1].x - ptwXY1->points[0].x ) < half_epsilon * ( fabs( ptwXY1->points[0].x ) + fabs( ptwXY1->points[0].x ) ) ) {
391 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_Error, "Domain (%.17e, %.17e) is less than epsilon = %.17e.",
392 ptwXY1->points[0].x, ptwXY1->points[length-1].x, epsilon );
393 return( NULL );
394 }
395 }
396
397 if( ( length <= 2 ) || ( epsilon < 2 * DBL_EPSILON ) ) {
398 if( ( thinned = ptwXY_clone( smr, ptwXY1 ) ) == NULL ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via." );
399 return( thinned );
400 }
401
402 if( ( thinned = ptwXY_new( smr, ptwXY1->interpolation, ptwXY1->interpolationString, ptwXY1->biSectionMax, ptwXY1->accuracy,
403 length, ptwXY1->overflowAllocatedSize, ptwXY1->userFlag ) ) == NULL ) {
405 return( NULL );
406 }
407
408 points = thinned->points;
409 *points = ptwXY1->points[0];
410 ++points;
411 ++thinnedLength;
412 x1 = ptwXY1->points[0].x;
413 x2 = x3 = x1; /* To stop some compilers from printing a warning. */
414 for( i1 = 1; i1 < lengthm1; i1 = i2 ) {
415 for( i2 = i1; i2 < length; ++i2 ) { /* Find next x3 that is epsilon * ( x1 + x2 ) / 2 above x1. */
416 x3 = ptwXY1->points[i2].x;
417 if( ( x3 - x1 ) >= half_epsilon * ( fabs( x1 ) + fabs( x3 ) ) ) break;
418 x2 = x3;
419 }
420 if( i1 == i2 ) {
421 y2 = ptwXY1->points[i2].y;
422 x2 = x3; }
423 else {
424 if( ( x3 - x1 ) > ( epsilon * ( fabs( x1 ) + fabs( x3 ) ) ) ) {
425 dx = fabs( x2 * epsilon );
426 x2 = x1 + dx;
427 if( ptwXY_getValueAtX( smr, ptwXY1, x2, &y2 ) != nfu_Okay ) {
429 ptwXY_free( thinned );
430 return( NULL );
431 }
432 --i2; }
433 else {
434 if( i2 == length ) break;
435 x2 = x3;
436 y2 = ptwXY1->points[i2].y;
437 }
438 }
439 points->x = x2;
440 points->y = y2;
441 ++points;
442 ++thinnedLength;
443 x1 = x2;
444 ++i2;
445 }
446
447 x3 = ptwXY1->points[lengthm1].x;
448 x2 = thinned->points[thinnedLength-1].x;
449 if( ( x3 - x2 ) < ( half_epsilon * ( fabs( x2 ) + fabs( x3 ) ) ) ) {
450 --points;
451 --thinnedLength;
452 x1 = thinned->points[thinnedLength-1].x;
453 if( ( x3 - x1 ) > ( epsilon * ( fabs( x1 ) + fabs( x2 ) ) ) ) {
454 dx = fabs( x3 * epsilon );
455 x2 = x3 - dx;
456 if( ptwXY_getValueAtX( smr, ptwXY1, x2, &y2 ) != nfu_Okay ) {
458 ptwXY_free( thinned );
459 return( NULL );
460 }
461 points->x = x2;
462 points->y = y2;
463 ++points;
464 ++thinnedLength;
465 }
466 }
467 points->x = x3;
468 points->y = ptwXY1->points[lengthm1].y;
469 ++thinnedLength;
470 thinned->length = thinnedLength;
471
472 return( thinned );
473}

◆ ptwXY_toOtherInterpolation()

ptwXYPoints * ptwXY_toOtherInterpolation ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
ptwXY_interpolation interpolation,
double accuracy )

Definition at line 197 of file ptwXY_interpolation.c.

198 {
199/*
200* This function only works when 'ptwXY->interpolation == interpolationTo' or when interpolationTo is ptwXY_interpolationLinLin.
201*/
202 int i1, logX = 0, logY = 0;
203 ptwXYPoints *n1;
204 interpolation_func func = NULL;
205
206 if( ptwXY->status != nfu_Okay ) {
207 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
208 return( NULL );
209 }
210
211 if( ptwXY->interpolation == interpolationTo ) {
212 if( ( n1 = ptwXY_clone( smr, ptwXY ) ) == NULL ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via." );
213 return( n1 ); }
214 else {
215 if( interpolationTo == ptwXY_interpolationLinLin ) {
216 switch( ptwXY->interpolation ) {
218 logX = logY = 1;
219 func = ptwXY_LogLogToLinLin; break;
221 logY = 1;
222 func = ptwXY_LogLinToLinLin; break;
224 logX = 1;
225 func = ptwXY_LinLogToLinLin; break;
226 case ptwXY_interpolationLinLin : /* Stops compilers from complaining. */
229 break;
230 }
231 }
232 }
233 if( func == NULL ) {
235 "Interpolation conversion from '%s' to %d not supported.", ptwXY->interpolationString, interpolationTo );
236 return( NULL );
237 }
238
239 if( ( logX != 0 ) || ( logY != 0 ) ) {
240 ptwXYPoint *point;
241
242 if( ptwXY_simpleCoalescePoints( smr, ptwXY ) != nfu_Okay ) {
244 return( NULL );
245 }
246
247 for( i1 = 0, point = ptwXY->points; i1 < ptwXY->length; ++i1, ++point ) {
248 if( ( logX != 0 ) && ( point->x <= 0 ) ) {
249 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_badLogValue, "At index %d x-value %.16e for log <= 0.",
250 (int) i1, point->x );
251 return( NULL );
252 }
253 if( ( logY != 0 ) && ( point->y <= 0 ) ) {
254 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_badLogValue, "At index %d y-value %.16e for log <= 0.",
255 (int) i1, point->y );
256 return( NULL );
257 }
258 }
259 }
260
261 if( ( n1 = ptwXY_cloneToInterpolation( smr, ptwXY, interpolationTo ) ) == NULL ) {
263 return( NULL );
264 }
265 n1->accuracy = ptwXY_limitAccuracy( accuracy );
266
267 if( ptwXY_toOtherInterpolation2( smr, n1, ptwXY, func ) != nfu_Okay ) {
269 n1 = ptwXY_free( n1 ); }
270 else {
271 if( n1->accuracy < ptwXY->accuracy ) n1->accuracy = ptwXY->accuracy;
272 }
273 return( n1 );
274}
@ nfu_badLogValue
@ nfu_unsupportedInterpolationConversion
ptwXYPoints * ptwXY_cloneToInterpolation(statusMessageReporting *smr, ptwXYPoints *ptwXY, ptwXY_interpolation interpolationTo)
Definition ptwXY_core.c:349
nfu_status(* interpolation_func)(statusMessageReporting *smr, ptwXYPoints *desc, double x1, double y1, double x2, double y2, int depth)

Referenced by GIDI::Functions::XYs1d::asXYs1d().

◆ ptwXY_toUnitbase()

ptwXYPoints * ptwXY_toUnitbase ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
int scaleRange )

Definition at line 373 of file ptwXY_interpolation.c.

373 {
374
375 int64_t i;
376 ptwXYPoints *n;
377 ptwXYPoint *p;
378 double domainMin, domainMax, dx, inverseDx;
379
380 if( ptwXY->length < 2 ) {
381 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_tooFewPoints, "Too few points %d", (int) ptwXY->length );
382 return( NULL );
383 }
384 if( ( n = ptwXY_clone( smr, ptwXY ) ) == NULL ) {
386 return( NULL );
387 }
388
389 domainMin = n->points[0].x;
390 domainMax = n->points[n->length-1].x;
391 dx = domainMax - domainMin;
392 inverseDx = 1. / dx;
393 for( i = 0, p = n->points; i < n->length; i++, p++ ) {
394 p->x = ( p->x - domainMin ) * inverseDx;
395 if( scaleRange ) p->y = p->y * dx;
396 }
397 n->points[n->length-1].x = 1.; /* Make sure last point is realy 1. */
398 return( n );
399}

Referenced by ptwXY_unitbaseInterpolate().

◆ ptwXY_trim()

nfu_status ptwXY_trim ( statusMessageReporting * smr,
ptwXYPoints * ptwXY )

Definition at line 477 of file ptwXY_methods.c.

477 {
478/*
479c Remove extra zeros at beginning and end.
480*/
481 int64_t i, i1, i2;
482
483 if( ptwXY->status != nfu_Okay ) {
484 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid destination." );
485 return( ptwXY->status );
486 }
487
488 if( ptwXY_simpleCoalescePoints( smr, ptwXY ) != nfu_Okay ) {
490 return( ptwXY->status );
491 }
492
493 for( i1 = 0; i1 < ptwXY->length; i1++ ) {
494 if( ptwXY->points[i1].y != 0 ) break;
495 }
496 if( i1 > 0 ) i1--;
497 for( i2 = ptwXY->length - 1; i2 >= 0; i2-- ) {
498 if( ptwXY->points[i2].y != 0 ) break;
499 }
500 i2++;
501 if( i2 < ptwXY->length ) i2++;
502 if( i2 > i1 ) {
503 if( i1 > 0 ) {
504 for( i = i1; i < i2; i++ ) ptwXY->points[i - i1] = ptwXY->points[i];
505 }
506 ptwXY->length = i2 - i1; }
507 else if( i2 < i1 ) { /* Remove all zeros between endpoints. */
508 ptwXY->points[1] = ptwXY->points[ptwXY->length - 1];
509 ptwXY->length = 2;
510 }
511
512 return( nfu_Okay );
513}

◆ ptwXY_tweakDomainsToMutualify()

nfu_status ptwXY_tweakDomainsToMutualify ( statusMessageReporting * smr,
ptwXYPoints * ptwXY1,
ptwXYPoints * ptwXY2,
int epsilonFactor,
double epsilon )

Definition at line 477 of file ptwXY_convenient.c.

478 {
479
480 nfu_status status = nfu_Okay;
481 int64_t n1 = ptwXY1->length, n2 = ptwXY2->length;
482 double sum, diff;
483 ptwXYPoint *xy1, *xy2;
484
485 epsilon = fabs( epsilon ) + fabs( epsilonFactor * DBL_EPSILON );
486
487 if( ptwXY1->status != nfu_Okay ) {
488 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source1." );
489 return( ptwXY1->status );
490 }
491 if( ptwXY2->status != nfu_Okay ) {
492 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source2." );
493 return( ptwXY2->status );
494 }
495
496 if( n1 == 0 ) return( nfu_empty );
497 if( n2 == 0 ) return( nfu_empty );
498 if( n1 < 2 ) {
499 status = nfu_tooFewPoints; }
500 else if( n2 < 2 ) {
501 status = nfu_tooFewPoints; }
502 else {
503 xy1 = ptwXY_getPointAtIndex_Unsafely( ptwXY1, 0 );
504 xy2 = ptwXY_getPointAtIndex_Unsafely( ptwXY2, 0 );
505 if( xy1->x < xy2->x ) {
506 if( xy2->y != 0. ) {
507 sum = fabs( xy1->x ) + fabs( xy2->x );
508 diff = fabs( xy2->x - xy1->x );
509 if( diff > epsilon * sum ) {
510 status = nfu_domainsNotMutual; }
511 else {
512 xy1->x = xy2->x;
513 }
514 } }
515 else if( xy1->x > xy2->x ) {
516 if( xy1->y != 0. ) {
517 sum = fabs( xy1->x ) + fabs( xy2->x );
518 diff = fabs( xy2->x - xy1->x );
519 if( diff > epsilon * sum ) {
520 status = nfu_domainsNotMutual; }
521 else {
522 xy2->x = xy1->x;
523 }
524 }
525 }
526
527 if( status == nfu_Okay ) {
528 xy1 = ptwXY_getPointAtIndex_Unsafely( ptwXY1, n1 - 1 );
529 xy2 = ptwXY_getPointAtIndex_Unsafely( ptwXY2, n2 - 1 );
530 if( xy1->x < xy2->x ) {
531 if( xy1->y != 0. ) {
532 sum = fabs( xy1->x ) + fabs( xy2->x );
533 diff = fabs( xy2->x - xy1->x );
534 if( diff > epsilon * sum ) {
535 status = nfu_domainsNotMutual; }
536 else {
537 xy2->x = xy1->x;
538 }
539 } }
540 else if( xy1->x > xy2->x ) {
541 if( xy2->y != 0. ) {
542 sum = fabs( xy1->x ) + fabs( xy2->x );
543 diff = fabs( xy2->x - xy1->x );
544 if( diff > epsilon * sum ) {
545 status = nfu_domainsNotMutual; }
546 else {
547 xy1->x = xy2->x;
548 }
549 }
550 }
551 }
552 }
553 return( status );
554}

Referenced by ptwXY_groupThreeFunctions(), and ptwXY_groupTwoFunctions().

◆ ptwXY_union()

ptwXYPoints * ptwXY_union ( statusMessageReporting * smr,
ptwXYPoints * ptwXY1,
ptwXYPoints * ptwXY2,
int unionOptions )

Definition at line 517 of file ptwXY_methods.c.

517 {
518
519 int64_t overflowSize, i, i1 = 0, i2 = 0, n1 = ptwXY1->length, n2 = ptwXY2->length, length;
520 int fillWithFirst = unionOptions & ptwXY_union_fill, trim = unionOptions & ptwXY_union_trim;
521 ptwXYPoints *n;
522 double x1 = 0., x2 = 0., y1 = 0., y2 = 0., y, biSectionMax, accuracy;
523/*
524* Many other routines use the fact that ptwXY_union calls ptwXY_coalescePoints for ptwXY1 and ptwXY2 so do not change it.
525*/
526 if( ptwXY_simpleCoalescePoints( smr, ptwXY1 ) != nfu_Okay ) {
528 return( NULL );
529 }
530 if( ptwXY_simpleCoalescePoints( smr, ptwXY2 ) != nfu_Okay ) {
532 return( NULL );
533 }
534
535 if( ptwXY1->interpolation == ptwXY_interpolationOther ) {
536 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not allowed for source1." );
537 return( NULL );
538 }
539 if( ptwXY2->interpolation == ptwXY_interpolationOther ) {
540 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_otherInterpolation, "Other interpolation not allowed for source2." );
541 return( NULL );
542 }
543
544 if( ( n1 == 1 ) || ( n2 == 1 ) ) {
546 "Too few point in one of the sources: len( source1 ) = %d, len( source2 ) = %d", (int) n1, (int) n2 );
547 return( NULL );
548 }
549 if( trim ) {
550 if( n1 > 0 ) {
551 if( n2 > 0 ) {
552 if( ptwXY1->points[0].x < ptwXY2->points[0].x ) {
553 while( i1 < n1 ) {
554 if( ptwXY1->points[i1].x >= ptwXY2->points[0].x ) break;
555 if( fillWithFirst ) {
556 if( i1 < ( ptwXY1->length - 1 ) ) {
557 x1 = ptwXY1->points[i1].x;
558 y1 = ptwXY1->points[i1].y;
559 x2 = ptwXY1->points[i1+1].x;
560 y2 = ptwXY1->points[i1+1].y;
561 }
562 }
563 i1++;
564 } }
565 else {
566 while( i2 < n2 ) {
567 if( ptwXY2->points[i2].x >= ptwXY1->points[0].x ) break;
568 i2++;
569 }
570 }
571 if( ptwXY1->points[n1-1].x > ptwXY2->points[n2-1].x ) {
572 while( i1 < n1 ) {
573 if( ptwXY1->points[n1-1].x <= ptwXY2->points[n2-1].x ) break;
574 n1--;
575 } }
576 else {
577 while( i2 < n2 ) {
578 if( ptwXY2->points[n2-1].x <= ptwXY1->points[n1-1].x ) break;
579 n2--;
580 }
581 } }
582 else {
583 n1 = 0;
584 } }
585 else {
586 n2 = 0;
587 }
588 }
589 overflowSize = ptwXY1->overflowAllocatedSize;
590 if( overflowSize < ptwXY2->overflowAllocatedSize ) overflowSize = ptwXY2->overflowAllocatedSize;
591 length = ( n1 - i1 ) + ( n2 - i2 );
592 if( length == 0 ) length = ptwXY_minimumSize;
593 biSectionMax = ptwXY1->biSectionMax;
594 if( biSectionMax < ptwXY2->biSectionMax ) biSectionMax = ptwXY2->biSectionMax;
595 accuracy = ptwXY1->accuracy;
596 if( accuracy < ptwXY2->accuracy ) accuracy = ptwXY2->accuracy;
597 n = ptwXY_new( smr, ptwXY1->interpolation, NULL, biSectionMax, accuracy, length, overflowSize, ptwXY1->userFlag );
598 if( n == NULL ) {
600 return( NULL );
601 }
602
603 for( i = 0; ( i1 < n1 ) && ( i2 < n2 ); i++ ) {
604 y = 0.;
605 if( ptwXY1->points[i1].x <= ptwXY2->points[i2].x ) {
606 n->points[i].x = ptwXY1->points[i1].x;
607 if( fillWithFirst ) {
608 y = ptwXY1->points[i1].y;
609 if( i1 < ( ptwXY1->length - 1 ) ) {
610 x1 = ptwXY1->points[i1].x;
611 y1 = ptwXY1->points[i1].y;
612 x2 = ptwXY1->points[i1+1].x;
613 y2 = ptwXY1->points[i1+1].y; }
614 else {
615 y1 = 0.;
616 y2 = 0.;
617 }
618 }
619 if( ptwXY1->points[i1].x == ptwXY2->points[i2].x ) i2++;
620 i1++; }
621 else {
622 n->points[i].x = ptwXY2->points[i2].x;
623 if( fillWithFirst && ( ( y1 != 0. ) || ( y2 != 0. ) ) ) {
624 if( ptwXY_interpolatePoint( smr, ptwXY1->interpolation, ptwXY2->points[i2].x, &y, x1, y1, x2, y2 ) != nfu_Okay ) {
626 ptwXY_free( n );
627 return( NULL );
628 }
629 }
630 i2++;
631 }
632 n->points[i].y = y;
633 }
634
635 y = 0.;
636 for( ; i1 < n1; i1++, i++ ) {
637 n->points[i].x = ptwXY1->points[i1].x;
638 if( fillWithFirst ) y = ptwXY1->points[i1].y;
639 n->points[i].y = y;
640 }
641 for( ; i2 < n2; i2++, i++ ) {
642 n->points[i].x = ptwXY2->points[i2].x;
643 if( fillWithFirst && trim && ( n->points[i].x <= x2 ) ) {
644 if( ptwXY_interpolatePoint( smr, ptwXY1->interpolation, n->points[i].x, &y, x1, y1, x2, y2 ) != nfu_Okay ) {
646 ptwXY_free( n );
647 return( NULL );
648 }
649 }
650 n->points[i].y = y;
651 }
652 n->length = i;
653
654 if( unionOptions & ptwXY_union_mergeClosePoints ) {
655 if( ptwXY_mergeClosePoints( smr, n, 4 * DBL_EPSILON ) != nfu_Okay ) {
657 ptwXY_free( n );
658 return( NULL );
659 }
660 }
661 return( n );
662}
#define ptwXY_union_trim
Definition ptwXY.h:35
nfu_status ptwXY_mergeClosePoints(statusMessageReporting *smr, ptwXYPoints *ptwXY, double epsilon)

Referenced by ptwXY_binary_ptwXY(), ptwXY_div_ptwXY(), ptwXY_groupThreeFunctions(), and ptwXY_groupTwoFunctions().

◆ ptwXY_unitbaseInterpolate()

ptwXYPoints * ptwXY_unitbaseInterpolate ( statusMessageReporting * smr,
double w,
double w1,
ptwXYPoints * ptwXY1,
double w2,
ptwXYPoints * ptwXY2,
int scaleRange )

Definition at line 441 of file ptwXY_interpolation.c.

442 {
443/*
444* Should we not be checking the interpolation members???????
445*/
446 int64_t i;
447 ptwXYPoints *n1 = NULL, *n2 = NULL, *a = NULL, *r = NULL;
448 ptwXYPoint *p;
449 double f, g, domainMin, domainMax;
450
451 if( ( w < w1 ) || ( w > w2 ) ) {
452 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_XOutsideDomain, "W value outside w-domain: (%.15e, %.15e)",
453 w1, w2 );
454 return( NULL );
455 }
456 if( w == w1 ) {
457 if( ( n1 = ptwXY_clone( smr, ptwXY1 ) ) == NULL ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via (source1)." );
458 return( n1 );
459 }
460 if( w == w2 ) {
461 if( ( n1 = ptwXY_clone( smr, ptwXY2 ) ) == NULL ) smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_Error, "Via (source2)." );
462 return( n1 );
463 }
464 if( ( n1 = ptwXY_toUnitbase( smr, ptwXY1, scaleRange ) ) == NULL ) goto Err;
465 if( ( n2 = ptwXY_toUnitbase( smr, ptwXY2, scaleRange ) ) == NULL ) goto Err;
466 f = ( w - w1 ) / ( w2 - w1 );
467 g = 1. - f;
468 for( i = 0, p = n1->points; i < n1->length; i++, p++ ) p->y *= g;
469 for( i = 0, p = n2->points; i < n2->length; i++, p++ ) p->y *= f;
470 if( ( a = ptwXY_add_ptwXY( smr, n1, n2 ) ) == NULL ) goto Err;
471
472 domainMin = g * ptwXY1->points[0].x + f * ptwXY2->points[0].x;
473 domainMax = g * ptwXY1->points[ptwXY1->length-1].x + f * ptwXY2->points[ptwXY2->length-1].x;
474 if( ( r = ptwXY_fromUnitbase( smr, a, domainMin, domainMax, scaleRange ) ) == NULL ) goto Err;
475 ptwXY_free( n1 );
476 ptwXY_free( n2 );
477 ptwXY_free( a );
478 return( r );
479
480Err:
482 if( n1 != NULL ) ptwXY_free( n1 );
483 if( n2 != NULL ) ptwXY_free( n2 );
484 if( a != NULL ) ptwXY_free( a );
485 return( NULL );
486}
ptwXYPoints * ptwXY_add_ptwXY(statusMessageReporting *smr, ptwXYPoints *ptwXY1, ptwXYPoints *ptwXY2)
ptwXYPoints * ptwXY_toUnitbase(statusMessageReporting *smr, ptwXYPoints *ptwXY, int scaleRange)
ptwXYPoints * ptwXY_fromUnitbase(statusMessageReporting *smr, ptwXYPoints *ptwXY, double domainMin, double domainMax, int scaleRange)

◆ ptwXY_update_biSectionMax()

void ptwXY_update_biSectionMax ( ptwXYPoints * ptwXY1,
double oldLength )

Definition at line 37 of file ptwXY_misc.c.

37 {
38
39 ptwXY1->biSectionMax = ptwXY1->biSectionMax - 1.442695 * log( ptwXY1->length / oldLength ); /* 1.442695 = 1 / log( 2. ) */
40 if( ptwXY1->biSectionMax < 0 ) ptwXY1->biSectionMax = 0;
42}

Referenced by ptwXY_applyFunction(), ptwXY_div_ptwXY(), and ptwXY_mul2_ptwXY().

◆ ptwXY_valuesToC_XsAndYs()

nfu_status ptwXY_valuesToC_XsAndYs ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
double ** xs,
double ** ys )

Definition at line 727 of file ptwXY_convenient.c.

727 {
728
729 int64_t i1, length;
730 double *xps, *yps;
731 ptwXYPoint *pointFrom;
732
733 if( ptwXY_simpleCoalescePoints( smr, ptwXY ) != nfu_Okay ) {
734 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid source." );
735 return( ptwXY->status );
736 }
737 length = ptwXY_length( NULL, ptwXY );
738
739 if( ( *xs = (double *) smr_malloc2( smr, (size_t) length * sizeof( double ), 0, "xs" ) ) == NULL ) {
741 return( nfu_mallocError );
742 }
743 if( ( *ys = (double *) smr_malloc2( smr, (size_t) length * sizeof( double ), 0, "ys" ) ) == NULL ) {
745 smr_freeMemory2( *xs );
746 return( nfu_mallocError );
747 }
748
749 for( i1 = 0, pointFrom = ptwXY->points, xps = *xs, yps = *ys; i1 < length; ++i1, ++pointFrom, ++xps, ++yps ) {
750 *xps = pointFrom->x;
751 *yps = pointFrom->y;
752 }
753
754 return( nfu_Okay );
755}

◆ ptwXY_valueTo_ptwXY()

ptwXYPoints * ptwXY_valueTo_ptwXY ( statusMessageReporting * smr,
double x1,
double x2,
double y )

Definition at line 759 of file ptwXY_convenient.c.

759 {
760
761 ptwXYPoints *n1;
762
763 if( x1 >= x2 ) {
765 "X-values not ascend: x1 = %.17e, x2 = %.17e", x1, x2 );
766 return( NULL );
767 }
768 if( ( n1 = ptwXY_new( smr, ptwXY_interpolationLinLin, NULL, ptwXY_maxBiSectionMax, ptwXY_minAccuracy, 2, 0, 0 ) ) == NULL ) {
770 return( NULL );
771 }
772 if( ptwXY_setValueAtX( smr, n1, x1, y ) != nfu_Okay ) goto Err;
773 if( ptwXY_setValueAtX( smr, n1, x2, y ) != nfu_Okay ) goto Err;
774 return( n1 );
775
776Err:
778 ptwXY_free( n1 );
779 return( NULL );
780}

◆ ptwXY_ysMappedToXs()

ptwXPoints * ptwXY_ysMappedToXs ( statusMessageReporting * smr,
ptwXYPoints * ptwXY,
ptwXPoints * Xs,
int64_t * offset )

Definition at line 44 of file ptwXY_convenient.c.

44 {
45
46 int64_t iXY, iX, nXY = ptwXY_length( NULL, ptwXY ), nX = ptwX_length( NULL, Xs );
47 ptwXYPoint *point1, *point2;
48 ptwXY_interpolation interpolation = ptwXY_getInterpolation( ptwXY );
49 ptwXPoints *Ys = NULL;
50
51 *offset = 0;
52
53 if( ptwXY_simpleCoalescePoints( smr, ptwXY ) != nfu_Okay ) {
55 return( NULL );
56 }
57
58 if( Xs->status != nfu_Okay ) {
59 smr_setReportError2p( smr, nfu_SMR_libraryID, nfu_badSelf, "Invalid destination." );
60 return( NULL );
61 }
62
63 if( ( nXY == 1 ) || ( nX == 1 ) ) {
64 smr_setReportError2( smr, nfu_SMR_libraryID, nfu_tooFewPoints, "number of points less than 2: %lld %lld", nXY, nX );
65 return( NULL );
66 }
67
68 if( ( nXY == 0 ) || ( nX == 0 ) ) {
69 if( ( Ys = ptwX_new( smr, 0 ) ) == NULL ) {
71 return( NULL );
72 }
73 return( Ys );
74 }
75
76 point1 = &ptwXY->points[0];
77 point2 = &ptwXY->points[nXY-1];
78
79 for( iX = 0; iX < nX; ++iX ) {
80 if( Xs->points[iX] >= point1->x ) break;
81 }
82 *offset = iX;
83
84 for( iX = 0; iX < nX; ++iX ) {
85 if( Xs->points[iX] > point2->x ) break;
86 }
87 nX = iX;
88 iX = *offset;
89
90 if( ( Ys = ptwX_new( smr, nX - iX ) ) == NULL ) {
92 return( NULL );
93 }
94 if( nX - iX < 2 ) return( Ys );
95
96 for( iXY = 1; iXY < nXY; ++iXY ) {
97 point2 = &ptwXY->points[iXY];
98 if( point2->x >= Xs->points[iX] ) break;
99 point1 = point2;
100 }
101
102 for( ; iXY < nXY; ++iXY ) {
103 point2 = &ptwXY->points[iXY];
104
105 while( iX < nX ) {
106 double xValue = Xs->points[iX], yValue;
107
108 if( xValue > point2->x ) break;
109
110 if( ptwXY_interpolatePoint( smr, interpolation, xValue, &yValue, point1->x, point1->y, point2->x, point2->y ) != nfu_Okay ) {
112 ptwX_free( Ys );
113 return( NULL );
114 }
115 if( ptwX_setPointAtIndex( smr, Ys, ptwX_length( NULL, Ys ), yValue ) != nfu_Okay ) {
117 ptwX_free( Ys );
118 return( NULL );
119 }
120 ++iX;
121 }
122 point1 = point2;
123 }
124
125 return( Ys );
126}