Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
GIDI_settings_flux.cc
Go to the documentation of this file.
1/*
2# <<BEGIN-copyright>>
3# Copyright 2019, Lawrence Livermore National Security, LLC.
4# This file is part of the gidiplus package (https://github.com/LLNL/gidiplus).
5# gidiplus is licensed under the MIT license (see https://opensource.org/licenses/MIT).
6# SPDX-License-Identifier: MIT
7# <<END-copyright>>
8*/
9
10#include <iostream>
11#include <stdio.h>
12#include <stdlib.h>
13
14#include "GIDI.hpp"
15
16#include <ptwX.h>
17#include <ptwXY.h>
18
19namespace GIDI {
20
21namespace Transporting {
22
23/*! \class Flux_order
24 * Specifies the flux data for a specified Legendre order (see class Flux).
25 */
26
27/* *********************************************************************************************************//**
28 * @param a_order [in] The Legendre order of the flux data.
29 * @param a_length [in] The number of *a_energies* values.
30 * @param a_energies [in] The list of energies that the flux *a_fluxes* are given at.
31 * @param a_fluxes [in] The flux for this Legendre order.
32 ***********************************************************************************************************/
33
34Flux_order::Flux_order( std::size_t a_order, std::size_t a_length, double const *a_energies, double const *a_fluxes ) :
35 m_order( a_order ) {
36
37 for( std::size_t i1 = 0; i1 < a_length; ++i1 ) m_energies.push_back( a_energies[i1] );
38 for( std::size_t i1 = 0; i1 < a_length; ++i1 ) m_fluxes.push_back( a_fluxes[i1] );
39}
40
41/* *********************************************************************************************************//**
42 * @param a_order [in] The Legendre order of the flux data.
43 * @param a_energies [in] The list of energies that the flux *a_fluxes* are given at.
44 * @param a_fluxes [in] The flux for this Legendre order.
45 ***********************************************************************************************************/
46
47Flux_order::Flux_order( std::size_t a_order, std::vector<double> const &a_energies, std::vector<double> const &a_fluxes ) :
48 m_order( a_order ),
49 m_energies( a_energies ),
50 m_fluxes( a_fluxes ) {
51
52 if( a_energies.size( ) != a_fluxes.size( ) ) throw Exception( "Flux_order::Flux_order: a_energies.size( ) != a_fluxes.size( )." );
53}
54
55/* *********************************************************************************************************//**
56 * @param a_fluxOrder [in] The flux order to copy.
57 ***********************************************************************************************************/
58
59Flux_order::Flux_order( Flux_order const &a_fluxOrder ) :
60 m_order( a_fluxOrder.order( ) ),
61 m_energies( a_fluxOrder.v_energies( ) ),
62 m_fluxes( a_fluxOrder.v_fluxes( ) ) {
63
64}
65
66/* *********************************************************************************************************//**
67 ***********************************************************************************************************/
68
72
73/* *********************************************************************************************************//**
74 * Print the Flux_order to std::cout. Mainly for debugging.
75 *
76 * @param a_valuesPerLine [in] The number of points (i.e., energy, flux pairs) to print per line.
77 ***********************************************************************************************************/
78
79void Flux_order::print( unsigned int a_valuesPerLine ) const {
80
81 auto nE = m_energies.size( );
82 bool printIndent = true;
83
84 std::cout << " ORDER: " << m_order << " (number of points = " << m_energies.size( ) << ")" << std::endl;
85 for( std::size_t iE = 0; iE < nE; ++iE ) {
86 if( printIndent ) std::cout << " ";
87 printIndent = false;
88 std::string buffer = LUPI::Misc::argumentsToString( " %15.8e %15.8e", m_energies[iE], m_fluxes[iE] );
89 std::cout << buffer;
90 if( ( ( iE + 1 ) % a_valuesPerLine ) == 0 ) {
91 std::cout << std::endl;
92 printIndent = true;
93 }
94 }
95 if( nE % a_valuesPerLine ) std::cout << std::endl;
96}
97
98/*! \class Flux
99 * Specifies the flux data as a list of Flux_order's.
100 */
101
102/* *********************************************************************************************************//**
103 * @param a_label [in] The label for the flux.
104 * @param a_temperature [in] The temperature the
105 ***********************************************************************************************************/
106
107Flux::Flux( std::string const &a_label, double a_temperature ) :
108 m_label( a_label ),
109 m_temperature( a_temperature ) {
110
111}
112
113/* *********************************************************************************************************//**
114 * @param a_label [in] The label for the flux.
115 * @param a_temperature [in] The temperature the
116 ***********************************************************************************************************/
117
118Flux::Flux( char const *a_label, double a_temperature ) :
119 m_label( a_label ),
120 m_temperature( a_temperature ) {
121
122}
123
124/* *********************************************************************************************************//**
125 * @param a_flux [in] The Flux to copy.
126 ***********************************************************************************************************/
127
128Flux::Flux( Flux const &a_flux ) :
129 m_label( a_flux.label( ) ),
130 m_temperature( a_flux.temperature( ) ) {
131
132 for( std::size_t i1 = 0; i1 <= a_flux.maxOrder( ); ++i1 ) { addFluxOrder( a_flux[i1] ); }
133}
134
135/* *********************************************************************************************************//**
136 ***********************************************************************************************************/
137
139
140}
141
142/* *********************************************************************************************************//**
143 * Adds a Flux_order. The Flux_order's must be added sequentially.
144 *
145 * @param a_fluxOrder [in] The Flux_order to add to *this*.
146 ***********************************************************************************************************/
147
148void Flux::addFluxOrder( Flux_order const &a_fluxOrder ) {
149/*
150* Orders can only be added in sequence (e.g., 0 first, then 1, ...).
151*/
152 auto order = a_fluxOrder.order( );
153
154 if( order > m_fluxOrders.size( ) ) throw Exception( "Flux::addFluxOrder: order > m_fluxOrders.size( )." );
155 m_fluxOrders.push_back( a_fluxOrder );
156}
157
158/* *********************************************************************************************************//**
159 * Multi-groups the flux and returns the result.
160 *
161 * @param a_multiGroup [in] The Flux to copy.
162 * @return [in] The Multi-group flux.
163 ***********************************************************************************************************/
164
165ProcessedFlux Flux::process( std::vector<double> const &a_multiGroup ) const {
166/*
167 Currently only does l=0 flux.
168*/
169 std::size_t i1 = 0;
170 std::vector<double> groupedFlux;
171
172 int64_t size = static_cast<int64_t>( a_multiGroup.size( ) );
173 ptwXPoints *boundaries = ptwX_create( nullptr, size, size, &(a_multiGroup[0]) );
174 if( boundaries == nullptr ) throw Exception( "ptwX_create failted for boundaries." );
175
176 for( ; i1 < 1; ++i1 ) { // only do l=0 currenlty hence ' i1 < 1' test.
177 Flux_order const *__fluxOrder = &(m_fluxOrders[i1]);
179 10, 1e-3, 10, 10, static_cast<int64_t>( __fluxOrder->size( ) ), __fluxOrder->energies( ),
180 __fluxOrder->fluxes( ), 0 );
181 if( __flux == nullptr ) throw Exception( "ptwXY_createFrom_Xs_Ys failed for __flux." );
182
183 ptwXPoints *groupedFluxX = ptwXY_groupOneFunction( nullptr, __flux, boundaries, ptwXY_group_normType_none, nullptr );
184 if( groupedFluxX == nullptr ) throw Exception( "ptwXY_groupOneFunction failed for groupedFluxX." );
185
186 for( int i2 = 0; i2 < ptwX_length( nullptr, groupedFluxX ); ++i2 ) groupedFlux.push_back( ptwX_getPointAtIndex_Unsafely( groupedFluxX, i2 ) );
187
188 ptwX_free( groupedFluxX );
189 ptwXY_free( __flux );
190 }
191 ptwX_free( boundaries );
192
193 return( ProcessedFlux( temperature( ), groupedFlux ) );
194}
195
196/* *********************************************************************************************************//**
197 * Print the Flux to std::cout. Mainly for debugging.
198 *
199 * @param a_indent [in] The std::string to print at the beginning.
200 * @param a_outline [in] If true, does not print the flux values.
201 * @param a_valuesPerLine [in] The number of points (i.e., energy, flux pairs) to print per line.
202 ***********************************************************************************************************/
203
204void Flux::print( std::string const &a_indent, bool a_outline, unsigned int a_valuesPerLine ) const {
205
206 std::cout << a_indent << "FLUX: label = '" << m_label << "': maximum order = " << ( size( ) - 1 ) << std::endl;
207 if( a_outline ) return;
208 for( std::vector<Flux_order>::const_iterator iter = m_fluxOrders.begin( ); iter < m_fluxOrders.end( ); ++iter )
209 iter->print( a_valuesPerLine );
210}
211
212
213/*! \class Fluxes_from_bdfls
214 * Specifies the flux data for a specified Legendre order (see class Flux).
215 */
216
217/* *********************************************************************************************************//**
218 * Reads in fluxes from a *bdfls* file as a list of Flux instances.
219 *
220 * @param a_fileName [in] The bdfls file name.
221 * @param a_temperature_MeV [in] The temperature to assign to the read fluxes.
222 ***********************************************************************************************************/
223
224Fluxes_from_bdfls::Fluxes_from_bdfls( std::string const &a_fileName, double a_temperature_MeV = 0 ) {
225
226 initialize( a_fileName.c_str( ), a_temperature_MeV );
227}
228
229/* *********************************************************************************************************//**
230 * Reads in fluxes from a *bdfls* file as a list of Flux instances.
231 *
232 * @param a_fileName [in] The bdfls file name.
233 * @param a_temperature_MeV [in] The temperature to assign to the read fluxes.
234 ***********************************************************************************************************/
235
236Fluxes_from_bdfls::Fluxes_from_bdfls( char const *a_fileName, double a_temperature_MeV = 0 ) {
237
238 initialize( a_fileName, a_temperature_MeV );
239}
240
241/* *********************************************************************************************************//**
242 * Used by constructors to do most of the work.
243 *
244 * @param a_fileName [in] The bdfls file name.
245 * @param a_temperature_MeV [in] The temperature to assign to the read fluxes.
246 ***********************************************************************************************************/
247
248void Fluxes_from_bdfls::initialize( char const *a_fileName, double a_temperature_MeV ) {
249
250 char buffer[132], *pEnd, cValue[16];
251 std::size_t numberOfValuesInOrders[16];
252 FILE *fIn = fopen( a_fileName, "r" );
253 if( fIn == nullptr ) throw Exception( "Fluxes_from_bdfls::initialize: Could not open bdfls file." );
254
255 while( true ) { // Skip over groups.
256 if( fgets( buffer, 132, fIn ) == nullptr ) throw Exception( "Fluxes_from_bdfls::initialize: fgets failed for fid." );
257 if( strlen( buffer ) > 73 ) {
258 if( buffer[72] == '1' ) break;
259 }
260 }
261
262 while( true ) {
263 int fid( -1 );
264 if( fgets( buffer, 132, fIn ) == nullptr ) throw Exception( "Fluxes_from_bdfls::initialize: fgets failed for fid." );
265 if( strlen( buffer ) > 73 ) {
266 if( buffer[72] == '1' ) break;
267 }
268 fid = (int) strtol( buffer, &pEnd, 10 );
269 if( fid == -1 ) throw Exception( "Fluxes_from_bdfls::initialize: converting fid to long failed." );
270 std::string label( LLNL_fidToLabel( fid ) );
271 Flux flux( label, a_temperature_MeV );
272
273 long maximumFluxOrder2( -1 );
274 if( fgets( buffer, 132, fIn ) == nullptr ) throw Exception( "Fluxes_from_bdfls::initialize: fgets failed for maximumFluxOrder." );
275 maximumFluxOrder2 = strtol( buffer, &pEnd, 10 );
276 std::size_t maximumFluxOrder = static_cast<std::size_t>( maximumFluxOrder2 );
277 if( static_cast<long>( maximumFluxOrder ) != maximumFluxOrder2 ) throw Exception( "Fluxes_from_bdfls::initialize: converting maximumFluxOrder to long failed." );
278 if( maximumFluxOrder >= (long) ( sizeof( numberOfValuesInOrders ) / sizeof( numberOfValuesInOrders[0] ) ) )
279 throw Exception( "Fluxes_from_bdfls::initialize: need to increase size of numberOfValuesInOrders" );
280
281 for( std::size_t order = 0; order <= maximumFluxOrder; ++order ) {
282 long numberOfValuesInOrders2 = -1;
283 if( fgets( buffer, 132, fIn ) == nullptr ) throw Exception( "Fluxes_from_bdfls::initialize: fgets failed for maximumFluxOrders." );
284 numberOfValuesInOrders2 = strtol( buffer, &pEnd, 10 );
285 if( numberOfValuesInOrders2 == -1 ) throw Exception( "Fluxes_from_bdfls::initialize: converting numberOfValuesInOrders[order] to long failed." );
286 numberOfValuesInOrders[order] = static_cast<std::size_t>( numberOfValuesInOrders2 ) / 2;
287 }
288
289 for( std::size_t order = 0; order <= maximumFluxOrder; ++order ) {
290 std::size_t index = 0;
291 long numberOfValuesInOrder = 2 * static_cast<long>( numberOfValuesInOrders[order] );
292 std::vector<double> energiesAndFluxes( static_cast<std::size_t>( numberOfValuesInOrder ) );
293 while( numberOfValuesInOrder > 0 ) {
294 std::size_t n1 = 6;
295 if( numberOfValuesInOrder < 6 ) n1 = static_cast<std::size_t>( numberOfValuesInOrder );
296 if( fgets( buffer, 132, fIn ) == nullptr ) throw Exception( "Fluxes_from_bdfls::initialize: fgets failed for energies/fluxes." );
297 for( std::size_t i1 = 0; i1 < n1; ++i1, ++index ) {
298 strncpy( cValue, &buffer[12*i1], 12 );
299 cValue[12] = 0;
300 energiesAndFluxes[index] = strtod( cValue, &pEnd );
301 }
302 numberOfValuesInOrder -= static_cast<long>( n1 );
303 }
304
305 std::vector<double> energies( numberOfValuesInOrders[order] );
306 std::vector<double> fluxes( numberOfValuesInOrders[order] );
307 for( index = 0; index < numberOfValuesInOrders[order]; ++index ) {
308 energies[index] = energiesAndFluxes[2*index];
309 fluxes[index] = energiesAndFluxes[2*index+1];
310 }
311
312 Flux_order flux_order( order, energies, fluxes );
313 flux.addFluxOrder( flux_order );
314 }
315 m_fluxes.push_back( flux );
316 }
317
318 fclose( fIn );
319}
320
321/* *********************************************************************************************************//**
322 ***********************************************************************************************************/
323
327
328/* *********************************************************************************************************//**
329 * Returns the Flux instance whose *fid* is *a_fid*.
330 *
331 * @param a_fid [in] The *fid* of the Flux to return.
332 * @return Returns the Flux whose *fid* is *a_fid*.
333 ***********************************************************************************************************/
334
336
337 std::string label( LLNL_fidToLabel( a_fid ) );
338
339 for( std::size_t if1 = 0; if1 < m_fluxes.size( ); ++if1 ) {
340 if( m_fluxes[if1].label( ) == label ) return( m_fluxes[if1] );
341 }
342 throw Exception( "Fluxes_from_bdfls::getViaFID: fid not found." );
343}
344
345/* *********************************************************************************************************//**
346 * Returns the 3-d function flux f(T,E,mu) whose *fid* is *a_fid*. In f(T,E,mu), T is the temperature, E is the projectile'e energy
347 * and mu is the cos(theta) where theta is measured relative to the projectile velocity.
348 *
349 * @param a_fid [in] The *fid* of the Flux to return.
350 * @return Returns the 3-d function flux f(T,E,mu).
351 ***********************************************************************************************************/
352
354
355 Flux flux = getViaFID( a_fid );
356
357 Axes axes;
358 axes.append( new Axis( 3, "temperature", "MeV/k" ) );
359 axes.append( new Axis( 2, "energy_in", "MeV" ) );
360 axes.append( new Axis( 1, "mu", "" ) );
361 axes.append( new Axis( 0, "flux", "1/s" ) );
362
363 Functions::XYs3d *xys3d = new Functions::XYs3d( axes, ptwXY_interpolationLinLin, 0, flux.temperature( ) );
365
366 xys3d->setLabel( flux.label( ) );
367
368 std::vector<double> const &energies = flux[0].v_energies( );
369 for( std::size_t i1 = 0; i1 < energies.size( ); ++i1 ) {
370 Functions::Legendre1d *legendre1d = new Functions::Legendre1d( axes, 0, energies[i1] );
371 std::vector<double> &coefficients = legendre1d->coefficients( );
372
373 for( std::size_t i2 = 0; i2 < flux.size( ); ++i2 ) coefficients.push_back( flux[i2].fluxes( )[i1] );
374 xys2d->append( legendre1d );
375 }
376 xys3d->append( xys2d );
377
378 return( xys3d );
379}
380
381/* *********************************************************************************************************//**
382 * Returns a list of *fid* strings (i.e., labels) for the Flux's read in from *bdfls* file.
383 *
384 * @return The list of *fid*'s.
385 ***********************************************************************************************************/
386
387std::vector<std::string> Fluxes_from_bdfls::labels( ) const {
388
389 auto size = m_fluxes.size( );
390 std::vector<std::string> _labels( size );
391
392 for( std::size_t if1 = 0; if1 < size; ++if1 ) _labels[if1] = m_fluxes[if1].label( );
393 return( _labels );
394}
395
396/* *********************************************************************************************************//**
397 * Returns a list of integer *fid* for the Flux's read in from *bdfls* file.
398 *
399 * @return The list of *fid*'s.
400 ***********************************************************************************************************/
401
402std::vector<int> Fluxes_from_bdfls::FIDs( ) const {
403
404 auto size = m_fluxes.size( );
405 std::vector<int> fids( size );
406 char *e;
407
408 for( std::size_t if1 = 0; if1 < size; ++if1 ) {
409 fids[if1] = (int) strtol( &(m_fluxes[if1].label( ).c_str( )[9]), &e, 10 );
410 }
411 return( fids );
412}
413
414/* *********************************************************************************************************//**
415 * Print the list of Flux's to std::cout. Mainly for debugging.
416 *
417 * @param a_outline [in] Passed to other *print* methods.
418 * @param a_valuesPerLine [in] Passed to other *print* methods.
419 ***********************************************************************************************************/
420
421void Fluxes_from_bdfls::print( bool a_outline, unsigned int a_valuesPerLine ) const {
422
423 auto nfs = m_fluxes.size( );
424
425 std::cout << "BDFLS FLUXes: number of fluxes = " << nfs << std::endl;
426 for( std::size_t if1 = 0; if1 < nfs ; ++if1 ) m_fluxes[if1].print( " ", a_outline, a_valuesPerLine );
427}
428
429}
430
431/* *********************************************************************************************************//**
432 * Convert a flux in the form of a Function3dForm into those needed by Settings methods. Currently only works for
433 * XYs3d which contains a list of XYs2d which each contain a list of Legendre instances.
434 *
435 * @param a_function3d [in] A Function3dForm instance.
436 * @return The list of Transporting::Flux * instances.
437 ***********************************************************************************************************/
438
439std::vector<Transporting::Flux> settingsFluxesFromFunction3d( Functions::Function3dForm const &a_function3d ) {
440
441 if( a_function3d.type( ) != FormType::XYs3d ) throw Exception( "Currently, only a 3d function of type XYs3d is supported." );
442
443 Functions::XYs3d const &xys3d = static_cast<Functions::XYs3d const &>( a_function3d );
444 std::vector<Functions::Function2dForm *> const function2ds = xys3d.function2ds( );
445 std::vector<Transporting::Flux> fluxes;
446
447 for( std::size_t i1 = 0; i1 < function2ds.size( ); ++i1 ) {
448 Functions::Function2dForm const &function2d = *function2ds[i1];
449
450 if( function2d.type( ) != FormType::XYs2d ) throw Exception( "Currently, only a 2d function of type XYs2d is supported for flux f(E,mu)." );
451
452 Functions::XYs2d const &xys2d = static_cast<Functions::XYs2d const &>( function2d );
453 std::vector<Functions::Function1dForm *> const &function1ds = xys2d.function1ds( );
454
455 Transporting::Flux flux( a_function3d.label( ), xys2d.outerDomainValue( ) );
456 std::size_t maxOrder = 0;
457 std::vector<double> energies;
458 std::vector< std::vector<double> > fluxMatrix;
459
460 for( std::size_t i2 = 0; i2 < function1ds.size( ); ++i2 ) {
461 Functions::Function1dForm const &function1d = *function1ds[i2];
462
463 if( function1d.type( ) != FormType::Legendre1d ) throw Exception( "Currently, only a 1d function of type Legendre1d is supported for flux f(mu)." );
464
465 Functions::Legendre1d const &legendre1d = static_cast<Functions::Legendre1d const &>( function1d );
466
467 energies.push_back( legendre1d.outerDomainValue( ) );
468 std::vector<double> &coefficients = const_cast< std::vector<double> &>( legendre1d.coefficients( ) );
469 if( maxOrder < coefficients.size( ) ) maxOrder = coefficients.size( );
470 fluxMatrix.push_back( coefficients );
471 }
472
473 for( std::size_t order = 0; order < maxOrder; ++order ) {
474 std::vector<double> energyFluxAtOrder;
475
476 for( std::size_t i2 = 0; i2 < function1ds.size( ); ++i2 ) {
477 energyFluxAtOrder.push_back( 0.0 );
478 if( order < fluxMatrix[i2].size( ) ) energyFluxAtOrder[i2] = fluxMatrix[i2][order];
479 }
480
481 Transporting::Flux_order fluxOrder( order, energies, energyFluxAtOrder );
482 flux.addFluxOrder( fluxOrder );
483 }
484
485 fluxes.push_back( flux );
486 }
487
488 return( fluxes );
489}
490
491}
void append(Axis *a_axis)
Definition GIDI.hpp:876
std::string const & label() const
Definition GIDI.hpp:658
FormType type() const
Definition GIDI.hpp:667
void setLabel(std::string const &a_label)
Definition GIDI_form.cc:114
double outerDomainValue() const
Definition GIDI.hpp:1010
std::vector< double > const & coefficients() const
Definition GIDI.hpp:1225
void append(Function1dForm *a_function1d)
std::vector< Function1dForm * > const & function1ds() const
Definition GIDI.hpp:1560
void append(Function2dForm *a_function2d)
std::vector< Function2dForm * > const & function2ds() const
Definition GIDI.hpp:1951
std::size_t size() const
Definition GIDI.hpp:3554
double const * fluxes() const
Definition GIDI.hpp:3557
std::vector< double > const & v_fluxes() const
Definition GIDI.hpp:3558
std::size_t order() const
Definition GIDI.hpp:3553
void print(unsigned int a_valuesPerLine=10) const
double const * energies() const
Definition GIDI.hpp:3555
std::vector< double > const & v_energies() const
Definition GIDI.hpp:3556
Flux_order(std::size_t a_order, std::size_t a_length, double const *a_energies, double const *a_fluxes)
Flux(std::string const &a_label, double a_temperature_MeV)
ProcessedFlux process(std::vector< double > const &a_multiGroup) const
std::string const & label() const
Definition GIDI.hpp:3585
void print(std::string const &a_indent, bool a_outline=true, unsigned int a_valuesPerLine=10) const
std::size_t size() const
Definition GIDI.hpp:3583
std::size_t maxOrder() const
Definition GIDI.hpp:3582
double temperature() const
Definition GIDI.hpp:3586
void addFluxOrder(Flux_order const &a_fluxOrder)
void print(bool a_outline=true, unsigned int a_valuesPerLine=10) const
std::vector< std::string > labels() const
Fluxes_from_bdfls(std::string const &a_fileName, double a_temperature_MeV)
Functions::XYs3d * get3dViaFID(int a_fid) const
Definition GIDI.hpp:32
std::string LLNL_fidToLabel(int a_fid)
Definition GIDI_misc.cc:324
std::vector< Transporting::Flux > settingsFluxesFromFunction3d(Functions::Function3dForm const &a_function3d)
std::string argumentsToString(char const *a_format,...)
Definition LUPI_misc.cc:305
char const * ptwXY_interpolationToString(ptwXY_interpolation interpolation)
@ ptwXY_group_normType_none
Definition ptwXY.h:31
@ ptwXY_interpolationLinLin
Definition ptwXY.h:37
struct ptwXYPoints_s ptwXYPoints
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
ptwXYPoints * ptwXY_free(ptwXYPoints *ptwXY)
Definition ptwXY_core.c:782
ptwXPoints * ptwXY_groupOneFunction(statusMessageReporting *smr, ptwXYPoints *ptwXY, ptwXPoints *groupBoundaries, ptwXY_group_normType normType, ptwXPoints *ptwX_norm)
int64_t ptwX_length(statusMessageReporting *smr, ptwXPoints *ptwX)
Definition ptwX_core.c:222
double ptwX_getPointAtIndex_Unsafely(ptwXPoints *ptwX, int64_t index)
Definition ptwX_core.c:297
struct ptwXPoints_s ptwXPoints
ptwXPoints * ptwX_create(statusMessageReporting *smr, int64_t size, int64_t length, double const *xs)
Definition ptwX_core.c:54
ptwXPoints * ptwX_free(ptwXPoints *ptwX)
Definition ptwX_core.c:213