11 #include "MCGIDI_misc.h"
12 #include <xDataTOM_importXML_private.h>
14 #if defined __cplusplus
20 #if defined __cplusplus
28 #if defined __cplusplus
35 MCGIDI_target *target;
37 if( ( target = (MCGIDI_target *) smr_malloc2( smr,
sizeof( MCGIDI_target ), 0,
"target" ) ) == NULL )
return( NULL );
46 memset( target, 0,
sizeof( MCGIDI_target ) );
54 MCGIDI_target *target;
64 int projectile_PoPID,
int target_PoPID ) {
74 int MCGIDI_target_readFromMap( statusMessageReporting *smr, MCGIDI_target *target, MCGIDI_map *map,
const char *evaluation,
const char *projectileName,
75 const char *targetName ) {
79 if( ( targetPath =
MCGIDI_map_findTarget( smr, map, evaluation, projectileName, targetName ) ) == NULL )
return( 1 );
86 int projectile_PoPID,
int target_PoPID ) {
89 MCGIDI_target *target;
100 const char *targetName ) {
103 MCGIDI_target *target;
106 if( targetPath == NULL )
return( NULL );
130 for( i = 0; i < target->nHeatedTargets; i++ ) {
133 if( target->heatedTargets[i].heatedTarget != NULL )
MCGIDI_target_heated_free( smr, target->heatedTargets[i].heatedTarget );
148 xDataXML_document *doc;
149 xDataXML_element *element, *child;
150 int i, iHeated, nHeated = 0, status = 1;
153 char const *version, *contents;
156 if( ( target->path = smr_allocateCopyString2( smr, fileName,
"path" ) ) == NULL )
return( status );
160 if( strcmp( element->name,
"xTarget" ) != 0 ) {
165 smr_setReportError2( smr, smr_unknownID, 1,
"version attribute missing from element '%s'", element->name );
168 if( strcmp( version,
"xMCProcess 0.1" ) != 0 ) {
169 smr_setReportError2( smr, smr_unknownID, 1,
"Unsupported version '%s' for element %s", version, element->name );
176 if( strcmp( child->name,
"target" ) != 0 ) {
185 if( ( target->heatedTargets = (MCGIDI_target_heated_info *) smr_malloc2( smr, nHeated *
sizeof( MCGIDI_target_heated_info ), 1,
"heatedTargets" ) ) == NULL ) {
188 if( ( target->readHeatedTargets = (MCGIDI_target_heated_info **) smr_malloc2( smr, nHeated *
sizeof( MCGIDI_target_heated_info * ), 1,
"heatedTargets" ) ) == NULL )
194 if( i > 0 ) smr_setReportError2p( smr, smr_unknownID, 1,
"target does not have a temperature attribute" );
198 for( iHeated = 0; iHeated < nHeated; iHeated++ )
if( target->heatedTargets[iHeated].temperature > temperature )
break;
199 if( iHeated < nHeated )
for( i = nHeated; i >= iHeated; i-- ) target->heatedTargets[i+1] = target->heatedTargets[i];
200 target->heatedTargets[iHeated].temperature = temperature;
201 target->heatedTargets[iHeated].path = NULL;
202 target->heatedTargets[iHeated].contents = NULL;
203 target->heatedTargets[iHeated].heatedTarget = NULL;
205 if( ( target->heatedTargets[iHeated].contents = smr_allocateCopyString2( smr, contents,
"contents" ) ) == NULL ) {
214 if( ( target->heatedTargets[iHeated].path = (
char *) smr_malloc2(smr, strlen( target->absPath ) + strlen( contents ) + 2, 0,
"path") ) == NULL) {
218 strcpy( target->heatedTargets[iHeated].path, target->absPath );
219 *strrchr( target->heatedTargets[iHeated].path,
'/' ) = 0;
220 strcat( target->heatedTargets[iHeated].path,
"/" );
221 strcat( target->heatedTargets[iHeated].path, contents );
222 target->nHeatedTargets++;
228 for( i = 0; i < nHeated; i++ ) target->heatedTargets[i].ordinal = i;
229 for( i = 0; i < nHeated; i++ )
if( target->heatedTargets[i].contents == NULL )
break;
230 if( i == nHeated ) i = 0;
232 target->baseHeatedTarget = target->heatedTargets[i].heatedTarget; }
256 if( temperatures != NULL )
for( i = 0; i < target->nHeatedTargets; i++ ) temperatures[i] = target->heatedTargets[i].temperature;
257 return( target->nHeatedTargets );
266 if( ( index < 0 ) || ( index >= target->nHeatedTargets ) ) {
267 smr_setReportError2( smr, smr_unknownID, 1,
"temperature index = %d out of range (0 <= index < %d", index, target->nHeatedTargets );
270 if( target->heatedTargets[index].heatedTarget != NULL )
return( 1 );
272 target->projectilePOP = target->heatedTargets[index].heatedTarget->projectilePOP;
273 target->targetPOP = target->heatedTargets[index].heatedTarget->targetPOP;
274 if( target->heatedTargets[index].heatedTarget != NULL ) {
275 target->heatedTargets[index].heatedTarget->ordinal = target->heatedTargets[index].ordinal;
276 for( i = target->nReadHeatedTargets; i > 0; i-- ) {
277 if( target->readHeatedTargets[i-1]->temperature < target->heatedTargets[index].temperature )
break;
278 target->readHeatedTargets[i] = target->readHeatedTargets[i-1];
280 target->readHeatedTargets[i] = &(target->heatedTargets[i]);
281 target->nReadHeatedTargets++;
284 return( ( target->heatedTargets[index].heatedTarget == NULL ? -1 : 0 ) );
291 if( ( index < 0 ) || ( index >= target->nHeatedTargets ) ) {
292 smr_setReportError2( smr, smr_unknownID, 1,
"temperature index = %d out of range (0 <= index < %d", index, target->nHeatedTargets );
296 return( target->heatedTargets[index].heatedTarget );
303 if( ( index < 0 ) || ( index >= target->nHeatedTargets ) ) {
304 smr_setReportError2( smr, smr_unknownID, 1,
"temperature index = %d out of range (0 <= index < %d", index, target->nHeatedTargets );
307 if( target->heatedTargets[index].heatedTarget == NULL ) {
308 smr_setReportError2( smr, smr_unknownID, 1,
"temperature index = %d not read in", index );
311 return( target->heatedTargets[index].heatedTarget );
327 if( reaction == NULL )
return( MCGIDI_reactionType_unknown_e );
362 double xsec = 0., xsec1, xsec2, temperature = modes.getTemperature( );
364 for( i = 0; i < target->nReadHeatedTargets; i++ )
if( target->readHeatedTargets[i]->temperature > temperature )
break;
367 else if( i == target->nReadHeatedTargets ) {
372 xsec = ( ( target->readHeatedTargets[i]->temperature - temperature ) * xsec1 +
373 ( temperature - target->readHeatedTargets[i-1]->temperature ) * xsec2 ) /
374 ( target->readHeatedTargets[i]->temperature - target->readHeatedTargets[i-1]->temperature );
387 for( ir = 0; ir < nr; ir++ ) {
393 if( *EMin > EMin_ ) *EMin = EMin_;
394 if( *EMax < EMax_ ) *EMax = EMax_;
406 double xsec = 0., xsec1, xsec2, temperature = modes.getTemperature( );
408 for( i = 0; i < target->nReadHeatedTargets; i++ )
if( target->readHeatedTargets[i]->temperature > temperature )
break;
411 else if( i == target->nReadHeatedTargets ) {
416 xsec = ( ( target->readHeatedTargets[i]->temperature - temperature ) * xsec1 +
417 ( temperature - target->readHeatedTargets[i-1]->temperature ) * xsec2 ) /
418 ( target->readHeatedTargets[i]->temperature - target->readHeatedTargets[i-1]->temperature );
427 double (*userrng)(
void * ),
void *rngState ) {
430 double rngValue = (*userrng)( rngState );
431 double cumm_xsec = 0., r_xsec = rngValue * totalXSec;
433 for( ir = 0; ir < nr; ir++ ) {
435 if( cumm_xsec >= r_xsec )
break;
438 if( ( totalXSec - cumm_xsec ) >= 1e-12 * totalXSec ) {
439 smr_setReportError2( smr, smr_unknownID, 1,
440 "Failed to sample a reaction for temperature = %.12e, energy = %.12e, totalXSec = %16.e, rngValue = %16.e, r_xsec = %16.e, cumm_xsec = %16.e",
441 modes.getTemperature( ), modes.getProjectileEnergy( ), totalXSec, rngValue, r_xsec, cumm_xsec );
446 if( modes.getCrossSectionMode( ) == MCGIDI_quantityLookupMode_grouped ) {
449 if( modes.getGroupIndex( ) == reaction->thresholdGroupIndex ) {
450 double dEnergy = modes.getProjectileEnergy( ) - reaction->EMin;
452 if( dEnergy <= 0 )
return( MCGIDI_nullReaction );
453 if( ( (*userrng)( rngState ) * reaction->thresholdGroupDomain ) > dEnergy )
return( MCGIDI_nullReaction );
462 MCGIDI_quantitiesLookupModes &modes, MCGIDI_decaySamplingInfo *decaySamplingInfo, MCGIDI_sampledProductsDatas *productDatas ) {
464 MCGIDI_sampledProductsData productData;
466 productData.isVelocity = decaySamplingInfo->isVelocity;
467 productData.pop = target->projectilePOP;
468 productData.kineticEnergy = modes.getProjectileEnergy( );
469 productData.px_vx = 0.;
470 productData.py_vy = 0.;
471 productData.pz_vz = std::sqrt( productData.kineticEnergy * ( productData.kineticEnergy + 2. * productData.pop->mass_MeV ) );
472 if( productData.isVelocity ) productData.pz_vz *=
473 MCGIDI_speedOfLight_cm_sec / std::sqrt( productData.pz_vz * productData.pz_vz + productData.pop->mass_MeV * productData.pop->mass_MeV );
474 productData.delayedNeutronIndex = 0;
475 productData.delayedNeutronRate = 0.;
476 productData.birthTimeSec = 0;
478 productDatas->numberOfProducts = 0;
480 return( productDatas->numberOfProducts );
486 MCGIDI_quantitiesLookupModes &modes, MCGIDI_decaySamplingInfo *decaySamplingInfo, MCGIDI_sampledProductsDatas *productData ) {
494 MCGIDI_quantitiesLookupModes &modes ) {
512 for( i1 = 0; i1 < target->nReadHeatedTargets; i1++ ) {
526 #if defined __cplusplus
int MCGIDI_target_sampleIndexReactionProductsAtE(statusMessageReporting *smr, MCGIDI_target *target, int index, MCGIDI_quantitiesLookupModes &modes, MCGIDI_decaySamplingInfo *decaySamplingInfo, MCGIDI_sampledProductsDatas *productData)
int MCGIDI_target_numberOfReactions(statusMessageReporting *smr, MCGIDI_target *target)
MCGIDI_target * MCGIDI_target_newRead(statusMessageReporting *smr, const char *fileName)
char const * xDataXML_getAttributesValueInElement(xDataXML_element *element, char const *name)
double MCGIDI_target_heated_getIndexReactionCrossSectionAtE(statusMessageReporting *smr, MCGIDI_target_heated *target, int index, MCGIDI_quantitiesLookupModes &modes, bool sampling)
int MCGIDI_target_release(statusMessageReporting *smr, MCGIDI_target *target)
enum MCGIDI_reactionType MCGIDI_reaction_getReactionType(statusMessageReporting *, MCGIDI_reaction *reaction)
int MCGIDI_target_heated_sampleIndexReactionProductsAtE(statusMessageReporting *smr, MCGIDI_target_heated *target, int index, MCGIDI_quantitiesLookupModes &modes, MCGIDI_decaySamplingInfo *decaySamplingInfo, MCGIDI_sampledProductsDatas *productDatas)
int MCGIDI_target_sampleReaction(statusMessageReporting *smr, MCGIDI_target *target, MCGIDI_quantitiesLookupModes &modes, double totalXSec, double(*userrng)(void *), void *rngState)
double MCGIDI_target_heated_getTotalCrossSectionAtE(statusMessageReporting *smr, MCGIDI_target_heated *target, MCGIDI_quantitiesLookupModes &modes, bool sampling)
char * MCGIDI_map_findTarget(statusMessageReporting *smr, MCGIDI_map *map, const char *evaluation, const char *projectile, const char *targetName)
MCGIDI_reaction * MCGIDI_target_getReactionAtIndex_smr(statusMessageReporting *smr, MCGIDI_target *target, int index)
double MCGIDI_target_getTotalCrossSectionAtTAndE(statusMessageReporting *smr, MCGIDI_target *target, MCGIDI_quantitiesLookupModes &modes, bool sampling)
int MCGIDI_target_readFromMap(statusMessageReporting *smr, MCGIDI_target *target, MCGIDI_map *map, const char *evaluation, const char *projectileName, const char *targetName)
MCGIDI_target * MCGIDI_target_newReadFromMap(statusMessageReporting *smr, MCGIDI_map *map, const char *evaluation, const char *projectileName, const char *targetName)
std::map< int, enum MCGIDI_transportability > const * MCGIDI_target_heated_getUniqueProducts(statusMessageReporting *, MCGIDI_target_heated *target)
char * MCGIDI_misc_getAbsPath(statusMessageReporting *smr, const char *fileName)
double MCGIDI_target_getIndexReactionCrossSectionAtE(statusMessageReporting *smr, MCGIDI_target *target, int index, MCGIDI_quantitiesLookupModes &modes, bool sampling)
char * MCGIDI_map_findTargetViaPoPIDs(statusMessageReporting *smr, MCGIDI_map *map, const char *evaluation, int projectile_PoPID, int target_PoPID)
static int _MCGIDI_target_releaseAndReturnOne(statusMessageReporting *smr, MCGIDI_target *target)
xDataXML_document * xDataXML_importFile2(statusMessageReporting *smr, char const *fileName)
int MCGIDI_target_heated_getReactionsDomain(statusMessageReporting *, MCGIDI_target_heated *target, int index, double *EMin, double *EMax)
MCGIDI_target_heated * MCGIDI_target_getHeatedTargetAtTIndex(statusMessageReporting *smr, MCGIDI_target *target, int index)
MCGIDI_target_heated * MCGIDI_target_heated_free(statusMessageReporting *smr, MCGIDI_target_heated *target)
int MCGIDI_target_heated_numberOfProductionReactions(statusMessageReporting *, MCGIDI_target_heated *)
void * smr_freeMemory(void **p)
MCGIDI_target_heated * MCGIDI_target_heated_newRead(statusMessageReporting *smr, const char *fileName)
int MCGIDI_target_readFromMapViaPoPIDs(statusMessageReporting *smr, MCGIDI_target *target, MCGIDI_map *map, const char *evaluation, int projectile_PoPID, int target_PoPID)
void xDataTOMAL_release(xDataTOM_attributionList *attributes)
int MCGIDI_misc_setMessageError_Element(statusMessageReporting *smr, void *userInterface, xDataXML_element *element, const char *file, int line, int code, const char *fmt,...)
int MCGIDI_sampledProducts_addProduct(statusMessageReporting *smr, MCGIDI_sampledProductsDatas *sampledProductsDatas, MCGIDI_sampledProductsData *sampledProductsData)
char const * MCGIDI_target_getAttributesValue(statusMessageReporting *, MCGIDI_target *target, char const *name)
double MCGIDI_target_heated_getIndexReactionFinalQ(statusMessageReporting *smr, MCGIDI_target_heated *target, int index, MCGIDI_quantitiesLookupModes &modes)
double MCGIDI_target_getIndexReactionFinalQ(statusMessageReporting *smr, MCGIDI_target *target, int index, MCGIDI_quantitiesLookupModes &modes)
MCGIDI_reaction * MCGIDI_target_heated_getReactionAtIndex_smr(statusMessageReporting *smr, MCGIDI_target_heated *target, int index)
int MCGIDI_target_recast(statusMessageReporting *smr, MCGIDI_target *target, GIDI_settings &settings)
void * xDataXML_freeDoc(statusMessageReporting *smr, xDataXML_document *doc)
MCGIDI_reaction * MCGIDI_target_getReactionAtIndex(MCGIDI_target *target, int index)
int MCGIDI_target_initialize(statusMessageReporting *, MCGIDI_target *target)
int MCGIDI_target_read(statusMessageReporting *smr, MCGIDI_target *target, const char *fileName)
MCGIDI_target_heated * MCGIDI_target_getHeatedTargetAtIndex_ReadIfNeeded(statusMessageReporting *smr, MCGIDI_target *target, int index)
int MCGIDI_target_heated_recast(statusMessageReporting *smr, MCGIDI_target_heated *target, GIDI_settings &settings)
MCGIDI_target * MCGIDI_target_free(statusMessageReporting *smr, MCGIDI_target *target)
xDataXML_element * xDataXML_getNextElement(xDataXML_element *element)
int MCGIDI_target_getTemperatures(statusMessageReporting *, MCGIDI_target *target, double *temperatures)
xDataXML_element * xDataXML_getFirstElement(xDataXML_element *element)
int MCGIDI_target_readHeatedTarget(statusMessageReporting *smr, MCGIDI_target *target, int index)
MCGIDI_target * MCGIDI_target_newReadFromMapViaPoPIDs(statusMessageReporting *smr, MCGIDI_map *map, const char *evaluation, int projectile_PoPID, int target_PoPID)
MCGIDI_target * MCGIDI_target_new(statusMessageReporting *smr)
int MCGIDI_target_sampleNullReactionProductsAtE(statusMessageReporting *smr, MCGIDI_target *target, MCGIDI_quantitiesLookupModes &modes, MCGIDI_decaySamplingInfo *decaySamplingInfo, MCGIDI_sampledProductsDatas *productDatas)
xDataXML_element * xDataXML_getDocumentsElement(xDataXML_document *doc)
enum MCGIDI_reactionType MCGIDI_target_getReactionTypeAtIndex(statusMessageReporting *smr, MCGIDI_target *target, int index)
std::map< int, enum MCGIDI_transportability > const * MCGIDI_target_getUniqueProducts(statusMessageReporting *smr, MCGIDI_target *target)
char const * xDataTOMAL_getAttributesValue(xDataTOM_attributionList *attributes, char const *name)
MCGIDI_reaction * MCGIDI_target_heated_getReactionAtIndex(MCGIDI_target_heated *target, int index)
int xDataXML_convertAttributeToDouble(statusMessageReporting *smr, xDataXML_element *element, char const *name, double *d, int required)
int MCGIDI_target_getDomain(statusMessageReporting *smr, MCGIDI_target *target, double *EMin, double *EMax)
int MCGIDI_target_numberOfProductionReactions(statusMessageReporting *, MCGIDI_target *)
int MCGIDI_target_heated_numberOfReactions(statusMessageReporting *, MCGIDI_target_heated *target)