Files
geant4/source/processes/hadronic/models/lend/src/GIDI_settings_particle.cc
T
2016-06-10 14:11:04 +02:00

204 lines
7.5 KiB
C++

/*
# <<BEGIN-copyright>>
# <<END-copyright>>
*/
#include <iostream>
#include <cmath>
#include "GIDI_settings.hh"
using namespace GIDI;
/*
=========================================================
*/
GIDI_settings_particle::GIDI_settings_particle( int PoPId, bool transporting, int energyMode ) : mGroup( ) {
initialize( PoPId, transporting, energyMode );
}
/*
=========================================================
*/
GIDI_settings_particle::GIDI_settings_particle( GIDI_settings_particle const &particle ) {
initialize( particle.mPoPId, particle.mTransporting, particle.mEnergyMode );
setGroup( particle.mGroup );
for( std::vector<GIDI_settings_processedFlux>::const_iterator iter = particle.mProcessedFluxes.begin( ); iter != particle.mProcessedFluxes.end( ); ++iter ) {
mProcessedFluxes.push_back( *iter );
}
}
/*
=========================================================
*/
int GIDI_settings_particle::initialize( int PoPId, bool transporting, int energyMode ) {
mPoPId = PoPId;
mTransporting = transporting;
int energyMode_ = ( energyMode & GIDI_settings_projectileEnergyMode_continuousEnergy )
+ ( energyMode & GIDI_settings_projectileEnergyMode_grouped )
// + ( energyMode & GIDI_settings_projectileEnergyMode_fixedGrid ) // Currently not supported.
;
if( energyMode_ != energyMode ) throw 1;
mEnergyMode = energyMode;
mGroupX = NULL;
setGroup( mGroup );
return( 0 );
}
/*
=========================================================
*/
void GIDI_settings_particle::setGroup( GIDI_settings_group const &group ) {
nfu_status status_nf;
mGroup = group;
if( mGroupX != NULL ) ptwX_free( mGroupX );
mGroupX = NULL;
if( mGroup.size( ) > 0 ) {
if( ( mGroupX = ptwX_create( (int) mGroup.size( ), (int) mGroup.size( ), mGroup.pointer( ), &status_nf ) ) == NULL ) throw 1;
}
}
/*
=========================================================
*/
GIDI_settings_particle::~GIDI_settings_particle( ) {
if( mGroupX != NULL ) ptwX_free( mGroupX );
}
/*
=========================================================
*/
int GIDI_settings_particle::addFlux( statusMessageReporting* /* smr */, GIDI_settings_flux const &flux ) {
double temperature = flux.getTemperature( );
std::vector<GIDI_settings_processedFlux>::iterator iter;
for( iter = mProcessedFluxes.begin( ); iter != mProcessedFluxes.end( ); ++iter ) {
if( temperature <= iter->getTemperature( ) ) break;
}
// BRB need to check if temperature is the same.
mProcessedFluxes.insert( iter, GIDI_settings_processedFlux( flux, mGroupX ) );
return( 0 );
}
/*
=========================================================
*/
GIDI_settings_processedFlux const *GIDI_settings_particle::nearestFluxToTemperature( double temperature ) const {
double priorTemperature, lastTemperature;
std::vector<GIDI_settings_processedFlux>::const_iterator iter;
if( mProcessedFluxes.size( ) == 0 ) return( NULL );
priorTemperature = mProcessedFluxes[0].getTemperature( );
//TK adds next line
lastTemperature = mProcessedFluxes[0].getTemperature( );
for( iter = mProcessedFluxes.begin( ); iter != mProcessedFluxes.end( ); ++iter ) {
lastTemperature = iter->getTemperature( );
if( lastTemperature > temperature ) break;
//TK add next line
priorTemperature = iter->getTemperature( );
}
if( iter == mProcessedFluxes.end( ) ) {
--iter; }
else {
//if( fabs( lastTemperature - temperature ) < fabs( temperature - priorTemperature ) ) --iter;
//TK modified above line
if( std::fabs( lastTemperature - temperature ) > std::fabs( temperature - priorTemperature ) ) --iter;
}
return( &(*iter) );
}
/*
=========================================================
*/
ptwXPoints *GIDI_settings_particle::groupFunction( statusMessageReporting *smr, ptwXYPoints *ptwXY1, double temperature, int order ) const {
if( mGroupX == NULL ) return( NULL );
GIDI_settings_processedFlux const *processedFlux = nearestFluxToTemperature( temperature );
if( processedFlux == NULL ) return( NULL );
return( processedFlux->groupFunction( smr, mGroupX, ptwXY1, order ) );
}
/* ---- GIDI_settings_processedFlux ---- */
/*
=========================================================
*/
GIDI_settings_processedFlux::GIDI_settings_processedFlux( GIDI_settings_flux const &flux, ptwXPoints *groupX ) : mFlux( flux ) {
nfu_status status_nf;
ptwXYPoints *fluxXY = NULL;
ptwXPoints *groupedFluxX;
GIDI_settings_flux_order const *fluxOrder;
double const *energies, *fluxes;
for( int order = 0; order < (int) flux.size( ); ++order ) {
fluxOrder = flux[order];
energies = fluxOrder->getEnergies( );
fluxes = fluxOrder->getFluxes( );
if( ( fluxXY = ptwXY_createFrom_Xs_Ys( ptwXY_interpolationLinLin, NULL, 12, 1e-3, fluxOrder->size( ), 10,
fluxOrder->size( ), energies, fluxes, &status_nf, 0 ) ) == NULL ) goto err;
mFluxXY.push_back( fluxXY );
if( ( groupedFluxX = ptwXY_groupOneFunction( fluxXY, groupX, ptwXY_group_normType_none, NULL, &status_nf ) ) == NULL ) goto err;
mGroupedFlux.push_back( groupedFluxX );
}
return;
err:
throw 1;
}
/*
=========================================================
*/
GIDI_settings_processedFlux::GIDI_settings_processedFlux( GIDI_settings_processedFlux const &flux ) : mFlux( flux.mFlux ) {
nfu_status status_nf;
ptwXYPoints *fluxXY;
ptwXPoints *fluxX;
for( int order = 0; order < (int) mFlux.size( ); ++order ) {
if( ( fluxXY = ptwXY_clone( flux.mFluxXY[order], &status_nf ) ) == NULL ) goto err;
mFluxXY.push_back( fluxXY );
if( ( fluxX = ptwX_clone( flux.mGroupedFlux[order], &status_nf ) ) == NULL ) goto err;
mGroupedFlux.push_back( fluxX );
}
return;
err:
for( std::vector<ptwXYPoints *>::iterator iter = mFluxXY.begin( ); iter != mFluxXY.end( ); ++iter ) ptwXY_free( *iter );
for( std::vector<ptwXPoints *>::iterator iter = mGroupedFlux.begin( ); iter != mGroupedFlux.end( ); ++iter ) ptwX_free( *iter );
throw 1;
}
/*
=========================================================
*/
GIDI_settings_processedFlux::~GIDI_settings_processedFlux( ) {
for( std::vector<ptwXYPoints *>::iterator iter = mFluxXY.begin( ); iter != mFluxXY.end( ); ++iter ) ptwXY_free( *iter );
for( std::vector<ptwXPoints *>::iterator iter = mGroupedFlux.begin( ); iter != mGroupedFlux.end( ); ++iter ) ptwX_free( *iter );
}
/*
=========================================================
*/
ptwXPoints *GIDI_settings_processedFlux::groupFunction( statusMessageReporting * /*smr*/, ptwXPoints *groupX, ptwXYPoints *ptwXY1, int order ) const {
nfu_status status_nf;
ptwXYPoints *fluxXY;
ptwXPoints *groupedX;
if( groupX == NULL ) return( NULL );
if( order < 0 ) order = 0;
if( order >= (int) mFluxXY.size( ) ) order = (int) mFluxXY.size( ) - 1;
fluxXY = ptwXY_xSlice( mFluxXY[order], ptwXY_getXMin( ptwXY1 ), ptwXY_getXMax( ptwXY1 ), 10, 1, &status_nf );
// if( fluxXY == NULL ) smr_setReportError2( smr, smr_unknownID, 1, "ptwXY_xSlice error %d: %s", status_nf, nfu_statusMessage( status_nf ) );
groupedX = ptwXY_groupTwoFunctions( ptwXY1, fluxXY, groupX, ptwXY_group_normType_norm, mGroupedFlux[order], &status_nf );
ptwXY_free( fluxXY );
// if( groupedX == NULL ) smr_setReportError2( smr, smr_unknownID, 1, "ptwXY_groupTwoFunctions error %d: %s", status_nf, nfu_statusMessage( status_nf ) );
return( groupedX );
}