tpia_target.cc

Go to the documentation of this file.
00001 /*
00002 # <<BEGIN-copyright>>
00003 # Copyright (c) 2010, Lawrence Livermore National Security, LLC. 
00004 # Produced at the Lawrence Livermore National Laboratory 
00005 # Written by Bret R. Beck, beck6@llnl.gov. 
00006 # CODE-461393
00007 # All rights reserved. 
00008 #  
00009 # This file is part of GIDI. For details, see nuclear.llnl.gov. 
00010 # Please also read the "Additional BSD Notice" at nuclear.llnl.gov. 
00011 # 
00012 # Redistribution and use in source and binary forms, with or without modification, 
00013 # are permitted provided that the following conditions are met: 
00014 #
00015 #      1) Redistributions of source code must retain the above copyright notice, 
00016 #         this list of conditions and the disclaimer below.
00017 #      2) Redistributions in binary form must reproduce the above copyright notice, 
00018 #         this list of conditions and the disclaimer (as noted below) in the 
00019 #          documentation and/or other materials provided with the distribution.
00020 #      3) Neither the name of the LLNS/LLNL nor the names of its contributors may be 
00021 #         used to endorse or promote products derived from this software without 
00022 #         specific prior written permission. 
00023 #
00024 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
00025 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
00026 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT 
00027 # SHALL LAWRENCE LIVERMORE NATIONAL SECURITY, LLC, THE U.S. DEPARTMENT OF ENERGY OR 
00028 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
00029 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
00030 # OR SERVICES;  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
00031 # AND ON  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
00032 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
00033 # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
00034 # <<END-copyright>>
00035 */
00036 #include <string.h>
00037 #include <tpia_target.h>
00038 #include <tpia_misc.h>
00039 
00040 #if defined __cplusplus
00041 namespace GIDI {
00042 using namespace GIDI;
00043 #endif
00044 
00045 static int _tpia_target_releaseAndReturnOne( statusMessageReporting *smr, tpia_target *target );
00046 /*
00047 ************************************************************
00048 */
00049 tpia_target *tpia_target_create( statusMessageReporting *smr ) {
00050 
00051     tpia_target *target;
00052 
00053     //if( ( target = xData_malloc2( smr, sizeof( tpia_target ), 0, "target" ) ) == NULL ) return( NULL );
00054     if( ( target = (tpia_target*) xData_malloc2( smr, sizeof( tpia_target ), 0, "target" ) ) == NULL ) return( NULL );
00055     if( tpia_target_initialize( smr, target ) ) target = tpia_target_free( smr, target );
00056     return( target );
00057 }
00058 /*
00059 ************************************************************
00060 */
00061 int tpia_target_initialize( statusMessageReporting *smr, tpia_target *target ) {
00062 
00063     memset( target, 0, sizeof( tpia_target ) );
00064     tpia_samplingMethods_initialize( smr, &(target->samplingMethods) );
00065     return( 0 );
00066 }
00067 /*
00068 ************************************************************
00069 */
00070 tpia_target *tpia_target_createRead( statusMessageReporting *smr, const char *fileName ) {
00071 
00072     tpia_target *target;
00073 
00074     if( ( target = tpia_target_create( smr ) ) == NULL ) return( NULL );
00075     //if( tpia_target_read( smr, target, fileName ) != 0 ) target = xData_free( smr, target );
00076     if( tpia_target_read( smr, target, fileName ) != 0 ) target = (tpia_target*) xData_free( smr, target );
00077     return( target );
00078 }
00079 /*
00080 ************************************************************
00081 */
00082 int tpia_target_readFromMap( statusMessageReporting *smr, tpia_target *target, tpia_map *map, const char *evaluation, const char *projectileName, 
00083         const char *targetName ) {
00084 
00085     char *targetPath;
00086 
00087     if( ( targetPath = tpia_map_findTarget( smr, map, evaluation, projectileName, targetName ) ) == NULL ) return( 1 );
00088     return( tpia_target_read( smr, target, targetPath ) );
00089 }
00090 /*
00091 ************************************************************
00092 */
00093 tpia_target *tpia_target_createReadFromMap( statusMessageReporting *smr, tpia_map *map, const char *evaluation, const char *projectileName, 
00094         const char *targetName ) {
00095 
00096     char *targetPath;
00097     tpia_target *target;
00098 
00099     targetPath = tpia_map_findTarget( smr, map, evaluation, projectileName, targetName );
00100     if( targetPath == NULL ) return( NULL );
00101     target = tpia_target_createRead( smr, targetPath );
00102     xData_free( smr, targetPath );
00103     return( target );
00104 }
00105 /*
00106 ************************************************************
00107 */
00108 tpia_target *tpia_target_free( statusMessageReporting *smr, tpia_target *target ) {
00109 
00110     tpia_target_release( smr, target );
00111     xData_free( smr, target );
00112     return( NULL );
00113 }
00114 /*
00115 ************************************************************
00116 */
00117 int tpia_target_release( statusMessageReporting *smr, tpia_target *target ) {
00118 
00119     int i;
00120 
00121     //target->path = xData_free( smr, target->path );
00122     target->path = (char*) xData_free( smr, target->path );
00123     //target->absPath = xData_free( smr, target->absPath );
00124     target->absPath = (char*) xData_free( smr, target->absPath );
00125     xData_releaseAttributionList( smr, &(target->attributes) );
00126     for( i = 0; i < target->nHeatedTargets; i++ ) {
00127         //target->heatedTargets[i].path = xData_free( smr, target->heatedTargets[i].path );
00128         target->heatedTargets[i].path = (char*) xData_free( smr, target->heatedTargets[i].path );
00129         //target->heatedTargets[i].contents = xData_free( smr, target->heatedTargets[i].contents );
00130         target->heatedTargets[i].contents = (char*) xData_free( smr, target->heatedTargets[i].contents );
00131             if( target->heatedTargets[i].heatedTarget != NULL ) tpia_target_heated_free( smr, target->heatedTargets[i].heatedTarget );
00132     }
00133     //target->heatedTargets = xData_free( smr, target->heatedTargets );
00134     target->heatedTargets = (tpia_target_heated_info*) xData_free( smr, target->heatedTargets );
00135     //target->readHeatedTargets = xData_free( smr, target->readHeatedTargets );
00136     target->readHeatedTargets = (tpia_target_heated_info**) xData_free( smr, target->readHeatedTargets );
00137     tpia_target_initialize( smr, target );
00138     return( 0 );
00139 }
00140 /*
00141 ************************************************************
00142 */
00143 int tpia_target_read( statusMessageReporting *smr, tpia_target *target, const char *fileName ) {
00144 /*
00145 *   If a target has already been read into this target, user must have called tpia_target_release before calling this routine.
00146 *   Otherwise, there will be memory leaks.
00147 */
00148     xData_document *doc;
00149     xData_element *element, *child;
00150     int i, iHeated, nHeated = 0, status = 1;
00151     double temperature;
00152     //fix for gcc4.6 warings 110602
00153     //char *pReturnValue, *name;
00154     char *name;
00155     char const *contents;
00156 
00157     tpia_target_initialize( smr, target );
00158     if( ( target->path = xDataMisc_allocateCopyString2( smr, fileName, "path" ) ) == NULL ) return( status );
00159     if( ( target->absPath = xDataMisc_getAbsPath( smr, fileName ) ) == NULL ) return( _tpia_target_releaseAndReturnOne( smr, target ) );
00160     if( ( doc = xData_parseReadFile( smr, fileName, NULL, NULL ) ) == NULL ) return( _tpia_target_releaseAndReturnOne( smr, target ) );
00161     element = xData_getDocumentsElement( doc );
00162     if( strcmp( element->name, "xTarget" ) != 0 ) {
00163         tpia_misc_setMessageError_Element( smr, NULL, element, __FILE__, __LINE__, 1, "input file's top element must be xTarget and not %s", element->name ); }
00164     else {
00165         //pReturnValue = ( xData_copyAttributionList( smr, &(target->attributes), &(element->attributes) ) ) ? NULL : target->path;
00166         //fix for gcc4.6 warings 110602
00167         xData_copyAttributionList( smr, &(target->attributes),&(element->attributes) );
00168         name = tpia_misc_pointerToAttributeIfAllOk2( smr, element, 1, &(target->attributes), "projectile" );
00169         if( smr_isOk( smr ) ) target->projectileID = tpia_particle_getInternalID( smr, name );
00170         if( smr_isOk( smr ) && ( name = tpia_misc_pointerToAttributeIfAllOk2( smr, element, 1, &(target->attributes), "target" ) ) != NULL ) {
00171             if( smr_isOk( smr ) && ( target->targetID = tpia_particle_getInternalID( smr, name ) ) != NULL ) {
00172                 status = 0;
00173                 for( nHeated = 0, child = xData_getFirstElement( element ); child != NULL; nHeated++, child = xData_getNextElement( child ) ) {
00174                     if( strcmp( child->name, "target" ) != 0 ) {
00175                         tpia_misc_setMessageError_Element( smr, NULL, element, __FILE__, __LINE__, 1, "element can only have target sub-elements%s", 
00176                                 element->name );
00177                         status = 1;
00178                         break;
00179                     }
00180                 }
00181                 if( status == 0 ) {
00182                     //if( ( target->heatedTargets = xData_malloc2( smr, nHeated * sizeof( tpia_target_heated_info ), 1, "heatedTargets" ) ) == NULL ) {
00183                     if( ( target->heatedTargets = (tpia_target_heated_info*) xData_malloc2( smr, nHeated * sizeof( tpia_target_heated_info ), 1, "heatedTargets" ) ) == NULL ) {
00184                         status = 1; }
00185                     else {
00186                         //if( ( target->readHeatedTargets = xData_malloc2( smr, nHeated * sizeof( tpia_target_heated_info * ), 1, "heatedTargets" ) ) == NULL ) 
00187                         if( ( target->readHeatedTargets = (tpia_target_heated_info**) xData_malloc2( smr, nHeated * sizeof( tpia_target_heated_info * ), 1, "heatedTargets" ) ) == NULL ) 
00188                                 status = 1;
00189                     }
00190                     for( nHeated = 0, child = xData_getFirstElement( element ); ( status == 0 ) && ( child != NULL ); 
00191                             nHeated++, child = xData_getNextElement( child ) ) {
00192                         if( ( i = xData_convertAttributeToDouble( smr, child, "temperature", &temperature ) ) != 0 ) {
00193                             if( i > 0 ) smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1, "target does not have a temperature attribute" );
00194                             status = 1;
00195                             break;
00196                         }
00197                         for( iHeated = 0; iHeated < nHeated; iHeated++ ) if( target->heatedTargets[iHeated].temperature > temperature ) break;
00198                         if( iHeated < nHeated ) for( i = nHeated; i >= iHeated; i-- ) target->heatedTargets[i+1] = target->heatedTargets[i];
00199                         target->heatedTargets[iHeated].temperature = temperature;
00200                         target->heatedTargets[iHeated].path = NULL;
00201                         target->heatedTargets[iHeated].contents = NULL;
00202                         target->heatedTargets[iHeated].heatedTarget = NULL;
00203                         if( ( contents = xData_getAttributesValueInElement( child, "contents" ) ) != NULL ) {
00204                             if( ( target->heatedTargets[iHeated].contents = xDataMisc_allocateCopyString2( smr, contents, "contents" ) ) == NULL ) {
00205                                 status = 1;
00206                                 break;
00207                             }
00208                         }
00209                         if( ( contents = xData_getAttributesValueInElement( child, "file" ) ) == NULL ) {
00210                             status = 1;
00211                             break;
00212                         }
00213                         //if((target->heatedTargets[iHeated].path = xData_malloc2(smr, strlen( target->absPath ) + strlen( contents ) + 2, 0, "path")) == NULL) {
00214                         if((target->heatedTargets[iHeated].path = (char*) xData_malloc2(smr, strlen( target->absPath ) + strlen( contents ) + 2, 0, "path")) == NULL) {
00215                             status = 1;
00216                             break;
00217                         }
00218                         strcpy( target->heatedTargets[iHeated].path, target->absPath );
00219                         *strrchr( target->heatedTargets[iHeated].path, '/' ) = 0;
00220                         strcat( target->heatedTargets[iHeated].path, "/" );
00221                         strcat( target->heatedTargets[iHeated].path, contents );
00222                         target->nHeatedTargets++;
00223                     }
00224                 }
00225             }
00226         }
00227     }
00228     xData_parseFree( smr, doc );
00229     if( status == 0 ) {
00230         for( i = 0; i < nHeated; i++ ) target->heatedTargets[i].ordinal = i;
00231         for( i = 0; i < nHeated; i++ ) if( target->heatedTargets[i].contents == NULL ) break;
00232         if( i == nHeated ) i = 0;                                           /* All heated targets are crossSection only. */
00233         if( tpia_target_readHeatedTarget( smr, target, i, 0 ) == 0 ) {
00234             target->baseHeatedTarget = target->heatedTargets[i].heatedTarget; }
00235         else {
00236             tpia_target_release( NULL, target );
00237             status = 1;
00238         } }
00239     else {
00240         tpia_target_release( smr, target );
00241     }
00242     return( status );
00243 }
00244 /*
00245 ************************************************************
00246 */
00247 //char *tpia_target_getAttributesValue( statusMessageReporting *smr, tpia_target *target, char const *name ) {
00248 char *tpia_target_getAttributesValue( statusMessageReporting *, tpia_target *target, char const *name ) {
00249 
00250     return( xData_getAttributesValue( &(target->attributes), name ) );
00251 }
00252 /*
00253 ************************************************************
00254 */
00255 //int tpia_target_getTemperatures( statusMessageReporting *smr, tpia_target *target, double *temperatures ) {
00256 int tpia_target_getTemperatures( statusMessageReporting *, tpia_target *target, double *temperatures ) {
00257 
00258     int i;
00259 
00260     if( temperatures != NULL ) for( i = 0; i < target->nHeatedTargets; i++ ) temperatures[i] = target->heatedTargets[i].temperature;
00261     return( target->nHeatedTargets );
00262 }
00263 /*
00264 ************************************************************
00265 */
00266 int tpia_target_readHeatedTarget( statusMessageReporting *smr, tpia_target *target, int index, int checkElememtsForAccess ) {
00267 
00268     int i;
00269 
00270     if( ( index < 0 ) || ( index >= target->nHeatedTargets ) ) {
00271         smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1, "temperature index = %d out of range (0 <= index < %d", index, target->nHeatedTargets );
00272         return( -1 );
00273     }
00274     if( target->heatedTargets[index].heatedTarget != NULL ) return( 1 );
00275     target->heatedTargets[index].heatedTarget = tpia_target_heated_createRead( smr, target->heatedTargets[index].path, checkElememtsForAccess );
00276     if( target->heatedTargets[index].heatedTarget != NULL ) {
00277         target->heatedTargets[index].heatedTarget->ordinal = target->heatedTargets[index].ordinal;
00278         for( i = target->nReadHeatedTargets; i > 0; i-- ) {
00279             if( target->readHeatedTargets[i-1]->temperature < target->heatedTargets[index].temperature ) break;
00280             target->readHeatedTargets[i] = target->readHeatedTargets[i-1];
00281         }
00282         target->readHeatedTargets[i] = &(target->heatedTargets[i]);
00283         target->nReadHeatedTargets++;
00284     }
00285     return( ( target->heatedTargets[index].heatedTarget == NULL ? -1 : 0 ) );
00286 }
00287 /*
00288 ************************************************************
00289 */
00290 tpia_target_heated *tpia_target_getHeatedTargetAtIndex_ReadIfNeeded( statusMessageReporting *smr, tpia_target *target, int index ) {
00291 
00292     if( ( index < 0 ) || ( index >= target->nHeatedTargets ) ) {
00293         smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1, "temperature index = %d out of range (0 <= index < %d", index, target->nHeatedTargets );
00294         return( NULL );
00295     }
00296     if( target->heatedTargets[index].heatedTarget == NULL ) tpia_target_readHeatedTarget( smr, target, index, 0 );
00297     return( target->heatedTargets[index].heatedTarget );
00298 }
00299 /*
00300 ************************************************************
00301 */
00302 tpia_target_heated *tpia_target_getHeatedTargetAtTIndex( statusMessageReporting *smr, tpia_target *target, int index ) {
00303 
00304     if( ( index < 0 ) || ( index >= target->nHeatedTargets ) ) {
00305         smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1, "temperature index = %d out of range (0 <= index < %d", index, target->nHeatedTargets );
00306         return( NULL );
00307     }
00308     if( target->heatedTargets[index].heatedTarget == NULL ) {
00309         smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1, "temperature index = %d not read in", index );
00310         return( NULL );
00311     }
00312     return( target->heatedTargets[index].heatedTarget );
00313 }
00314 /*
00315 ************************************************************
00316 */
00317 int tpia_target_numberOfChannels( statusMessageReporting *smr, tpia_target *target ) {
00318 
00319     return( tpia_target_heated_numberOfChannels( smr, target->baseHeatedTarget ) );
00320 }
00321 /*
00322 ************************************************************
00323 */
00324 int tpia_target_numberOfProductionChannels( statusMessageReporting *smr, tpia_target *target ) {
00325 
00326     return( tpia_target_heated_numberOfProductionChannels( smr, target->baseHeatedTarget ) );
00327 }
00328 /*
00329 ************************************************************
00330 */
00331 xData_Int tpia_target_getEnergyGridAtTIndex( statusMessageReporting *smr, tpia_target *target, int index, double **energyGrid ) {
00332 
00333     tpia_target_heated *heated = tpia_target_getHeatedTargetAtTIndex( smr, target, index );
00334 
00335     if( !smr_isOk( smr ) ) return( -1 );
00336     return( tpia_target_heated_getEnergyGrid( smr, heated, energyGrid ) );
00337 }
00338 /*
00339 ************************************************************
00340 */
00341 tpia_1dData *tpia_target_getTotalCrossSectionAtTIndex( statusMessageReporting *smr, tpia_target *target, int index, int crossSectionType ) {
00342 
00343     tpia_target_heated *heated = tpia_target_getHeatedTargetAtTIndex( smr, target, index );
00344 
00345     if( !smr_isOk( smr ) ) return( NULL );
00346     if( crossSectionType == tpia_crossSectionType_grouped ) {
00347         return( &(heated->totalCrossSectionGrouped) ); }
00348     else if( crossSectionType == tpia_crossSectionType_pointwise ) {
00349         return( &(heated->totalCrossSectionPointwise) );
00350     }
00351     smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1, "Invalue crossSectionType = %d", crossSectionType );
00352     return( NULL );
00353 }
00354 /*
00355 ************************************************************
00356 */
00357 double tpia_target_getTotalCrossSectionAtTAndE( statusMessageReporting *smr, tpia_target *target, double T, xData_Int iEg, double e_in,
00358     int crossSectionType ) {
00359 
00360     int i;
00361     double xsec = 0., xsec1, xsec2;
00362 
00363     for( i = 0; i < target->nReadHeatedTargets; i++ ) if( target->readHeatedTargets[i]->temperature > T ) break;
00364     if( i == 0 ) {
00365         xsec = tpia_target_heated_getTotalCrossSectionAtE( smr, target->readHeatedTargets[0]->heatedTarget, iEg, e_in, crossSectionType ); }
00366     else if( i == target->nReadHeatedTargets ) {
00367         xsec = tpia_target_heated_getTotalCrossSectionAtE( smr, target->readHeatedTargets[i-1]->heatedTarget, iEg, e_in, crossSectionType ); }
00368     else {
00369         xsec1 = tpia_target_heated_getTotalCrossSectionAtE( smr, target->readHeatedTargets[i-1]->heatedTarget, iEg, e_in, crossSectionType );
00370         xsec2 = tpia_target_heated_getTotalCrossSectionAtE( smr, target->readHeatedTargets[i  ]->heatedTarget, iEg, e_in, crossSectionType );
00371         xsec = ( ( target->readHeatedTargets[i]->temperature - T ) * xsec1 + ( T - target->readHeatedTargets[i-1]->temperature ) * xsec2 ) / 
00372             ( target->readHeatedTargets[i]->temperature - target->readHeatedTargets[i-1]->temperature );
00373     }
00374 
00375     return( xsec );
00376 }
00377 /*
00378 ************************************************************
00379 */
00380 double tpia_target_getIndexChannelCrossSectionAtE( statusMessageReporting *smr, tpia_target *target, int index, double T, xData_Int iEg, double e_in,
00381     int crossSectionType ) {
00382 
00383     int i;
00384     double xsec = 0., xsec1, xsec2;
00385 
00386     for( i = 0; i < target->nReadHeatedTargets; i++ ) if( target->readHeatedTargets[i]->temperature > T ) break;
00387     if( i == 0 ) {
00388         xsec = tpia_target_heated_getIndexChannelCrossSectionAtE( smr, target->readHeatedTargets[0]->heatedTarget, index, iEg, e_in, crossSectionType ); }
00389     else if( i == target->nReadHeatedTargets ) {
00390         xsec = tpia_target_heated_getIndexChannelCrossSectionAtE( smr, target->readHeatedTargets[i-1]->heatedTarget, index, iEg, e_in, crossSectionType ); }
00391     else {
00392         xsec1 = tpia_target_heated_getIndexChannelCrossSectionAtE(smr, target->readHeatedTargets[i-1]->heatedTarget, index, iEg, e_in, crossSectionType);
00393         xsec2 = tpia_target_heated_getIndexChannelCrossSectionAtE(smr, target->readHeatedTargets[i  ]->heatedTarget, index, iEg, e_in, crossSectionType);
00394         xsec = ( ( target->readHeatedTargets[i]->temperature - T ) * xsec1 + ( T - target->readHeatedTargets[i-1]->temperature ) * xsec2 ) / 
00395             ( target->readHeatedTargets[i]->temperature - target->readHeatedTargets[i-1]->temperature );
00396     }
00397 
00398     return( xsec );
00399 }
00400 /*
00401 ************************************************************
00402 */
00403 //int tpia_target_sampleIndexChannelProductsAtE( statusMessageReporting *smr, tpia_target *target, int index, double T, 
00404 int tpia_target_sampleIndexChannelProductsAtE( statusMessageReporting *smr, tpia_target *target, int index, double , 
00405         tpia_decaySamplingInfo *decaySamplingInfo, int nProductData, tpia_productOutgoingData *productData ) {
00406 
00407     return( tpia_target_heated_sampleIndexChannelProductsAtE( smr, target->baseHeatedTarget, index, decaySamplingInfo,
00408         nProductData, productData ) );
00409 }
00410 /*
00411 ************************************************************
00412 */
00413 static int _tpia_target_releaseAndReturnOne( statusMessageReporting *smr, tpia_target *target ) {
00414 
00415     tpia_target_release( smr, target );
00416     return( 1 );
00417 }
00418 
00419 #if defined __cplusplus
00420 }
00421 #endif

Generated on Mon May 27 17:50:35 2013 for Geant4 by  doxygen 1.4.7