source: trunk/source/processes/hadronic/models/incl/src/G4AblaFissionSimfis18.cc @ 1253

Last change on this file since 1253 was 968, checked in by garnier, 15 years ago

fichier ajoutes

File size: 56.6 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer                                           *
4// *                                                                  *
5// * The  Geant4 software  is  copyright of the Copyright Holders  of *
6// * the Geant4 Collaboration.  It is provided  under  the terms  and *
7// * conditions of the Geant4 Software License,  included in the file *
8// * LICENSE and available at  http://cern.ch/geant4/license .  These *
9// * include a list of copyright holders.                             *
10// *                                                                  *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work  make  any representation or  warranty, express or implied, *
14// * regarding  this  software system or assume any liability for its *
15// * use.  Please see the license in the file  LICENSE  and URL above *
16// * for the full disclaimer and the limitation of liability.         *
17// *                                                                  *
18// * This  code  implementation is the result of  the  scientific and *
19// * technical work of the GEANT4 collaboration.                      *
20// * By using,  copying,  modifying or  distributing the software (or *
21// * any work based  on the software)  you  agree  to acknowledge its *
22// * use  in  resulting  scientific  publications,  and indicate your *
23// * acceptance of all terms of the Geant4 Software license.          *
24// ********************************************************************
25//
26// $Id: G4AblaFissionSimfis18.cc,v 1.3 2008/11/06 08:42:00 gcosmo Exp $
27// Translation of INCL4.2/ABLA V3
28// Pekka Kaitaniemi, HIP (translation)
29// Christelle Schmidt, IPNL (fission code)
30// Alain Boudard, CEA (contact person INCL/ABLA)
31// Aatos Heikkinen, HIP (project coordination)
32
33#include "G4AblaFissionSimfis18.hh"
34#include <time.h>
35
36G4AblaFissionSimfis18::G4AblaFissionSimfis18()
37{
38}
39
40G4AblaFissionSimfis18::G4AblaFissionSimfis18(G4Hazard *hzr, G4InclRandomInterface *rndm)
41{
42  hazard = hzr;
43  randomGenerator = rndm;
44  setAboutString("Fission model: Based on ABLA with SimFis18");
45}
46
47G4AblaFissionSimfis18::~G4AblaFissionSimfis18()
48{
49
50}
51
52void G4AblaFissionSimfis18::doFission(G4double &A, G4double &Z, G4double &E,
53                 G4double &A1, G4double &Z1, G4double &E1, G4double &K1,
54                 G4double &A2, G4double &Z2, G4double &E2, G4double &K2)
55{
56  fissionDistri(A,Z,E,A1,Z1,E1,K1,A2,Z2,E2,K2);
57}
58
59void G4AblaFissionSimfis18::even_odd(G4double r_origin,G4double r_even_odd,G4int &i_out)     
60{
61  // Procedure to calculate I_OUT from R_IN in a way that
62  // on the average a flat distribution in R_IN results in a
63  // fluctuating distribution in I_OUT with an even-odd effect as
64  // given by R_EVEN_ODD
65
66  //     /* ------------------------------------------------------------ */
67  //     /* EXAMPLES :                                                   */
68  //     /* ------------------------------------------------------------ */
69  //     /*    If R_EVEN_ODD = 0 :                                       */
70  //     /*           CEIL(R_IN)  ----                                   */
71  //     /*                                                              */
72  //     /*              R_IN ->                                         */
73  //     /*            (somewhere in between CEIL(R_IN) and FLOOR(R_IN)) */                                            */
74  //     /*                                                              */
75  //     /*           FLOOR(R_IN) ----       --> I_OUT                   */
76  //     /* ------------------------------------------------------------ */
77  //     /*    If R_EVEN_ODD > 0 :                                       */
78  //     /*      The interval for the above treatment is                 */
79  //     /*         larger for FLOOR(R_IN) = even and                    */
80  //     /*         smaller for FLOOR(R_IN) = odd                        */
81  //     /*    For R_EVEN_ODD < 0 : just opposite treatment              */
82  //     /* ------------------------------------------------------------ */
83
84  //     /* ------------------------------------------------------------ */
85  //     /* On input:   R_ORIGIN    nuclear charge (real number)         */
86  //     /*             R_EVEN_ODD  requested even-odd effect            */
87  //     /* Intermediate quantity: R_IN = R_ORIGIN + 0.5                 */
88  //     /* On output:  I_OUT       nuclear charge (integer)             */
89  //     /* ------------------------------------------------------------ */
90
91  //      G4double R_ORIGIN,R_IN,R_EVEN_ODD,R_REST,R_HELP;
92  G4double r_in = 0.0, r_rest = 0.0, r_help = 0.0;
93  G4double r_floor = 0.0;
94  G4double r_middle = 0.0;
95  //      G4int I_OUT,N_FLOOR;
96  G4int n_floor = 0;
97
98  r_in = r_origin + 0.5;
99  r_floor = (float)((int)(r_in));
100  if (r_even_odd < 0.001) {
101    i_out = (int)(r_floor);
102  } 
103  else {
104    r_rest = r_in - r_floor;
105    r_middle = r_floor + 0.5;
106    n_floor = (int)(r_floor);
107    if (n_floor%2 == 0) {
108      // even before modif.
109      r_help = r_middle + (r_rest - 0.5) * (1.0 - r_even_odd);
110    } 
111    else {
112      // odd before modification
113      r_help = r_middle + (r_rest - 0.5) * (1.0 + r_even_odd);
114    }
115    i_out = (int)(r_help);
116  }
117}
118
119G4double G4AblaFissionSimfis18::umass(G4double z,G4double n,G4double beta)
120{
121  // liquid-drop mass, Myers & Swiatecki, Lysekil, 1967
122  // pure liquid drop, without pairing and shell effects
123
124  // On input:    Z     nuclear charge of nucleus
125  //              N     number of neutrons in nucleus
126  //              beta  deformation of nucleus
127  // On output:   binding energy of nucleus
128
129  G4double a = 0.0, umass = 0.0;
130  G4double alpha = 0.0;
131  G4double xcom = 0.0, xvs = 0.0, xe = 0.0;
132  const G4double pi = 3.1416;
133     
134  a = n + z;
135  alpha = ( std::sqrt(5.0/(4.0*pi)) ) * beta;
136 
137  xcom = 1.0 - 1.7826 * ((a - 2.0*z)/a)*((a - 2.0*z)/a);
138  // factor for asymmetry dependence of surface and volume term
139  xvs = - xcom * ( 15.4941 * a - 
140                   17.9439 * std::pow(a,0.66667) * (1.0+0.4*alpha*alpha) );
141  // sum of volume and surface energy
142  xe = z*z * (0.7053/(std::pow(a,0.33333)) * (1.0-0.2*alpha*alpha) - 1.1529/a);
143  umass = xvs + xe;
144 
145  return umass;
146}
147
148G4double G4AblaFissionSimfis18::ecoul(G4double z1,G4double n1,G4double beta1,G4double z2,G4double n2,G4double beta2,G4double d)
149{
150  // Coulomb potential between two nuclei
151  // surfaces are in a distance of d
152  // in a tip to tip configuration
153
154  // approximate formulation
155  // On input: Z1      nuclear charge of first nucleus
156  //           N1      number of neutrons in first nucleus
157  //           beta1   deformation of first nucleus
158  //           Z2      nuclear charge of second nucleus
159  //           N2      number of neutrons in second nucleus
160  //           beta2   deformation of second nucleus
161  //           d       distance of surfaces of the nuclei
162
163  //      G4double Z1,N1,beta1,Z2,N2,beta2,d,ecoul;
164  G4double ecoul = 0;
165  G4double dtot = 0;
166  const G4double r0 = 1.16;
167
168  dtot = r0 * ( std::pow((z1+n1),0.33333) * (1.0+(2.0/3.0)*beta1)
169                + std::pow((z2+n2),0.33333) * (1.0+(2.0/3.0)*beta2) ) + d;
170  ecoul = z1 * z2 * 1.44 / dtot;
171
172  return ecoul;
173}
174
175void G4AblaFissionSimfis18::fissionDistri(G4double &a,G4double &z,G4double &e,
176                           G4double &a1,G4double &z1,G4double &e1,G4double &v1,
177                           G4double &a2,G4double &z2,G4double &e2,G4double &v2)
178{
179  //  On input: A, Z, E (mass, atomic number and exc. energy of compound nucleus
180  //                     before fission)
181  //  On output: Ai, Zi, Ei (mass, atomic number and exc. energy of fragment 1 and 2
182  //                     after fission)
183
184  //  Additionally calculated but not put in the parameter list:
185  //  Kinetic energy of prefragments EkinR1, EkinR2
186
187  //  Translation of SIMFIS18.PLI (KHS, 2.1.2001)
188
189  // This program calculates isotopic distributions of fission fragments
190  // with a semiempirical model                     
191  // Copy from SIMFIS3, KHS, 8. February 1995       
192  // Modifications made by Jose Benlliure and KHS in August 1996
193  // Energy counted from lowest barrier (J. Benlliure, KHS 1997)
194  // Some bugs corrected (J. Benlliure, KHS 1997)         
195  // Version used for thesis S. Steinhaueser (August 1997)
196  // (Curvature of LD potential increased by factor of 2!)
197
198  // Weiter veraendert mit der Absicht, eine Version zu erhalten, die
199  // derjenigen entspricht, die von J. Benlliure et al.
200  // in Nucl. Phys. A 628 (1998) 458 verwendet wurde,
201  // allerdings ohne volle Neutronenabdampfung.
202
203  // The excitation energy was calculate now for each fission channel
204  // separately. The dissipation from saddle to scission was taken from
205  // systematics, the deformation energy at scission considers the shell
206  // effects in a simplified way, and the fluctuation is included.
207  // KHS, April 1999
208
209  // The width in N/Z was carefully adapted to values given by Lang et al.
210
211  // The width and eventually a shift in N/Z (polarization) follows the
212  // following rules:                                       
213
214  // The line N/Z following UCD has an angle of std::atan(Zcn/Ncn)
215  // to the horizontal axis on a chart of nuclides.
216  // (For 238U the angle is 32.2 deg.)
217
218  // The following relations hold: (from Armbruster)
219  //
220  // sigma(N) (A=const) = sigma(Z) (A=const)
221  // sigma(A) (N=const) = sigma(Z) (N=const)
222  // sigma(A) (Z=const) = sigma(N) (Z=const)
223  //
224  // From this we get:
225  // sigma(Z) (N=const) * N = sigma(N) (Z=const) * Z
226  // sigma(A) (Z=const) = sigma(Z) (A=const) * A/Z
227  // sigma(N) (Z=const) = sigma(Z) (A=const) * A/Z
228  // Z*sigma(N) (Z=const) = N*sigma(Z) (N=const) = A*sigma(Z) (A=const)
229
230  // Excitation energy now calculated above the lowest potential point
231  // Inclusion of a distribution of excitation energies             
232
233  // Several modifications, starting from SIMFIS12: KHS November 2000
234  // This version seems to work quite well for 238U.                 
235  // The transition from symmetric to asymmetric fission around 226Th
236  // is reasonably well reproduced, although St. I is too strong and St. II
237  // is too weak. St. I and St. II are also weakly seen for 208Pb.
238
239  // Extensions for an event generator of fission events (21.11.2000,KHS)
240
241  // Defalt parameters (IPARS) rather carefully adjusted to
242  // pre-neutron mass distributions of Vives et al. (238U + n)
243  // Die Parameter Fgamma1 und Fgamma2 sind kleiner als die resultierenden
244  // Breiten der Massenverteilungen!!! 
245  // Fgamma1 und Fgamma2 wurden angepaï¿œ, so daï¿œ
246  // Sigma-A(ST-I) = 3.3, Sigma-A(St-II) = 5.8 (nach Vives)
247
248  // Parameters of the model carefully adjusted by KHS (2.2.2001) to
249  // 238U + 208Pb, 1000 A MeV, Timo Enqvist et al.         
250
251
252  G4double     n = 0.0;
253  G4double     nlight1 = 0.0, nlight2 = 0.0;
254  G4double     aheavy1 = 0.0,alight1 = 0.0, aheavy2 = 0.0, alight2 = 0.0;
255  G4double     eheavy1 = 0.0, elight1 = 0.0, eheavy2 = 0.0, elight2 = 0.0;
256  G4double     zheavy1_shell = 0.0, zheavy2_shell = 0.0;
257  G4double     zlight1 = 0.0, zlight2 = 0.0;
258  G4double     masscurv = 0.0;
259  G4double     sasymm1 = 0.0, sasymm2 = 0.0, ssymm = 0.0, ysum = 0.0, yasymm = 0.0;
260  G4double     ssymm_mode1 = 0.0, ssymm_mode2 = 0.0;
261  G4double     cz_asymm1_saddle = 0.0, cz_asymm2_saddle = 0.0;
262  // Curvature at saddle, modified by ld-potential
263  G4double     wzasymm1_saddle, wzasymm2_saddle, wzsymm_saddle  = 0.0;
264  G4double     wzasymm1_scission = 0.0, wzasymm2_scission = 0.0, wzsymm_scission = 0.0;
265  G4double     wzasymm1 = 0.0, wzasymm2 = 0.0, wzsymm = 0.0;
266  G4double     nlight1_eff = 0.0, nlight2_eff = 0.0;
267  G4int  imode = 0;
268  G4double     rmode = 0.0;
269  G4double     z1mean = 0.0, z2mean = 0.0, z1width = 0.0, za1width = 0.0;
270  //      G4double     Z1,Z2,N1R,N2R,A1R,A2R,N1,N2,A1,A2;
271  G4double     n1r = 0.0, n2r = 0.0, a1r = 0.0, a2r = 0.0, n1 = 0.0, n2 = 0.0;
272
273  G4double     zsymm = 0.0, nsymm = 0.0, asymm = 0.0;
274  G4double     n1mean = 0.0, n2mean, n1width;
275  G4double     dueff = 0.0;
276  // effective shell effect at lowest barrier
277  G4double     eld = 0.0;
278  // Excitation energy with respect to ld barrier
279  G4double     re1 = 0.0, re2 = 0.0, re3 = 0.0;
280  G4double     eps1 = 0.0, eps2 = 0.0;
281  G4double     n1ucd = 0.0, n2ucd = 0.0, z1ucd = 0.0, z2ucd = 0.0;
282  G4double     beta = 0.0, beta1 = 0.0, beta2 = 0.0;
283
284  G4double     dn1_pol = 0.0;
285  // shift of most probable neutron number for given Z,
286  // according to polarization
287  G4int  i_help = 0;
288
289  //   /* Parameters of the semiempirical fission model */
290  G4double a_levdens = 0.0;
291  //           /* level-density parameter */
292  G4double a_levdens_light1 = 0.0, a_levdens_light2 = 0.0;
293  G4double a_levdens_heavy1 = 0.0, a_levdens_heavy2 = 0.0;
294  const G4double r_null = 1.16;
295  //          /* radius parameter */
296  G4double epsilon_1_saddle = 0.0, epsilon0_1_saddle = 0.0;
297  G4double epsilon_2_saddle = 0.0, epsilon0_2_saddle = 0.0, epsilon_symm_saddle = 0.0;
298  G4double epsilon_1_scission = 0.0, epsilon0_1_scission = 0.0;
299  G4double epsilon_2_scission = 0.0, epsilon0_2_scission = 0.0;
300  G4double epsilon_symm_scission = 0.0;
301  //                                   /* modified energy */
302  G4double e_eff1_saddle = 0.0, e_eff2_saddle = 0.0;
303  G4double epot0_mode1_saddle = 0.0, epot0_mode2_saddle = 0.0, epot0_symm_saddle = 0.0;
304  G4double epot_mode1_saddle = 0.0, epot_mode2_saddle = 0.0, epot_symm_saddle = 0.0;
305  G4double e_defo = 0.0, e_defo1 = 0.0, e_defo2 = 0.0, e_scission = 0.0, e_asym = 0.0;
306  G4double e1exc = 0.0, e2exc = 0.0;
307  G4double e1exc_sigma = 0.0, e2exc_sigma = 0.0;
308  G4double e1final = 0.0, e2final = 0.0;
309
310  const G4double r0 = 1.16;
311  G4double tker = 0.0;
312  G4double ekin1 = 0.0, ekin2 = 0.0;
313  //      G4double EkinR1,EkinR2,E1,E2,V1,V2;
314  G4double ekinr1 = 0.0, ekinr2 = 0.0;
315  G4int icz = 0, k = 0;
316
317  //   Input parameters:
318  //OMMENT(Nuclear charge number);
319  //      G4double Z;
320  //OMMENT(Nuclear mass number);
321  //      G4double A;
322  //OMMENT(Excitation energy above fission barrier);
323  //      G4double E;
324
325  //   Model parameters:
326  //OMMENT(position of heavy peak valley 1);
327  const G4double nheavy1 = 83.0;
328  //OMMENT(position of heavy peak valley 2);
329  const G4double nheavy2 = 90.0;
330  //OMMENT(Shell effect for valley 1);
331  const G4double delta_u1_shell = -2.65;
332  //        Parameter (Delta_U1_shell = -2)
333  //OMMENT(Shell effect for valley 2);
334  const G4double delta_u2_shell = -3.8;
335  //        Parameter (Delta_U2_shell = -3.2)
336  //OMMENT(I: used shell effect);
337  G4double delta_u1 = 0.0;
338  //omment(I: used shell effect);
339  G4double delta_u2 = 0.0;
340  //OMMENT(Curvature of asymmetric valley 1);
341  const G4double cz_asymm1_shell = 0.7;
342  //OMMENT(Curvature of asymmetric valley 2);
343  const G4double cz_asymm2_shell = 0.15;
344  //OMMENT(Factor for width of distr. valley 1);
345  const G4double fwidth_asymm1 = 0.63;
346  //OMMENT(Factor for width of distr. valley 2);
347  const G4double fwidth_asymm2 = 0.97;
348  //       Parameter (CZ_asymm2_scission = 0.12)
349  //OMMENT(Parameter x: a = A/x);
350  const G4double xlevdens = 12.0;
351  //OMMENT(Factor to gamma_heavy1);
352  const G4double fgamma1 = 2.0;
353  //OMMENT(I: fading of shells (general));
354  G4double gamma = 0.0;
355  //OMMENT(I: fading of shell 1);
356  G4double gamma_heavy1 = 0.0;
357  //OMMENT(I: fading of shell 2);
358  G4double gamma_heavy2 = 0.0;
359  //OMMENT(Zero-point energy at saddle);
360  const G4double e_zero_point = 0.5;
361  //OMMENT(I: friction from saddle to scission);
362  G4double e_saddle_scission = 0.0;
363  //OMMENT(Friction factor);
364  const G4double friction_factor = 1.0;
365  //OMMENT(I: Internal counter for different modes); INIT(0,0,0)
366  //      Integer*4 I_MODE(3)
367  //OMMENT(I: Yield of symmetric mode);
368  G4double ysymm = 0.0;
369  //OMMENT(I: Yield of asymmetric mode 1);
370  G4double yasymm1 = 0.0;
371  //OMMENT(I: Yield of asymmetric mode 2);
372  G4double yasymm2 = 0.0;
373  //OMMENT(I: Effective position of valley 1);
374  G4double nheavy1_eff = 0.0;
375  //OMMENT(I: position of heavy peak valley 1);
376  G4double zheavy1 = 0.0;
377  //omment(I: Effective position of valley 2);
378  G4double nheavy2_eff = 0.0;
379  //OMMENT(I: position of heavy peak valley 2);
380  G4double zheavy2 = 0.0;
381  //omment(I: Excitation energy above saddle 1);
382  G4double eexc1_saddle = 0.0;
383  //omment(I: Excitation energy above saddle 2);
384  G4double eexc2_saddle = 0.0;
385  //omment(I: Excitation energy above lowest saddle);
386  G4double eexc_max = 0.0;
387  //omment(I: Effective mass mode 1);
388  G4double aheavy1_mean = 0.0;
389  //omment(I: Effective mass mode 2);
390  G4double aheavy2_mean = 0.0;
391  //omment(I: Width of symmetric mode);
392  G4double wasymm_saddle = 0.0;
393  //OMMENT(I: Width of asymmetric mode 1);
394  G4double waheavy1_saddle = 0.0;
395  //OMMENT(I: Width of asymmetric mode 2);
396  G4double waheavy2_saddle = 0.0;
397  //omment(I: Width of symmetric mode);
398  G4double wasymm = 0.0;
399  //OMMENT(I: Width of asymmetric mode 1);
400  G4double waheavy1 = 0.0;
401  //OMMENT(I: Width of asymmetric mode 2);
402  G4double waheavy2 = 0.0;
403  //OMMENT(I: Even-odd effect in Z);
404  G4double r_e_o = 0.0, r_e_o_exp = 0.0;
405  //OMMENT(I: Curveture of symmetric valley);
406  G4double cz_symm = 0.0;
407  //OMMENT(I: Curvature of mass distribution for fixed Z);
408  G4double cn = 0.0;
409  //OMMENT(I: Curvature of Z distribution for fixed A);
410  G4double cz = 0.0;
411  //OMMENT(Minimum neutron width for constant Z);
412  const G4double sigzmin = 1.16;
413  //OMMENT(Surface distance of scission configuration);
414  const G4double d = 2.0;
415
416  //   /* Charge polarisation from Wagemanns p. 397: */
417  //OMMENT(Charge polarisation standard I);
418  const G4double cpol1 = 0.65;
419  //OMMENT(Charge polarisation standard II);
420  const G4double cpol2 = 0.55;
421  //OMMENT(=1: Polarisation simult. in N and Z);
422  const G4int nzpol = 1;
423  //OMMENT(=1: test output, =0: no test output);
424  const G4int itest = 0;
425     
426  //      G4double UMASS, ECOUL, reps1, reps2, rn1_pol;
427  G4double reps1 = 0.0, reps2 = 0.0, rn1_pol = 0.0;
428  //      Float_t HAZ,GAUSSHAZ;
429  G4int kkk = 0;
430  //  G4int kkk = 10; // PK
431 
432  //     I_MODE = 0;
433
434  if(itest == 1) {
435    G4cout << " cn mass " << a << G4endl;
436    G4cout << " cn charge " << z << G4endl;
437    G4cout << " cn energy " << e << G4endl;
438  }
439
440  //     /* average Z of asymmetric and symmetric components: */
441  n = a - z;  /* neutron number of the fissioning nucleus */
442
443  k = 0;
444  icz = 0;
445  if ( (std::pow(z,2)/a < 25.0) || (n < nheavy2) || (e > 500.0) ) {
446    icz = -1;
447    //          GOTO 1002;
448    goto milledeux;
449  }
450
451  nlight1 = n - nheavy1;
452  nlight2 = n - nheavy2;
453       
454  //    /* Polarisation assumed for standard I and standard II:
455  //      Z - Zucd = cpol (for A = const);
456  //      from this we get (see Armbruster)
457  //      Z - Zucd =  Acn/Ncn * cpol (for N = const)                        */
458
459  zheavy1_shell = ((nheavy1/n) * z) - ((a/n) * cpol1);
460  zheavy2_shell = ((nheavy2/n) * z) - ((a/n) * cpol2);
461
462  e_saddle_scission = 
463    (-24.0 + 0.02227 * (std::pow(z,2))/(std::pow(a,0.33333)) ) * friction_factor;
464   
465  //      /* Energy dissipated from saddle to scission                        */
466  //      /* F. Rejmund et al., Nucl. Phys. A 678 (2000) 215, fig. 4 b        */
467  //      E_saddle_scission = DMAX1(0.,E_saddle_scission);
468  if (e_saddle_scission > 0.) {
469    e_saddle_scission = e_saddle_scission;
470  }
471  else {
472    e_saddle_scission = 0.;
473  }
474  //     /* Semiempirical fission model: */
475
476  //    /* Fit to experimental result on curvature of potential at saddle */
477  //           /* reference:                                              */
478  //    /* IF Z**2/A < 33.15E0 THEN
479  //       MassCurv = 30.5438538E0 - 4.00212049E0 * Z**2/A
480  //                               + 0.11983384E0 * Z**4 / (A**2) ;
481  //     ELSE
482  //       MassCurv = 10.E0 ** (7.16993332E0 - 0.26602401E0 * Z**2/A
483  //                               + 0.00283802E0 * Z**4 / (A**2)) ;  */
484  //  /* New parametrization of T. Enqvist according to Mulgin et al. 1998 */
485  if ( (std::pow(z,2))/a < 34.0) {
486    masscurv =  std::pow( 10.0,(-1.093364 + 0.082933 * (std::pow(z,2)/a)
487                           - 0.0002602 * (std::pow(z,4)/std::pow(a,2))) );
488  } else {
489    masscurv = std::pow( 10.0,(3.053536 - 0.056477 * (std::pow(z,2)/a)
490                          + 0.0002454 * (std::pow(z,4)/std::pow(a,2))) );
491  }
492
493  cz_symm = (8.0/std::pow(z,2)) * masscurv;
494
495  if(itest == 1) {
496    G4cout << "cz_symmetry= " << cz_symm << G4endl;
497  }
498
499  if (cz_symm < 0) {
500    icz = -1;
501    //          GOTO 1002;
502    goto milledeux;
503  }
504
505  //  /* proton number in symmetric fission (centre) */
506  zsymm  = z/2.0;
507  nsymm  = n/2.0;
508  asymm = nsymm + zsymm;
509
510  zheavy1 = (cz_symm*zsymm + cz_asymm1_shell*zheavy1_shell)/(cz_symm + cz_asymm1_shell);
511  zheavy2 = (cz_symm*zsymm + cz_asymm2_shell*zheavy2_shell)/(cz_symm + cz_asymm2_shell);
512  //            /* position of valley due to influence of liquid-drop potential */
513  nheavy1_eff = (zheavy1 + (a/n * cpol1))*(n/z);
514  nheavy2_eff = (zheavy2 + (a/n * cpol2))*(n/z);
515  nlight1_eff = n - nheavy1_eff;
516  nlight2_eff = n - nheavy2_eff;
517  //  /* proton number of light fragments (centre) */
518  zlight1 = z - zheavy1;
519  //  /* proton number of light fragments (centre) */
520  zlight2 = z - zheavy2;
521  aheavy1 = nheavy1_eff + zheavy1;
522  aheavy2 = nheavy2_eff + zheavy2;
523  aheavy1_mean = aheavy1;
524  aheavy2_mean = aheavy2;
525  alight1 = nlight1_eff + zlight1;
526  alight2 = nlight2_eff + zlight2;
527
528  a_levdens = a / xlevdens;
529  a_levdens_heavy1 = aheavy1 / xlevdens;
530  a_levdens_heavy2 = aheavy2 / xlevdens;
531  a_levdens_light1 = alight1 / xlevdens;
532  a_levdens_light2 = alight2 / xlevdens;
533  gamma = a_levdens / (0.4 * (std::pow(a,1.3333)) );
534  gamma_heavy1 = ( a_levdens_heavy1 / (0.4 * (std::pow(aheavy1,1.3333)) ) ) * fgamma1;
535  gamma_heavy2 = a_levdens_heavy2 / (0.4 * (std::pow(aheavy2,1.3333)) );
536
537  cz_asymm1_saddle = cz_asymm1_shell + cz_symm;
538  cz_asymm2_saddle = cz_asymm2_shell + cz_symm;
539       
540  // Up to here: Ok! Checked CS 10/10/05           
541
542  cn = umass(zsymm,(nsymm+1.),0.0) + umass(zsymm,(nsymm-1.),0.0)
543    + 1.44 * (std::pow(zsymm,2))/
544    ( (std::pow(r_null,2)) * 
545      ( std::pow((asymm+1.0),0.33333) + std::pow((asymm-1.0),0.33333) ) *
546      ( std::pow((asymm+1.0),0.33333) + std::pow((asymm-1.0),0.33333) ) )
547    - 2.0 * umass(zsymm,nsymm,0.0)
548    - 1.44 * (std::pow(zsymm,2))/
549    ( ( 2.0 * r_null * (std::pow(asymm,0.33333)) ) * 
550      ( 2.0 * r_null * (std::pow(asymm,0.33333)) ) );
551       
552  // /* shell effect in valley of mode 1 */
553  delta_u1 = delta_u1_shell + (std::pow((zheavy1_shell-zheavy1),2))*cz_asymm1_shell;
554  // /* shell effect in valley of mode 2 */
555  delta_u2 = delta_u2_shell + (std::pow((zheavy2_shell-zheavy2),2))*cz_asymm2_shell;
556
557  //     /* liquid drop energies
558  //        at the centres of the different shell effects
559  //        with respect to liquid drop at symmetry: */
560  epot0_mode1_saddle = (std::pow((zheavy1-zsymm),2)) * cz_symm;
561  epot0_mode2_saddle = (std::pow((zheavy2-zsymm),2)) * cz_symm;
562  epot0_symm_saddle = 0.0;
563     
564  if (itest == 1) {
565    G4cout << "check zheavy1 = " << zheavy1  << G4endl;
566    G4cout << "check zheavy2 = " << zheavy2  << G4endl;
567    G4cout << "check zsymm = " << zsymm  << G4endl;
568    G4cout << "check czsymm = " << cz_symm  << G4endl;
569    G4cout << "check epot0_mode1_saddle = " << epot0_mode1_saddle  << G4endl;
570    G4cout << "check epot0_mode2_saddle = " << epot0_mode2_saddle  << G4endl;
571    G4cout << "check epot0_symm_saddle = " << epot0_symm_saddle  << G4endl;
572    G4cout << "delta_u1 = " << delta_u1 << G4endl;
573    G4cout << "delta_u2 = " << delta_u2 << G4endl;
574  }
575     
576  //     /* energies including shell effects
577  //        at the centres of the different shell effects
578  //        with respect to liquid drop at symmetry: */
579  epot_mode1_saddle = epot0_mode1_saddle + delta_u1;
580  epot_mode2_saddle = epot0_mode2_saddle + delta_u2;
581  epot_symm_saddle = epot0_symm_saddle;
582  if (itest == 1) {
583    G4cout << "check epot_mode1_saddle = " << epot_mode1_saddle  << G4endl;
584    G4cout << "check epot_mode2_saddle = " << epot_mode2_saddle  << G4endl;
585    G4cout << "check epot_symm_saddle = " << epot_symm_saddle  << G4endl;
586  }
587
588  //     /* Minimum of potential with respect to ld potential at symmetry */
589  dueff = min(epot_mode1_saddle,epot_mode2_saddle);
590  dueff = min(dueff,epot_symm_saddle);
591  dueff = dueff - epot_symm_saddle;
592
593  eld = e + dueff + e_zero_point;
594     
595  if (itest == 1) {
596    G4cout << "check dueff = " << dueff  << G4endl;
597    G4cout << "check e = " << e  << G4endl;
598    G4cout << "check e_zero_point = " << e_zero_point  << G4endl;
599    G4cout << "check eld = " << eld  << G4endl;
600  }
601  // Up to here: Ok! Checked CS 10/10/05
602     
603  //          /* E = energy above lowest effective barrier */
604  //          /* Eld = energy above liquid-drop barrier */
605
606  //     /* Due to this treatment the energy E on input means the excitation  */
607  //     /* energy above the lowest saddle.                                   */
608
609  //  /* These energies are not used */
610  eheavy1 = e * aheavy1 / a;
611  eheavy2 = e * aheavy2 / a;
612  elight1 = e * alight1 / a;
613  elight2 = e * alight2 / a;
614
615  epsilon0_1_saddle = eld - e_zero_point - epot0_mode1_saddle;
616  //            /* excitation energy at saddle mode 1 without shell effect */
617  epsilon0_2_saddle = eld - e_zero_point - epot0_mode2_saddle;
618  //            /* excitation energy at saddle mode 2 without shell effect */
619
620  epsilon_1_saddle = eld - e_zero_point - epot_mode1_saddle;
621  //            /* excitation energy at saddle mode 1 with shell effect */
622  epsilon_2_saddle = eld - e_zero_point - epot_mode2_saddle;
623  //            /* excitation energy at saddle mode 2 with shell effect */
624  epsilon_symm_saddle = eld - e_zero_point - epot_symm_saddle;
625
626  //  /* global parameters */
627  eexc1_saddle = epsilon_1_saddle;
628  eexc2_saddle = epsilon_2_saddle;
629  eexc_max = max(eexc1_saddle,eexc2_saddle);
630  eexc_max = max(eexc_max,eld);
631       
632  //         /* EEXC_MAX is energy above the lowest saddle */
633
634
635  epsilon0_1_scission = eld + e_saddle_scission - epot0_mode1_saddle;
636  //                    /* excitation energy without shell effect */
637  epsilon0_2_scission = eld + e_saddle_scission - epot0_mode2_saddle;
638  //                    /* excitation energy without shell effect */
639
640  epsilon_1_scission = eld + e_saddle_scission - epot_mode1_saddle;
641  //                    /* excitation energy at scission */
642  epsilon_2_scission = eld+ e_saddle_scission - epot_mode2_saddle;
643  //                    /* excitation energy at scission */
644  epsilon_symm_scission = eld + e_saddle_scission - epot_symm_saddle;
645  //           /* excitation energy of symmetric fragment at scission */
646
647  //     /* Calculate widhts at the saddle:                */
648
649  e_eff1_saddle = epsilon0_1_saddle - delta_u1 * (std::exp((-epsilon_1_saddle*gamma)));
650   
651  if (e_eff1_saddle > 0.0) {
652    wzasymm1_saddle = std::sqrt( (0.5 * 
653                             (std::sqrt(1.0/a_levdens*e_eff1_saddle)) /
654                             (cz_asymm1_shell * std::exp((-epsilon_1_saddle*gamma)) + cz_symm) ) );
655  } 
656  else {
657    wzasymm1_saddle = 1.0;
658  }
659
660  e_eff2_saddle = epsilon0_2_saddle - delta_u2 * (std::exp((-epsilon_2_saddle*gamma)));
661  if (e_eff2_saddle > 0.0) {
662    wzasymm2_saddle = std::sqrt( (0.5 * 
663                             (std::sqrt(1.0/a_levdens*e_eff2_saddle)) /
664                             (cz_asymm2_shell * std::exp((-epsilon_2_saddle*gamma)) + cz_symm) ) );
665  } 
666  else {
667    wzasymm2_saddle = 1.0;
668  }
669
670  if (eld > e_zero_point) {
671    if ( (eld + epsilon_symm_saddle) < 0.0)  {
672      G4cout << "<e> eld + epsilon_symm_saddle < 0" << G4endl;
673    }
674    wzsymm_saddle = std::sqrt( (0.5 * 
675                           (std::sqrt(1.0/a_levdens*(eld+epsilon_symm_saddle))) / cz_symm ) );
676  } else {
677    wzsymm_saddle = 1.0;
678  }
679
680  if (itest == 1) {
681    G4cout << "wz1(saddle) = " << wzasymm1_saddle << G4endl;
682    G4cout << "wz2(saddle) = " << wzasymm2_saddle << G4endl;
683    G4cout << "wzsymm(saddle) = " << wzsymm_saddle << G4endl;
684  }
685     
686  //     /* Calculate widhts at the scission point: */
687  //     /* fits of ref. Beizin 1991 (Plots brought to GSI by Sergei Zhdanov) */
688
689  wzsymm_scission = wzsymm_saddle;
690
691  if (e_saddle_scission == 0.0) {
692
693    wzasymm1_scission = wzasymm1_saddle;
694    wzasymm2_scission = wzasymm2_saddle;
695
696  } 
697  else {
698
699    if (nheavy1_eff > 75.0) {
700      wzasymm1_scission = (std::sqrt(21.0)) * z/a;
701      wzasymm2_scission = (std::sqrt (max( (70.0-28.0)/3.0*(z*z/a-35.0)+28.,0.0 )) ) * z/a;
702    } 
703    else {
704      wzasymm1_scission = wzasymm1_saddle;
705      wzasymm2_scission = wzasymm2_saddle;
706    }
707
708  }
709
710  wzasymm1_scission = max(wzasymm1_scission,wzasymm1_saddle);
711  wzasymm2_scission = max(wzasymm2_scission,wzasymm2_saddle);
712
713  wzasymm1 = wzasymm1_scission * fwidth_asymm1;
714  wzasymm2 = wzasymm2_scission * fwidth_asymm2;
715  wzsymm = wzsymm_scission;
716
717  /*      if (ITEST == 1) {
718          G4cout << "WZ1(scission) = " << WZasymm1_scission << G4endl;
719          G4cout << "WZ2(scission) = " << WZasymm2_scission << G4endl;
720          G4cout << "WZsymm(scission) = " << WZsymm_scission << G4endl;
721          }
722          if (ITEST == 1) {
723          G4cout << "WZ1(scission) final= " << WZasymm1 << G4endl;
724          G4cout << "WZ2(scission) final= " << WZasymm2 << G4endl;
725          G4cout << "WZsymm(scission) final= " << WZsymm << G4endl;
726          } */
727     
728  wasymm = wzsymm * a/z;
729  waheavy1 = wzasymm1 * a/z;
730  waheavy2 = wzasymm2 * a/z;
731
732  wasymm_saddle = wzsymm_saddle * a/z;
733  waheavy1_saddle = wzasymm1_saddle * a/z;
734  waheavy2_saddle = wzasymm2_saddle * a/z;
735
736  if (itest == 1) {
737    G4cout << "wasymm = " << wzsymm << G4endl;
738    G4cout << "waheavy1 = " << waheavy1 << G4endl;
739    G4cout << "waheavy2 = " << waheavy2 << G4endl;
740  }
741  // Up to here: Ok! Checked CS 11/10/05
742           
743  if ( (epsilon0_1_saddle - delta_u1*std::exp((-epsilon_1_saddle*gamma_heavy1))) < 0.0) {
744    sasymm1 = -10.0;
745  } 
746  else {
747    sasymm1 = 2.0 * std::sqrt( a_levdens * (epsilon0_1_saddle - 
748                                       delta_u1*(std::exp((-epsilon_1_saddle*gamma_heavy1))) ) );
749  }
750
751  if ( (epsilon0_2_saddle - delta_u2*std::exp((-epsilon_2_saddle*gamma_heavy2))) < 0.0) {
752    sasymm2 = -10.0;
753  } 
754  else {
755    sasymm2 = 2.0 * std::sqrt( a_levdens * (epsilon0_2_saddle - 
756                                       delta_u2*(std::exp((-epsilon_2_saddle*gamma_heavy2))) ) );
757  }
758             
759  if (epsilon_symm_saddle > 0.0) {
760    ssymm = 2.0 * std::sqrt( a_levdens*(epsilon_symm_saddle) );
761  } 
762  else {
763    ssymm = -10.0;
764  }
765     
766  if (ssymm > -10.0) {
767    ysymm = 1.0;
768
769    if (epsilon0_1_saddle < 0.0) {
770      //  /* low energy */
771      yasymm1 = std::exp((sasymm1-ssymm)) * wzasymm1_saddle / wzsymm_saddle * 2.0;
772      //           /* factor of 2 for symmetry classes */
773    } 
774    else {
775      //        /* high energy */
776      ssymm_mode1 = 2.0 * std::sqrt( a_levdens*(epsilon0_1_saddle) );
777      yasymm1 = ( std::exp((sasymm1-ssymm)) - std::exp((ssymm_mode1 - ssymm)) ) 
778        * wzasymm1_saddle / wzsymm_saddle * 2.0;
779    }
780
781    if (epsilon0_2_saddle < 0.0) {
782      //  /* low energy */
783      yasymm2 = std::exp((sasymm2-ssymm)) * wzasymm2_saddle / wzsymm_saddle * 2.0;
784      //           /* factor of 2 for symmetry classes */
785    } 
786    else {
787      //        /* high energy */
788      ssymm_mode2 = 2.0 * std::sqrt( a_levdens*(epsilon0_2_saddle) );
789      yasymm2 = ( std::exp((sasymm2-ssymm)) - std::exp((ssymm_mode2 - ssymm)) ) 
790        * wzasymm2_saddle / wzsymm_saddle * 2.0;
791    }       
792    //                            /* difference in the exponent in order */
793    //                            /* to avoid numerical overflow         */
794
795  } 
796  else {
797    if ( (sasymm1 > -10.0) && (sasymm2 > -10.0) ) {
798      ysymm = 0.0;
799      yasymm1 = std::exp(sasymm1) * wzasymm1_saddle * 2.0;
800      yasymm2 = std::exp(sasymm2) * wzasymm2_saddle * 2.0;
801    }
802  }
803       
804  //  /* normalize */
805  ysum = ysymm + yasymm1 + yasymm2;
806  if (ysum > 0.0) {
807    ysymm = ysymm / ysum;
808    yasymm1 = yasymm1 / ysum;
809    yasymm2 = yasymm2 / ysum;
810    yasymm = yasymm1 + yasymm2;
811  } 
812  else {
813    ysymm = 0.0;
814    yasymm1 = 0.0;
815    yasymm2 = 0.0;
816    //        /* search minimum threshold and attribute all events to this mode */
817    if ( (epsilon_symm_saddle < epsilon_1_saddle) && (epsilon_symm_saddle < epsilon_2_saddle) ) {
818      ysymm = 1.0;
819    } 
820    else {
821      if (epsilon_1_saddle < epsilon_2_saddle) {
822        yasymm1 = 1.0;
823      } 
824      else {
825        yasymm2 = 1.0;
826      }
827    }
828  }
829
830  if (itest == 1) {
831    G4cout << "ysymm normalized= " << ysymm  << G4endl;
832    G4cout << "yasymm1 normalized= " << yasymm1  << G4endl;
833    G4cout << "yasymm2 normalized= " << yasymm2  << G4endl;
834  }
835  // Up to here: Ok! Ckecked CS 11/10/05     
836     
837  //      /* even-odd effect */
838  //      /* simple parametrization KHS, Nov. 2000. From Rejmund et al. */
839  if ((int)(z) % 2 == 0) {
840    r_e_o_exp = -0.017 * (e_saddle_scission + eld) * (e_saddle_scission + eld);
841    if ( r_e_o_exp < -307.0) {
842      r_e_o_exp = -307.0;
843      r_e_o = std::pow(10.0,r_e_o_exp);
844    }
845    else {
846      r_e_o = std::pow(10.0,r_e_o_exp);
847    }
848  } 
849  else {
850    r_e_o = 0.0;
851  }
852   
853  //      $LOOP;    /* event loop */
854  //     I_COUNT = I_COUNT + 1;
855
856  //     /* random decision: symmetric or asymmetric */
857  //     /* IMODE = 1 means asymmetric fission, mode 1,
858  //        IMODE = 2 means asymmetric fission, mode 2,
859  //        IMODE = 3 means symmetric  */
860  //      RMODE = dble(HAZ(k));
861  //      rmode = rnd.rndm(); 
862
863  // Safety check added to make sure we always select well defined
864  // fission mode.
865  do {
866    rmode = haz(k);
867    // Cast for test CS 11/10/05
868    //      RMODE = 0.54;   
869    //  rmode = 0.54;
870    if (rmode < yasymm1) {
871      imode = 1;
872    } else if ( (rmode > yasymm1) && (rmode < (yasymm1+yasymm2)) ) {
873      imode = 2;
874    } else if ( (rmode > yasymm1) && (rmode > (yasymm1+yasymm2)) ) {
875      imode = 3;
876    }
877  } while(imode == 0);
878
879  //     /* determine parameters of the Z distribution */
880  // force imode (for testing, PK)
881  // imode = 3;
882  if (imode == 1) {
883    z1mean = zheavy1;
884    z1width = wzasymm1;
885  }
886  if (imode == 2) {
887    z1mean = zheavy2;
888    z1width = wzasymm2;
889  }
890  if (imode == 3) {
891    z1mean = zsymm;
892    z1width = wzsymm;
893  }
894
895  if (itest == 1) {
896    G4cout << "nbre aleatoire tire " << rmode << G4endl;
897    G4cout << "fission mode " << imode << G4endl;
898    G4cout << "z1mean= " << z1mean << G4endl;
899    G4cout << "z1width= " << z1width << G4endl;
900  }
901                     
902  //     /* random decision: Z1 and Z2 at scission: */
903  z1 = 1.0;
904  z2 = 1.0;
905  while  ( (z1<5.0) || (z2<5.0) ) {
906    //         Z1 = dble(GAUSSHAZ(K,sngl(Z1mean),sngl(Z1width)));
907    //   z1 = rnd.gaus(z1mean,z1width);
908    z1 = gausshaz(k, z1mean, z1width);
909    z2 = z - z1;
910  }
911  if (itest == 1) {
912    G4cout << "ff charge sample " << G4endl;
913    G4cout << "z1 =  " << z1 << G4endl;
914    G4cout << "z2 = " << z2 << G4endl;
915  }
916
917  //     CALL EVEN_ODD(Z1,R_E_O,I_HELP);
918  //         /* Integer proton number with even-odd effect */
919  //     Z1 = REAL(I_HELP)
920  //      /* Z1 = INT(Z1+0.5E0); */
921  z2 = z - z1;
922
923  //     /* average N of both fragments: */
924  if (imode == 1) {
925    n1mean = (z1 + cpol1 * a/n) * n/z;
926  }
927  if (imode == 2) { 
928    n1mean = (z1 + cpol2 * a/n) * n/z;
929  }
930  /*       CASE(99)   ! only for testing;
931           N1UCD = Z1 * N/Z;
932           N2UCD = Z2 * N/Z;
933           re1 = UMASS(Z1,N1UCD,0.6) +;
934           &         UMASS(Z2,N2UCD,0.6) +;
935           &         ECOUL(Z1,N1UCD,0.6,Z2,N2UCD,0.6,d);
936           re2 = UMASS(Z1,N1UCD+1.,0.6) +;
937           &         UMASS(Z2,N2UCD-1.,0.6) +;
938           &         ECOUL(Z1,N1UCD+1.,0.6,Z2,N2UCD-1.,0.6,d);
939           re3 = UMASS(Z1,N1UCD+2.,0.6) +;
940           &         UMASS(Z2,N2UCD-2.,0.6) +;
941           &         ECOUL(Z1,N1UCD+2.,0.6,Z2,N2UCD-2.,0.6,d);
942           eps2 = (re1-2.0*re2+re3) / 2.0;
943           eps1 = re2 - re1 - eps2;
944           DN1_POL = - eps1 / (2.0 * eps2);
945           N1mean = N1UCD + DN1_POL; */
946  if (imode == 3) {
947    n1ucd = z1 * n/z;
948    n2ucd = z2 * n/z;
949    re1 = umass(z1,n1ucd,0.6) + umass(z2,n2ucd,0.6) + ecoul(z1,n1ucd,0.6,z2,n2ucd,0.6,d);
950    re2 = umass(z1,n1ucd+1.,0.6) + umass(z2,n2ucd-1.,0.6) + ecoul(z1,n1ucd+1.,0.6,z2,n2ucd-1.,0.6,d);
951    re3 = umass(z1,n1ucd+2.,0.6) + umass(z2,n2ucd-2.,0.6) + ecoul(z1,n1ucd+2.,0.6,z2,n2ucd-2.,0.6,d);
952    eps2 = (re1-2.0*re2+re3) / 2.0;
953    eps1 = re2 - re1 - eps2;
954    dn1_pol = - eps1 / (2.0 * eps2);
955    n1mean = n1ucd + dn1_pol;
956  }
957  // all fission modes features have been checked CS 11/10/05
958  n2mean = n - n1mean;
959  z2mean = z - z1mean;
960     
961  //   /* Excitation energies */
962  //     /* formulated in energies in close consistency with the fission model */
963
964  //     /* E_defo = UMASS(Z*0.5E0,N*0.5E0,0.6E0) -
965  //                 UMASS(Z*0.5E0,N*0.5E0,0);   */
966  //       /* calculates the deformation energy of the liquid drop for
967  //          deformation beta = 0.6 which is most probable at scission */
968
969  //    /* N1R and N2R provisionaly taken without fluctuations in
970  //       polarisation:                                              */
971  n1r = n1mean;
972  n2r = n2mean;
973  a1r = n1r + z1;
974  a2r = n2r + z2;
975
976  if (imode == 1) { /* N = 82 */;
977    //! /* Eexc at scission */
978    e_scission = max(epsilon_1_scission,1.0);
979    if (n1mean > (n * 0.5) ) {
980      //! /* 1. fragment is spherical */
981      beta1 = 0.0;
982      beta2 = 0.6;
983      e1exc = epsilon_1_scission * a1r / a;
984      e_defo = umass(z2,n2r,beta2) - umass(z2,n2r,0.0);
985      e2exc = epsilon_1_scission * a2r / a + e_defo;
986    }
987    else {
988      //!                       /* 2. fragment is spherical */
989      beta1 = 0.6;
990      beta2 = 0.0;
991      e_defo = umass(z1,n1r,beta1) - umass(z1,n1r,0.0);
992      e1exc = epsilon_1_scission * a1r / a + e_defo;
993      e2exc = epsilon_1_scission * a2r / a;
994    }
995  }
996           
997  if (imode == 2) { 
998    //! /* N appr. 86 */
999    e_scission = max(epsilon_2_scission,1.0);
1000    if (n1mean >  (n * 0.5) ) { 
1001      //! /* 2. fragment is spherical */
1002      beta1 = (n1r - nheavy2) * 0.034 + 0.3;
1003      e_defo = umass(z1,n1r,beta1) - umass(z1,n1r,0.0);
1004      e1exc = epsilon_2_scission * a1r / a + e_defo;
1005      beta2 = 0.6 - beta1;
1006      e_defo = umass(z2,n2r,beta2) - umass(z2,n2r,0.0);
1007      e2exc = epsilon_2_scission * a2r / a + e_defo;
1008    }
1009    else {
1010      //!                      /* 1. fragment is spherical */
1011      beta2 = (n2r - nheavy2) * 0.034 + 0.3;
1012      e_defo = umass(z2,n2r,beta2) - umass(z2,n2r,0.0);
1013      e2exc = epsilon_2_scission * a2r / a + e_defo;
1014      beta1 = 0.6 - beta2;
1015      e_defo = umass(z1,n1r,beta1) - umass(z1,n1r,0.0);
1016      e1exc = epsilon_2_scission * a1r / a + e_defo;
1017    }
1018  }
1019         
1020  if (imode == 3) { 
1021    // ! /* Symmetric fission channel */
1022
1023    //             /* the fit function for beta is the deformation for
1024    //                optimum energy at the scission point, d = 2 */
1025    //             /* beta  : deformation of symmetric fragments */
1026    //             /* beta1 : deformation of first fragment */
1027    //             /* beta2 : deformation of second fragment */
1028    beta =  0.177963 + 0.0153241 * zsymm - 0.000162037 * zsymm*zsymm;
1029    beta1 = 0.177963 + 0.0153241 * z1 - 0.000162037 * z1*z1;
1030    //            beta1 = 0.6
1031    e_defo1 = umass(z1,n1r,beta1) - umass(z1,n1r,0.0);
1032    beta2 = 0.177963 + 0.0153241 * z2 - 0.000162037 * z2*z2;
1033    //            beta2 = 0.6
1034    e_defo2 = umass(z2,n2r,beta2) - umass(z2,n2r,0.0);
1035    e_asym = umass(z1 , n1r, beta1) + umass(z2, n2r ,beta2)
1036      + ecoul(z1,n1r,beta1,z2,n2r,beta2,2.0)
1037      - 2.0 * umass(zsymm,nsymm,beta)
1038      - ecoul(zsymm,nsymm,beta,zsymm,nsymm,beta,2.0);
1039    //            E_asym = CZ_symm * (Z1 - Zsymm)**2
1040    e_scission = max((epsilon_symm_scission - e_asym),1.0);
1041    //         /*  $LIST(Z1,N1R,Z2,N2R,E_asym,E_scission); */
1042    e1exc = e_scission * a1r / a + e_defo1;
1043    e2exc = e_scission * a2r / a + e_defo2;
1044  }
1045  // Energies checked for all the modes CS 11/10/05
1046         
1047  //    /* random decision: N1R and N2R at scission, before evaporation: */
1048  //    /* CN =       UMASS(Zsymm , Nsymm + 1.E0,0) +
1049  //                UMASS(Zsymm, Nsymm - 1.E0,0)
1050  //                 + 1.44E0 * (Zsymm)**2 /
1051  //                 (r_null**2 * ((Asymm+1)**1/3 + (Asymm-1)**1/3)**2 )
1052  //                 - 2.E0 * UMASS(Zsymm,Nsymm,0)
1053  //                 - 1.44E0 * (Zsymm)**2 / (r_null * 2.E0 * (Asymm)**1/3)**2; */
1054
1055
1056  //    /* N1width = std::sqrt(0.5E0 * std::sqrt(1.E0/A_levdens*(Eld+E_saddle_scission)) / CN); */
1057  //    /* 8. 9. 1998: KHS (see also consideration in the first comment block)
1058  //       sigma_N(Z=const) = A/Z  * sigma_Z(A=const)
1059  //       sigma_Z(A=const) = 0.4 to 0.5  (from Lang paper Nucl Phys. A345 (1980) 34)
1060  //       sigma_N(Z=const) = 0.45 * A/Z  (= 1.16 for 238U)
1061  //       therefore: SIGZMIN = 1.16                                              */
1062
1063  if ( (imode == 1) || (imode == 2) ) {
1064    cn=(umass(z1,n1mean+1.,beta1) + umass(z1,n1mean-1.,beta1)
1065        + umass(z2,n2mean+1.,beta2) + umass(z2,n2mean-1.,beta2)
1066        + ecoul(z1,n1mean+1.,beta1,z2,n2mean-1.,beta2,2.0)
1067        + ecoul(z1,n1mean-1.,beta1,z2,n2mean+1.,beta2,2.0)
1068        - 2.0 * ecoul(z1,n1mean,beta1,z2,n2mean,beta2,2.0)
1069        - 2.0 * umass(z1, n1mean, beta1)
1070        - 2.0 * umass(z2, n2mean, beta2) ) * 0.5;
1071    //          /* Coulomb energy neglected for the moment! */
1072    //           IF (E_scission.lt.0.) Then
1073    //             write(6,*)'<E> E_scission < 0, MODE 1,2'
1074    //           ENDIF
1075    //           IF (CN.lt.0.) Then
1076    //             write(6,*)'CN < 0, MODE 1,2'
1077    //           ENDIF
1078    n1width=std::sqrt( (0.5 * (std::sqrt(1.0/a_levdens*(e_scission)))/cn) );
1079    n1width=max(n1width, sigzmin);
1080
1081    //          /* random decision: N1R and N2R at scission, before evaporation: */
1082    n1r = 1.0;
1083    n2r = 1.0;
1084    while  ( (n1r<5.0) || (n2r<5.0) ) {
1085      //             n1r = dble(gausshaz(k,sngl(n1mean),sngl(n1width)));
1086      //                n1r = rnd.gaus(n1mean,n1width);
1087      n1r = gausshaz(k, n1mean, n1width);
1088      n2r = n - n1r;
1089    }     
1090    //           N1R = GAUSSHAZ(K,N1mean,N1width)
1091    if (itest == 1) {
1092      G4cout << "after neutron sample " << n1r << G4endl;
1093    }     
1094    n1r = (float)( (int)((n1r+0.5)) );
1095    n2r = n - n1r;
1096 
1097    even_odd(z1,r_e_o,i_help);
1098    //         /*  proton number with even-odd effect */
1099    z1 = (float)(i_help);
1100    z2 = z - z1;
1101
1102    a1r = z1 + n1r;
1103    a2r = z2 + n2r;
1104  }
1105       
1106  if (imode == 3) {
1107    //!  /* When(3) */
1108    if (nzpol > 0.0) {
1109      //           /* We treat a simultaneous split in Z and N to determine polarisation */
1110      cz = ( umass(z1-1., n1mean+1.,beta1)
1111             +  umass(z2+1., n2mean-1.,beta1) 
1112             +  umass(z1+1., n1mean-1.,beta2)
1113             +  umass(z2 - 1., n2mean + 1.,beta2)
1114             +  ecoul(z1-1.,n1mean+1.,beta1,z2+1.,n2mean-1.,beta2,2.0)
1115             +  ecoul(z1+1.,n1mean-1.,beta1,z2-1.,n2mean+1.,beta2,2.0)
1116             -  2.0 * ecoul(z1,n1mean,beta1,z2,n2mean,beta2,2.0)
1117             -  2.0 * umass(z1, n1mean,beta1)
1118             -  2.0 * umass(z2, n2mean,beta2) ) * 0.5;
1119      //           IF (E_scission.lt.0.) Then
1120      //             write(6,*) '<E> E_scission < 0, MODE 1,2'
1121      //           ENDIF
1122      //           IF (CZ.lt.0.) Then
1123      //             write(6,*) 'CZ < 0, MODE 1,2'
1124      //           ENDIF
1125      za1width=std::sqrt( (0.5 * std::sqrt(1.0/a_levdens*(e_scission)) / cz) );
1126      za1width=std::sqrt( (max((za1width*za1width-(1.0/12.0)),0.1)) );
1127      //                        /* Check the value of 0.1 ! */
1128      //                        /* Shephard correction */
1129      a1r = z1 + n1mean;
1130      a1r = (float)((int)((a1r+0.5)));
1131      a2r = a - a1r;
1132      //           /* A1R and A2R are integer numbers now */
1133      //        /* $LIST(A1R,A2R,ZA1WIDTH); */
1134
1135      n1ucd = n/a * a1r;
1136      n2ucd = n/a * a2r;
1137      z1ucd = z/a * a1r;
1138      z2ucd = z/a * a2r;
1139
1140      re1 = umass(z1ucd-1.,n1ucd+1.,beta1) + umass(z2ucd+1.,n2ucd-1.,beta2)
1141        + ecoul(z1ucd-1.,n1ucd+1.,beta1,z2ucd+1.,n2ucd-1.,beta2,d);
1142      re2 = umass(z1ucd,n1ucd,beta1) + umass(z2ucd,n2ucd,beta2)
1143        + ecoul(z1ucd,n1ucd,beta1,z2ucd,n2ucd,beta2,d);
1144      re3 = umass(z1ucd+1.,n1ucd-1.,beta1) + umass(z2ucd-1.,n2ucd+1.,beta2) +
1145        + ecoul(z1ucd+1.,n1ucd-1.,beta1,z2ucd-1.,n2ucd+1.,beta2,d);
1146                 
1147      eps2 = (re1-2.0*re2+re3) / 2.0;
1148      eps1 = (re3 - re1)/2.0;
1149      dn1_pol = - eps1 / (2.0 * eps2);
1150      z1 = z1ucd + dn1_pol;
1151      if (itest == 1) {
1152        G4cout << "before proton sample " << z1 << G4endl;
1153      } 
1154      //           Z1 = dble(GAUSSHAZ(k,sngl(Z1),sngl(ZA1width)));
1155      //           z1 = rnd.gaus(z1,za1width);
1156      z1 = gausshaz(k, z1, za1width);
1157      if (itest == 1) {
1158        G4cout << "after proton sample " << z1 << G4endl;
1159      }   
1160      even_odd(z1,r_e_o,i_help);
1161      //         /* proton number with even-odd effect */
1162      z1 = (float)(i_help);
1163      z2 = (float)((int)( (z - z1 + 0.5)) );
1164
1165      n1r = a1r - z1;
1166      n2r = n - n1r;
1167    } 
1168    else {
1169      //           /* First division of protons, then adjustment of neutrons */
1170      cn = ( umass(z1, n1mean+1.,beta1) + umass(z1, n1mean-1., beta1)
1171             + umass(z2, n2mean+1.,beta2) + umass(z2, n2mean-1., beta2)
1172             + ecoul(z1,n1mean+1.,beta1,z2,n2mean-1.,beta2,2.0)
1173             + ecoul(z1,n1mean-1.,beta1,z2,n2mean+1.,beta2,2.0)
1174             - 2.0 * ecoul(z1,n1mean,beta1,z2,n2mean,beta2,2.0)
1175             - 2.0 * umass(z1, n1mean, 0.6)
1176             - 2.0 * umass(z2, n2mean, 0.6) ) * 0.5;
1177      //          /* Coulomb energy neglected for the moment! */
1178      //           IF (E_scission.lt.0.) Then
1179      //             write(6,*) '<E> E_scission < 0, MODE 1,2'
1180      //           Endif
1181      //           IF (CN.lt.0.) Then
1182      //             write(6,*) 'CN < 0, MODE 1,2'
1183      //           Endif
1184      n1width=std::sqrt( (0.5 * std::sqrt(1.0/a_levdens*(e_scission)) / cn) );
1185      n1width=max(n1width, sigzmin);
1186
1187      //          /* random decision: N1R and N2R at scission, before evaporation: */
1188      //           N1R = dble(GAUSSHAZ(k,sngl(N1mean),sngl(N1width)));
1189      //           n1r = rnd.gaus(n1mean,n1width);
1190      n1r = gausshaz(k, n1mean, n1width);
1191      n1r = (float)( (int)((n1r+0.5)) );
1192      n2r = n - n1r;
1193
1194      even_odd(z1,r_e_o,i_help);
1195      //         /* Integer proton number with even-odd effect */
1196      z1 = (float)(i_help);
1197      z2 = z - z1;
1198
1199      a1r = z1 + n1r;
1200      a2r = z2 + n2r;
1201         
1202    }
1203  }
1204
1205  if (itest == 1) {
1206    G4cout << "remid imode = " << imode << G4endl;
1207    G4cout << "n1width =  " << n1width << G4endl;
1208    G4cout << "n1r = " << n1r << G4endl;
1209    G4cout << "a1r = " << a1r << G4endl;
1210    G4cout << "n2r = " << n2r << G4endl;
1211    G4cout << "a2r = " << a2r << G4endl;
1212  }
1213  // Up to here: checked CS 11/10/05   
1214       
1215  //      /* Extracted from Lang et al. Nucl. Phys. A 345 (1980) 34 */
1216  e1exc_sigma = 5.5;
1217  e2exc_sigma = 5.5;
1218
1219 neufcentquatrevingtsept:
1220  //       E1final = dble(Gausshaz(k,sngl(E1exc),sngl(E1exc_sigma)));
1221  //       E2final = dble(Gausshaz(k,sngl(E2exc),sngl(E2exc_sigma)));
1222  //        e1final = rnd.gaus(e1exc,e1exc_sigma);
1223  //        e2final = rnd.gaus(e2exc,e2exc_sigma);
1224  e1final = gausshaz(k, e1exc, e1exc_sigma);
1225  e2final = gausshaz(k, e2exc, e2exc_sigma);
1226  if ( (e1final < 0.0) || (e2final < 0.0) ) goto neufcentquatrevingtsept;
1227  if (itest == 1) {
1228    G4cout << "sampled exc 1 " << e1final << G4endl;
1229    G4cout << "sampled exc 2 " << e2final << G4endl;
1230  }
1231
1232  //      /* OUTPUT QUANTITIES OF THE EVENT GENERATOR:        */
1233
1234  //      /* Quantities before neutron evaporation            */
1235
1236  //      /* Neutron number of prefragments: N1R and N2R      */
1237  //      /* Atomic number of fragments: Z1 and Z2            */
1238  //      /* Kinetic energy of fragments: EkinR1, EkinR2      *7
1239
1240  //      /* Quantities after neutron evaporation:            */
1241
1242  //      /* Neutron number of fragments: N1 and N2           */
1243  //      /* Mass number of fragments: A1 and A2              */
1244  //      /* Atomic number of fragments: Z1 and Z2            */
1245  //      /* Number of evaporated neutrons: N1R-N1 and N2R-N2 */
1246  //      /* Kinetic energy of fragments: EkinR1*A1/A1R and
1247  //                                      EkinR2*A2/A2R       */
1248
1249  n1 = n1r;
1250  n2 = n2r;
1251  a1 = n1 + z1;
1252  a2 = n2 + z2;
1253  e1 = e1final;
1254  e2 = e2final;
1255
1256  //       /* Pre-neutron-emission total kinetic energy: */
1257  tker = (z1 * z2 * 1.44) /
1258    ( r0 * std::pow(a1,0.33333) * (1.0 + 2.0/3.0 * beta1) +
1259      r0 * std::pow(a2,0.33333) * (1.0 + 2.0/3.0 * beta2) + 2.0 );
1260  //       /* Pre-neutron-emission kinetic energy of 1. fragment: */
1261  ekinr1 = tker * a2 / a;
1262  //       /* Pre-neutron-emission kinetic energy of 2. fragment: */
1263  ekinr2 = tker * a1 / a;
1264
1265  v1 = std::sqrt( (ekinr1/a1) ) * 1.3887;
1266  v2 = std::sqrt( (ekinr2/a2) ) * 1.3887;
1267
1268  if (itest == 1) {
1269    G4cout << "ekinr1 " << ekinr1 << G4endl;
1270    G4cout << "ekinr2 " << ekinr2 << G4endl;
1271  }
1272
1273 milledeux:       
1274  //**************************
1275  //*** only symmetric fission
1276  //**************************
1277  // Symmetric fission: Ok! Checked CS 10/10/05
1278  if ( (icz == -1) || (a1 < 0.0) || (a2 < 0.0) ) {
1279    //           IF (z.eq.92) THEN
1280    //              write(6,*)'symmetric fission'
1281    //              write(6,*)'Z,A,E,A1,A2,icz,Atot',Z,A,E,A1,A2,icz,Atot
1282    //           END IF
1283
1284    if (itest == 1) {
1285      G4cout << "milledeux: liquid-drop option "  << G4endl;
1286    }
1287
1288    n = a-z;
1289    //  proton number in symmetric fission (centre) *
1290    zsymm  = z / 2.0;
1291    nsymm  = n / 2.0;
1292    asymm = nsymm + zsymm;
1293
1294    a_levdens = a / xlevdens;
1295
1296    masscurv = 2.0;
1297    cz_symm = 8.0 / std::pow(z,2) * masscurv;
1298
1299    wzsymm = std::sqrt( (0.5 * std::sqrt(1.0/a_levdens*e) / cz_symm) ) ;
1300
1301    if (itest == 1) {
1302      G4cout << " symmetric high energy fission " << G4endl;
1303      G4cout << "wzsymm " << wzsymm << G4endl;
1304    }
1305
1306    z1mean = zsymm;
1307    z1width = wzsymm;
1308
1309    // random decision: Z1 and Z2 at scission: */
1310    z1 = 1.0;
1311    z2 = 1.0;
1312    while  ( (z1 < 5.0) || (z2 < 5.0) ) {
1313      //           z1 = dble(gausshaz(kkk,sngl(z1mean),sngl(z1width)));
1314      //           z1 = rnd.gaus(z1mean,z1width);
1315      z1 = gausshaz(kkk, z1mean, z1width);
1316      z2 = z - z1;
1317    }
1318
1319    if (itest == 1) {
1320      G4cout << " z1 " << z1 << G4endl;
1321      G4cout << " z2 " << z2 << G4endl;
1322    }
1323    if (itest == 1) {
1324      G4cout << " zsymm " << zsymm << G4endl;
1325      G4cout << " nsymm " << nsymm << G4endl;
1326      G4cout << " asymm " << asymm << G4endl;
1327    }
1328    //          CN =  UMASS(Zsymm , Nsymm + 1.E0) + UMASS(Zsymm, Nsymm - 1.E0)
1329    //    #            + 1.44E0 * (Zsymm)**2 /
1330    //    #            (r_null**2 * ((Asymm+1)**(1./3.) +
1331    //    #            (Asymm-1)**(1./3.))**2 )
1332    //    #            - 2.E0 * UMASS(Zsymm,Nsymm)
1333    //    #            - 1.44E0 * (Zsymm)**2 /
1334    //    #            (r_null * 2.E0 * (Asymm)**(1./3.))**2
1335
1336    n1ucd = z1 * n/z;
1337    n2ucd = z2 * n/z;
1338    re1 = umass(z1,n1ucd,0.6) + umass(z2,n2ucd,0.6) +
1339      ecoul(z1,n1ucd,0.6,z2,n2ucd,0.6,2.0);
1340    re2 = umass(z1,n1ucd+1.,0.6) + umass(z2,n2ucd-1.,0.6) +
1341      ecoul(z1,n1ucd+1.,0.6,z2,n2ucd-1.,0.6,2.0);
1342    re3 = umass(z1,n1ucd+2.,0.6) + umass(z2,n2ucd-2.,0.6) +
1343      ecoul(z1,n1ucd+2.,0.6,z2,n2ucd-2.,0.6,2.0);
1344    reps2 = (re1-2.0*re2+re3)/2.0;
1345    reps1 = re2 - re1 -reps2;
1346    rn1_pol = -reps1/(2.0*reps2);
1347    n1mean = n1ucd + rn1_pol;
1348    n2mean = n - n1mean;
1349
1350    if (itest == 1) {
1351      G4cout << " n1mean " << n1mean << G4endl;
1352      G4cout << " n2mean " << n2mean << G4endl;
1353    }
1354
1355    cn = (umass(z1,n1mean+1.,0.0) + umass(z1,n1mean-1.,0.0) +
1356          + umass(z2,n2mean+1.,0.0) + umass(z2,n2mean-1.,0.0)
1357          - 2.0 * umass(z1,n1mean,0.0) +
1358          - 2.0 * umass(z2,n2mean,0.0) ) * 0.5;
1359    //      This is an approximation! Coulomb energy is neglected.
1360
1361    n1width = std::sqrt( (0.5 * std::sqrt(1.0/a_levdens*e) / cn) );
1362
1363    if (itest == 1) {
1364      G4cout << " cn " << cn << G4endl;
1365      G4cout << " n1width " << n1width << G4endl;
1366    }
1367       
1368    // random decision: N1R and N2R at scission, before evaporation: */
1369    //       N1R = dfloat(NINT(GAUSSHAZ(KKK,sngl(N1mean),sngl(N1width))));
1370    //      n1r = (float)( (int)(rnd.gaus(n1mean,n1width)) );
1371    n1r = (float)( (int)(gausshaz(k, n1mean,n1width)) );
1372    n2r = n - n1r;
1373    // Mass of first and second fragment */
1374    a1 = z1 + n1r;
1375    a2 = z2 + n2r;
1376
1377    e1 = e*a1/(a1+a2);
1378    e2 = e - e*a1/(a1+a2);
1379    if (itest == 1) {
1380      G4cout << " n1r " << n1r << G4endl;
1381      G4cout << " n2r " << n2r << G4endl;
1382    }
1383
1384  }
1385
1386  if (itest == 1) {
1387    G4cout << " a1 " << a1 << G4endl;
1388    G4cout << " z1 " << z1 << G4endl;
1389    G4cout << " a2 " << a2 << G4endl;
1390    G4cout << " z2 " << z2 << G4endl;
1391    G4cout << " e1 " << e1 << G4endl;
1392    G4cout << " e2 " << e << G4endl;
1393  }
1394
1395  //       /* Pre-neutron-emission total kinetic energy: */
1396  tker = (z1 * z2 * 1.44) /
1397    ( r0 * std::pow(a1,0.33333) * (1.0 + 2.0/3.0 * beta1) +
1398      r0 * std::pow(a2,0.33333) * (1.0 + 2.0/3.0 * beta2) + 2.0 );
1399  //       /* Pre-neutron-emission kinetic energy of 1. fragment: */
1400  ekin1 = tker * a2 / a;
1401  //       /* Pre-neutron-emission kinetic energy of 2. fragment: */
1402  ekin2 = tker * a1 / a;
1403
1404  v1 = std::sqrt( (ekin1/a1) ) * 1.3887;
1405  v2 = std::sqrt( (ekin2/a2) ) * 1.3887;
1406
1407  if (itest == 1) {
1408    G4cout << " kinetic energies " << G4endl;
1409    G4cout << " ekin1 " << ekin1 << G4endl;
1410    G4cout << " ekin2 " << ekin2 << G4endl;
1411  }
1412}
1413
1414void G4AblaFissionSimfis18::standardRandom(G4double *rndm, G4long *seed)
1415{
1416  (*seed) = (*seed); // Avoid warning during compilation.
1417  // Use Geant4 G4UniformRand
1418  (*rndm) = randomGenerator->getRandom();
1419}
1420
1421G4double G4AblaFissionSimfis18::haz(G4int k)
1422{
1423  const G4int pSize = 110;
1424  static G4double p[pSize];
1425  static G4long ix = 0, i = 0;
1426  static G4double x = 0.0, y = 0.0, a = 0.0, haz = 0.0;
1427  //  k =< -1 on initialise                                       
1428  //  k = -1 c'est reproductible                                   
1429  //  k < -1 || k > -1 ce n'est pas reproductible
1430
1431  // Zero is invalid random seed. Set proper value from our random seed collection:
1432  if(ix == 0) {
1433    ix = hazard->ial;
1434  }
1435
1436  if (k <= -1) { //then                                             
1437    if(k == -1) { //then                                           
1438      ix = 0;
1439    }
1440    else {
1441      x = 0.0;
1442      y = secnds(int(x));
1443      ix = int(y * 100 + 43543000);
1444      if(mod(ix,2) == 0) {
1445        ix = ix + 1;
1446      }
1447    }
1448
1449    // Here we are using random number generator copied from INCL code
1450    // instead of the CERNLIB one! This causes difficulties for
1451    // automatic testing since the random number generators, and thus
1452    // the behavior of the routines in C++ and FORTRAN versions is no
1453    // longer exactly the same!
1454    x = randomGenerator->getRandom();
1455    //    standardRandom(&x, &ix);
1456    for(G4int i = 0; i < pSize; i++) { //do i=1,110                                                 
1457      p[i] = randomGenerator->getRandom();
1458      //      standardRandom(&(p[i]), &ix);
1459    }
1460    a = randomGenerator->getRandom();
1461    standardRandom(&a, &ix);
1462    k = 0;
1463  }
1464
1465  i = nint(100*a)+1;
1466  haz = p[i];
1467  a = randomGenerator->getRandom();
1468  //  standardRandom(&a, &ix);
1469  p[i] = a;
1470
1471  hazard->ial = ix;
1472  return haz;
1473}
1474
1475
1476G4double G4AblaFissionSimfis18::gausshaz(int k, double xmoy, double sig)
1477{
1478  // Gaussian random numbers:
1479
1480  //   1005       C*** TIRAGE ALEATOIRE DANS UNE GAUSSIENNE DE LARGEUR SIG ET MOYENNE XMOY
1481  static G4int  iset = 0;
1482  static G4double v1,v2,r,fac,gset,gausshaz;
1483
1484  if(iset == 0) { //then                                             
1485    do {
1486      v1 = 2.0*haz(k) - 1.0;
1487      v2 = 2.0*haz(k) - 1.0;
1488      r = std::pow(v1,2) + std::pow(v2,2);
1489    } while(r >= 1);
1490
1491    fac = std::sqrt(-2.*std::log(r)/r);
1492    gset = v1*fac;
1493    gausshaz = v2*fac*sig+xmoy;
1494    iset = 1;
1495  }
1496  else {
1497    gausshaz=gset*sig+xmoy;
1498    iset=0;
1499  }
1500  return gausshaz;                                                         
1501}
1502
1503
1504// Utilities
1505
1506G4double G4AblaFissionSimfis18::min(G4double a, G4double b)
1507{
1508  if(a < b) {
1509    return a;
1510  }
1511  else {
1512    return b;
1513  }
1514}
1515
1516G4int G4AblaFissionSimfis18::min(G4int a, G4int b)
1517{
1518  if(a < b) {
1519    return a;
1520  }
1521  else {
1522    return b;
1523  }
1524}
1525
1526G4double G4AblaFissionSimfis18::max(G4double a, G4double b)
1527{
1528  if(a > b) {
1529    return a;
1530  }
1531  else {
1532    return b;
1533  }
1534}
1535
1536G4int G4AblaFissionSimfis18::max(G4int a, G4int b)
1537{
1538  if(a > b) {
1539    return a;
1540  }
1541  else {
1542    return b;
1543  }
1544}
1545
1546G4int G4AblaFissionSimfis18::nint(G4double number)
1547{
1548  G4double intpart = 0.0;
1549  G4double fractpart = 0.0;
1550  fractpart = std::modf(number, &intpart);
1551  if(number == 0) {
1552    return 0;
1553  }
1554  if(number > 0) {
1555    if(fractpart < 0.5) {
1556      return int(std::floor(number));
1557    }
1558    else {
1559      return int(std::ceil(number));
1560    }
1561  }
1562  if(number < 0) {
1563    if(fractpart < -0.5) {
1564      return int(std::floor(number));
1565    }
1566    else {
1567      return int(std::ceil(number));
1568    }
1569  }
1570
1571  return int(std::floor(number));
1572}
1573
1574G4int G4AblaFissionSimfis18::secnds(G4int x)
1575{
1576  time_t mytime;
1577  tm *mylocaltime;
1578
1579  time(&mytime);
1580  mylocaltime = localtime(&mytime);
1581
1582  if(x == 0) {
1583    return(mylocaltime->tm_hour*60*60 + mylocaltime->tm_min*60 + mylocaltime->tm_sec);
1584  }
1585  else {
1586    return(mytime - x);
1587  }
1588}
1589
1590G4int G4AblaFissionSimfis18::mod(G4int a, G4int b)
1591{
1592  if(b != 0) {
1593    return (a - (a/b)*b);
1594  }
1595  else {
1596    return 0;
1597  } 
1598}
1599
1600G4double G4AblaFissionSimfis18::dmod(G4double a, G4double b)
1601{
1602  if(b != 0) {
1603    return (a - (a/b)*b);
1604  }
1605  else {
1606    return 0.0;
1607  } 
1608}
1609
1610G4double G4AblaFissionSimfis18::dint(G4double a)
1611{
1612  G4double value = 0.0;
1613
1614  if(a < 0.0) {
1615    value = double(std::ceil(a));
1616  }
1617  else {
1618    value = double(std::floor(a));
1619  }
1620
1621  return value;
1622}
1623
1624G4int G4AblaFissionSimfis18::idint(G4double a)
1625{
1626  G4int value = 0;
1627
1628  if(a < 0) {
1629    value = int(std::ceil(a));
1630  }
1631  else {
1632    value = int(std::floor(a));
1633  }
1634
1635  return value;
1636}
1637
1638G4int G4AblaFissionSimfis18::idnint(G4double value)
1639{
1640  G4double valueCeil = int(std::ceil(value));
1641  G4double valueFloor = int(std::floor(value));
1642
1643  if(std::fabs(value - valueCeil) < std::fabs(value - valueFloor)) {
1644    return int(valueCeil);
1645  }
1646  else {
1647    return int(valueFloor);
1648  }
1649}
1650
1651G4double G4AblaFissionSimfis18::dmin1(G4double a, G4double b, G4double c)
1652{
1653  if(a < b && a < c) {
1654    return a;
1655  }
1656  if(b < a && b < c) {
1657    return b;
1658  }
1659  if(c < a && c < b) {
1660    return c;
1661  }
1662  return a;
1663}
1664
1665G4double G4AblaFissionSimfis18::utilabs(G4double a)
1666{
1667  if(a > 0) {
1668    return a;
1669  }
1670  if(a < 0) {
1671    return (-1*a);
1672  }
1673  if(a == 0) {
1674    return a;
1675  }
1676
1677  return a;
1678}
Note: See TracBrowser for help on using the repository browser.