tpia_particle.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 
00039 #if defined __cplusplus
00040 namespace GIDI {
00041 using namespace GIDI;
00042 #endif
00043 
00044 static int initialSizeOfList = 100, incrementalSizeOfList = 100;
00045 static int numberOfParticles = 0, sizeOfParticleSortedList = 0;
00046 static tpia_particle **particleSortedList = NULL;
00047 static tpia_particle *particleList = NULL, *particleListEnd = NULL;
00048 /*
00049 ************************************************************
00050 */
00051 tpia_particle *tpia_particle_create( statusMessageReporting *smr ) {
00052 
00053     //tpia_particle *particle = xData_malloc2( smr, sizeof( tpia_particle ), 0, "particle" );
00054     tpia_particle *particle = (tpia_particle*) xData_malloc2( smr, sizeof( tpia_particle ), 0, "particle" );
00055 
00056     if( particle == NULL ) return( NULL );
00057     tpia_particle_initialize( smr, particle );
00058     return( particle );
00059 }
00060 /*
00061 ************************************************************
00062 */
00063 //int tpia_particle_initialize( statusMessageReporting *smr, tpia_particle *particle ) {
00064 int tpia_particle_initialize( statusMessageReporting *, tpia_particle *particle ) {
00065 
00066     memset( particle, 0, sizeof( tpia_particle ) );
00067     return( 0 );
00068 }
00069 /*
00070 ************************************************************
00071 */
00072 tpia_particle *tpia_particle_free( statusMessageReporting *smr, tpia_particle *particle ) {
00073 
00074     int i, j;
00075     tpia_particle **p;
00076 
00077     for( i = 0, p = particleSortedList; i < numberOfParticles; i++, p++ ) {
00078         if( *p == particle ) {
00079             numberOfParticles--;
00080             for( j = i; j < numberOfParticles; j++, p++ ) *p = p[1];
00081             break;
00082         }
00083     }
00084     if( particle == particleListEnd ) particleListEnd = particle->prior;
00085     if( particle == particleList ) particleList = particle->next;
00086     if( particle->prior != NULL ) particle->prior->next = particle->next;
00087     if( particle->next != NULL ) particle->next->prior = particle->prior;
00088     tpia_particle_release( smr, particle );
00089     xData_free( smr, particle );
00090     return( NULL );
00091 }
00092 /*
00093 ************************************************************
00094 */
00095 int tpia_particle_release( statusMessageReporting *smr, tpia_particle *particle ) {
00096 
00097     if( particle->spectralID != NULL ) tpi_spectralID_free( smr, particle->spectralID );
00098     return( 0 );
00099 }
00100 /*
00101 ************************************************************
00102 */
00103 int tpia_particle_freeInternalList( statusMessageReporting *smr ) {
00104 
00105     while( particleList != NULL ) tpia_particle_free( smr, particleList );
00106     //particleSortedList = xData_free( smr, particleSortedList );
00107     particleSortedList = (tpia_particle**) xData_free( smr, particleSortedList );
00108     return( 0 );
00109 }
00110 /*
00111 ************************************************************
00112 */
00113 tpia_particle *tpia_particle_getInternalID( statusMessageReporting *smr, const char * const name ) {
00114 
00115     int i, iCmp, min, mid, max, Z, A, m;
00116     tpia_particle *particle;
00117     char *EOP;
00118 
00119     iCmp = 0;
00120     min = mid = 0;
00121     max = numberOfParticles;
00122     while( min != max ) {
00123         mid = ( min + max ) / 2;
00124         iCmp = strcmp( name, particleSortedList[mid]->name );
00125         if( iCmp == 0 ) return( particleSortedList[mid] );
00126         if( iCmp < 0 ) {
00127             max = mid - 1;
00128             if( mid == 0 ) max = 0; }
00129         else {
00130             min = mid + 1;
00131             if( min > max ) min = max;
00132         }
00133     }
00134     mid = min;
00135     if( numberOfParticles > 0 ) {
00136         iCmp = strcmp( name, particleSortedList[mid]->name );
00137         if( iCmp == 0 ) return( particleSortedList[mid] );
00138         if( ( iCmp < 0 ) && ( mid != 0 ) ) {
00139             mid--;
00140             iCmp = strcmp( name, particleSortedList[mid]->name );
00141         }
00142     }
00143 
00144     if( ( particle = tpia_particle_create( smr ) ) == NULL ) return( NULL );
00145     if( ( particle->spectralID = tpi_spectralID_parse( smr, name, &(EOP) ) ) == NULL ) return( tpia_particle_free( smr, particle ) );
00146     particle->name = particle->spectralID->name;
00147     if( tpia_miscNameToZAm( smr, particle->name, &Z, &A, &m ) != 0 ) return( tpia_particle_free( smr, particle ) );
00148     particle->prior = NULL;
00149     particle->next = NULL;
00150     particle->Z = Z;
00151     particle->A = A;
00152     particle->m = m;
00153     particle->mass = tpia_particleMass_AMU( smr, particle->name );
00154     if( !smr_isOk( smr ) ) return( tpia_particle_free( smr, particle ) );
00155     particle->fullMass_MeV = tpia_AMU2MeV * particle->mass + particle->spectralID->level;
00156 
00157     if( sizeOfParticleSortedList < ( numberOfParticles + 1 ) ) {
00158         if( sizeOfParticleSortedList == 0 ) {
00159             sizeOfParticleSortedList = initialSizeOfList; }
00160         else {
00161             sizeOfParticleSortedList += incrementalSizeOfList;
00162         }
00163         //if( ( particleSortedList = xData_realloc2( smr, particleSortedList, sizeOfParticleSortedList * sizeof( tpia_particle * ), 
00164         if( ( particleSortedList = (tpia_particle** ) xData_realloc2( smr, particleSortedList, sizeOfParticleSortedList * sizeof( tpia_particle * ), 
00165             "particleSortedList" ) ) == NULL ) return( tpia_particle_free( smr, particle ) );
00166     }
00167 
00168     if( particleList == NULL ) {
00169         particle->ordinal = 0;
00170         particleListEnd = particleList = particle; }
00171     else {
00172         particle->ordinal = particleListEnd->ordinal + 1;
00173         particle->prior = particleListEnd;
00174         particleListEnd->next = particle;
00175         particleListEnd = particle;
00176     }
00177 
00178     if( ( mid != 0 ) || ( iCmp > 0 ) ) mid++;
00179     for( i = numberOfParticles; i > mid; i-- ) particleSortedList[i] = particleSortedList[i-1];
00180     particleSortedList[mid] = particle;
00181     numberOfParticles++;
00182 
00183     return( particle );
00184 }
00185 /*
00186 ************************************************************
00187 */
00188 //int tpia_particle_printInternalSortedList( statusMessageReporting *smr ) {
00189 int tpia_particle_printInternalSortedList( statusMessageReporting * ) {
00190 
00191     int i;
00192 
00193     for( i = 0; i < numberOfParticles; i++ ) printf( "%s\n", particleSortedList[i]->name );
00194     return( 0 );
00195 }
00196 
00197 #if defined __cplusplus
00198 }
00199 #endif

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