/* # <> # Copyright (c) 2010, Lawrence Livermore National Security, LLC. # Produced at the Lawrence Livermore National Laboratory # Written by Bret R. Beck, beck6@llnl.gov. # CODE-461393 # All rights reserved. # # This file is part of GIDI. For details, see nuclear.llnl.gov. # Please also read the "Additional BSD Notice" at nuclear.llnl.gov. # # Redistribution and use in source and binary forms, with or without modification, # are permitted provided that the following conditions are met: # # 1) Redistributions of source code must retain the above copyright notice, # this list of conditions and the disclaimer below. # 2) Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the disclaimer (as noted below) in the # documentation and/or other materials provided with the distribution. # 3) Neither the name of the LLNS/LLNL nor the names of its contributors may be # used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT # SHALL LAWRENCE LIVERMORE NATIONAL SECURITY, LLC, THE U.S. DEPARTMENT OF ENERGY OR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # <> */ #include #include #include #if defined __cplusplus namespace GIDI { using namespace GIDI; #endif static int _tpia_target_releaseAndReturnOne( statusMessageReporting *smr, tpia_target *target ); /* ************************************************************ */ tpia_target *tpia_target_create( statusMessageReporting *smr ) { tpia_target *target; //if( ( target = xData_malloc2( smr, sizeof( tpia_target ), 0, "target" ) ) == NULL ) return( NULL ); if( ( target = (tpia_target*) xData_malloc2( smr, sizeof( tpia_target ), 0, "target" ) ) == NULL ) return( NULL ); if( tpia_target_initialize( smr, target ) ) target = tpia_target_free( smr, target ); return( target ); } /* ************************************************************ */ int tpia_target_initialize( statusMessageReporting *smr, tpia_target *target ) { memset( target, 0, sizeof( tpia_target ) ); tpia_samplingMethods_initialize( smr, &(target->samplingMethods) ); return( 0 ); } /* ************************************************************ */ tpia_target *tpia_target_createRead( statusMessageReporting *smr, const char *fileName ) { tpia_target *target; if( ( target = tpia_target_create( smr ) ) == NULL ) return( NULL ); //if( tpia_target_read( smr, target, fileName ) != 0 ) target = xData_free( smr, target ); if( tpia_target_read( smr, target, fileName ) != 0 ) target = (tpia_target*) xData_free( smr, target ); return( target ); } /* ************************************************************ */ int tpia_target_readFromMap( statusMessageReporting *smr, tpia_target *target, tpia_map *map, const char *evaluation, const char *projectileName, const char *targetName ) { char *targetPath; if( ( targetPath = tpia_map_findTarget( smr, map, evaluation, projectileName, targetName ) ) == NULL ) return( 1 ); return( tpia_target_read( smr, target, targetPath ) ); } /* ************************************************************ */ tpia_target *tpia_target_createReadFromMap( statusMessageReporting *smr, tpia_map *map, const char *evaluation, const char *projectileName, const char *targetName ) { char *targetPath; tpia_target *target; targetPath = tpia_map_findTarget( smr, map, evaluation, projectileName, targetName ); if( targetPath == NULL ) return( NULL ); target = tpia_target_createRead( smr, targetPath ); xData_free( smr, targetPath ); return( target ); } /* ************************************************************ */ tpia_target *tpia_target_free( statusMessageReporting *smr, tpia_target *target ) { tpia_target_release( smr, target ); xData_free( smr, target ); return( NULL ); } /* ************************************************************ */ int tpia_target_release( statusMessageReporting *smr, tpia_target *target ) { int i; //target->path = xData_free( smr, target->path ); target->path = (char*) xData_free( smr, target->path ); //target->absPath = xData_free( smr, target->absPath ); target->absPath = (char*) xData_free( smr, target->absPath ); xData_releaseAttributionList( smr, &(target->attributes) ); for( i = 0; i < target->nHeatedTargets; i++ ) { //target->heatedTargets[i].path = xData_free( smr, target->heatedTargets[i].path ); target->heatedTargets[i].path = (char*) xData_free( smr, target->heatedTargets[i].path ); //target->heatedTargets[i].contents = xData_free( smr, target->heatedTargets[i].contents ); target->heatedTargets[i].contents = (char*) xData_free( smr, target->heatedTargets[i].contents ); if( target->heatedTargets[i].heatedTarget != NULL ) tpia_target_heated_free( smr, target->heatedTargets[i].heatedTarget ); } //target->heatedTargets = xData_free( smr, target->heatedTargets ); target->heatedTargets = (tpia_target_heated_info*) xData_free( smr, target->heatedTargets ); //target->readHeatedTargets = xData_free( smr, target->readHeatedTargets ); target->readHeatedTargets = (tpia_target_heated_info**) xData_free( smr, target->readHeatedTargets ); tpia_target_initialize( smr, target ); return( 0 ); } /* ************************************************************ */ int tpia_target_read( statusMessageReporting *smr, tpia_target *target, const char *fileName ) { /* * If a target has already been read into this target, user must have called tpia_target_release before calling this routine. * Otherwise, there will be memory leaks. */ xData_document *doc; xData_element *element, *child; int i, iHeated, nHeated = 0, status = 1; double temperature; //fix for gcc4.6 warings 110602 //char *pReturnValue, *name; char *name; char const *contents; tpia_target_initialize( smr, target ); if( ( target->path = xDataMisc_allocateCopyString2( smr, fileName, "path" ) ) == NULL ) return( status ); if( ( target->absPath = xDataMisc_getAbsPath( smr, fileName ) ) == NULL ) return( _tpia_target_releaseAndReturnOne( smr, target ) ); if( ( doc = xData_parseReadFile( smr, fileName, NULL, NULL ) ) == NULL ) return( _tpia_target_releaseAndReturnOne( smr, target ) ); element = xData_getDocumentsElement( doc ); if( strcmp( element->name, "xTarget" ) != 0 ) { tpia_misc_setMessageError_Element( smr, NULL, element, __FILE__, __LINE__, 1, "input file's top element must be xTarget and not %s", element->name ); } else { //pReturnValue = ( xData_copyAttributionList( smr, &(target->attributes), &(element->attributes) ) ) ? NULL : target->path; //fix for gcc4.6 warings 110602 xData_copyAttributionList( smr, &(target->attributes),&(element->attributes) ); name = tpia_misc_pointerToAttributeIfAllOk2( smr, element, 1, &(target->attributes), "projectile" ); if( smr_isOk( smr ) ) target->projectileID = tpia_particle_getInternalID( smr, name ); if( smr_isOk( smr ) && ( name = tpia_misc_pointerToAttributeIfAllOk2( smr, element, 1, &(target->attributes), "target" ) ) != NULL ) { if( smr_isOk( smr ) && ( target->targetID = tpia_particle_getInternalID( smr, name ) ) != NULL ) { status = 0; for( nHeated = 0, child = xData_getFirstElement( element ); child != NULL; nHeated++, child = xData_getNextElement( child ) ) { if( strcmp( child->name, "target" ) != 0 ) { tpia_misc_setMessageError_Element( smr, NULL, element, __FILE__, __LINE__, 1, "element can only have target sub-elements%s", element->name ); status = 1; break; } } if( status == 0 ) { //if( ( target->heatedTargets = xData_malloc2( smr, nHeated * sizeof( tpia_target_heated_info ), 1, "heatedTargets" ) ) == NULL ) { if( ( target->heatedTargets = (tpia_target_heated_info*) xData_malloc2( smr, nHeated * sizeof( tpia_target_heated_info ), 1, "heatedTargets" ) ) == NULL ) { status = 1; } else { //if( ( target->readHeatedTargets = xData_malloc2( smr, nHeated * sizeof( tpia_target_heated_info * ), 1, "heatedTargets" ) ) == NULL ) if( ( target->readHeatedTargets = (tpia_target_heated_info**) xData_malloc2( smr, nHeated * sizeof( tpia_target_heated_info * ), 1, "heatedTargets" ) ) == NULL ) status = 1; } for( nHeated = 0, child = xData_getFirstElement( element ); ( status == 0 ) && ( child != NULL ); nHeated++, child = xData_getNextElement( child ) ) { if( ( i = xData_convertAttributeToDouble( smr, child, "temperature", &temperature ) ) != 0 ) { if( i > 0 ) smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1, "target does not have a temperature attribute" ); status = 1; break; } for( iHeated = 0; iHeated < nHeated; iHeated++ ) if( target->heatedTargets[iHeated].temperature > temperature ) break; if( iHeated < nHeated ) for( i = nHeated; i >= iHeated; i-- ) target->heatedTargets[i+1] = target->heatedTargets[i]; target->heatedTargets[iHeated].temperature = temperature; target->heatedTargets[iHeated].path = NULL; target->heatedTargets[iHeated].contents = NULL; target->heatedTargets[iHeated].heatedTarget = NULL; if( ( contents = xData_getAttributesValueInElement( child, "contents" ) ) != NULL ) { if( ( target->heatedTargets[iHeated].contents = xDataMisc_allocateCopyString2( smr, contents, "contents" ) ) == NULL ) { status = 1; break; } } if( ( contents = xData_getAttributesValueInElement( child, "file" ) ) == NULL ) { status = 1; break; } //if((target->heatedTargets[iHeated].path = xData_malloc2(smr, strlen( target->absPath ) + strlen( contents ) + 2, 0, "path")) == NULL) { if((target->heatedTargets[iHeated].path = (char*) xData_malloc2(smr, strlen( target->absPath ) + strlen( contents ) + 2, 0, "path")) == NULL) { status = 1; break; } strcpy( target->heatedTargets[iHeated].path, target->absPath ); *strrchr( target->heatedTargets[iHeated].path, '/' ) = 0; strcat( target->heatedTargets[iHeated].path, "/" ); strcat( target->heatedTargets[iHeated].path, contents ); target->nHeatedTargets++; } } } } } xData_parseFree( smr, doc ); if( status == 0 ) { for( i = 0; i < nHeated; i++ ) target->heatedTargets[i].ordinal = i; for( i = 0; i < nHeated; i++ ) if( target->heatedTargets[i].contents == NULL ) break; if( i == nHeated ) i = 0; /* All heated targets are crossSection only. */ if( tpia_target_readHeatedTarget( smr, target, i, 0 ) == 0 ) { target->baseHeatedTarget = target->heatedTargets[i].heatedTarget; } else { tpia_target_release( NULL, target ); status = 1; } } else { tpia_target_release( smr, target ); } return( status ); } /* ************************************************************ */ //char *tpia_target_getAttributesValue( statusMessageReporting *smr, tpia_target *target, char const *name ) { char *tpia_target_getAttributesValue( statusMessageReporting *, tpia_target *target, char const *name ) { return( xData_getAttributesValue( &(target->attributes), name ) ); } /* ************************************************************ */ //int tpia_target_getTemperatures( statusMessageReporting *smr, tpia_target *target, double *temperatures ) { int tpia_target_getTemperatures( statusMessageReporting *, tpia_target *target, double *temperatures ) { int i; if( temperatures != NULL ) for( i = 0; i < target->nHeatedTargets; i++ ) temperatures[i] = target->heatedTargets[i].temperature; return( target->nHeatedTargets ); } /* ************************************************************ */ int tpia_target_readHeatedTarget( statusMessageReporting *smr, tpia_target *target, int index, int checkElememtsForAccess ) { int i; if( ( index < 0 ) || ( index >= target->nHeatedTargets ) ) { smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1, "temperature index = %d out of range (0 <= index < %d", index, target->nHeatedTargets ); return( -1 ); } if( target->heatedTargets[index].heatedTarget != NULL ) return( 1 ); target->heatedTargets[index].heatedTarget = tpia_target_heated_createRead( smr, target->heatedTargets[index].path, checkElememtsForAccess ); if( target->heatedTargets[index].heatedTarget != NULL ) { target->heatedTargets[index].heatedTarget->ordinal = target->heatedTargets[index].ordinal; for( i = target->nReadHeatedTargets; i > 0; i-- ) { if( target->readHeatedTargets[i-1]->temperature < target->heatedTargets[index].temperature ) break; target->readHeatedTargets[i] = target->readHeatedTargets[i-1]; } target->readHeatedTargets[i] = &(target->heatedTargets[i]); target->nReadHeatedTargets++; } return( ( target->heatedTargets[index].heatedTarget == NULL ? -1 : 0 ) ); } /* ************************************************************ */ tpia_target_heated *tpia_target_getHeatedTargetAtIndex_ReadIfNeeded( statusMessageReporting *smr, tpia_target *target, int index ) { if( ( index < 0 ) || ( index >= target->nHeatedTargets ) ) { smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1, "temperature index = %d out of range (0 <= index < %d", index, target->nHeatedTargets ); return( NULL ); } if( target->heatedTargets[index].heatedTarget == NULL ) tpia_target_readHeatedTarget( smr, target, index, 0 ); return( target->heatedTargets[index].heatedTarget ); } /* ************************************************************ */ tpia_target_heated *tpia_target_getHeatedTargetAtTIndex( statusMessageReporting *smr, tpia_target *target, int index ) { if( ( index < 0 ) || ( index >= target->nHeatedTargets ) ) { smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1, "temperature index = %d out of range (0 <= index < %d", index, target->nHeatedTargets ); return( NULL ); } if( target->heatedTargets[index].heatedTarget == NULL ) { smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1, "temperature index = %d not read in", index ); return( NULL ); } return( target->heatedTargets[index].heatedTarget ); } /* ************************************************************ */ int tpia_target_numberOfChannels( statusMessageReporting *smr, tpia_target *target ) { return( tpia_target_heated_numberOfChannels( smr, target->baseHeatedTarget ) ); } /* ************************************************************ */ int tpia_target_numberOfProductionChannels( statusMessageReporting *smr, tpia_target *target ) { return( tpia_target_heated_numberOfProductionChannels( smr, target->baseHeatedTarget ) ); } /* ************************************************************ */ xData_Int tpia_target_getEnergyGridAtTIndex( statusMessageReporting *smr, tpia_target *target, int index, double **energyGrid ) { tpia_target_heated *heated = tpia_target_getHeatedTargetAtTIndex( smr, target, index ); if( !smr_isOk( smr ) ) return( -1 ); return( tpia_target_heated_getEnergyGrid( smr, heated, energyGrid ) ); } /* ************************************************************ */ tpia_1dData *tpia_target_getTotalCrossSectionAtTIndex( statusMessageReporting *smr, tpia_target *target, int index, int crossSectionType ) { tpia_target_heated *heated = tpia_target_getHeatedTargetAtTIndex( smr, target, index ); if( !smr_isOk( smr ) ) return( NULL ); if( crossSectionType == tpia_crossSectionType_grouped ) { return( &(heated->totalCrossSectionGrouped) ); } else if( crossSectionType == tpia_crossSectionType_pointwise ) { return( &(heated->totalCrossSectionPointwise) ); } smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1, "Invalue crossSectionType = %d", crossSectionType ); return( NULL ); } /* ************************************************************ */ double tpia_target_getTotalCrossSectionAtTAndE( statusMessageReporting *smr, tpia_target *target, double T, xData_Int iEg, double e_in, int crossSectionType ) { int i; double xsec = 0., xsec1, xsec2; for( i = 0; i < target->nReadHeatedTargets; i++ ) if( target->readHeatedTargets[i]->temperature > T ) break; if( i == 0 ) { xsec = tpia_target_heated_getTotalCrossSectionAtE( smr, target->readHeatedTargets[0]->heatedTarget, iEg, e_in, crossSectionType ); } else if( i == target->nReadHeatedTargets ) { xsec = tpia_target_heated_getTotalCrossSectionAtE( smr, target->readHeatedTargets[i-1]->heatedTarget, iEg, e_in, crossSectionType ); } else { xsec1 = tpia_target_heated_getTotalCrossSectionAtE( smr, target->readHeatedTargets[i-1]->heatedTarget, iEg, e_in, crossSectionType ); xsec2 = tpia_target_heated_getTotalCrossSectionAtE( smr, target->readHeatedTargets[i ]->heatedTarget, iEg, e_in, crossSectionType ); xsec = ( ( target->readHeatedTargets[i]->temperature - T ) * xsec1 + ( T - target->readHeatedTargets[i-1]->temperature ) * xsec2 ) / ( target->readHeatedTargets[i]->temperature - target->readHeatedTargets[i-1]->temperature ); } return( xsec ); } /* ************************************************************ */ double tpia_target_getIndexChannelCrossSectionAtE( statusMessageReporting *smr, tpia_target *target, int index, double T, xData_Int iEg, double e_in, int crossSectionType ) { int i; double xsec = 0., xsec1, xsec2; for( i = 0; i < target->nReadHeatedTargets; i++ ) if( target->readHeatedTargets[i]->temperature > T ) break; if( i == 0 ) { xsec = tpia_target_heated_getIndexChannelCrossSectionAtE( smr, target->readHeatedTargets[0]->heatedTarget, index, iEg, e_in, crossSectionType ); } else if( i == target->nReadHeatedTargets ) { xsec = tpia_target_heated_getIndexChannelCrossSectionAtE( smr, target->readHeatedTargets[i-1]->heatedTarget, index, iEg, e_in, crossSectionType ); } else { xsec1 = tpia_target_heated_getIndexChannelCrossSectionAtE(smr, target->readHeatedTargets[i-1]->heatedTarget, index, iEg, e_in, crossSectionType); xsec2 = tpia_target_heated_getIndexChannelCrossSectionAtE(smr, target->readHeatedTargets[i ]->heatedTarget, index, iEg, e_in, crossSectionType); xsec = ( ( target->readHeatedTargets[i]->temperature - T ) * xsec1 + ( T - target->readHeatedTargets[i-1]->temperature ) * xsec2 ) / ( target->readHeatedTargets[i]->temperature - target->readHeatedTargets[i-1]->temperature ); } return( xsec ); } /* ************************************************************ */ //int tpia_target_sampleIndexChannelProductsAtE( statusMessageReporting *smr, tpia_target *target, int index, double T, int tpia_target_sampleIndexChannelProductsAtE( statusMessageReporting *smr, tpia_target *target, int index, double , tpia_decaySamplingInfo *decaySamplingInfo, int nProductData, tpia_productOutgoingData *productData ) { return( tpia_target_heated_sampleIndexChannelProductsAtE( smr, target->baseHeatedTarget, index, decaySamplingInfo, nProductData, productData ) ); } /* ************************************************************ */ static int _tpia_target_releaseAndReturnOne( statusMessageReporting *smr, tpia_target *target ) { tpia_target_release( smr, target ); return( 1 ); } #if defined __cplusplus } #endif