Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/lend/src/MCGIDI_KalbachMann.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 ]

Diff markup

Differences between /processes/hadronic/models/lend/src/MCGIDI_KalbachMann.cc (Version 11.3.0) and /processes/hadronic/models/lend/src/MCGIDI_KalbachMann.cc (Version 9.0.p2)


  1 /*                                                  1 
  2 # <<BEGIN-copyright>>                             
  3 # <<END-copyright>>                               
  4 */                                                
  5 #include <string.h>                               
  6 #include <cmath>                                  
  7                                                   
  8 #if defined __cplusplus                           
  9 #include "G4Exp.hh"                               
 10 #include "G4Log.hh"                               
 11 #include "G4Pow.hh"                               
 12 namespace GIDI {                                  
 13 using namespace GIDI;                             
 14 #endif                                            
 15 const double C1 = 0.04, C2 = 1.8e-6/*, C3 = 6.    
 16 /*                                                
 17 const double Et1 = 130., Et3 = 41.;               
 18 */                                                
 19 #if defined __cplusplus                           
 20 }                                                 
 21 #endif                                            
 22                                                   
 23 #include "MCGIDI_fromTOM.h"                       
 24 #include "MCGIDI_misc.h"                          
 25 #include "MCGIDI_private.h"                       
 26                                                   
 27 #if defined __cplusplus                           
 28 namespace GIDI {                                  
 29 using namespace GIDI;                             
 30 #endif                                            
 31                                                   
 32                                                   
 33 static int MCGIDI_KalbachMann_parseFromTOM2( s    
 34         double energyInFactor, double energyOu    
 35 static double MCGIDI_KalbachMann_S_a_or_b( dou    
 36 /*                                                
 37 **********************************************    
 38 */                                                
 39 MCGIDI_KalbachMann *MCGIDI_KalbachMann_new( st    
 40         ptwXY_interpolation interpolationXY )     
 41                                                   
 42     MCGIDI_KalbachMann *KalbachMann;              
 43                                                   
 44     if( ( KalbachMann = (MCGIDI_KalbachMann *)    
 45     if( MCGIDI_KalbachMann_initialize( smr, Ka    
 46     return( KalbachMann );                        
 47 }                                                 
 48 /*                                                
 49 **********************************************    
 50 */                                                
 51 int MCGIDI_KalbachMann_initialize( statusMessa    
 52                                                   
 53     memset( KalbachMann, 0, sizeof( MCGIDI_Kal    
 54     KalbachMann->dists.interpolationWY = inter    
 55     KalbachMann->dists.interpolationXY = inter    
 56     return( 0 );                                  
 57 }                                                 
 58 /*                                                
 59 **********************************************    
 60 */                                                
 61 MCGIDI_KalbachMann *MCGIDI_KalbachMann_free( s    
 62                                                   
 63     MCGIDI_KalbachMann_release( smr, KalbachMa    
 64     smr_freeMemory( (void **) &KalbachMann );     
 65     return( NULL );                               
 66 }                                                 
 67 /*                                                
 68 **********************************************    
 69 */                                                
 70 int MCGIDI_KalbachMann_release( statusMessageR    
 71                                                   
 72     int i;                                        
 73     MCGIDI_pdfsOfXGivenW *dists = &(KalbachMan    
 74                                                   
 75     for( i = 0; i < dists->numberOfWs; i++ ) {    
 76         smr_freeMemory( (void **) &(KalbachMan    
 77         smr_freeMemory( (void **) &(dists->dis    
 78     }                                             
 79     smr_freeMemory( (void **) &(KalbachMann->r    
 80     smr_freeMemory( (void **) &(dists->Ws) );     
 81     smr_freeMemory( (void **) &(dists->dist) )    
 82                                                   
 83     MCGIDI_KalbachMann_initialize( smr, Kalbac    
 84     return( 0 );                                  
 85 }                                                 
 86 /*                                                
 87 **********************************************    
 88 */                                                
 89 int MCGIDI_KalbachMann_parseFromTOM( statusMes    
 90                                                   
 91     MCGIDI_KalbachMann *KalbachMann = NULL;       
 92     xDataTOM_element *KalbachMannElement;         
 93     int index, dataPerEout = 3;                   
 94     double energyInFactor, energyOutFactor;       
 95     xDataTOM_xDataInfo *xDataInfo;                
 96     xDataTOM_KalbachMann *KalbachMannXData;       
 97     ptwXY_interpolation interpolationXY, inter    
 98     char const *energyFromUnit, *energyToUnit     
 99                                                   
100     MCGIDI_POP *productPOP = distribution->pro    
101     double productZ = productPOP->Z, productA     
102     MCGIDI_target_heated *targetHeated = MCGID    
103     MCGIDI_POP *projectilePOP = MCGIDI_target_    
104     double projectileZ = projectilePOP->Z, pro    
105     MCGIDI_POP *targetPOP = MCGIDI_target_heat    
106     double targetZ = targetPOP->Z, targetA = t    
107     double Ia = 0., Ib = 0., Ma = -1, mb = -1;    
108                                                   
109     if( ( targetA == 0 ) && ( targetZ == 6 ) )    
110         targetN = 6;                              
111         targetA = 12;                             
112     }                                             
113     if( ( KalbachMannElement = xDataTOME_getOn    
114                                                   
115     if( MCGIDI_fromTOM_interpolation( smr, Kal    
116     if( MCGIDI_fromTOM_interpolation( smr, Kal    
117                                                   
118     xDataInfo = &(KalbachMannElement->xDataInf    
119     KalbachMannXData = (xDataTOM_KalbachMann *    
120     if( KalbachMannXData->type == xDataTOM_Kal    
121                                                   
122     energyFromUnit = xDataTOM_axes_getUnit( sm    
123     if( !smr_isOk( smr ) ) goto err;              
124     energyInFactor = MCGIDI_misc_getUnitConver    
125     if( !smr_isOk( smr ) ) goto err;              
126                                                   
127     energyFromUnit = xDataTOM_axes_getUnit( sm    
128     if( !smr_isOk( smr ) ) goto err;              
129     energyOutFactor = MCGIDI_misc_getUnitConve    
130     if( !smr_isOk( smr ) ) goto err;              
131                                                   
132     if( ( KalbachMann = distribution->KalbachM    
133                                                   
134 /*                                                
135     double productMass MCGIDI_product_getMass_    
136 */                                                
137     KalbachMann->energyToMeVFactor = MCGIDI_mi    
138     KalbachMann->massFactor = (double) product    
139     KalbachMann->massFactor /= projectileN + p    
140     KalbachMann->massFactor += 1.;                
141                                                   
142     if( projectileZ == 0 ) {                      
143         if( projectileN == 1 ) Ma = 1; }          
144     else if( projectileZ == 1 ) {                 
145         if( projectileN == 1 ) {                  
146             Ma = 1; }                             
147         else if( projectileN == 2 ) {             
148             Ia = 2.22;                            
149             Ma = 1; } }                           
150     else if( projectileZ == 2 ) {                 
151         if( projectileN == 2 ) {                  
152             Ia = 28.3;                            
153             Ma = 0;                               
154         }                                         
155     }                                             
156                                                   
157     if( productZ == 0 ) {                         
158         if( productN == 1 ) mb = 0.5; }           
159     else if( productZ == 1 ) {                    
160         if( productN == 1 ) {                     
161             mb = 1; }                             
162         else if( productN == 2 ) {                
163             Ia = 2.22;                            
164             mb = 1; }                             
165         else if( productN == 3 ) {                
166             Ib = 8.48;                            
167             mb = 1; } }                           
168     else if( productZ == 2 ) {                    
169         if( productN == 1 ) {                     
170             Ib = 7.72;                            
171             mb = 1; }                             
172         else if( productN == 2 ) {                
173             Ib = 28.3;                            
174             mb = 2;                               
175         }                                         
176     }                                             
177                                                   
178     KalbachMann->Ma = Ma;                         
179     KalbachMann->mb = mb;                         
180                                                   
181     KalbachMann->Sa = MCGIDI_KalbachMann_S_a_o    
182     KalbachMann->Sb = MCGIDI_KalbachMann_S_a_o    
183         targetZ + projectileZ, targetN + proje    
184                                                   
185     KalbachMann->dists.numberOfWs = 0;            
186     if( ( KalbachMann->dists.Ws = (double *) s    
187     if( ( KalbachMann->dists.dist = (MCGIDI_pd    
188     if( ( KalbachMann->ras = (MCGIDI_KalbachMa    
189                                                   
190     for( index = 0; index < KalbachMannXData->    
191         if( MCGIDI_KalbachMann_parseFromTOM2(     
192             energyInFactor, energyOutFactor, K    
193     }                                             
194                                                   
195     if( ( KalbachMann->frame = MCGIDI_misc_get    
196     distribution->type = MCGIDI_distributionTy    
197                                                   
198     return( 0 );                                  
199                                                   
200 err:                                              
201     if( KalbachMann != NULL ) MCGIDI_KalbachMa    
202     return( 1 );                                  
203 }                                                 
204 /*                                                
205 **********************************************    
206 */                                                
207 static int MCGIDI_KalbachMann_parseFromTOM2( s    
208         double energyInFactor, double energyOu    
209                                                   
210     int i, j, n = coefficientsXData->length /     
211     MCGIDI_pdfsOfXGivenW *dists = &(KalbachMan    
212     MCGIDI_pdfOfX *dist = &(dists->dist[index]    
213     double norm, *p, *rs = NULL, *as_ = NULL,     
214     nfu_status status;                            
215     ptwXYPoints *pdfXY = NULL;                    
216     ptwXYPoint *point;                            
217     ptwXPoints *cdfX = NULL;                      
218     char const *ptwFunc = "";                     
219                                                   
220     if( ( Xs = (double *) smr_malloc2( smr, 3     
221     pdf = &(Xs[n]);                               
222     cdf = &(pdf[n]);                              
223                                                   
224     if( ( rs = (double *) smr_malloc2( smr, (     
225     if( dataPerEout == 4 ) as_ = &(rs[n]);        
226                                                   
227     ptwFunc = "ptwXY_new";                        
228     if( ( pdfXY = ptwXY_new( KalbachMann->dist    
229                                                   
230     ptwFunc = "ptwXY_setXYPairAtIndex";           
231     for( i = 0, p = coefficientsXData->coeffic    
232         if( ( status = ptwXY_setValueAtX( pdfX    
233         rs[i] = p[2];                             
234         if( dataPerEout == 4 ) as_[i] = p[3];     
235     }                                             
236                                                   
237     for( j = 0; j < n; j++ ) {                    
238         point = ptwXY_getPointAtIndex_Unsafely    
239         Xs[j] = energyOutFactor * point->x;       
240         pdf[j] = point->y / energyOutFactor;      
241     }                                             
242                                                   
243     ptwFunc = "ptwXY_runningIntegral";            
244     if( ( cdfX = ptwXY_runningIntegral( pdfXY,    
245     norm = ptwX_getPointAtIndex_Unsafely( cdfX    
246     if( std::fabs( 1. - norm ) > 0.99 ) {         
247         smr_setReportError2( smr, smr_unknownI    
248         goto err;                                 
249     }                                             
250     for( j = 0; j < n; j++ ) cdf[j] = ptwX_get    
251     for( j = 0; j < n; j++ ) pdf[j] /= norm;      
252                                                   
253     dists->numberOfWs++;                          
254     dists->Ws[index] = energyInFactor * coeffi    
255     dist->numberOfXs = n;                         
256     dist->Xs = Xs;                                
257     dist->pdf = pdf;                              
258     dist->cdf = cdf;                              
259     KalbachMann->ras[index].rs = rs;              
260     KalbachMann->ras[index].as = as_;             
261                                                   
262     pdfXY = ptwXY_free( pdfXY );                  
263     cdfX = ptwX_free( cdfX );                     
264     return( 0 );                                  
265                                                   
266 errXY:                                            
267     smr_setReportError2( smr, smr_unknownID, 1    
268                                                   
269 err:                                              
270     if( Xs != NULL ) smr_freeMemory( (void **)    
271     if( rs != NULL ) smr_freeMemory( (void **)    
272     if( pdfXY != NULL ) ptwXY_free( pdfXY );      
273     if( cdfX != NULL ) cdfX = ptwX_free( cdfX     
274     return( 1 );                                  
275 }                                                 
276 /*                                                
277 **********************************************    
278 */                                                
279 static double MCGIDI_KalbachMann_S_a_or_b( dou    
280                                                   
281     double A_AB = Z_AB + N_AB, A_C = Z_C + N_C    
282     double invA_AB_third = 1.0 / G4Pow::GetIns    
283     double NZA_AB = ( N_AB - Z_AB ) * ( N_AB -    
284                                                   
285     S =   15.68 * ( A_C - A_AB )                  
286         - 18.56 * ( A_C * invA_C_third - A_AB     
287         - 0.717 * ( Z_C * Z_C * invA_C_third -    
288         - I_ab;                                   
289     return( S );                                  
290 }                                                 
291 /*                                                
292 **********************************************    
293 */                                                
294 int MCGIDI_KalbachMann_sampleEp( statusMessage    
295         MCGIDI_decaySamplingInfo *decaySamplin    
296                                                   
297     double Epl, Epu, Ep, r, r2, rl, ru, a, a2,    
298     MCGIDI_pdfsOfXGivenW_sampled sampled;         
299     MCGIDI_pdfsOfXGivenW *dists = &(KalbachMan    
300     ptwXY_interpolation interpolationWY;          
301                                                   
302     sampled.smr = smr;                            
303     sampled.w = modes.getProjectileEnergy( );     
304     MCGIDI_sampling_sampleX_from_pdfsOfXGivenW    
305                                                   
306     interpolationWY = sampled.interpolationWY;    
307     if( sampled.iW < 0 ) {                        
308         interpolationWY = ptwXY_interpolationF    
309         if( sampled.iW == -2 ) {        /* ???    
310             sampled.iW = 0; }                     
311         else if( sampled.iW == -1 ) {             
312             sampled.iW = dists->numberOfWs - 1    
313         }                                         
314     }                                             
315                                                   
316     Ep = sampled.x;                               
317     if( sampled.interpolationXY == ptwXY_inter    
318         r = KalbachMann->ras[sampled.iW].rs[sa    
319     else {                                        
320         Epl = dists->dist[sampled.iW].Xs[sampl    
321         Epu = dists->dist[sampled.iW].Xs[sampl    
322         rl = KalbachMann->ras[sampled.iW].rs[s    
323         ru = KalbachMann->ras[sampled.iW].rs[s    
324         r = ( ru - rl ) / ( Epu - Epl ) * ( Ep    
325     }                                             
326     if( interpolationWY == ptwXY_interpolation    
327         if( sampled.interpolationXY == ptwXY_i    
328             r2 = KalbachMann->ras[sampled.iW+1    
329         else {                                    
330             Epl = dists->dist[sampled.iW+1].Xs    
331             Epu = dists->dist[sampled.iW+1].Xs    
332             rl = KalbachMann->ras[sampled.iW+1    
333             ru = KalbachMann->ras[sampled.iW+1    
334             r2 = ( ru - rl ) / ( Epu - Epl ) *    
335         }                                         
336         r = sampled.frac * r + ( 1. - sampled.    
337     }                                             
338                                                   
339     if( KalbachMann->ras[0].as == NULL ) {        
340         double X1, X3_2;                          
341         double eb = KalbachMann->massFactor *     
342                                                   
343         X1 = eb;             /* Not valid for     
344         X3_2 = eb * eb;       /* Not valid for    
345         a = X1 * ( C1 + C2 * X1 * X1 ) + C2 *     
346     else {                                        
347         if( sampled.interpolationXY == ptwXY_i    
348             a = KalbachMann->ras[sampled.iW].a    
349         else {                                    
350             Epl = dists->dist[sampled.iW].Xs[s    
351             Epu = dists->dist[sampled.iW].Xs[s    
352             al = KalbachMann->ras[sampled.iW].    
353             au = KalbachMann->ras[sampled.iW].    
354             a = ( au - al ) / ( Epu - Epl ) *     
355         }                                         
356         a2 = 0.;                                  
357         if( interpolationWY == ptwXY_interpola    
358             if( sampled.interpolationXY == ptw    
359                 a2 = KalbachMann->ras[sampled.    
360             else {                                
361                 Epl = dists->dist[sampled.iW+1    
362                 Epu = dists->dist[sampled.iW+1    
363                 al = KalbachMann->ras[sampled.    
364                 au = KalbachMann->ras[sampled.    
365                 a2 = ( au - al ) / ( Epu - Epl    
366             }                                     
367         }                                         
368         a = sampled.frac * a + ( 1. - sampled.    
369     }                                             
370                                                   
371         /* In the following: Cosh[ a mu ] + r     
372     if( decaySamplingInfo->rng( decaySamplingI    
373         double T = ( 2. * decaySamplingInfo->r    
374                                                   
375         mu = G4Log( T + std::sqrt( T * T + 1.     
376     else {                                        
377         double rng1 = decaySamplingInfo->rng(     
378                                                   
379         mu = G4Log( rng1 * exp_a + ( 1. - rng1    
380     }                                             
381     if( mu < -1 ) {                               
382         mu = -1;}                                 
383     else if( mu >  1 ) {                          
384         mu = 1;                                   
385     }                                             
386                                                   
387     decaySamplingInfo->frame = KalbachMann->fr    
388     decaySamplingInfo->Ep = Ep;                   
389     decaySamplingInfo->mu = mu;                   
390     return( !smr_isOk( smr ) );                   
391 }                                                 
392                                                   
393 #if defined __cplusplus                           
394 }                                                 
395 #endif                                            
396