00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
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
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
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
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
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
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