Files
geant4/source/processes/hadronic/models/lend/src/GIDI_form.cc
T
2025-12-05 08:54:02 +01:00

564 lines
29 KiB
C++

/*
# <<BEGIN-copyright>>
# Copyright 2019, Lawrence Livermore National Security, LLC.
# This file is part of the gidiplus package (https://github.com/LLNL/gidiplus).
# gidiplus is licensed under the MIT license (see https://opensource.org/licenses/MIT).
# SPDX-License-Identifier: MIT
# <<END-copyright>>
*/
#include <stdlib.h>
#include "GIDI.hpp"
#include <HAPI.hpp>
namespace GIDI {
/*! \class Form
* Base class inherited by most other GIDI classes. Mainly contains **label** and **type** members.
*/
/* *********************************************************************************************************//**
*
* @param a_type [in] The *FormType* the class represents.
***********************************************************************************************************/
Form::Form( FormType a_type ) :
GUPI::Ancestry( "" ),
m_parent( nullptr ),
m_type( a_type ),
m_keyName( GIDI_labelChars ) {
}
/* *********************************************************************************************************//**
* @param a_moniker [in] The moniker for *this*.
* @param a_type [in] The *FormType* the class represents.
* @param a_label [in] The label for *this*.
***********************************************************************************************************/
Form::Form( std::string const &a_moniker, FormType a_type, std::string const &a_label ) :
GUPI::Ancestry( a_moniker ),
m_parent( nullptr ),
m_type( a_type ),
m_keyName( GIDI_labelChars ),
m_label( a_label ) {
}
/* *********************************************************************************************************//**
*
* @param a_node [in] The **HAPI::Node** to be parsed and used to construct the XYs2d.
* @param a_setupInfo [in] Information create my the Protare constructor to help in parsing.
* @param a_type [in] The *FormType* the class represents.
* @param a_parent [in] The parent GIDI::Suite.
***********************************************************************************************************/
Form::Form( HAPI::Node const &a_node, LUPI_maybeUnused SetupInfo &a_setupInfo, FormType a_type, Suite *a_parent ) :
GUPI::Ancestry( a_node.name( ) ),
m_parent( a_parent ),
m_type( a_type ),
m_keyName( GIDI_labelChars ),
m_label( a_node.attribute_as_string( GIDI_labelChars ) ) {
}
/* *********************************************************************************************************//**
* @param a_form [in] The Form to copy.
***********************************************************************************************************/
Form::Form( Form const &a_form ) :
GUPI::Ancestry( a_form.moniker( ), a_form.attribute( ) ),
m_parent( nullptr ),
m_type( a_form.type( ) ),
m_keyName( a_form.keyName( ) ),
m_keyValue( a_form.keyValue( ) ),
m_label( a_form.label( ) ) {
}
/* *********************************************************************************************************//**
***********************************************************************************************************/
Form::~Form( ) {
}
/* *********************************************************************************************************//**
* The assignment operator. This method sets the members of *this* to those of *a_rhs* except for
* the member *m_parent* which is set to **nullptr** and those not set by base classes.
*
* @param a_rhs [in] Instance whose member are used to set the members of *this*.
***********************************************************************************************************/
Form &Form::operator=( Form const &a_rhs ) {
if( this != &a_rhs ) {
GUPI::Ancestry::operator=( a_rhs );
m_parent = nullptr;
m_type = a_rhs.type( );
m_keyName = a_rhs.keyName( );
m_keyValue = a_rhs.keyValue( );
m_label = a_rhs.label( );
}
return( *this );
}
/* *********************************************************************************************************//**
* Set the *m_label* member per *a_label*. Also, if *m_keyName* is "label", calls **setKeyValue**.
*
* @param a_label [in] The value of the label.
***********************************************************************************************************/
void Form::setLabel( std::string const &a_label ) {
m_label = a_label;
if( m_keyName == GIDI_labelChars ) setKeyValue( GIDI_labelChars );
}
/* *********************************************************************************************************//**
* Returns a *const* reference to the *m_keyName* member.
*
* @return The name of the key for *this*.
***********************************************************************************************************/
std::string const &Form::keyName( ) const {
return( m_keyName );
}
/* *********************************************************************************************************//**
* Set the *m_keyName* member to *a_keyName* and calls setKeyValue.
*
* @param a_keyName [in] The value of the key name.
***********************************************************************************************************/
void Form::setKeyName( std::string const &a_keyName ) {
m_keyName = a_keyName;
setKeyValue( m_keyName );
}
/* *********************************************************************************************************//**
* Returns a *const* reference to the *m_keyValue* member.
*
* @return The value of the key for *this*.
***********************************************************************************************************/
std::string const &Form::keyValue( ) const {
if( m_keyValue == "" ) setKeyValue( m_keyName );
return( m_keyValue );
}
/* *********************************************************************************************************//**
* Set the *m_keyValue* per the *a_keyName* name. This method assumes that *a_keyName* is "label". Otherwise, it executes a throw.
*
* @param a_keyName [in] The name of the key whose value is set.
***********************************************************************************************************/
void Form::setKeyValue( std::string const &a_keyName ) const {
if( a_keyName != GIDI_labelChars ) throw Exception( "Form::setKeyValue: unsupported keyname \"" + a_keyName + "\"." );
m_keyValue = m_label;
}
/* *********************************************************************************************************//**
* Returns the sibling of *this* with label *a_label*.
*
* @param a_label [in] The label of the sibling to find.
* @return The sibling with label *a_label*.
***********************************************************************************************************/
Form const *Form::sibling( std::string a_label ) const {
Form *_form;
try {
_form = ((*parent( )).get<Form>( a_label ) ); }
catch (...) {
return( nullptr );
}
return( _form );
}
namespace Functions {
/*! \class FunctionForm
* Base class inherited by other GIDI function classes.
*/
/* *********************************************************************************************************//**
* @param a_moniker [in] The moniker for *this*.
* @param a_type [in] The *FormType* the class represents.
* @param a_dimension [in] The dimension of the function.
* @param a_interpolation [in] The interpolation along the outer most independent axis and the dependent axis.
* @param a_index [in] Currently not used.
* @param a_outerDomainValue [in] If embedded in a higher dimensional function, the value of the domain of the next higher dimension.
***********************************************************************************************************/
FunctionForm::FunctionForm( std::string const &a_moniker, FormType a_type, int a_dimension, ptwXY_interpolation a_interpolation,
int a_index, double a_outerDomainValue ) :
Form( a_moniker, a_type, "" ),
m_dimension( a_dimension ),
m_interpolation( a_interpolation ),
m_index( a_index ),
m_outerDomainValue( a_outerDomainValue ) {
m_interpolationString = ptwXY_interpolationToString( m_interpolation );
}
/* *********************************************************************************************************//**
* @param a_moniker [in] The moniker for *this*.
* @param a_type [in] The *FormType* the class represents.
* @param a_dimension [in] The dimension of the function.
* @param a_axes [in] The axes for the function.
* @param a_interpolation [in] The interpolation along the outer most independent axis and the dependent axis.
* @param a_index [in] Currently not used.
* @param a_outerDomainValue [in] If embedded in a higher dimensional function, the value of the domain of the next higher dimension.
***********************************************************************************************************/
FunctionForm::FunctionForm( std::string const &a_moniker, FormType a_type, int a_dimension, Axes const &a_axes, ptwXY_interpolation a_interpolation,
int a_index, double a_outerDomainValue ) :
Form( a_type ),
m_dimension( a_dimension ),
m_axes( a_axes ),
m_interpolation( a_interpolation ),
m_index( a_index ),
m_outerDomainValue( a_outerDomainValue ) {
setMoniker( a_moniker );
m_interpolationString = ptwXY_interpolationToString( m_interpolation );
m_axes.setAncestor( this );
}
/* *********************************************************************************************************//**
* @param a_construction [in] Used to pass user options to the constructor.
* @param a_node [in] The **HAPI::Node** to be parsed and used to construct the FunctionForm.
* @param a_setupInfo [in] Information create my the Protare constructor to help in parsing.
* @param a_type [in] The *FormType* the class represents.
* @param a_dimension [in] The dimension of the function.
* @param a_suite [in] The parent GIDI::Suite.
***********************************************************************************************************/
FunctionForm::FunctionForm( LUPI_maybeUnused Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo,
FormType a_type, int a_dimension, Suite *a_suite ) :
Form( a_node, a_setupInfo, a_type, a_suite ),
m_dimension( a_dimension ),
m_axes( a_node.child( GIDI_axesChars ), a_setupInfo, 0 ),
m_interpolation( ptwXY_interpolationLinLin ),
m_index( 0 ),
m_outerDomainValue( 0.0 ) {
m_interpolationString = a_node.attribute_as_string( GIDI_interpolationChars );
m_interpolation = ptwXY_stringToInterpolation( m_interpolationString.c_str( ) );
if( m_interpolation != ptwXY_interpolationOther ) m_interpolationString = ptwXY_interpolationToString( m_interpolation );
if( strcmp( a_node.attribute_as_string( GIDI_indexChars ).c_str( ), "" ) != 0 ) m_index = a_node.attribute_as_int( GIDI_indexChars );
if( strcmp( a_node.attribute_as_string( GIDI_outerDomainValueChars ).c_str( ), "" ) != 0 ) m_outerDomainValue = a_node.attribute_as_double( GIDI_outerDomainValueChars );
}
/* *********************************************************************************************************//**
* @param a_form [in] The FunctionForm to copy.
***********************************************************************************************************/
FunctionForm::FunctionForm( FunctionForm const &a_form ) :
Form( a_form ),
m_dimension( a_form.dimension( ) ),
m_axes( a_form.axes( ) ),
m_interpolation( a_form.interpolation( ) ),
m_interpolationString( a_form.interpolationString( ) ),
m_index( a_form.index( ) ),
m_outerDomainValue( a_form.outerDomainValue( ) ) {
}
/* *********************************************************************************************************//**
***********************************************************************************************************/
FunctionForm::~FunctionForm( ) {
}
/* *********************************************************************************************************//**
* The assignment operator. This method sets the members of *this* to those of *a_rhs* except for those
* not set by base classes.
*
* @param a_rhs [in] Instance whose member are used to set the members of *this*.
***********************************************************************************************************/
FunctionForm &FunctionForm::operator=( FunctionForm const &a_rhs ) {
if( this != &a_rhs ) {
Form::operator=( a_rhs );
m_dimension = a_rhs.dimension( );
m_axes = a_rhs.axes( );
m_interpolation = a_rhs.interpolation( );
m_interpolationString = a_rhs.interpolationString( );
m_index = a_rhs.index( );
m_outerDomainValue = a_rhs.outerDomainValue( );
}
return( *this );
}
/* *********************************************************************************************************//**
* This method sets the integer (i.e., *ptwXY_interpolation*) interpolation value of **m_interpolation** to
* **a_interpolation**. This method also sets the **m_interpolationString** member per **a_interpolation**.
*
* @param a_interpolation [in] The *ptwXY_interpolation* integer value of the interpolaction.
***********************************************************************************************************/
void FunctionForm::setInterpolation( ptwXY_interpolation a_interpolation ) {
m_interpolation = a_interpolation;
m_interpolationString = ptwXY_interpolationToString( m_interpolation );
}
/* *********************************************************************************************************//**
* Fills the argument *a_writeInfo* with the XML lines that represent *this*. Recursively enters each sub-node.
*
* @param a_writeInfo [in/out] Instance containing incremental indentation and other information and stores the appended lines.
* @param a_indent [in] The amount to indent *this* node.
* @param a_embedded [in] If *true*, *this* function is embedded in a higher dimensional function.
* @param a_inRegions [in] If *true*, *this* is in a Regions container.
***********************************************************************************************************/
void FunctionForm::toXMLList_func( LUPI_maybeUnused GUPI::WriteInfo &a_writeInfo, LUPI_maybeUnused std::string const &a_indent, LUPI_maybeUnused bool a_embedded, LUPI_maybeUnused bool a_inRegions ) const {
std::cout << "Node '" << moniker( ) << "' needs toXMLList methods." << std::endl;
}
/*! \class Function1dForm
* Base class inherited by other GIDI 1d function classes.
*/
/* *********************************************************************************************************//**
* @param a_moniker [in] The moniker for *this*.
* @param a_type [in] The *FormType* the class represents.
* @param a_interpolation [in] The interpolation along the outer most independent axis and the dependent axis.
* @param a_index [in] Currently not used.
* @param a_outerDomainValue [in] If embedded in a higher dimensional function, the value of the domain of the next higher dimension.
***********************************************************************************************************/
Function1dForm::Function1dForm( std::string const &a_moniker, FormType a_type, ptwXY_interpolation a_interpolation, int a_index, double a_outerDomainValue ) :
FunctionForm( a_moniker, a_type, 1, a_interpolation, a_index, a_outerDomainValue ) {
}
/* *********************************************************************************************************//**
* @param a_moniker [in] The moniker for *this*.
* @param a_type [in] The *FormType* the class represents.
* @param a_axes [in] The axes to copy for *this*.
* @param a_interpolation [in] The interpolation along the outer most independent axis and the dependent axis.
* @param a_index [in] Currently not used.
* @param a_outerDomainValue [in] If embedded in a higher dimensional function, the value of the domain of the next higher dimension.
***********************************************************************************************************/
Function1dForm::Function1dForm( std::string const &a_moniker, FormType a_type, Axes const &a_axes, ptwXY_interpolation a_interpolation,
int a_index, double a_outerDomainValue ) :
FunctionForm( a_moniker, a_type, 1, a_axes, a_interpolation, a_index, a_outerDomainValue ) {
}
/* *********************************************************************************************************//**
* @param a_construction [in] Used to pass user options to the constructor.
* @param a_node [in] The **HAPI::Node** to be parsed and used to construct the FunctionForm.
* @param a_setupInfo [in] Information create my the Protare constructor to help in parsing.
* @param a_type [in] The *FormType* the class represents.
* @param a_suite [in] The parent GIDI::Suite.
***********************************************************************************************************/
Function1dForm::Function1dForm( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo, FormType a_type,
Suite *a_suite ) :
FunctionForm( a_construction, a_node, a_setupInfo, a_type, 1, a_suite ) {
}
/* *********************************************************************************************************//**
* @param a_form [in] The Function1dForm to copy.
***********************************************************************************************************/
Function1dForm::Function1dForm( Function1dForm const &a_form ) :
FunctionForm( a_form ) {
}
/* *********************************************************************************************************//**
***********************************************************************************************************/
Function1dForm::~Function1dForm( ) {
}
/* *********************************************************************************************************//**
* The assignment operator. This method sets the members of *this* to those of *a_rhs* except for those
* not set by base classes.
*
* @param a_rhs [in] Instance whose member are used to set the members of *this*.
***********************************************************************************************************/
Function1dForm &Function1dForm::operator=( Function1dForm const &a_rhs ) {
if( this != &a_rhs ) {
FunctionForm::operator=( a_rhs );
}
return( *this );
}
/* *********************************************************************************************************//**
* This method executes a throw as the sub-class did not define it. Evaluates *this* at the X-values in *a_Xs*[*a_offset*:]
* and adds the results to *a_results*[*a_offset*:].
*
* @param a_offset [in] The offset in *a_Xs* to start.
* @param a_Xs [in] The list of domain values to evaluate *this* at.
* @param a_results [in] The list whose values are added to by the Y-values of *this*.
* @param a_scaleFactor [in] A factor applied to each evaluation before it is added to *a_results*.
***********************************************************************************************************/
void Function1dForm::mapToXsAndAdd( LUPI_maybeUnused std::size_t a_offset, LUPI_maybeUnused std::vector<double> const &a_Xs, LUPI_maybeUnused std::vector<double> &a_results, LUPI_maybeUnused double a_scaleFactor ) const {
throw Exception( "Function1dForm::mapToXsAndAdd: function " + moniker( ) + " not implemented." );
}
/* *********************************************************************************************************//**
* This method writes a warning message stating that the write method has not been implemented for *this*.
*
* @param a_file [in] The C FILE instance to write the data to.
* @param a_format [in] The format string passed to each region's write method.
***********************************************************************************************************/
/* *********************************************************************************************************//**
* This method returns a **nullptr** since this methods was not implemented in the the derived class.
*
* @param a_asLinlin [in] If **true**, the inpolatation of the returned XYs1d instance will always be lin-lin. Otherwise,
* the interpolation depends on the child 1d functions. This argument is not needed or used for this class.
* @param a_accuracy [in] The accuracy use to convert the data to lin=lin interpolation if needed. This argument is not needed or used for this cl
* @param a_lowerEps [in] The relative domain ammount to put a point below a boundary between two regions. This argument is not needed or used for
* @param a_upperEps [in] The relative domain ammount to put a point above a boundary between two regions. This argument is not needed or used for
*
* @return A pointer to an XYs1d instance that must be freed by the calling function.
***********************************************************************************************************/
XYs1d *Function1dForm::asXYs1d( LUPI_maybeUnused bool a_asLinlin, LUPI_maybeUnused double a_accuracy, LUPI_maybeUnused double a_lowerEps, LUPI_maybeUnused double a_upperEps ) const {
return( nullptr );
}
void Function1dForm::write( FILE *a_file, LUPI_maybeUnused std::string const &a_format ) const {
fprintf( a_file, "# Write method not implemented for %s.\n", moniker( ).c_str( ) );
}
/* *********************************************************************************************************//**
* Calls the write method with stdout as the file stream.
*
* @param a_format [in] The format string passed to the C printf function.
***********************************************************************************************************/
void Function1dForm::print( std::string const &a_format ) const {
write( stdout, a_format.c_str( ) );
}
/* *********************************************************************************************************//**
* @param a_moniker [in] The **GNDS** node name for the 2d function.
* @param a_type [in] The *FormType* the class represents.
* @param a_interpolation [in] The interpolation along the outer most independent axis and the dependent axis.
* @param a_index [in] The GNDS **index** value for *this*.
* @param a_outerDomainValue [in] The GNDS **outerDomainValue** value for *this*.
***********************************************************************************************************/
Function2dForm::Function2dForm( std::string const &a_moniker, FormType a_type, ptwXY_interpolation a_interpolation, int a_index, double a_outerDomainValue ) :
FunctionForm( a_moniker, a_type, 2, a_interpolation, a_index, a_outerDomainValue ) {
}
/* *********************************************************************************************************//**
* @param a_moniker [in] The moniker for *this*.
* @param a_type [in] The *FormType* the class represents.
* @param a_axes [in] The axes to copy for *this*.
* @param a_interpolation [in] The interpolation along the outer most independent axis and the dependent axis.
* @param a_index [in] Currently not used.
* @param a_outerDomainValue [in] If embedded in a higher dimensional function, the value of the domain of the next higher dimension.
***********************************************************************************************************/
Function2dForm::Function2dForm( std::string const &a_moniker, FormType a_type, Axes const &a_axes, ptwXY_interpolation a_interpolation,
int a_index, double a_outerDomainValue ) :
FunctionForm( a_moniker, a_type, 2, a_axes, a_interpolation, a_index, a_outerDomainValue ) {
}
/* *********************************************************************************************************//**
* @param a_construction [in] Used to pass user options to the constructor.
* @param a_node [in] The **HAPI::Node** to be parsed and used to construct the FunctionForm.
* @param a_setupInfo [in] Information create my the Protare constructor to help in parsing.
* @param a_type [in] The *FormType* the class represents.
* @param a_suite [in] The parent GIDI::Suite.
***********************************************************************************************************/
Function2dForm::Function2dForm( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo,
FormType a_type, Suite *a_suite ) :
FunctionForm( a_construction, a_node, a_setupInfo, a_type, 2, a_suite ) {
}
/* *********************************************************************************************************//**
* @param a_form [in] Function2dForm to copy.
***********************************************************************************************************/
Function2dForm::Function2dForm( Function2dForm const &a_form ) :
FunctionForm( a_form ) {
}
/* *********************************************************************************************************//**
***********************************************************************************************************/
Function2dForm::~Function2dForm( ) {
}
/* *********************************************************************************************************//**
* @param a_construction [in] Used to pass user options to the constructor.
* @param a_node [in] The **HAPI::Node** to be parsed and used to construct the FunctionForm.
* @param a_setupInfo [in] Information create my the Protare constructor to help in parsing.
* @param a_type [in] The *FormType* the class represents.
* @param a_suite [in] The parent GIDI::Suite.
***********************************************************************************************************/
Function3dForm::Function3dForm( Construction::Settings const &a_construction, HAPI::Node const &a_node, SetupInfo &a_setupInfo,
FormType a_type, Suite *a_suite ) :
FunctionForm( a_construction, a_node, a_setupInfo, a_type, 3, a_suite ) {
}
/* *********************************************************************************************************//**
* @param a_moniker [in] The moniker for *this*.
* @param a_type [in] The *FormType* the class represents.
* @param a_axes [in] The axes to copy for *this*.
* @param a_interpolation [in] The interpolation along the outer most independent axis and the dependent axis.
* @param a_index [in] Currently not used.
* @param a_outerDomainValue [in] If embedded in a higher dimensional function, the value of the domain of the next higher dimension.
***********************************************************************************************************/
Function3dForm::Function3dForm( std::string const &a_moniker, FormType a_type, Axes const &a_axes, ptwXY_interpolation a_interpolation,
int a_index, double a_outerDomainValue ) :
FunctionForm( a_moniker, a_type, 3, a_axes, a_interpolation, a_index, a_outerDomainValue ) {
}
/* *********************************************************************************************************//**
***********************************************************************************************************/
Function3dForm::~Function3dForm( ) {
}
} // End namespace Functions.
} // End namespace GIDI.