Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/lend/src/MCGIDI_particle.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  1 /*
  2 # <<BEGIN-copyright>>
  3 # <<END-copyright>>
  4 */
  5 #include <string.h>
  6 #include "MCGIDI.h"
  7 
  8 #if defined __cplusplus
  9 namespace GIDI {
 10 using namespace GIDI;
 11 #endif
 12 
 13 static int initialSizeOfList = 1000, incrementalSizeOfList = 1000;
 14 static int numberOfParticles = 0, sizeOfParticleSortedList = 0;
 15 static MCGIDI_particle **particleSortedList = NULL;
 16 static MCGIDI_particle *particleList = NULL, *particleListEnd = NULL;
 17 /*
 18 ************************************************************
 19 */
 20 MCGIDI_particle *MCGIDI_particle_new( statusMessageReporting *smr ) {
 21 
 22     MCGIDI_particle *particle = (MCGIDI_particle *) smr_malloc2( smr, sizeof( MCGIDI_particle ), 0, "particle" );
 23 
 24     if( particle == NULL ) return( NULL );
 25     MCGIDI_particle_initialize( smr, particle );
 26     return( particle );
 27 }
 28 /*
 29 ************************************************************
 30 */
 31 int MCGIDI_particle_initialize( statusMessageReporting * /*smr*/, MCGIDI_particle *particle ) {
 32 
 33     memset( particle, 0, sizeof( MCGIDI_particle ) );
 34     return( 0 );
 35 }
 36 /*
 37 ************************************************************
 38 */
 39 MCGIDI_particle *MCGIDI_particle_free( statusMessageReporting *smr, MCGIDI_particle *particle ) {
 40 
 41     int i, j;
 42     MCGIDI_particle **p;
 43 
 44     for( i = 0, p = particleSortedList; i < numberOfParticles; i++, p++ ) {
 45         if( *p == particle ) {
 46             numberOfParticles--;
 47             for( j = i; j < numberOfParticles; j++, p++ ) *p = p[1];
 48             break;
 49         }
 50     }
 51     if( particle == particleListEnd ) particleListEnd = particle->prior;
 52     if( particle == particleList ) particleList = particle->next;
 53     if( particle->prior != NULL ) particle->prior->next = particle->next;
 54     if( particle->next != NULL ) particle->next->prior = particle->prior;
 55     MCGIDI_particle_release( smr, particle );
 56     smr_freeMemory( (void **) &particle );
 57     return( NULL );
 58 }
 59 /*
 60 ************************************************************
 61 */
 62 int MCGIDI_particle_release( statusMessageReporting * /*smr*/, MCGIDI_particle *particle ) {
 63 
 64     smr_freeMemory( (void **) &(particle->name) );
 65     return( 0 );
 66 }
 67 /*
 68 ************************************************************
 69 */
 70 int MCGIDI_particle_freeInternalList( statusMessageReporting *smr ) {
 71 
 72     while( particleList != NULL ) MCGIDI_particle_free( smr, particleList );  // Loop checking, 11.06.2015, T. Koi
 73     particleSortedList = (MCGIDI_particle **) smr_freeMemory( (void **) &particleSortedList );
 74     return( 0 );
 75 }
 76 /*
 77 ************************************************************
 78 */
 79 MCGIDI_particle *MCGIDI_particle_getInternalID( statusMessageReporting *smr, const char * const name, MCGIDI_POPs *pops ) {
 80 
 81     int i, iCmp, min, mid, max, Z, A, m, level;
 82     MCGIDI_particle *particle;
 83     MCGIDI_POP *pop;
 84 
 85     iCmp = 0;
 86     min = mid = 0;
 87     max = numberOfParticles;
 88     while( min != max ) {  // Loop checking, 11.06.2015, T. Koi
 89         mid = ( min + max ) / 2;
 90         iCmp = strcmp( name, particleSortedList[mid]->name );
 91         if( iCmp == 0 ) return( particleSortedList[mid] );
 92         if( iCmp < 0 ) {
 93             max = mid - 1;
 94             if( mid == 0 ) max = 0; }
 95         else {
 96             min = mid + 1;
 97             if( min > max ) min = max;
 98         }
 99     }
100     mid = min;
101     if( numberOfParticles > 0 ) {
102         iCmp = strcmp( name, particleSortedList[mid]->name );
103         if( iCmp == 0 ) return( particleSortedList[mid] );
104         if( ( iCmp < 0 ) && ( mid != 0 ) ) {
105             mid--;
106             iCmp = strcmp( name, particleSortedList[mid]->name );
107         }
108     }
109 
110     if( ( particle = MCGIDI_particle_new( smr ) ) == NULL ) return( NULL );
111     if( ( particle->name = smr_allocateCopyString( smr, name, "particle->name", __FILE__, __LINE__, __func__ ) ) == NULL ) goto err;
112     if( MCGIDI_miscNameToZAm( smr, name, &Z, &A, &m, &level ) != 0 ) goto err;
113     particle->prior = NULL;
114     particle->next = NULL;
115     particle->Z = Z;
116     particle->A = A;
117     particle->m = m;
118     if( ( pop = MCGIDI_POPs_findParticle( pops, name ) ) == NULL ) {    /* This should not happend. */
119         particle->mass_MeV = MCGIDI_AMU2MeV * MCGIDI_particleMass_AMU( smr, name ); }
120     else {
121         particle->mass_MeV = pop->mass_MeV;
122     }
123     if( !smr_isOk( smr ) ) goto err;
124 
125     if( sizeOfParticleSortedList < ( numberOfParticles + 1 ) ) {
126         if( sizeOfParticleSortedList == 0 ) {
127             sizeOfParticleSortedList = initialSizeOfList; }
128         else {
129             sizeOfParticleSortedList += incrementalSizeOfList;
130         }
131         if( ( particleSortedList = (MCGIDI_particle **) smr_realloc2( smr, particleSortedList, sizeOfParticleSortedList * sizeof( MCGIDI_particle * ), 
132             "particleSortedList" ) ) == NULL ) goto err;
133     }
134 
135     if( particleList == NULL ) {
136         particle->ordinal = 0;
137         particleListEnd = particleList = particle; }
138     else {
139         particle->ordinal = particleListEnd->ordinal + 1;
140         particle->prior = particleListEnd;
141         particleListEnd->next = particle;
142         particleListEnd = particle;
143     }
144 
145     if( ( mid != 0 ) || ( iCmp > 0 ) ) mid++;
146     for( i = numberOfParticles; i > mid; i-- ) particleSortedList[i] = particleSortedList[i-1];
147     particleSortedList[mid] = particle;
148     numberOfParticles++;
149 
150     return( particle );
151 
152 err:
153     MCGIDI_particle_free( smr, particle );
154     return( NULL );
155 }
156 /*
157 ************************************************************
158 */
159 int MCGIDI_particle_printInternalSortedList( statusMessageReporting * /*smr*/ ) {
160 
161     int i;
162 
163     for( i = 0; i < numberOfParticles; i++ ) printf( "%s\n", particleSortedList[i]->name );
164     return( 0 );
165 }
166 
167 #if defined __cplusplus
168 }
169 #endif
170 
171