source: trunk/source/processes/hadronic/models/incl/src/G4Abla.cc @ 1117

Last change on this file since 1117 was 962, checked in by garnier, 15 years ago

update processes

File size: 140.1 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: G4Abla.cc,v 1.19 2008/09/15 08:16:45 kaitanie 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 <time.h>
34
35#include "G4Abla.hh"
36#include "G4InclAblaDataFile.hh"
37#include "Randomize.hh"
38#include "G4InclRandomNumbers.hh"
39#include "G4Ranecu.hh"
40#include "G4AblaFissionSimfis18.hh"
41#include "G4AblaFission.hh"
42
43G4Abla::G4Abla()
44{
45  verboseLevel = 0;
46  ilast = 0;
47}
48
49G4Abla::G4Abla(G4Hazard *hazard, G4Volant *volant)
50{
51  verboseLevel = 0;
52  ilast = 0;
53  volant = volant; // ABLA internal particle data
54  volant->iv = 0;
55  hazard = hazard; // Random seeds
56
57  randomGenerator = new G4InclGeant4Random();
58  //randomGenerator = new G4Ranecu();
59  varntp = new G4VarNtp();
60  pace = new G4Pace();
61  ald = new G4Ald();
62  eenuc = new G4Eenuc();
63  ec2sub = new G4Ec2sub();
64  ecld = new G4Ecld();
65  fb = new G4Fb();
66  fiss = new G4Fiss();
67  opt = new G4Opt();
68}
69
70G4Abla::G4Abla(G4Hazard *aHazard, G4Volant *aVolant, G4VarNtp *aVarntp)
71{
72  verboseLevel = 0;
73  ilast = 0;
74  volant = aVolant; // ABLA internal particle data
75  volant->iv = 0;
76  hazard = aHazard; // Random seeds
77  varntp = aVarntp; // Output data structure
78  varntp->ntrack = 0;
79 
80  randomGenerator = new G4InclGeant4Random();
81  //randomGenerator = new G4Ranecu();
82
83  // ABLA fission
84  //  fissionModel = new G4AblaFissionSimfis18(hazard, randomGenerator);
85  fissionModel = new G4AblaFission(hazard, randomGenerator);
86  if(verboseLevel > 0) {
87    fissionModel->about();
88  }
89  verboseLevel = 0;
90  pace = new G4Pace();
91  ald = new G4Ald();
92  eenuc = new G4Eenuc();
93  ec2sub = new G4Ec2sub();
94  ecld = new G4Ecld();
95  fb = new G4Fb();
96  fiss = new G4Fiss();
97  opt = new G4Opt();
98}
99
100G4Abla::~G4Abla()
101{
102  delete randomGenerator;
103  delete pace;
104  delete ald;
105  delete eenuc;
106  delete ec2sub;
107  delete ecld;
108  delete fb;
109  delete fiss;
110  delete opt;
111}
112
113// Main interface to the evaporation
114
115// Possible problem with generic Geant4 interface: ABLA evaporation
116// needs angular momentum information (calculated by INCL) to
117// work. Maybe there is a way to obtain this information from
118// G4Fragment?
119
120void G4Abla::breakItUp(G4double nucleusA, G4double nucleusZ, G4double nucleusMass, G4double excitationEnergy,
121                       G4double angularMomentum, G4double recoilEnergy, G4double momX, G4double momY, G4double momZ,
122                       G4int eventnumber)
123{
124  const G4double uma = 931.4942;
125  const G4double melec = 0.511;
126  const G4double fmp = 938.27231;
127  const G4double fmn = 939.56563;
128
129  G4double alrem = 0.0, berem = 0.0, garem = 0.0;
130  G4double R[4][4]; // Rotation matrix
131  G4double csdir1[4];
132  G4double csdir2[4];
133  G4double csrem[4];
134  G4double pfis_rem[4];
135  G4double pf1_rem[4];
136  for(G4int init_i = 0; init_i < 4; init_i++) {
137    csdir1[init_i] = 0.0;
138    csdir2[init_i] = 0.0;
139    csrem[init_i] = 0.0;
140    pfis_rem[init_i] = 0.0;
141    pf1_rem[init_i] = 0.0;
142    for(G4int init_j = 0; init_j < 4; init_j++) {
143      R[init_i][init_j] = 0.0;
144    }
145  }
146
147  G4double plab1 = 0.0, gam1 = 0.0, eta1 = 0.0;
148  G4double plab2 = 0.0, gam2 = 0.0, eta2 = 0.0;
149
150  G4double sitet = 0.0;
151  G4double stet1 = 0.0;
152  G4double stet2 = 0.0;
153 
154  G4int nbpevap = 0;
155  G4int mempaw = 0, memiv = 0;
156
157  G4double e_evapo = 0.0;
158  G4double el = 0.0;
159  G4double fmcv = 0.0;
160
161  G4double aff1 = 0.0;
162  G4double zff1 = 0.0;
163  G4double eff1 = 0.0;
164  G4double aff2 = 0.0;
165  G4double zff2 = 0.0;
166  G4double eff2 = 0.0;
167
168  G4double v1 = 0.0, v2 = 0.0;
169
170  G4double t2 = 0.0;
171  G4double ctet1 = 0.0;
172  G4double ctet2 = 0.0;
173  G4double phi1 = 0.0;
174  G4double phi2 = 0.0;
175  G4double p2 = 0.0;
176  G4double epf2_out = 0.0 ;
177  G4int lma_pf1 = 0, lmi_pf1 = 0;
178  G4int lma_pf2 = 0, lmi_pf2 = 0;
179  G4int nopart = 0;
180
181  G4double cst = 0.0, sst = 0.0, csf = 0.0, ssf = 0.0;
182 
183  G4double zf = 0.0, af = 0.0, mtota = 0.0, pleva = 0.0, pxeva = 0.0, pyeva = 0.0;
184  G4int ff = 0;
185  G4int inum = eventnumber;
186  G4int inttype = 0;
187  G4double esrem = excitationEnergy;
188 
189  G4double aprf = nucleusA;
190  G4double zprf = nucleusZ;
191  G4double mcorem = nucleusMass;
192  G4double ee = excitationEnergy;
193  G4double jprf = angularMomentum; // actually root-mean-squared
194
195  G4double erecrem = recoilEnergy;
196  G4double trem = 0.0;
197  G4double pxrem = momX;
198  G4double pyrem = momY;
199  G4double pzrem = momZ;
200
201  G4double remmass = 0.0;
202 
203  volant->clear(); // Clean up an initialize ABLA output.
204  varntp->clear(); // Clean up an initialize ABLA output.
205  varntp->ntrack = 0;
206    volant->iv = 0;
207  //volant->iv = 1;
208 
209  G4double pcorem = std::sqrt(erecrem*(erecrem +2.*938.2796*nucleusA));
210    // G4double pcorem = std::sqrt(std::pow(momX,2) + std::pow(momY,2) + std::pow(momZ,2));
211  if(pcorem != 0) { // Guard against division by zero.
212    alrem = pxrem/pcorem;
213    berem = pyrem/pcorem;
214    garem = pzrem/pcorem;
215  } else {
216    alrem = 0.0;
217    berem = 0.0;
218    garem = 0.0;
219  }
220
221  G4int idebug = 0;
222  G4int itest = 0;
223  if(idebug == 1) {
224    zprf =   81.;
225    aprf =   201.;
226    //    ee =   86.5877686;
227    ee = 300.0;
228    jprf =   32.;
229    zf =   0.;
230    af =   0.;
231    mtota =   0.;
232    pleva =   0.;
233    pxeva =   0.;
234    pyeva =   0.;
235    ff =  -1;
236    inttype =  0;
237    inum =  2;
238  }
239  if(itest == 1) {
240    G4cout <<" PK::: EVAPORA event  " << inum << G4endl;
241    G4cout <<" PK:::    zprf =   " << zprf << G4endl;
242    G4cout <<" PK:::    aprf =   " << aprf << G4endl;
243    G4cout <<" PK:::      ee =   " << ee << G4endl;
244    G4cout <<" PK:::      eeDiff =   " << ee - 86.5877686 << G4endl;
245    G4cout <<" PK:::    jprf =   " << jprf << G4endl;
246    G4cout <<" PK:::      zf =   " << zf << G4endl;
247    G4cout <<" PK:::      af =   " << af << G4endl;
248    G4cout <<" PK:::   mtota =   " << mtota << G4endl;
249    G4cout <<" PK:::   pleva =   " << pleva << G4endl;
250    G4cout <<" PK:::   pxeva =   " << pxeva << G4endl;
251    G4cout <<" PK:::   pyeva =   " << pyeva << G4endl;
252    G4cout <<" PK:::      ff =  " << ff << G4endl;
253    G4cout <<" PK::: inttype =  " << inttype << G4endl;
254    G4cout <<" PK:::    inum =  " << inum << G4endl;
255  }
256
257  if(esrem >= 1.0e-3) {
258    evapora(zprf,aprf,ee,jprf, &zf, &af, &mtota, &pleva, &pxeva, &pyeva, &ff, &inttype, &inum);
259  }
260  else {
261    ff = 0; 
262    zf = zprf;
263    af = aprf;
264    pxeva = pxrem;
265    pyeva = pyrem;
266    pleva = pzrem;
267  }
268
269  if (ff == 1) {
270    // Fission:
271    // variable ee: Energy of fissioning nucleus above the fission barrier.         
272    // Calcul des impulsions des particules evaporees (avant fission)
273    // dans le systeme labo.
274
275    if(verboseLevel > 2)
276      G4cout << __FILE__ << ":" << __LINE__ << " Entering fission code." << G4endl;
277    trem = double(erecrem);
278    remmass = pace2(aprf,zprf) + aprf*uma - zprf*melec; // canonic
279//     remmass = mcorem  + double(esrem);                       // ok
280//     remmass = mcorem;                                        //cugnon
281    varntp->kfis = 1;
282    G4double gamrem = (remmass + trem)/remmass;
283    G4double etrem = std::sqrt(trem*(trem + 2.0*remmass))/remmass;
284
285    //  This is not treated as accurately as for the non fission case for which
286    //  the remnant mass is computed to satisfy the energy conservation
287    //  of evaporated particles. But it is not bad and more canonical!     
288    remmass = pace2(aprf,zprf) + aprf*uma - zprf*melec+double(esrem); // !canonic
289    //  Essais avec la masse de KHS (9/2002):
290    el = 0.0;
291    mglms(aprf,zprf,0,&el);
292    remmass = zprf*fmp + (aprf-zprf)*fmn + el + double(esrem);
293    gamrem = std::sqrt(std::pow(pcorem,2) + std::pow(remmass,2))/remmass;
294    etrem = pcorem/remmass;
295   
296    csrem[0] = 0.0; // Should not be used.
297    csrem[1] = alrem;
298    csrem[2] = berem;
299    csrem[3] = garem;
300    if(verboseLevel > 1) {
301      G4cout << __FILE__ << ":" << __LINE__ << " momRem = (" << pxrem << ", " << pyrem << ", " << pzrem << ")" << G4endl;
302      G4cout << __FILE__ << ":" << __LINE__ << " csrem = (" << csrem[1] << ", " << csrem[2] << ", " << csrem[3] << ")" << G4endl;
303    }
304
305    // C Pour Vérif Remnant = evapo(Pre fission) + Noyau_fissionant (systÚme  Remnant)
306    G4double bil_e = 0.0;
307    G4double bil_px = 0.0;
308    G4double bil_py = 0.0;
309    G4double bil_pz = 0.0;
310    G4double masse = 0.0;
311   
312    for(G4int iloc = 1; iloc <= volant->iv; iloc++) { //DO iloc=1,iv
313      mglms(double(volant->acv[iloc]),double(volant->zpcv[iloc]),0,&el);
314      masse = volant->zpcv[iloc]*fmp + (volant->acv[iloc] - volant->zpcv[iloc])*fmn + el;
315      bil_e = bil_e + std::sqrt(std::pow(volant->pcv[iloc],2) + std::pow(masse,2));
316      bil_px = bil_px + volant->pcv[iloc]*(volant->xcv[iloc]);
317      bil_py = bil_py + volant->pcv[iloc]*(volant->ycv[iloc]);
318      bil_pz = bil_pz + volant->pcv[iloc]*(volant->zcv[iloc]);
319    } //  enddo
320    // C Ce bilan (impulsion nulle) est parfait. (Bil_Px=Bil_Px+PXEVA....)
321
322    G4int ndec = 1;
323   
324    if(volant->iv != 0) { //then
325      if(verboseLevel > 2) {
326        G4cout <<"varntp->ntrack = " << varntp->ntrack << G4endl;
327        G4cout <<"1st Translab: Adding indices from " << ndec << " to " << volant->iv << G4endl;
328      }
329      nopart = varntp->ntrack - 1;
330      translab(gamrem,etrem,csrem,nopart,ndec);
331      if(verboseLevel > 2) {
332        G4cout <<"Translab complete!" << G4endl;
333        G4cout <<"varntp->ntrack = " << varntp->ntrack << G4endl;
334      }
335    }
336    nbpevap = volant->iv;       // nombre de particules d'evaporation traitees
337
338    // C                                                                       
339    // C Now calculation of the fission fragment distribution including                 
340    // C evaporation from the fragments.                                           
341    // C                                   
342
343    // C Distribution of the fission fragments:
344                                                                       
345    //   void fissionDistri(G4double a,G4double z,G4double e,
346    //                     G4double &a1,G4double &z1,G4double &e1,G4double &v1,
347    //                       G4double &a2,G4double &z2,G4double &e2,G4double &v2);
348
349    //fissionModel->fissionDistri(af,zf,ee,aff1,zff1,eff1,v1,aff2,zff2,eff2,v2);
350    fissionModel->doFission(af,zf,ee,aff1,zff1,eff1,v1,aff2,zff2,eff2,v2);
351    // C verif des A et Z decimaux:
352    G4int na_f = int(std::floor(af + 0.5));
353    G4int nz_f = int(std::floor(zf + 0.5));
354    varntp->izfis = nz_f;   // copie dans le ntuple
355    varntp->iafis = na_f;
356    G4int na_pf1 = int(std::floor(aff1 + 0.5));
357    G4int nz_pf1 = int(std::floor(zff1 + 0.5)); 
358    G4int na_pf2 = int(std::floor(aff2 + 0.5));
359    G4int nz_pf2 = int(std::floor(zff2 + 0.5));
360
361    if((na_f != (na_pf1+na_pf2)) || (nz_f != (nz_pf1+nz_pf2))) {
362      if(verboseLevel > 2) {
363        G4cout <<"problemes arrondis dans la fission " << G4endl;
364        G4cout << "af,zf,aff1,zff1,aff2,zff2" << G4endl;
365        G4cout << af <<" , " << zf <<" , " << aff1 <<" , " << zff1 <<" , " << aff2 <<" , " << zff2 << G4endl;
366        G4cout << "a,z,a1,z1,a2,z2 integer" << G4endl;
367        G4cout << na_f <<" , " << nz_f <<" , " << na_pf1 <<" , " << nz_pf1 <<" , " << na_pf2 <<" , " << nz_pf2 << G4endl; 
368      }
369    }
370   
371    //  Calcul de l'impulsion des PF dans le syteme noyau de fission:
372    G4int kboud = idnint(zf);                                                 
373    G4int jboud = idnint(af-zf);                                             
374    //G4double ef = fb->efa[kboud][jboud]; // barriere de fission
375    G4double ef = fb->efa[jboud][kboud]; // barriere de fission
376    varntp->estfis = ee + ef;           // copie dans le ntuple   
377     
378    // C           MASSEF = pace2(AF,ZF)
379    // C           MASSEF = MASSEF + AF*UMA - ZF*MELEC + EE + EF
380    // C           MASSE1 = pace2(DBLE(AFF1),DBLE(ZFF1))
381    // C           MASSE1 = MASSE1 + AFF1*UMA - ZFF1*MELEC + EFF1
382    // C           MASSE2 = pace2(DBLE(AFF2),DBLE(ZFF2))
383    // C           MASSE2 = MASSE2 + AFF2*UMA - ZFF2*MELEC + EFF2
384    // C        WRITE(6,*) 'MASSEF,MASSE1,MASSE2',MASSEF,MASSE1,MASSE2
385    // C MGLMS est la fonction de masse cohérente avec KHS evapo-fis.
386    // C   Attention aux parametres, ici 0=OPTSHP, NO microscopic correct.
387    mglms(af,zf,0,&el);
388    G4double massef = zf*fmp + (af - zf)*fmn + el + ee + ef;
389    mglms(double(aff1),double(zff1),0,&el);
390    G4double masse1 = zff1*fmp + (aff1-zff1)*fmn + el + eff1;
391    mglms(aff2,zff2,0,&el);
392    G4double masse2 = zff2*fmp + (aff2 - zff2)*fmn + el + eff2;
393    // C        WRITE(6,*) 'MASSEF,MASSE1,MASSE2',MASSEF,MASSE1,MASSE2     
394    G4double b = massef - masse1 - masse2;
395    if(b < 0.0) { //then
396      b=0.0;
397      if(verboseLevel > 2) {
398        G4cout <<"anomalie dans la fission: " << G4endl; 
399        G4cout << inum<< " , " << af<< " , " <<zf<< " , " <<massef<< " , " <<aff1<< " , " <<zff1<< " , " <<masse1<< " , " <<aff2<< " , " <<zff2<< " , " << masse2 << G4endl;
400      }
401    } //endif
402    G4double t1 = b*(b + 2.0*masse2)/(2.0*massef);
403    G4double p1 = std::sqrt(t1*(t1 + 2.0*masse1));
404   
405    G4double rndm;
406    rndm = randomGenerator->getRandom();
407    //    standardRandom(&rndm, &(hazard->igraine[13]));
408    ctet1 = 2.0*rndm - 1.0;
409    //    standardRandom(&rndm,&(hazard->igraine[9]));
410    rndm = randomGenerator->getRandom();
411    phi1 = rndm*2.0*3.141592654;
412           
413    // C ----Coefs de la transformation de Lorentz (noyau de fission -> Remnant)
414    G4double peva = std::pow(pxeva,2) + std::pow(pyeva,2) + std::pow(pleva,2);
415    G4double gamfis = std::sqrt(std::pow(massef,2) + peva)/massef;
416    peva = std::sqrt(peva);
417    G4double etfis = peva/massef;
418     
419    G4double epf1_in = 0.0;
420    G4double epf1_out = 0.0;
421
422    // C ----Matrice de rotation (noyau de fission -> Remnant)
423    if(peva >= 1.0e-4) {
424      sitet = std::sqrt(std::pow(pxeva,2)+std::pow(pyeva,2))/peva;
425    }
426    if(sitet > 1.0e-5) { //then
427      G4double cstet = pleva/peva;
428      G4double siphi = pyeva/(sitet*peva);
429      G4double csphi = pxeva/(sitet*peva);
430       
431      R[1][1] = cstet*csphi;
432      R[1][2] = -siphi;
433      R[1][3] = sitet*csphi;
434      R[2][1] = cstet*siphi;
435      R[2][2] = csphi;
436      R[2][3] = sitet*siphi;
437      R[3][1] = -sitet;
438      R[3][2] = 0.0;
439      R[3][3] = cstet;
440    }
441    else {
442      R[1][1] = 1.0;
443      R[1][2] = 0.0;
444      R[1][3] = 0.0;
445      R[2][1] = 0.0;
446      R[2][2] = 1.0;
447      R[2][3] = 0.0;
448      R[3][1] = 0.0;
449      R[3][2] = 0.0;
450      R[3][3] = 1.0;
451    } //  endif
452    // c test de verif:                                     
453
454    if((zff1 <= 0.0) || (aff1 <= 0.0) || (aff1 < zff1)) { //then   
455      if(verboseLevel > 2) {
456        G4cout <<"zf = " <<  zf <<" af = " << af <<"ee = " << ee <<"zff1 = " << zff1 <<"aff1 = " << aff1 << G4endl;
457      }
458    }
459    else {
460      // C ---------------------- PF1 will evaporate
461      epf1_in = double(eff1);
462      epf1_out = epf1_in;
463      //   void evapora(G4double zprf, G4double aprf, G4double ee, G4double jprf,
464      //               G4double *zf_par, G4double *af_par, G4double *mtota_par,
465      //               G4double *pleva_par, G4double *pxeva_par, G4double *pyeva_par,
466      //               G4double *ff_par, G4int *inttype_par, G4int *inum_par);
467      G4double zf1, af1, malpha1, ffpleva1, ffpxeva1, ffpyeva1;
468      G4int ff1, ftype1;
469      evapora(zff1, aff1, epf1_out, 0.0, &zf1, &af1, &malpha1, &ffpleva1,
470              &ffpxeva1, &ffpyeva1, &ff1, &ftype1, &inum);
471      // C On ajoute le fragment:
472      volant->iv = volant->iv + 1;
473      volant->acv[volant->iv] = af1;
474      volant->zpcv[volant->iv] = zf1;
475      if(verboseLevel > 2) {
476        G4cout << __FILE__ << ":" << __LINE__ << " Added: zf1 = " << zf1 << " af1 = " << af1 << " at index " << volant->iv << G4endl;
477        volant->dump();
478      }
479      if(verboseLevel > 2) {
480        G4cout <<"Added fission fragment: a = " << volant->acv[volant->iv] << " z = " << volant->zpcv[volant->iv] << G4endl;
481      }
482      peva = std::sqrt(std::pow(ffpxeva1,2) + std::pow(ffpyeva1,2) + std::pow(ffpleva1,2));
483      volant->pcv[volant->iv] = peva;
484      if(peva > 0.001) { // then
485        volant->xcv[volant->iv] = ffpxeva1/peva;
486        volant->ycv[volant->iv] = ffpyeva1/peva;
487        volant->zcv[volant->iv] = ffpleva1/peva;
488      }
489      else {
490        volant->xcv[volant->iv] = 1.0;
491        volant->ycv[volant->iv] = 0.0;
492        volant->zcv[volant->iv] = 0.0;
493      } // end if
494               
495      // C Pour Vérif evapo de PF1 dans le systeme du Noyau Fissionant
496      G4double bil1_e = 0.0;
497      G4double bil1_px = 0.0;
498      G4double bil1_py=0.0;
499      G4double bil1_pz=0.0;
500      for(G4int iloc = nbpevap + 1; iloc <= volant->iv; iloc++) { //do iloc=nbpevap+1,iv
501        //      for(G4int iloc = nbpevap + 1; iloc <= volant->iv + 1; iloc++) { //do iloc=nbpevap+1,iv
502        mglms(volant->acv[iloc], volant->zpcv[iloc],0,&el);
503        masse = volant->zpcv[iloc]*fmp + (volant->acv[iloc] - volant->zpcv[iloc])*fmn + el; 
504        bil1_e = bil1_e + std::sqrt(std::pow(volant->pcv[iloc],2) + std::pow(masse,2));
505        bil1_px = bil1_px + volant->pcv[iloc]*(volant->xcv[iloc]);
506        bil1_py = bil1_py + volant->pcv[iloc]*(volant->ycv[iloc]);
507        bil1_pz = bil1_pz + volant->pcv[iloc]*(volant->zcv[iloc]);
508      } // enddo
509
510      // Calcul des cosinus directeurs de PF1 dans le Remnant et calcul
511      // des coefs pour la transformation de Lorentz Systeme PF --> Systeme Remnant
512      translabpf(masse1,t1,p1,ctet1,phi1,gamfis,etfis,R,&plab1,&gam1,&eta1,csdir1);
513
514      // calcul des impulsions des particules evaporees dans le systeme Remnant:
515      if(verboseLevel > 2)
516        G4cout <<"2nd Translab (pf1 evap): Adding indices from " << nbpevap+1 << " to " << volant->iv << G4endl;
517      nopart = varntp->ntrack - 1;
518      translab(gam1,eta1,csdir1,nopart,nbpevap+1);
519      if(verboseLevel > 2) {
520        G4cout <<"After translab call... varntp->ntrack = " << varntp->ntrack << G4endl;
521      }
522      memiv = nbpevap + 1;        // memoires pour la future transformation
523      mempaw = nopart;    // remnant->labo pour pf1 et pf2.
524      lmi_pf1 = nopart + nbpevap + 1;  // indices min et max dans /var_ntp/
525      lma_pf1 = nopart + volant->iv;   // des particules issues de pf1
526      nbpevap = volant->iv;     // nombre de particules d'evaporation traitees
527    } // end if
528    // C --------------------- End of PF1 calculation
529 
530    // c test de verif:                                                                                                         
531    if((zff2 <= 0.0) || (aff2 <= 0.0) || (aff2 <= zff2)) { //then   
532      if(verboseLevel > 2) {
533        G4cout << zf << " " << af << " " << ee  << " " << zff2 << " " << aff2 << G4endl;                               
534      }
535    }
536    else {                                                         
537      // C ---------------------- PF2 will evaporate
538      G4double epf2_in = double(eff2);
539      G4double epf2_out = epf2_in;
540      //   void evapora(G4double zprf, G4double aprf, G4double ee, G4double jprf,
541      //               G4double *zf_par, G4double *af_par, G4double *mtota_par,
542      //               G4double *pleva_par, G4double *pxeva_par, G4double *pyeva_par,
543      //               G4double *ff_par, G4int *inttype_par, G4int *inum_par);
544      G4double zf2, af2, malpha2, ffpleva2, ffpxeva2, ffpyeva2;
545      G4int ff2, ftype2;
546      evapora(zff2,aff2,epf2_out,0.0,&zf2,&af2,&malpha2,&ffpleva2,
547              &ffpxeva2,&ffpyeva2,&ff2,&ftype2,&inum);
548      // C On ajoute le fragment:
549      volant->iv = volant->iv + 1;
550      volant->acv[volant->iv] = af2;
551      volant->zpcv[volant->iv] = zf2; 
552      if(verboseLevel > 2)
553        G4cout << __FILE__ << ":" << __LINE__ << " Added: zf2 = " << zf2 << " af2 = " << af2 << " at index " << volant->iv << G4endl;
554      if(verboseLevel > 2) {
555        G4cout <<"Added fission fragment: a = " << volant->acv[volant->iv] << " z = " << volant->zpcv[volant->iv] << G4endl;
556      }
557      peva = std::sqrt(std::pow(ffpxeva2,2) + std::pow(ffpyeva2,2) + std::pow(ffpleva2,2));
558      volant->pcv[volant->iv] = peva;
559      //      exit(0);
560      if(peva > 0.001) { //then
561        volant->xcv[volant->iv] = ffpxeva2/peva;
562        volant->ycv[volant->iv] = ffpyeva2/peva;
563        volant->zcv[volant->iv] = ffpleva2/peva;
564      }
565      else {
566        volant->xcv[volant->iv] = 1.0;
567        volant->ycv[volant->iv] = 0.0;
568        volant->zcv[volant->iv] = 0.0;
569      } //end if       
570      // C Pour Vérif evapo de PF1 dans le systeme du Noyau Fissionant
571      G4double bil2_e = 0.0;
572      G4double bil2_px = 0.0;
573      G4double bil2_py = 0.0;
574      G4double bil2_pz = 0.0;
575      //      for(G4int iloc = nbpevap + 1; iloc <= volant->iv; iloc++) { //do iloc=nbpevap+1,iv
576      for(G4int iloc = nbpevap + 1; iloc <= volant->iv; iloc++) { //do iloc=nbpevap+1,iv
577        mglms(volant->acv[iloc],volant->zpcv[iloc],0,&el);
578        masse = volant->zpcv[iloc]*fmp + (volant->acv[iloc] - volant->zpcv[iloc])*fmn + el; 
579        bil2_e = bil2_e + std::sqrt(std::pow(volant->pcv[iloc],2) + std::pow(masse,2));
580        bil2_px = bil2_px + volant->pcv[iloc]*(volant->xcv[iloc]);
581        bil2_py = bil2_py + volant->pcv[iloc]*(volant->ycv[iloc]);
582        bil2_pz = bil2_pz + volant->pcv[iloc]*(volant->zcv[iloc]);
583      } //enddo
584
585      // C ----Calcul des cosinus directeurs de PF2 dans le Remnant et calcul
586      // c des coefs pour la transformation de Lorentz Systeme PF --> Systeme Remnant
587      G4double t2 = b - t1;
588      //      G4double ctet2 = -ctet1;
589      ctet2 = -1.0*ctet1;
590      phi2 = dmod(phi1+3.141592654,6.283185308);
591      G4double p2 = std::sqrt(t2*(t2+2.0*masse2));
592     
593      //   void translabpf(G4double masse1, G4double t1, G4double p1, G4double ctet1,
594      //                  G4double phi1, G4double gamrem, G4double etrem, G4double R[][4],
595      //                  G4double *plab1, G4double *gam1, G4double *eta1, G4double csdir[]);
596      translabpf(masse2,t2,p2,ctet2,phi2,gamfis,etfis,R,&plab2,&gam2,&eta2,csdir2);
597      // C
598      // C  calcul des impulsions des particules evaporees dans le systeme Remnant:
599      // c
600    if(verboseLevel > 2)
601      G4cout <<"3rd Translab (pf2 evap): Adding indices from " << nbpevap+1 << " to " << volant->iv << G4endl;
602      nopart = varntp->ntrack - 1;
603      translab(gam2,eta2,csdir2,nopart,nbpevap+1);
604      lmi_pf2 = nopart + nbpevap + 1;   // indices min et max dans /var_ntp/
605      lma_pf2 = nopart + volant->iv;            // des particules issues de pf2
606    } // end if
607    // C --------------------- End of PF2 calculation
608
609    // C Pour vérifications: calculs du noyau fissionant et des PF dans
610    // C    le systeme du remnant.
611    for(G4int iloc = 1; iloc <= 3; iloc++) { // do iloc=1,3
612      pfis_rem[iloc] = 0.0;
613    } // enddo
614    G4double efis_rem, pfis_trav[4];
615    lorab(gamfis,etfis,massef,pfis_rem,&efis_rem,pfis_trav);
616    rotab(R,pfis_trav,pfis_rem);
617     
618    stet1 = std::sqrt(1.0 - std::pow(ctet1,2));
619    pf1_rem[1] = p1*stet1*std::cos(phi1);
620    pf1_rem[2] = p1*stet1*std::sin(phi1);
621    pf1_rem[3] = p1*ctet1;
622    G4double e1_rem;
623    lorab(gamfis,etfis,masse1+t1,pf1_rem,&e1_rem,pfis_trav);
624    rotab(R,pfis_trav,pf1_rem);
625
626    stet2 = std::sqrt(1.0 - std::pow(ctet2,2));
627   
628    G4double pf2_rem[4];
629    G4double e2_rem;
630    pf2_rem[1] = p2*stet2*std::cos(phi2);
631    pf2_rem[2] = p2*stet2*std::sin(phi2);
632    pf2_rem[3] = p2*ctet2;
633    lorab(gamfis,etfis,masse2+t2,pf2_rem,&e2_rem,pfis_trav);
634    rotab(R,pfis_trav,pf2_rem);
635    // C Verif 0: Remnant = evapo_pre_fission + Noyau Fissionant
636    bil_e = remmass - efis_rem - bil_e;
637    bil_px = bil_px + pfis_rem[1];
638    bil_py = bil_py + pfis_rem[2]; 
639    bil_pz = bil_pz + pfis_rem[3]; 
640    // C Verif 1: noyau fissionant = PF1 + PF2 dans le systeme remnant
641    //    G4double bilan_e = efis_rem - e1_rem - e2_rem;
642    //    G4double bilan_px = pfis_rem[1] - pf1_rem[1] - pf2_rem[1];
643    //    G4double bilan_py = pfis_rem[2] - pf1_rem[2] - pf2_rem[2];
644    //    G4double bilan_pz = pfis_rem[3] - pf1_rem[3] - pf2_rem[3];
645    // C Verif 2: PF1 et PF2 egaux a toutes leurs particules evaporees
646    // C   (Systeme remnant)
647    if((lma_pf1-lmi_pf1) != 0) { //then
648      G4double bil_e_pf1 = e1_rem - epf1_out;
649      G4double bil_px_pf1 = pf1_rem[1];
650      G4double bil_py_pf1 = pf1_rem[2]; 
651      G4double bil_pz_pf1 = pf1_rem[3];
652      for(G4int ipf1 = lmi_pf1; ipf1 <= lma_pf1; ipf1++) { //do ipf1=lmi_pf1,lma_pf1
653        bil_e_pf1 = bil_e_pf1 - (std::pow(varntp->plab[ipf1],2) + std::pow(varntp->enerj[ipf1],2))/(2.0*(varntp->enerj[ipf1]));
654        cst = std::cos(varntp->tetlab[ipf1]/57.2957795);
655        sst = std::sin(varntp->tetlab[ipf1]/57.2957795);
656        csf = std::cos(varntp->philab[ipf1]/57.2957795);
657        ssf = std::sin(varntp->philab[ipf1]/57.2957795);
658        bil_px_pf1 = bil_px_pf1 - varntp->plab[ipf1]*sst*csf;
659        bil_py_pf1 = bil_py_pf1 - varntp->plab[ipf1]*sst*ssf;
660        bil_pz_pf1 = bil_pz_pf1 - varntp->plab[ipf1]*cst;               
661      } // enddo
662    } //endif
663         
664    if((lma_pf2-lmi_pf2) != 0) { //then
665      G4double bil_e_pf2 =  e2_rem - epf2_out;
666      G4double bil_px_pf2 = pf2_rem[1];
667      G4double bil_py_pf2 = pf2_rem[2]; 
668      G4double bil_pz_pf2 = pf2_rem[3];
669      for(G4int ipf2 = lmi_pf2; ipf2 <= lma_pf2; ipf2++) { //do ipf2=lmi_pf2,lma_pf2
670        bil_e_pf2 = bil_e_pf2 - (std::pow(varntp->plab[ipf2],2) + std::pow(varntp->enerj[ipf2],2))/(2.0*(varntp->enerj[ipf2]));
671        G4double cst = std::cos(varntp->tetlab[ipf2]/57.2957795);
672        G4double sst = std::sin(varntp->tetlab[ipf2]/57.2957795);
673        G4double csf = std::cos(varntp->philab[ipf2]/57.2957795);
674        G4double ssf = std::sin(varntp->philab[ipf2]/57.2957795);
675        bil_px_pf2 = bil_px_pf2 - varntp->plab[ipf2]*sst*csf;
676        bil_py_pf2 = bil_py_pf2 - varntp->plab[ipf2]*sst*ssf;
677        bil_pz_pf2 = bil_pz_pf2 - varntp->plab[ipf2]*cst;               
678      } // enddo
679    } //endif
680    // C
681    // C ---- Transformation systeme Remnant -> systeme labo. (evapo de PF1 ET PF2)
682    // C
683    //    G4double mempaw, memiv;
684    if(verboseLevel > 2)
685      G4cout <<"4th Translab: Adding indices from " << memiv << " to " << volant->iv << G4endl;
686    translab(gamrem,etrem,csrem,mempaw,memiv);
687    // C *******************  END of fission calculations ************************
688    if(verboseLevel > 2) {
689      G4cout <<"Dump at the end of fission event " << G4endl;
690      volant->dump();
691      G4cout <<"End of dump." << G4endl;
692    }
693  }
694  else {
695    // C ************************ Evapo sans fission *****************************
696    // C Here, FF=0, --> Evapo sans fission, on ajoute le fragment:
697    // C *************************************************************************
698    varntp->kfis = 0;
699    if(verboseLevel > 2) {
700      G4cout <<"Evaporation without fission" << G4endl;
701    }
702    volant->iv = volant->iv + 1;
703    volant->acv[volant->iv] = af;
704    volant->zpcv[volant->iv] = zf;
705    if(verboseLevel > 2)
706      G4cout << __FILE__ << ":" << __LINE__ << " Added: zf = " << zf << " af = " << af << " at index " << volant->iv << G4endl;
707    G4double peva = std::sqrt(std::pow(pxeva,2)+std::pow(pyeva,2)+std::pow(pleva,2));
708    volant->pcv[volant->iv] = peva;
709    if(peva > 0.001) { //then
710      volant->xcv[volant->iv] = pxeva/peva;
711      volant->ycv[volant->iv] = pyeva/peva;
712      volant->zcv[volant->iv] = pleva/peva;       
713    }
714    else {
715      volant->xcv[volant->iv] = 1.0;
716      volant->ycv[volant->iv] = 0.0;
717      volant->zcv[volant->iv] = 0.0;
718    } // end if       
719       
720    // C
721    // C  calcul des impulsions des particules evaporees dans le systeme labo:
722    // c
723    trem = double(erecrem);
724    // C      REMMASS = pace2(APRF,ZPRF) + APRF*UMA - ZPRF*MELEC        !Canonic
725    // C      REMMASS = MCOREM  + DBLE(ESREM)                           !OK
726    remmass = mcorem;                                           //Cugnon
727    // C      GAMREM = (REMMASS + TREM)/REMMASS                 !OK
728    // C      ETREM = DSQRT(TREM*(TREM + 2.*REMMASS))/REMMASS           !OK
729    csrem[0] = 0.0; // Should not be used.
730    csrem[1] = alrem;
731    csrem[2] = berem;
732    csrem[3] = garem;
733
734    //    for(G4int j = 1; j <= volant->iv; j++) { //do j=1,iv
735    for(G4int j = 1; j <= volant->iv; j++) { //do j=1,iv
736      if(volant->acv[j] == 0) {
737        if(verboseLevel > 2) {
738          G4cout <<"volant->acv[" << j << "] = 0" << G4endl;
739          G4cout <<"volant->iv = " << volant->iv << G4endl;
740        }
741      }
742      if(volant->acv[j] > 0) {
743        mglms(volant->acv[j],volant->zpcv[j],0,&el);
744        fmcv = volant->zpcv[j]*fmp + (volant->acv[j] - volant->zpcv[j])*fmn + el;
745        e_evapo = e_evapo + std::sqrt(std::pow(volant->pcv[j],2) + std::pow(fmcv,2));
746      }
747    } // enddo
748
749    // C Redefinition pour conservation d'impulsion!!!
750    // C   this mass obtained by energy balance is very close to the
751    // C   mass of the remnant computed by pace2 + excitation energy (EE). (OK)     
752    remmass = e_evapo;
753     
754    G4double gamrem = std::sqrt(std::pow(pcorem,2)+std::pow(remmass,2))/remmass;
755    G4double etrem = pcorem/remmass;
756
757    if(verboseLevel > 2)
758      G4cout <<"5th Translab (no fission): Adding indices from " << 1 << " to " << volant->iv << G4endl;
759    nopart = varntp->ntrack - 1;
760    translab(gamrem,etrem,csrem,nopart,1);
761                 
762    if(verboseLevel > 2) {
763      G4cout <<"Dump at the end of evaporation event " << G4endl;
764      volant->dump();
765      G4cout <<"End of dump." << G4endl;
766    }
767    // C End of the (FISSION - NO FISSION) condition (FF=1 or 0)                                         
768  } //end if
769  // C *********************** FIN de l'EVAPO KHS ********************
770}
771
772// Evaporation code
773void G4Abla::initEvapora()
774{
775  //     37     C     PROJECTILE AND TARGET PARAMETERS + CROSS SECTIONS                 
776  //     38     C     COMMON /ABLAMAIN/ AP,ZP,AT,ZT,EAP,BETA,BMAXNUC,CRTOT,CRNUC,       
777  //     39     C                       R_0,R_P,R_T, IMAX,IRNDM,PI,                     
778  //     40     C                       BFPRO,SNPRO,SPPRO,SHELL                         
779  //     41     C                                                                       
780  //     42     C     AP,ZP,AT,ZT   - PROJECTILE AND TARGET MASSES                     
781  //     43     C     EAP,BETA      - BEAM ENERGY PER NUCLEON, V/C                     
782  //     44     C     BMAXNUC       - MAX. IMPACT PARAMETER FOR NUCL. REAC.             
783  //     45     C     CRTOT,CRNUC   - TOTAL AND NUCLEAR REACTION CROSS SECTION         
784  //     46     C     R_0,R_P,R_T,  - RADIUS PARAMETER, PROJECTILE+ TARGET RADII       
785  //     47     C     IMAX,IRNDM,PI - MAXIMUM NUMBER OF EVENTS, DUMMY, 3.141...         
786  //     48     C     BFPRO         - FISSION BARRIER OF THE PROJECTILE                 
787  //     49     C     SNPRO         - NEUTRON SEPARATION ENERGY OF THE PROJECTILE       
788  //     50     C     SPPRO         - PROTON    "           "   "    "   "             
789  //     51     C     SHELL         - GROUND STATE SHELL CORRECTION                     
790  //     52     C--------------------------------------------------------------------- 
791  //     53     C                                                                       
792  //     54     C     ENERGIES WIDTHS AND CROSS SECTIONS FOR EM EXCITATION             
793  //     55     C     COMMON /EMDPAR/ EGDR,EGQR,FWHMGDR,FWHMGQR,CREMDE1,CREMDE2,       
794  //     56     C                     AE1,BE1,CE1,AE2,BE2,CE2,SR1,SR2,XR               
795  //     57     C                                                                       
796  //     58     C     EGDR,EGQR       - MEAN ENERGY OF GDR AND GQR                     
797  //     59     C     FWHMGDR,FWHMGQR - FWHM OF GDR, GQR                               
798  //     60     C     CREMDE1,CREMDE2 - EM CROSS SECTION FOR E1 AND E2                 
799  //     61     C     AE1,BE1,CE1     - ARRAYS TO CALCULATE                             
800  //     62     C     AE2,BE2,CE2     - THE EXCITATION ENERGY AFTER E.M. EXC.           
801  //     63     C     SR1,SR2,XR      - WITH MONTE CARLO                               
802  //     64     C--------------------------------------------------------------------- 
803  //     65     C                                                                       
804  //     66     C     DEFORMATIONS AND G.S. SHELL EFFECTS                               
805  //     67     C     COMMON /ECLD/   ECGNZ,ECFNZ,VGSLD,ALPHA                           
806  //     68     C                                                                       
807  //     69     C     ECGNZ - GROUND STATE SHELL CORR. FRLDM FOR A SPHERICAL G.S.       
808  //     70     C     ECFNZ - SHELL CORRECTION FOR THE SADDLE POINT (NOW: == 0)         
809  //     71     C     VGSLD - DIFFERENCE BETWEEN DEFORMED G.S. AND LDM VALUE           
810  //     72     C     ALPHA - ALPHA GROUND STATE DEFORMATION (THIS IS NOT BETA2!)       
811  //     73     C             BETA2 = SQRT(5/(4PI)) * ALPHA                             
812  //     74     C--------------------------------------------------------------------- 
813  //     75     C                                                                       
814  //     76     C     ARRAYS FOR EXCITATION ENERGY BY STATISTICAL HOLE ENERY MODEL     
815  //     77     C     COMMON /EENUC/  SHE, XHE                                         
816  //     78     C                                                                       
817  //     79     C     SHE, XHE - ARRAYS TO CALCULATE THE EXC. ENERGY AFTER             
818  //     80     C                ABRASION BY THE STATISTICAL HOLE ENERGY MODEL         
819  //     81     C--------------------------------------------------------------------- 
820  //     82     C                                                                       
821  //     83     C     G.S. SHELL EFFECT                                                 
822  //     84     C     COMMON /EC2SUB/ ECNZ                                             
823  //     85     C                                                                       
824  //     86     C     ECNZ G.S. SHELL EFFECT FOR THE MASSES (IDENTICAL TO ECGNZ)       
825  //     87     C--------------------------------------------------------------------- 
826  //     88     C                                                                       
827  //     89     C     OPTIONS AND PARAMETERS FOR FISSION CHANNEL                       
828  //     90     C     COMMON /FISS/    AKAP,BET,HOMEGA,KOEFF,IFIS,                       
829  //     91     C                            OPTSHP,OPTXFIS,OPTLES,OPTCOL               
830  //     92     C                                                                       
831  //     93     C     AKAP   - HBAR**2/(2* MN * R_0**2) = 10 MEV                       
832  //     94     C     BET    - REDUCED NUCLEAR FRICTION COEFFICIENT IN (10**21 S**-1)   
833  //     95     C     HOMEGA - CURVATURE OF THE FISSION BARRIER = 1 MEV                 
834  //     96     C     KOEFF  - COEFFICIENT FOR THE LD FISSION BARRIER == 1.0           
835  //     97     C     IFIS   - 0/1 FISSION CHANNEL OFF/ON                               
836  //     98     C     OPTSHP - INTEGER SWITCH FOR SHELL CORRECTION IN MASSES/ENERGY     
837  //     99     C            = 0 NO MICROSCOPIC CORRECTIONS IN MASSES AND ENERGY       
838  //    100     C            = 1 SHELL ,  NO PAIRING                                   
839  //    101     C            = 2 PAIRING, NO SHELL                                     
840  //    102     C            = 3 SHELL AND PAIRING                                     
841  //    103     C     OPTCOL - 0/1 COLLECTIVE ENHANCEMENT SWITCHED ON/OFF               
842  //    104     C     OPTXFIS- 0,1,2 FOR MYERS & SWIATECKI, DAHLINGER, ANDREYEV         
843  //    105     C              FISSILITY PARAMETER.                                     
844  //    106     C     OPTLES - CONSTANT TEMPERATURE LEVEL DENSITY FOR A,Z > TH-224     
845  //    107     C     OPTCOL - 0/1 COLLECTIVE ENHANCEMENT OFF/ON                       
846  //    108     C--------------------------------------------------------------------- 
847  //    109     C                                                                       
848  //    110     C     OPTIONS                                                           
849  //    111     C     COMMON /OPT/    OPTEMD,OPTCHA,EEFAC                               
850  //    112     C                                                                       
851  //    113     C     OPTEMD - 0/1  NO EMD / INCL. EMD                                 
852  //    114     C     OPTCHA - 0/1  0 GDR / 1 HYPERGEOMETRICAL PREFRAGMENT-CHARGE-DIST.
853  //    115     C              ***  RECOMMENDED IS OPTCHA = 1 ***                       
854  //    116     C     EEFAC  - EXCITATION ENERGY FACTOR, 2.0 RECOMMENDED               
855  //    117     C--------------------------------------------------------------------- 
856  //    118     C                                                                       
857  //    119     C     FISSION BARRIERS                                                 
858  //    120     C     COMMON /FB/     EFA                                               
859  //    121     C     EFA    - ARRAY OF FISSION BARRIERS                               
860  //    122     C--------------------------------------------------------------------- 
861  //    123     C                                                                       
862  //    124     C p    LEVEL DENSITY PARAMETERS                                         
863  //    125     C     COMMON /ALD/    AV,AS,AK,OPTAFAN                                 
864  //    126     C     AV,AS,AK - VOLUME,SURFACE,CURVATURE DEPENDENCE OF THE             
865  //    127     C                LEVEL DENSITY PARAMETER                               
866  //    128     C     OPTAFAN - 0/1  AF/AN >=1 OR AF/AN ==1                             
867  //    129     C               RECOMMENDED IS OPTAFAN = 0                             
868  //    130     C--------------------------------------------------------------------- 
869  //    131     C   ____________________________________________________________________
870  //    132     C  /                                                                   
871  //    133     C  /  INITIALIZES PARAMETERS IN COMMON /ABRAMAIN/, /EMDPAR/, /ECLD/ ...
872  //    134     C  /  PROJECTILE PARAMETERS, EMD PARAMETERS, SHELL CORRECTION TABLES.   
873  //    135     C  /  CALCULATES MAXIMUM IMPACT PARAMETER FOR NUCLEAR COLLISIONS AND   
874  //    136     C  /  TOTAL GEOMETRICAL CROSS SECTION + EMD CROSS SECTIONS             
875  //    137     C   ____________________________________________________________________
876  //    138     C                                                                       
877  //    139     C                                                                       
878  //    201     C                                                                       
879  //    202     C---------- SET INPUT VALUES                                           
880  //    203     C                                                                       
881  //    204     C *** INPUT FROM UNIT 10 IN THE FOLLOWING SEQUENCE !                   
882  //    205     C     AP1 =    INTEGER  !                                               
883  //    206     C     ZP1 =    INTEGER  !                                               
884  //    207     C     AT1 =    INTEGER  !                                               
885  //    208     C     ZT1 =    INTEGER  !                                               
886  //    209     C     EAP =    REAL     !                                               
887  //    210     C     IMAX =   INTEGER  !                                               
888  //    211     C     IFIS =   INTEGER SWITCH FOR FISSION                               
889  //    212     C     OPTSHP = INTEGER SWITCH FOR SHELL CORRECTION IN MASSES/ENERGY     
890  //    213     C            =0 NO MICROSCOPIC CORRECTIONS IN MASSES AND ENERGY         
891  //    214     C            =1 SHELL , NO PAIRING CORRECTION                           
892  //    215     C            =2 PAIRING, NO SHELL CORRECTION                           
893  //    216     C            =3 SHELL AND PAIRING CORRECTION IN MASSES AND ENERGY       
894  //    217     C     OPTEMD =0,1  0 NO EMD, 1 INCL. EMD                               
895  //    218     C               ELECTROMAGNETIC DISSOZIATION IS CALCULATED AS WELL.     
896  //    219     C     OPTCHA =0,1  0 GDR- , 1 HYPERGEOMETRICAL PREFRAGMENT-CHARGE-DIST.
897  //    220     C               RECOMMENDED IS OPTCHA=1                                 
898  //    221     C     OPTCOL =0,1 COLLECTIVE ENHANCEMENT SWITCHED ON 1 OR OFF 0 IN DENSN
899  //    222     C     OPTAFAN=0,1 SWITCH FOR AF/AN = 1 IN DENSNIV 0 AF/AN>1 1 AF/AN=1   
900  //    223     C     AKAP =  REAL    ALWAYS EQUALS 10                                 
901  //    224     C     BET  =  REAL    REDUCED FRICTION COEFFICIENT / 10**(+21) S**(-1) 
902  //    225     C     HOMEGA = REAL   CURVATURE / MEV RECOMMENDED = 1. MEV             
903  //    226     C     KOEFF  = REAL   COEFFICIENT FOR FISSION BARRIER                   
904  //    227     C     OPTXFIS= INTEGER 0,1,2 FOR MYERS & SWIATECKI, DAHLINGER, ANDREYEV
905  //    228     C              FISSILITY PARAMETER.                                     
906  //    229     C     EEFAC  = REAL EMPIRICAL FACTOR FOR THE EXCITATION ENERGY         
907  //    230     C                   RECOMMENDED 2.D0, STATISTICAL ABRASION MODELL 1.D0 
908  //    231     C     AV     = REAL KOEFFICIENTS FOR CALCULATION OF A(TILDE)           
909  //    232     C     AS     = REAL LEVEL DENSITY PARAMETER                             
910  //    233     C     AK     = REAL                                                     
911  //    234     C                                                                       
912  //    235     C This following inputs will be initialized in the main through the
913  //    236     C         common /ABLAMAIN/  (A.B.)
914  //    237     
915
916  // switch-fission.1=on.0=off
917  fiss->ifis = 1;
918
919  // shell+pairing.0-1-2-3
920  fiss->optshp = 0;
921
922  // optemd =0,1  0 no emd, 1 incl. emd                               
923  opt->optemd = 1;
924  // read(10,*,iostat=io) dum(10),optcha                               
925  opt->optcha = 1;
926
927  // not.to.be.changed.(akap)
928  fiss->akap = 10.0;
929
930  // nuclear.viscosity.(beta)
931  fiss->bet = 1.5;
932
933  // potential-curvature
934  fiss->homega = 1.0;
935
936  // fission-barrier-coefficient
937  fiss->koeff = 1.;
938
939  //collective enhancement switched on 1 or off 0 in densn (qr=val or =1.)
940  fiss->optcol = 0;
941
942  // switch-for-low-energy-sys
943  fiss->optles = 0;
944
945  opt->eefac = 2.;
946
947  ald->optafan = 0;
948
949  ald->av = 0.073e0;
950  ald->as = 0.095e0;
951  ald->ak = 0.0e0;
952
953  if(verboseLevel > 3) {
954    G4cout <<"ifis " << fiss->ifis << G4endl;
955    G4cout <<"optshp " << fiss->optshp << G4endl;
956    G4cout <<"optemd " << opt->optemd << G4endl;
957    G4cout <<"optcha " << opt->optcha << G4endl;
958    G4cout <<"akap " << fiss->akap << G4endl;
959    G4cout <<"bet " << fiss->bet << G4endl;
960    G4cout <<"homega " << fiss->homega << G4endl;
961    G4cout <<"koeff " << fiss->koeff << G4endl;
962    G4cout <<"optcol " << fiss->optcol << G4endl;
963    G4cout <<"optles " << fiss->optles << G4endl;
964    G4cout <<"eefac " << opt->eefac << G4endl;
965    G4cout <<"optafan " << ald->optafan << G4endl;
966    G4cout <<"av " << ald->av << G4endl;
967    G4cout <<"as " << ald->as << G4endl;
968    G4cout <<"ak " << ald->ak << G4endl;
969  }
970  fiss->optxfis = 1;
971
972  G4InclAblaDataFile *dataInterface = new G4InclAblaDataFile();
973  if(dataInterface->readData() == true) {
974    if(verboseLevel > 0) {
975      G4cout <<"G4Abla: Datafiles read successfully." << G4endl;
976    }
977  }
978  else {
979    G4Exception("ERROR: Failed to read datafiles.");
980  }
981 
982  for(int z = 0; z < 99; z++) { //do 30  z = 0,98,1                                                 
983    for(int n = 0; n < 154; n++) { //do 31  n = 0,153,1                                             
984      ecld->ecfnz[n][z] = 0.e0;
985      ec2sub->ecnz[n][z] = dataInterface->getEcnz(n,z);
986      ecld->ecgnz[n][z] = dataInterface->getEcnz(n,z);
987      ecld->alpha[n][z] = dataInterface->getAlpha(n,z);
988      ecld->vgsld[n][z] = dataInterface->getVgsld(n,z);
989      //      if(ecld->ecgnz[n][z] != 0.0) G4cout <<"ecgnz[" << n << "][" << z << "] = " << ecld->ecgnz[n][z] << G4endl;
990    }
991  }
992
993  for(int z = 0; z < 500; z++) {
994    for(int a = 0; a < 500; a++) {
995      pace->dm[z][a] = dataInterface->getPace2(z,a);
996    }
997  }
998
999  delete dataInterface;
1000}
1001
1002void G4Abla::qrot(G4double z, G4double a, G4double bet, G4double sig, G4double u, G4double *qr)
1003{
1004  G4double ucr = 10.0; // Critical energy for damping.
1005  G4double dcr = 40.0; // Width of damping.
1006  G4double ponq = 0.0, dn = 0.0, n = 0.0, dz = 0.0;
1007
1008  if(((std::fabs(bet)-1.15) < 0) || ((std::fabs(bet)-1.15) == 0)) {
1009    goto qrot10;
1010  }
1011
1012  if((std::fabs(bet)-1.15) > 0) {
1013    goto qrot11;
1014  }
1015
1016 qrot10:
1017  n = a - z;
1018  dz = std::fabs(z - 82.0);
1019  if (n > 104) {
1020    dn = std::fabs(n-126.e0);
1021  }
1022  else {
1023    dn = std::fabs(n - 82.0);
1024  }
1025
1026  bet = 0.022 + 0.003*dn + 0.005*dz;
1027
1028  sig = 25.0*std::pow(bet,2) * sig;
1029
1030 qrot11:   
1031  ponq = (u - ucr)/dcr;
1032
1033  if (ponq > 700.0) {
1034    ponq = 700.0;
1035  }
1036  if (sig < 1.0) {
1037    sig = 1.0;
1038  }
1039  (*qr) = 1.0/(1.0 + std::exp(ponq)) * (sig - 1.0) + 1.0;
1040
1041  if ((*qr) < 1.0) {
1042    (*qr) = 1.0;
1043  }
1044
1045  return;
1046}
1047
1048void G4Abla::mglw(G4double a, G4double z, G4double *el)
1049{
1050  // MODEL DE LA GOUTTE LIQUIDE DE C. F. WEIZSACKER.
1051  // USUALLY AN OBSOLETE OPTION
1052
1053  G4int a1 = 0, z1 = 0;
1054  G4double xv = 0.0, xs = 0.0, xc = 0.0, xa = 0.0;                                   
1055
1056  a1 = idnint(a);
1057  z1 = idnint(z);
1058
1059  if ((a <= 0.01) || (z < 0.01)) {
1060    (*el) = 1.0e38;
1061  }
1062  else {
1063    xv = -15.56*a;
1064    xs = 17.23*std::pow(a,(2.0/3.0));
1065
1066    if (a > 1.0) {
1067      xc = 0.7*z*(z-1.0)*std::pow((a-1.0),(-1.e0/3.e0));
1068    }
1069    else {
1070      xc = 0.0;
1071    }
1072  }
1073
1074  xa = 23.6*(std::pow((a-2.0*z),2)/a);
1075  (*el) = xv+xs+xc+xa;
1076  return;       
1077}
1078
1079void G4Abla::mglms(G4double a, G4double z, G4int refopt4, G4double *el)
1080{
1081  // USING FUNCTION EFLMAC(IA,IZ,0)                                   
1082  //
1083  // REFOPT4 = 0 : WITHOUT MICROSCOPIC CORRECTIONS                     
1084  // REFOPT4 = 1 : WITH SHELL CORRECTION                               
1085  // REFOPT4 = 2 : WITH PAIRING CORRECTION                             
1086  // REFOPT4 = 3 : WITH SHELL- AND PAIRING CORRECTION                 
1087
1088  //   1839     C-----------------------------------------------------------------------
1089  //   1840     C     A1       LOCAL    MASS NUMBER (INTEGER VARIABLE OF A)             
1090  //   1841     C     Z1       LOCAL    NUCLEAR CHARGE (INTEGER VARIABLE OF Z)         
1091  //   1842     C     REFOPT4           OPTION, SPECIFYING THE MASS FORMULA (SEE ABOVE)
1092  //   1843     C     A                 MASS NUMBER                                     
1093  //   1844     C     Z                 NUCLEAR CHARGE                                 
1094  //   1845     C     DEL               PAIRING CORRECTION                             
1095  //   1846     C     EL                BINDING ENERGY                                 
1096  //   1847     C     ECNZ( , )         TABLE OF SHELL CORRECTIONS                     
1097  //   1848     C-----------------------------------------------------------------------
1098  //   1849     C                                                                       
1099  G4int a1 = idnint(a);
1100  G4int z1 = idnint(z);
1101
1102  if ( (a1 <= 0) || (z1 <= 0) || ((a1-z1) <= 0) )  { //then
1103    // modif pour récupérer une masse p et n correcte:
1104    (*el) = 0.0;
1105    return;
1106    //    goto mglms50;
1107  }
1108  else {
1109    // binding energy incl. pairing contr. is calculated from               
1110    // function eflmac                                                       
1111    (*el) = eflmac(a1,z1,0,refopt4);
1112    if (refopt4 > 0) {
1113      if (refopt4 != 2) {
1114        (*el) = (*el) + ec2sub->ecnz[a1-z1][z1];
1115        //(*el) = (*el) + ec2sub->ecnz[z1][a1-z1];
1116      }
1117    }
1118  }
1119  return;
1120}
1121
1122G4double G4Abla::spdef(G4int a, G4int z, G4int optxfis)
1123{
1124
1125  // INPUT:  A,Z,OPTXFIS MASS AND CHARGE OF A NUCLEUS,                     
1126  // OPTION FOR FISSILITY                                         
1127  // OUTPUT: SPDEF                                                         
1128
1129  // ALPHA2 SADDLE POINT DEF. COHEN&SWIATECKI ANN.PHYS. 22 (1963) 406     
1130  // RANGING FROM FISSILITY X=0.30 TO X=1.00 IN STEPS OF 0.02             
1131
1132  G4int index = 0;
1133  G4double x = 0.0, v = 0.0, dx = 0.0;
1134
1135  const G4int alpha2Size = 37;
1136  // The value 0.0 at alpha2[0] added by PK.
1137  G4double alpha2[alpha2Size] = {0.0, 2.5464e0, 2.4944e0, 2.4410e0, 2.3915e0, 2.3482e0,
1138                                 2.3014e0, 2.2479e0, 2.1982e0, 2.1432e0, 2.0807e0, 2.0142e0, 1.9419e0,
1139                                 1.8714e0, 1.8010e0, 1.7272e0, 1.6473e0, 1.5601e0, 1.4526e0, 1.3164e0,
1140                                 1.1391e0, 0.9662e0, 0.8295e0, 0.7231e0, 0.6360e0, 0.5615e0, 0.4953e0,
1141                                 0.4354e0, 0.3799e0, 0.3274e0, 0.2779e0, 0.2298e0, 0.1827e0, 0.1373e0,
1142                                 0.0901e0, 0.0430e0, 0.0000e0};
1143
1144  dx = 0.02;
1145  x  = fissility(a,z,optxfis);
1146
1147  if (x > 1.0) {
1148    x = 1.0;
1149  }
1150
1151  if (x < 0.0) {
1152    x = 0.0;
1153  }
1154
1155  v  = (x - 0.3)/dx + 1.0;
1156  index = idnint(v);
1157
1158  if (index < 1) {
1159    return(alpha2[1]); // alpha2[0] -> alpha2[1]
1160  }
1161
1162  if (index == 36) { //then // :::FIXME:: Possible off-by-one bug...                                           
1163    return(alpha2[36]); 
1164  }
1165  else {
1166    return(alpha2[index] + (alpha2[index+1] - alpha2[index]) / dx * ( x - (0.3e0 + dx*(index-1)))); //:::FIXME::: Possible off-by-one
1167  }                                                       
1168
1169  return alpha2[0]; // The algorithm is not supposed to reach this point.
1170}
1171
1172G4double G4Abla::fissility(int a,int z, int optxfis)
1173{
1174  // CALCULATION OF FISSILITY PARAMETER                                 
1175  //
1176  // INPUT: A,Z INTEGER MASS & CHARGE OF NUCLEUS                       
1177  // OPTXFIS = 0 : MYERS, SWIATECKI                             
1178  //           1 : DAHLINGER                                     
1179  //           2 : ANDREYEV                                     
1180
1181  G4double aa = 0.0, zz = 0.0, i = 0.0;
1182  G4double fissilityResult = 0.0;
1183
1184  aa = double(a);
1185  zz = double(z);
1186  i  = double(a-2*z) / aa;
1187
1188  // myers & swiatecki droplet modell                       
1189  if (optxfis == 0) { //then                                           
1190    fissilityResult = std::pow(zz,2) / aa /50.8830e0 / (1.0e0 - 1.7826e0 * std::pow(i,2));
1191  }
1192
1193  if (optxfis == 1) {
1194    // dahlinger fit:                                         
1195    fissilityResult = std::pow(zz,2) / aa * std::pow((49.22e0*(1.e0 - 0.3803e0*std::pow(i,2) - 20.489e0*std::pow(i,4))),(-1));
1196  }
1197
1198  if (optxfis == 2) {
1199    // dubna fit:                                             
1200    fissilityResult = std::pow(zz,2) / aa  /(48.e0*(1.e0 - 17.22e0*std::pow(i,4)));
1201  }
1202
1203  return fissilityResult;
1204}
1205
1206void G4Abla::evapora(G4double zprf, G4double aprf, G4double ee, G4double jprf, 
1207                     G4double *zf_par, G4double *af_par, G4double *mtota_par,
1208                     G4double *pleva_par, G4double *pxeva_par, G4double *pyeva_par,
1209                     G4int *ff_par, G4int *inttype_par, G4int *inum_par)
1210{
1211  G4double zf = (*zf_par);
1212  G4double af = (*af_par);
1213  G4double mtota = (*mtota_par);
1214  G4double pleva = (*pleva_par);
1215  G4double pxeva = (*pxeva_par);
1216  G4double pyeva = (*pyeva_par);
1217  G4int ff = (*ff_par);
1218  G4int inttype = (*inttype_par);
1219  G4int inum = (*inum_par);
1220
1221  G4int idebug = 0;
1222
1223  if(idebug == 666) {
1224    zprf =   81.;
1225    aprf =   201.;
1226    //    ee =   86.5877686;
1227    ee = 300.0;
1228    jprf =   32.;
1229    zf =   0.;
1230    af =   0.;
1231    mtota =   0.;
1232    pleva =   0.;
1233    pxeva =   0.;
1234    pyeva =   0.;
1235    ff =  -1;
1236    inttype =  0;
1237    inum =  2;
1238    G4cout <<" PK::: EVAPORA event  " << inum << G4endl;
1239    G4cout <<" PK:::    zprf =   " << zprf << G4endl;
1240    G4cout <<" PK:::    aprf =   " << aprf << G4endl;
1241    G4cout <<" PK:::      ee =   " << ee << G4endl;
1242    G4cout <<" PK:::      eeDiff =   " << ee - 86.5877686 << G4endl;
1243    G4cout <<" PK:::    jprf =   " << jprf << G4endl;
1244    G4cout <<" PK:::      zf =   " << zf << G4endl;
1245    G4cout <<" PK:::      af =   " << af << G4endl;
1246    G4cout <<" PK:::   mtota =   " << mtota << G4endl;
1247    G4cout <<" PK:::   pleva =   " << pleva << G4endl;
1248    G4cout <<" PK:::   pxeva =   " << pxeva << G4endl;
1249    G4cout <<" PK:::   pyeva =   " << pyeva << G4endl;
1250    G4cout <<" PK:::      ff =  " << ff << G4endl;
1251    G4cout <<" PK::: inttype =  " << inttype << G4endl;
1252    G4cout <<" PK:::    inum =  " << inum << G4endl;
1253  }
1254  //    533     C                                                                       
1255  //    534     C     INPUT:                                                           
1256  //    535     C                                                                       
1257  //    536     C     ZPRF, APRF, EE(EE IS MODIFIED!), JPRF                             
1258  //    537     C                                                                       
1259  //    538     C     PROJECTILE AND TARGET PARAMETERS + CROSS SECTIONS                 
1260  //    539     C     COMMON /ABRAMAIN/ AP,ZP,AT,ZT,EAP,BETA,BMAXNUC,CRTOT,CRNUC,       
1261  //    540     C                       R_0,R_P,R_T, IMAX,IRNDM,PI,                     
1262  //    541     C                       BFPRO,SNPRO,SPPRO,SHELL                         
1263  //    542     C                                                                       
1264  //    543     C     AP,ZP,AT,ZT   - PROJECTILE AND TARGET MASSES                     
1265  //    544     C     EAP,BETA      - BEAM ENERGY PER NUCLEON, V/C                     
1266  //    545     C     BMAXNUC       - MAX. IMPACT PARAMETER FOR NUCL. REAC.             
1267  //    546     C     CRTOT,CRNUC   - TOTAL AND NUCLEAR REACTION CROSS SECTION         
1268  //    547     C     R_0,R_P,R_T,  - RADIUS PARAMETER, PROJECTILE+ TARGET RADII       
1269  //    548     C     IMAX,IRNDM,PI - MAXIMUM NUMBER OF EVENTS, DUMMY, 3.141...         
1270  //    549     C     BFPRO         - FISSION BARRIER OF THE PROJECTILE                 
1271  //    550     C     SNPRO         - NEUTRON SEPARATION ENERGY OF THE PROJECTILE       
1272  //    551     C     SPPRO         - PROTON    "           "   "    "   "             
1273  //    552     C     SHELL         - GROUND STATE SHELL CORRECTION                     
1274  //    553     C                                                                       
1275  //    554     C--------------------------------------------------------------------- 
1276  //    555     C     FISSION BARRIERS                                                 
1277  //    556     C     COMMON /FB/     EFA                                               
1278  //    557     C     EFA    - ARRAY OF FISSION BARRIERS                               
1279  //    558     C--------------------------------------------------------------------- 
1280  //    559     C     OUTPUT:                                                           
1281  //    560     C              ZF, AF, MTOTA, PLEVA, PTEVA, FF, INTTYPE, INUM           
1282  //    561     C                                                                       
1283  //    562     C     ZF,AF - CHARGE AND MASS OF FINAL FRAGMENT AFTER EVAPORATION       
1284  //    563     C     MTOTA _ NUMBER OF EVAPORATED ALPHAS                               
1285  //    564     C     PLEVA,PXEVA,PYEVA - MOMENTUM RECOIL BY EVAPORATION               
1286  //    565     C     INTTYPE - TYPE OF REACTION 0/1 NUCLEAR OR ELECTROMAGNETIC         
1287  //    566     C     FF      - 0/1 NO FISSION / FISSION EVENT                         
1288  //    567     C     INUM    - EVENTNUMBER                                             
1289  //    568     C   ____________________________________________________________________
1290  //    569     C  /                                                                   
1291  //    570     C  /  CALCUL DE LA MASSE ET CHARGE FINALES D'UNE CHAINE D'EVAPORATION   
1292  //    571     C  /                                                                   
1293  //    572     C  /  PROCEDURE FOR CALCULATING THE FINAL MASS AND CHARGE VALUES OF A   
1294  //    573     C  /  SPECIFIC EVAPORATION CHAIN, STARTING POINT DEFINED BY (APRF, ZPRF,
1295  //    574     C  /  EE)                                                               
1296  //    575     C  /  On ajoute les 3 composantes de l'impulsion (PXEVA,PYEVA,PLEVA)
1297  //    576     C  /    (actuellement PTEVA n'est pas correct; mauvaise norme...)                                               
1298  //    577     C  /____________________________________________________________________
1299  //    578     C                                                                       
1300  //    612     C                                                                       
1301  //    613     C-----------------------------------------------------------------------
1302  //    614     C     IRNDM             DUMMY ARGUMENT FOR RANDOM-NUMBER FUNCTION       
1303  //    615     C     SORTIE   LOCAL    HELP VARIABLE TO END THE EVAPORATION CHAIN     
1304  //    616     C     ZF                NUCLEAR CHARGE OF THE FRAGMENT                 
1305  //    617     C     ZPRF              NUCLEAR CHARGE OF THE PREFRAGMENT               
1306  //    618     C     AF                MASS NUMBER OF THE FRAGMENT                     
1307  //    619     C     APRF              MASS NUMBER OF THE PREFRAGMENT                 
1308  //    620     C     EPSILN            ENERGY BURNED IN EACH EVAPORATION STEP         
1309  //    621     C     MALPHA   LOCAL    MASS CONTRIBUTION TO MTOTA IN EACH EVAPORATION 
1310  //    622     C                        STEP                                           
1311  //    623     C     EE                EXCITATION ENERGY (VARIABLE)                   
1312  //    624     C     PROBP             PROTON EMISSION PROBABILITY                     
1313  //    625     C     PROBN             NEUTRON EMISSION PROBABILITY                   
1314  //    626     C     PROBA             ALPHA-PARTICLE EMISSION PROBABILITY             
1315  //    627     C     PTOTL             TOTAL EMISSION PROBABILITY                     
1316  //    628     C     E                 LOWEST PARTICLE-THRESHOLD ENERGY               
1317  //    629     C     SN                NEUTRON SEPARATION ENERGY                       
1318  //    630     C     SBP               PROTON SEPARATION ENERGY PLUS EFFECTIVE COULOMB
1319  //    631     C                        BARRIER                                       
1320  //    632     C     SBA               ALPHA-PARTICLE SEPARATION ENERGY PLUS EFFECTIVE
1321  //    633     C                        COULOMB BARRIER                               
1322  //    634     C     BP                EFFECTIVE PROTON COULOMB BARRIER               
1323  //    635     C     BA                EFFECTIVE ALPHA COULOMB BARRIER                 
1324  //    636     C     MTOTA             TOTAL MASS OF THE EVAPORATED ALPHA PARTICLES   
1325  //    637     C     X                 UNIFORM RANDOM NUMBER FOR NUCLEAR CHARGE       
1326  //    638     C     AMOINS   LOCAL    MASS NUMBER OF EVAPORATED PARTICLE             
1327  //    639     C     ZMOINS   LOCAL    NUCLEAR CHARGE OF EVAPORATED PARTICLE           
1328  //    640     C     ECP               KINETIC ENERGY OF PROTON WITHOUT COULOMB       
1329  //    641     C                        REPULSION                                     
1330  //    642     C     ECN               KINETIC ENERGY OF NEUTRON                       
1331  //    643     C     ECA               KINETIC ENERGY OF ALPHA PARTICLE WITHOUT COULOMB
1332  //    644     C                        REPULSION                                     
1333  //    645     C     PLEVA             TRANSVERSAL RECOIL MOMENTUM OF EVAPORATION     
1334  //    646     C     PTEVA             LONGITUDINAL RECOIL MOMENTUM OF EVAPORATION     
1335  //    647     C     FF                FISSION FLAG                                   
1336  //    648     C     INTTYPE           INTERACTION TYPE FLAG                           
1337  //    649     C     RNDX              RECOIL MOMENTUM IN X-DIRECTION IN A SINGLE STEP
1338  //    650     C     RNDY              RECOIL MOMENTUM IN Y-DIRECTION IN A SINGLE STEP
1339  //    651     C     RNDZ              RECOIL MOMENTUM IN Z-DIRECTION IN A SINGLE STEP
1340  //    652     C     RNDN              NORMALIZATION OF RECOIL MOMENTUM FOR EACH STEP 
1341  //    653     C-----------------------------------------------------------------------
1342  //    654     C                                                                       
1343  //    655           SAVE                                                             
1344  // SAVE -> static
1345       
1346  static G4int sortie = 0;                           
1347  static G4double epsiln = 0.0, probp = 0.0, probn = 0.0, proba = 0.0, ptotl = 0.0, e = 0.0; 
1348  static G4double sn = 0.0, sbp = 0.0, sba = 0.0, x = 0.0, amoins = 0.0, zmoins = 0.0;
1349  G4double ecn = 0.0, ecp = 0.0,eca = 0.0, bp = 0.0, ba = 0.0;         
1350  static G4double pteva = 0.0;                       
1351
1352  static G4int itest = 0;
1353  static G4double probf = 0.0;
1354
1355  static G4int k = 0, j = 0, il = 0;
1356
1357  static G4double ctet1 = 0.0, stet1 = 0.0, phi1 = 0.0;
1358  static G4double sbfis = 0.0, rnd = 0.0;
1359  static G4double selmax = 0.0;
1360  static G4double segs = 0.0;
1361  static G4double ef = 0.0;
1362  static G4int irndm = 0;
1363
1364  static G4double pc = 0.0, malpha = 0.0;
1365
1366  zf = zprf;
1367  af = aprf;
1368  pleva = 0.0;
1369  pteva = 0.0;
1370  pxeva = 0.0;
1371  pyeva = 0.0;
1372
1373  sortie = 0;
1374  ff = 0;
1375
1376  itest = 0;
1377  if (itest == 1) {
1378    G4cout << "***************************" << G4endl;
1379  }
1380
1381 evapora10:
1382
1383  if (itest == 1) {
1384    G4cout <<"------zf,af,ee------" << idnint(zf) << "," << idnint(af) << "," << ee << G4endl;
1385  }
1386
1387  // calculation of the probabilities for the different decay channels     
1388  // plus separation energies and kinetic energies of the particles       
1389  direct(zf,af,ee,jprf,&probp,&probn,&proba,&probf,&ptotl,
1390         &sn,&sbp,&sba,&ecn,&ecp,&eca,&bp,&ba,inttype,inum,itest); //:::FIXME::: Call
1391  if((eca+ba) < 0) {
1392    eca = 0.0;
1393    ba = 0.0;
1394  }
1395  k = idnint(zf);
1396  j = idnint(af-zf);
1397
1398  // now ef is calculated from efa that depends on the subroutine
1399  // barfit which takes into account the modification on the ang. mom.
1400  // jb mvr 6-aug-1999
1401  // note *** shell correction! (ecgnz)  jb mvr 20-7-1999
1402  il  = idnint(jprf);
1403  barfit(k,k+j,il,&sbfis,&segs,&selmax);
1404 
1405  if ((fiss->optshp == 1) || (fiss->optshp == 3)) { //then                     
1406    //    fb->efa[k][j] = G4double(sbfis) -  ecld->ecgnz[j][k];
1407    fb->efa[j][k] = G4double(sbfis) -  ecld->ecgnz[j][k];
1408  }
1409  else {
1410    fb->efa[j][k] = G4double(sbfis);
1411    //  fb->efa[j][k] = G4double(sbfis);
1412  } //end if
1413  ef = fb->efa[j][k];
1414  //  ef = fb->efa[j][k];
1415  // here the final steps of the evaporation are calculated               
1416  if ((sortie == 1) || (ptotl == 0.e0)) {
1417    e = dmin1(sn,sbp,sba);
1418    if (e > 1.0e30) {
1419      if(verboseLevel > 2) {
1420        G4cout <<"erreur a la sortie evapora,e>1.e30,af=" << af <<" zf=" << zf << G4endl;
1421      }
1422    }
1423    if (zf <= 6.0) {
1424      goto evapora100;
1425    }
1426    if (e < 0.0) {
1427      if (sn == e) {
1428        af = af - 1.e0;
1429      }
1430      else if (sbp == e) {
1431        af = af - 1.0;
1432        zf = zf - 1.0;
1433      }
1434      else if (sba == e) {
1435        af = af - 4.0;
1436        zf = zf - 2.0;
1437      }
1438      if (af < 2.5) {
1439        goto evapora100;
1440      }
1441      goto evapora10;
1442    }
1443    goto evapora100;
1444  }
1445  irndm = irndm + 1;
1446
1447  // here the normal evaporation cascade starts                           
1448
1449  // random number for the evaporation                                     
1450  //  x = double(Rndm(irndm))*ptotl;
1451  // x = double(haz(1))*ptotl;
1452  x = randomGenerator->getRandom() * ptotl;
1453//   G4cout <<"proba = " << proba << G4endl;
1454//   G4cout <<"probp = " << probp << G4endl;
1455//   G4cout <<"probn = " << probn << G4endl;
1456//   G4cout <<"probf = " << probf << G4endl;
1457
1458  itest = 0;
1459  if (x < proba) {
1460    // alpha evaporation                                                     
1461    if (itest == 1) {
1462      G4cout <<"PK::: < alpha evaporation >" << G4endl;
1463    }
1464    amoins = 4.0;
1465    zmoins = 2.0;
1466    epsiln = sba + eca;
1467    pc = std::sqrt(std::pow((1.0 + (eca+ba)/3.72834e3),2) - 1.0) * 3.72834e3;
1468    malpha = 4.0;
1469
1470    // volant:
1471    volant->iv = volant->iv + 1;
1472    volant->acv[volant->iv] = 4.;
1473    volant->zpcv[volant->iv] = 2.;
1474    volant->pcv[volant->iv] = pc;
1475  }
1476  else if (x < proba+probp) {
1477    // proton evaporation                                                   
1478    if (itest == 1) {
1479      G4cout <<"PK::: < proton evaporation >" << G4endl;
1480    }
1481    amoins = 1.0;
1482    zmoins = 1.0;
1483    epsiln = sbp + ecp;
1484    pc = std::sqrt(std::pow((1.0 + (ecp + bp)/9.3827e2),2) - 1.0) * 9.3827e2;
1485    malpha = 0.0;
1486    // volant:
1487    volant->iv = volant->iv + 1;
1488    volant->acv[volant->iv] = 1.0;
1489    volant->zpcv[volant->iv] = 1.;
1490    volant->pcv[volant->iv] = pc;
1491  }
1492  else if (x < proba+probp+probn) {
1493    // neutron evaporation                                                   
1494    if (itest == 1) {
1495      G4cout <<"PK::: < neutron evaporation >" << G4endl;
1496    }
1497    amoins = 1.0;
1498    zmoins = 0.0;
1499    epsiln = sn + ecn;
1500    pc = std::sqrt(std::pow((1.0 + (ecn)/9.3956e2),2) - 1.0) * 9.3956e2;
1501    if(itest == 1) {
1502      G4cout <<"PK::: pc " << pc << G4endl;
1503    }
1504    malpha = 0.0;
1505 
1506    // volant:
1507    volant->iv = volant->iv + 1;
1508    volant->acv[volant->iv] = 1.;
1509    volant->zpcv[volant->iv] = 0.;
1510    volant->pcv[volant->iv] = pc;
1511
1512    if(volant->getTotalMass() > 209 && verboseLevel > 0) {
1513      volant->dump();
1514      G4cout <<"DEBUGA Total = " << volant->getTotalMass() << G4endl;
1515    }
1516  }
1517  else {
1518    // fission                                                               
1519    // in case of fission-events the fragment nucleus is the mother nucleus 
1520    // before fission occurs with excitation energy above the fis.- barrier.
1521    // fission fragment mass distribution is calulated in subroutine fisdis 
1522    if (itest == 1) {
1523      G4cout <<"PK::: < fission >" << G4endl;
1524    }
1525    amoins = 0.0;
1526    zmoins = 0.0;
1527    epsiln = ef;
1528
1529    malpha = 0.0;
1530    pc = 0.0;
1531    ff = 1;
1532    // ff = 0; // For testing, allows to disable fission!
1533  }
1534
1535  if (itest == 1) {
1536    G4cout << std::setprecision(9) <<"PK::: SN,SBP,SBA,EF  " << sn << "  " << sbp << "  " << sba <<"  " << ef << G4endl;
1537    G4cout << std::setprecision(9) <<"PK::: PROBN,PROBP,PROBA,PROBF,PTOTL  " <<"  "<< probn <<"  "<< probp <<"  "<< proba <<"  "<< probf <<"  "<< ptotl << G4endl;
1538  }
1539
1540  // calculation of the daughter nucleus                                   
1541  af = af - amoins;
1542  zf = zf - zmoins;
1543  ee = ee - epsiln;
1544  if (ee <= 0.01) {
1545    ee = 0.01;
1546  }
1547  mtota = mtota + malpha;
1548
1549  if(ff == 0) {
1550    rnd = randomGenerator->getRandom();
1551    //    standardRandom(&rnd,&(hazard->igraine[8]));
1552    ctet1 = 2.0*rnd - 1.0;
1553    rnd = randomGenerator->getRandom();
1554    //    standardRandom(&rnd,&(hazard->igraine[4]));
1555    phi1 = rnd*2.0*3.141592654;
1556    stet1 = std::sqrt(1.0 - std::pow(ctet1,2));
1557    volant->xcv[volant->iv] = stet1*std::cos(phi1);
1558    volant->ycv[volant->iv] = stet1*std::sin(phi1);
1559    volant->zcv[volant->iv] = ctet1;
1560    pxeva = pxeva - pc * volant->xcv[volant->iv];
1561    pyeva = pyeva - pc * volant->ycv[volant->iv];
1562    pleva = pleva - pc * ctet1;
1563  }
1564
1565  // condition for end of evaporation                                   
1566  if ((af < 2.5) || (ff == 1)) {
1567    goto evapora100;
1568  }
1569  goto evapora10;
1570
1571 evapora100:
1572  (*zf_par) = zf;
1573  (*af_par) = af;
1574  (*mtota_par) = mtota;
1575  (*pleva_par) = pleva;
1576  (*pxeva_par) = pxeva;
1577  (*pyeva_par) = pyeva;
1578  (*ff_par) = ff;
1579  (*inttype_par) = inttype;                                         
1580  (*inum_par) = inum;
1581
1582  return;
1583}
1584
1585void G4Abla::direct(G4double zprf, G4double a, G4double ee, G4double jprf, 
1586                    G4double *probp_par, G4double *probn_par, G4double *proba_par, 
1587                    G4double *probf_par, G4double *ptotl_par, G4double *sn_par,
1588                    G4double *sbp_par, G4double *sba_par, G4double *ecn_par, 
1589                    G4double *ecp_par,G4double *eca_par, G4double *bp_par,
1590                    G4double *ba_par, G4int inttype, G4int inum, G4int itest)
1591{
1592  G4int dummy0 = 0;
1593 
1594  G4double probp = (*probp_par);
1595  G4double probn = (*probn_par);
1596  G4double proba = (*proba_par);
1597  G4double probf = (*probf_par);
1598  G4double ptotl = (*ptotl_par);
1599  G4double sn = (*sn_par);
1600  G4double sbp = (*sbp_par);
1601  G4double sba = (*sba_par);
1602  G4double ecn = (*ecn_par);
1603  G4double ecp = (*ecp_par);
1604  G4double eca = (*eca_par);
1605  G4double bp = (*bp_par);
1606  G4double ba = (*ba_par);
1607
1608  // CALCULATION OF PARTICLE-EMISSION PROBABILITIES & FISSION     /
1609  // BASED ON THE SIMPLIFIED FORMULAS FOR THE DECAY WIDTH BY      /
1610  // MORETTO, ROCHESTER MEETING TO AVOID COMPUTING TIME           /
1611  // INTENSIVE INTEGRATION OF THE LEVEL DENSITIES                 /
1612  // USES EFFECTIVE COULOMB BARRIERS AND AN AVERAGE KINETIC ENERGY/
1613  // OF THE EVAPORATED PARTICLES                                  /
1614  // COLLECTIVE ENHANCMENT OF THE LEVEL DENSITY IS INCLUDED       /
1615  // DYNAMICAL HINDRANCE OF FISSION IS INCLUDED BY A STEP FUNCTION/
1616  // APPROXIMATION. SEE A.R. JUNGHANS DIPLOMA THESIS              /
1617  // SHELL AND PAIRING STRUCTURES IN THE LEVEL DENSITY IS INCLUDED/
1618
1619  // INPUT:                                                           
1620  // ZPRF,A,EE  CHARGE, MASS, EXCITATION ENERGY OF COMPOUND     
1621  // NUCLEUS                                         
1622  // JPRF       ROOT-MEAN-SQUARED ANGULAR MOMENTUM                           
1623
1624  // DEFORMATIONS AND G.S. SHELL EFFECTS                               
1625  // COMMON /ECLD/   ECGNZ,ECFNZ,VGSLD,ALPHA                           
1626
1627  // ECGNZ - GROUND STATE SHELL CORR. FRLDM FOR A SPHERICAL G.S.       
1628  // ECFNZ - SHELL CORRECTION FOR THE SADDLE POINT (NOW: == 0)         
1629  // VGSLD - DIFFERENCE BETWEEN DEFORMED G.S. AND LDM VALUE           
1630  // ALPHA - ALPHA GROUND STATE DEFORMATION (THIS IS NOT BETA2!)       
1631  // BETA2 = SQRT((4PI)/5) * ALPHA                             
1632
1633  //OPTIONS AND PARAMETERS FOR FISSION CHANNEL                       
1634  //COMMON /FISS/    AKAP,BET,HOMEGA,KOEFF,IFIS,                       
1635  //                 OPTSHP,OPTXFIS,OPTLES,OPTCOL               
1636  //
1637  // AKAP   - HBAR**2/(2* MN * R_0**2) = 10 MEV, R_0 = 1.4 FM         
1638  // BET    - REDUCED NUCLEAR FRICTION COEFFICIENT IN (10**21 S**-1)   
1639  // HOMEGA - CURVATURE OF THE FISSION BARRIER = 1 MEV                 
1640  // KOEFF  - COEFFICIENT FOR THE LD FISSION BARRIER == 1.0           
1641  // IFIS   - 0/1 FISSION CHANNEL OFF/ON                               
1642  // OPTSHP - INTEGER SWITCH FOR SHELL CORRECTION IN MASSES/ENERGY     
1643  //          = 0 NO MICROSCOPIC CORRECTIONS IN MASSES AND ENERGY       
1644  //          = 1 SHELL ,  NO PAIRING                                   
1645  //          = 2 PAIRING, NO SHELL                                     
1646  //          = 3 SHELL AND PAIRING                                     
1647  // OPTCOL - 0/1 COLLECTIVE ENHANCEMENT SWITCHED ON/OFF               
1648  // OPTXFIS- 0,1,2 FOR MYERS & SWIATECKI, DAHLINGER, ANDREYEV         
1649  //                FISSILITY PARAMETER.                                     
1650  // OPTLES - CONSTANT TEMPERATURE LEVEL DENSITY FOR A,Z > TH-224     
1651  // OPTCOL - 0/1 COLLECTIVE ENHANCEMENT OFF/ON                       
1652
1653  // LEVEL DENSITY PARAMETERS                                         
1654  // COMMON /ALD/    AV,AS,AK,OPTAFAN                                 
1655  //                 AV,AS,AK - VOLUME,SURFACE,CURVATURE DEPENDENCE OF THE             
1656  //                            LEVEL DENSITY PARAMETER                               
1657  // OPTAFAN - 0/1  AF/AN >=1 OR AF/AN ==1                             
1658  //           RECOMMENDED IS OPTAFAN = 0                             
1659
1660  // FISSION BARRIERS                                                 
1661  // COMMON /FB/     EFA                                               
1662  // EFA    - ARRAY OF FISSION BARRIERS                               
1663
1664
1665  // OUTPUT: PROBN,PROBP,PROBA,PROBF,PTOTL:                           
1666  // - EMISSION PROBABILITIES FOR N EUTRON, P ROTON,  A LPHA     
1667  // PARTICLES, F ISSION AND NORMALISATION                     
1668  // SN,SBP,SBA: SEPARATION ENERGIES N P A                     
1669  // INCLUDING EFFECTIVE BARRIERS                             
1670  // ECN,ECP,ECA,BP,BA                                         
1671  // - AVERAGE KINETIC ENERGIES (2*T) AND EFFECTIVE BARRIERS     
1672
1673  static G4double bk = 0.0;
1674  static G4int afp = 0;
1675  static G4double at = 0.0;
1676  static G4double bs = 0.0;
1677  static G4double bshell = 0.0;
1678  static G4double cf = 0.0;
1679  static G4double dconst = 0.0;
1680  static G4double defbet = 0.0;
1681  static G4double denomi = 0.0;
1682  static G4double densa = 0.0;
1683  static G4double densf = 0.0;
1684  static G4double densg = 0.0;
1685  static G4double densn = 0.0;
1686  static G4double densp = 0.0;
1687  static G4double edyn = 0.0;
1688  static G4double eer = 0.0;
1689  static G4double ef = 0.0;
1690  static G4double ft = 0.0;
1691  static G4double ga = 0.0;
1692  static G4double gf = 0.0;
1693  static G4double gn = 0.0;
1694  static G4double gngf = 0.0;
1695  static G4double gp = 0.0;
1696  static G4double gsum = 0.0;
1697  static G4double hbar = 6.582122e-22; // = 0.0;
1698  static G4double iflag = 0.0;
1699  static G4int il = 0;
1700  static G4int imaxwell = 0;
1701  static G4int in = 0;
1702  static G4int iz = 0;
1703  static G4int j = 0;
1704  static G4int k = 0;
1705  static G4double ma1z = 0.0;
1706  static G4double ma1z1 = 0.0;
1707  static G4double ma4z2 = 0.0;
1708  static G4double maz = 0.0;
1709  static G4double nprf = 0.0;
1710  static G4double nt = 0.0;
1711  static G4double parc = 0.0;
1712  static G4double pi = 3.14159265;
1713  static G4double pt = 0.0;
1714  static G4double ra = 0.0;
1715  static G4double rat = 0.0;
1716  static G4double refmod = 0.0;
1717  static G4double rf = 0.0;
1718  static G4double rn = 0.0;
1719  static G4double rnd = 0.0;
1720  static G4double rnt = 0.0;
1721  static G4double rp = 0.0;
1722  static G4double rpt = 0.0;
1723  static G4double sa = 0.0;
1724  static G4double sbf = 0.0;
1725  static G4double sbfis = 0.0;
1726  static G4double segs = 0.0;
1727  static G4double selmax = 0.0;
1728  static G4double sp = 0.0;
1729  static G4double tauc = 0.0;
1730  static G4double tconst = 0.0;
1731  static G4double temp = 0.0;
1732  static G4double ts1 = 0.0;
1733  static G4double tsum = 0.0;
1734  static G4double wf = 0.0;
1735  static G4double wfex = 0.0;
1736  static G4double xx = 0.0;
1737  static G4double y = 0.0;
1738
1739  imaxwell = 1;
1740  inttype = 0;
1741 
1742  // limiting of excitation energy where fission occurs                   
1743  // Note, this is not the dynamical hindrance (see end of routine)     
1744  edyn = 1000.0;
1745
1746  // no limit if statistical model is calculated.                         
1747  if (fiss->bet <= 1.0e-16) {
1748    edyn = 10000.0;
1749  }
1750
1751  // just a change of name until the end of this subroutine               
1752  eer = ee;
1753  if(verboseLevel > 2)
1754    G4cout << __FILE__ << ":" << __LINE__ << " eer = " << eer << G4endl;
1755  if (inum == 1) {
1756    ilast = 1;
1757  }
1758
1759  // calculation of masses                                           
1760  // refmod = 1 ==> myers,swiatecki model                             
1761  // refmod = 0 ==> weizsaecker model                                 
1762  refmod = 1;  // Default = 1
1763
1764  if (refmod == 1) {
1765    mglms(a,zprf,fiss->optshp,&maz);
1766    mglms(a-1.0,zprf,fiss->optshp,&ma1z);
1767    mglms(a-1.0,zprf-1.0,fiss->optshp,&ma1z1);
1768    mglms(a-4.0,zprf-2.0,fiss->optshp,&ma4z2);
1769  }
1770  else {
1771    mglw(a,zprf,&maz);
1772    mglw(a-1.0,zprf,&ma1z);
1773    mglw(a-1.0,zprf-1.0,&ma1z1);
1774    mglw(a-4.0,zprf-2.0,&ma4z2);
1775  }
1776 
1777  // separation energies and effective barriers                     
1778  sn = ma1z - maz;
1779  sp = ma1z1 - maz;
1780  sa = ma4z2 - maz - 28.29688;
1781  if (zprf < 1.0e0) {
1782    sbp = 1.0e75;
1783    goto direct30;
1784  }
1785
1786  // parameterisation gaimard:
1787  // bp = 1.44*(zprf-1.d0)/(1.22*std::pow((a - 1.0),(1.0/3.0))+5.6)     
1788  // parameterisation khs (12-99)
1789  bp = 1.44*(zprf - 1.0)/(2.1*std::pow((a - 1.0),(1.0/3.0)) + 0.0);
1790
1791  sbp = sp + bp;
1792  if (a-4.0 <= 0.0) {
1793    sba = 1.0e+75;
1794    goto direct30;
1795  }
1796
1797  // new effective barrier for alpha evaporation d=6.1: khs         
1798  // ba = 2.88d0*(zprf-2.d0)/(1.22d0*(a-4.d0)**(1.d0/3.d0)+6.1d0)
1799  // parametrisation khs (12-99)
1800  ba = 2.88*(zprf - 2.0)/(2.2*std::pow((a - 4.0),(1.0/3.0)) + 0.0);
1801
1802  sba = sa + ba;
1803 direct30:
1804
1805  // calculation of surface and curvature integrals needed to     
1806  // to calculate the level density parameter (in densniv)         
1807  if (fiss->ifis > 0) {
1808    k = idnint(zprf);
1809    j = idnint(a - zprf);
1810
1811    // now ef is calculated from efa that depends on the subroutine
1812    // barfit which takes into account the modification on the ang. mom.
1813    // jb mvr 6-aug-1999
1814    // note *** shell correction! (ecgnz)  jb mvr 20-7-1999
1815    il = idnint(jprf);
1816    barfit(k,k+j,il,&sbfis,&segs,&selmax);
1817    if ((fiss->optshp == 1) || (fiss->optshp == 3)) {
1818      //      fb->efa[k][j] = G4double(sbfis) -  ecld->ecgnz[j][k];
1819      //      fb->efa[j][k] = G4double(sbfis) -  ecld->ecgnz[j][k];
1820      fb->efa[j][k] = double(sbfis) -  ecld->ecgnz[j][k];
1821    } 
1822    else {
1823      //      fb->efa[k][j] = G4double(sbfis);
1824      fb->efa[j][k] = double(sbfis);
1825    }
1826    //    ef = fb->efa[k][j];
1827    ef = fb->efa[j][k];
1828
1829    // to avoid negative values for impossible nuclei                       
1830    // the fission barrier is set to zero if smaller than zero.             
1831    //     if (fb->efa[k][j] < 0.0) {
1832    //       fb->efa[k][j] = 0.0;
1833    //     }
1834    if (fb->efa[j][k] < 0.0) {
1835      if(verboseLevel > 2) {
1836        G4cout <<"Setting fission barrier to 0" << G4endl;
1837      }
1838      fb->efa[j][k] = 0.0;
1839    }
1840   
1841    // factor with jprf should be 0.0025d0 - 0.01d0 for                     
1842    // approximate influence of ang. momentum on bfis  a.j. 22.07.96       
1843    // 0.0 means no angular momentum                                       
1844
1845    if (ef < 0.0) {
1846      ef = 0.0;
1847    }
1848    xx = fissility((k+j),k,fiss->optxfis);
1849   
1850    y = 1.00 - xx;
1851    if (y < 0.0) {
1852      y = 0.0;
1853    }
1854    if (y > 1.0) {
1855      y = 1.0;
1856    }
1857    bs = bipol(1,y);
1858    bk = bipol(2,y);
1859  }
1860  else {
1861    ef = 1.0e40;
1862    bs = 1.0;
1863    bk = 1.0;
1864  }
1865  sbf = ee - ef;
1866
1867  afp = idnint(a);
1868  iz = idnint(zprf);
1869  in = afp - iz;
1870  bshell = ecld->ecfnz[in][iz];
1871
1872  // ld saddle point deformation                                         
1873  // here: beta2 = std::sqrt(5/(4pi)) * alpha2                                 
1874
1875  // for the ground state def. 1.5d0 should be used                       
1876  // because this was just the factor to produce the                       
1877  // alpha-deformation table 1.5d0 should be used                         
1878  // a.r.j. 6.8.97                                                         
1879  defbet = 1.58533e0 * spdef(idnint(a),idnint(zprf),fiss->optxfis);
1880 
1881  // level density and temperature at the saddle point                     
1882  //   G4cout <<"a = " << a << G4endl;
1883  //   G4cout <<"zprf = " << zprf << G4endl;
1884  //   G4cout <<"ee = " << ee << G4endl;
1885  //   G4cout <<"ef = " << ef << G4endl;
1886  //   G4cout <<"bshell = " << bshell << G4endl;
1887  //   G4cout <<"bs = " << bs << G4endl;
1888  //   G4cout <<"bk = " << bk << G4endl;
1889  //   G4cout <<"defbet = " << defbet << G4endl;
1890  densniv(a,zprf,ee,ef,&densf,bshell,bs,bk,&temp,int(fiss->optshp),int(fiss->optcol),defbet);
1891  //   G4cout <<"densf = " << densf << G4endl;
1892  //   G4cout <<"temp = " << temp << G4endl;
1893  ft = temp;
1894  if (iz >= 2) {
1895    bshell = ecld->ecgnz[in][iz-1] - ecld->vgsld[in][iz-1];
1896    defbet = 1.5 * (ecld->alpha[in][iz-1]);
1897
1898    // level density and temperature in the proton daughter                 
1899    densniv(a-1.0,zprf-1.0e0,ee,sbp,&densp, bshell,1.e0,1.e0,&temp,int(fiss->optshp),int(fiss->optcol),defbet);
1900    pt = temp;
1901    if (imaxwell == 1) {
1902      // valentina - random kinetic energy in a maxwelliam distribution
1903      // modif juin/2002 a.b. c.v. for light targets; limit on the energy
1904      // from the maxwell distribution.
1905      rpt = pt;
1906      ecp = 2.0 * pt;
1907      if(rpt <= 1.0e-3) {
1908        goto direct2914;
1909      }
1910      iflag = 0;
1911    direct1914:
1912      ecp = fmaxhaz(rpt);
1913      iflag = iflag + 1;
1914      if(iflag >= 10) {
1915        rnd = randomGenerator->getRandom();
1916        //      standardRandom(&rnd,&(hazard->igraine[5]));
1917        ecp=std::sqrt(rnd)*(eer-sbp);
1918        goto direct2914;
1919      }
1920      if((ecp+sbp) > eer) {
1921        goto direct1914;
1922      }
1923    }
1924    else {
1925      ecp = 2.0 * pt;
1926    }
1927
1928  direct2914:
1929    dummy0 = 0;
1930    //    G4cout <<""<<G4endl;
1931  }
1932  else {
1933    densp = 0.0;
1934    ecp = 0.0;
1935    pt = 0.0;
1936  }
1937
1938  if (in >= 2) {
1939    bshell = ecld->ecgnz[in-1][iz] - ecld->vgsld[in-1][iz];
1940    defbet = 1.5e0 * (ecld->alpha[in-1][iz]);
1941
1942    // level density and temperature in the neutron daughter                 
1943    densniv(a-1.0,zprf,ee,sn,&densn,bshell, 1.e0,1.e0,&temp,int(fiss->optshp),int(fiss->optcol),defbet);
1944    nt = temp;
1945    if(itest == 1)
1946      G4cout <<"PK::: nt = " << nt <<G4endl;
1947    if (imaxwell == 1) {
1948      // valentina - random kinetic energy in a maxwelliam distribution
1949      // modif juin/2002 a.b. c.v. for light targets; limit on the energy
1950      // from the maxwell distribution.
1951      rnt = nt;
1952      ecn = 2.0 * nt;
1953      if(rnt <= 1.e-3) {
1954        goto direct2915;
1955      }
1956
1957      iflag=0;
1958    direct1915:
1959      ecn = fmaxhaz(rnt);
1960      if(verboseLevel > 2) {
1961        G4cout <<"rnt = " << rnt << G4endl;
1962        G4cout << __FILE__ << ":" << __LINE__ << " ecn = " << ecn << G4endl;
1963      }
1964      iflag=iflag+1;
1965      if(iflag >= 10) {
1966        rnd = randomGenerator->getRandom();
1967        //      standardRandom(&rnd,&(hazard->igraine[6]));
1968        ecn = std::sqrt(rnd)*(eer-sn);
1969        if(verboseLevel > 2)
1970          G4cout << __FILE__ << ":" << __LINE__ << " ecn = " << ecn << G4endl;
1971        goto direct2915;
1972      }
1973      if((ecn+sn) > eer) {
1974        goto direct1915;
1975      } 
1976    } 
1977    else {
1978        ecn = 2.e0 * nt;
1979        if(verboseLevel > 2)
1980          G4cout << __FILE__ << ":" << __LINE__ << " ecn = " << ecn << G4endl;
1981    }
1982//       if((ecn + sn) <= eer) {
1983//      ecn = 2.0 * nt;
1984//      G4cout << __FILE__ << ":" << __LINE__ << " ecn = " << ecn << G4endl;
1985//       }
1986    direct2915: 
1987      dummy0 = 0;
1988      //      G4cout <<"" <<G4endl;
1989  } 
1990  else {
1991    densn = 0.0;
1992    ecn = 0.0;
1993    nt = 0.0;
1994  }
1995
1996  if ((in >= 3) && (iz >= 3)) {
1997    bshell = ecld->ecgnz[in-2][iz-2] - ecld->vgsld[in-2][iz-2];
1998    defbet = 1.5 * (ecld->alpha[in-2][iz-2]);
1999
2000    // For debugging:
2001    //    bshell = -10.7;
2002    //    defbet = -0.06105;
2003    // G4cout <<"ecgnz N = " << in-2 << G4endl;
2004    // G4cout <<"ecgnz Z = " << iz-2 << G4endl;
2005    //  G4cout <<"bshell = " << bshell << G4endl;
2006    // G4cout <<"defbet = " << defbet << G4endl;
2007    // level density and temperature in the alpha daughter                   
2008    densniv(a-4.0,zprf-2.0e0,ee,sba,&densa,bshell,1.e0,1.e0,&temp,int(fiss->optshp),int(fiss->optcol),defbet);
2009    // G4cout <<"densa = " << densa << G4endl;
2010    // G4cout <<"temp = " << temp << G4endl;
2011
2012    // valentina - random kinetic energy in a maxwelliam distribution
2013    at = temp;
2014    if (imaxwell == 1) {
2015      // modif juin/2002 a.b. c.v. for light targets; limit on the energy
2016      // from the maxwell distribution.
2017      rat = at;
2018      eca= 2.e0 * at;
2019      if(rat <= 1.e-3) {
2020        goto direct2916;
2021      }
2022      iflag=0;
2023    direct1916:
2024      eca = fmaxhaz(rat);
2025      iflag=iflag+1;
2026      if(iflag >= 10) {
2027        rnd = randomGenerator->getRandom();
2028        //      standardRandom(&rnd,&(hazard->igraine[7]));
2029        eca=std::sqrt(rnd)*(eer-sba);
2030        goto direct2916;
2031      }
2032      if((eca+sba) > eer) {
2033        goto direct1916;
2034      }
2035    }
2036    else {
2037      eca = 2.0 * at;
2038    }
2039    direct2916:
2040      dummy0 = 0;
2041      //      G4cout <<"" << G4endl;
2042  }
2043  else {
2044    densa = 0.0;
2045    eca = 0.0;
2046    at = 0.0;
2047  }
2048  //} // PK
2049
2050  // special treatment for unbound nuclei                                               
2051  if (sn < 0.0) {
2052    probn = 1.0;
2053    probp = 0.0;
2054    proba = 0.0;
2055    probf = 0.0;
2056    goto direct70;
2057  }
2058  if (sbp < 0.0) {
2059    probp = 1.0;
2060    probn = 0.0;
2061    proba = 0.0;
2062    probf = 0.0;
2063    goto direct70;
2064  }
2065
2066  if ((a < 50.e0) || (ee > edyn)) { // no fission if e*> edyn or mass < 50
2067    //    G4cout <<"densf = 0.0" << G4endl;
2068    densf = 0.e0;
2069  }
2070
2071  bshell = ecld->ecgnz[in][iz] - ecld->vgsld[in][iz];
2072  defbet = 1.5e0 * (ecld->alpha[in][iz]);
2073
2074  // compound nucleus level density                                       
2075  densniv(a,zprf,ee,0.0e0,&densg,bshell,1.e0,1.e0,&temp,int(fiss->optshp),int(fiss->optcol),defbet);
2076 
2077  if ( densg > 0.e0) {
2078    // calculation of the partial decay width                               
2079    // used for both the time scale and the evaporation decay width
2080    gp = (std::pow(a,(2.0/3.0))/fiss->akap)*densp/densg/pi*std::pow(pt,2);
2081    gn = (std::pow(a,(2.0/3.0))/fiss->akap)*densn/densg/pi*std::pow(nt,2);
2082    ga = (std::pow(a,(2.0/3.0))/fiss->akap)*densa/densg/pi*2.0*std::pow(at,2);
2083    gf = densf/densg/pi/2.0*ft;
2084   
2085    if(itest == 1) {
2086      G4cout <<"gn,gp,ga,gf " << gn <<","<< gp <<","<< ga <<","<< gf << G4endl;
2087    }
2088  }
2089  else {
2090    if(verboseLevel > 2) {
2091      G4cout <<"direct: densg <= 0.e0 " << a <<","<< zprf <<","<< ee << G4endl;
2092    }
2093  }
2094
2095  gsum = ga + gp + gn;
2096  if (gsum > 0.0) {
2097    ts1  = hbar / gsum;
2098  }
2099  else {
2100    ts1  = 1.0e99;
2101  }
2102
2103  if (inum > ilast) {  // new event means reset the time scale
2104    tsum = 0;
2105  }
2106
2107  // calculate the relative probabilities for all decay channels       
2108  if (densf == 0.0) {
2109    if (densp == 0.0) {
2110      if (densn == 0.0) {
2111        if (densa == 0.0) {
2112          // no reaction is possible                                               
2113          probf = 0.0;
2114          probp = 0.0;
2115          probn = 0.0;
2116          proba = 0.0;
2117          goto direct70;
2118        }
2119
2120        // alpha evaporation is the only open channel                           
2121        rf = 0.0;
2122        rp = 0.0;
2123        rn = 0.0;
2124        ra = 1.0;
2125        goto direct50;
2126      }
2127
2128      // alpha emission and neutron emission                                   
2129      rf = 0.0;
2130      rp = 0.0;
2131      rn = 1.0;
2132      ra = densa*2.0/densn*std::pow((at/nt),2);
2133      goto direct50;
2134    }
2135    // alpha, proton and neutron emission                                   
2136    rf = 0.0;
2137    rp = 1.0;
2138    rn = densn/densp*std::pow((nt/pt),2);
2139    ra = densa*2.0/densp*std::pow((at/pt),2);
2140    goto direct50;
2141  }
2142
2143  // here fission has taken place                                         
2144  rf = 1.0;
2145
2146  // cramers and weidenmueller factors for the dynamical hindrances of     
2147  // fission                                                               
2148  if (fiss->bet <= 1.0e-16) {
2149    cf = 1.0;
2150    wf = 1.0;
2151  }
2152  else if (sbf > 0.0e0) {
2153    cf = cram(fiss->bet,fiss->homega);
2154    // if fission barrier ef=0.d0 then fission is the only possible     
2155    // channel. to avoid std::log(0) in function tau                         
2156    // a.j. 7/28/93                                                     
2157    if (ef <= 0.0) {
2158      rp = 0.0;
2159      rn = 0.0;
2160      ra = 0.0;
2161      goto direct50;
2162    }
2163    else {
2164      // transient time tau()                                                 
2165      tauc = tau(fiss->bet,fiss->homega,ef,ft);
2166    }
2167    wfex = (tauc - tsum)/ts1;
2168
2169    if (wfex < 0.0) {
2170      wf = 1.0;
2171    }
2172    else {
2173      wf = std::exp( -wfex);
2174    }
2175  }
2176  else {
2177    cf=1.0;
2178    wf=1.0;
2179  }
2180
2181  if(verboseLevel > 2) {
2182    G4cout <<"tsum,wf,cf " << tsum <<","<< wf <<","<< cf << G4endl;
2183  }
2184
2185  tsum = tsum + ts1;
2186
2187  // change by g.k. and a.h. 5.9.95                                       
2188  tconst = 0.7;
2189  dconst = 12.0/std::sqrt(a);
2190  nprf = a - zprf;
2191
2192  if (fiss->optshp >= 2) { //then                                           
2193    parite(nprf,&parc);
2194    dconst = dconst*parc;
2195  }
2196  else {
2197    dconst= 0.0;
2198  }
2199  if ((ee <= 17.e0) && (fiss->optles == 1) && (iz >= 90) && (in >= 134)) { //then                             
2200    // constant changed to 5.0 accord to moretto & vandenbosch a.j. 19.3.96 
2201    gngf = std::pow(a,(2.0/3.0))*tconst/10.0*std::exp((ef-sn+dconst)/tconst);
2202
2203    // if the excitation energy is so low that densn=0 ==> gn = 0           
2204    // fission remains the only channel.                                   
2205    // a. j. 10.1.94                                                       
2206    if (gn == 0.0) {
2207      rn = 0.0;
2208      rp = 0.0;
2209      ra = 0.0;
2210    }
2211    else {
2212      rn=gngf;
2213      rp=gngf*gp/gn;
2214      ra=gngf*ga/gn;
2215    }
2216  } else {
2217    rn = gn/(gf*cf);
2218//     G4cout <<"rn = " << G4endl;
2219//     G4cout <<"gn = " << gn << " gf = " << gf << " cf = " << cf << G4endl;
2220    rp = gp/(gf*cf);
2221    ra = ga/(gf*cf);
2222  }
2223 direct50:
2224  // relative decay probabilities                                         
2225  denomi = rp+rn+ra+rf;
2226  // decay probabilities after transient time
2227  probf = rf/denomi;
2228  probp = rp/denomi;
2229  probn = rn/denomi;
2230  proba = ra/denomi;
2231 
2232  // new treatment of grange-weidenmueller factor, 5.1.2000, khs !!!
2233
2234  // decay probabilites with transient time included
2235  probf = probf * wf;
2236  if(probf == 1.0) {
2237    probp = 0.0;
2238    probn = 0.0;
2239    proba = 0.0;
2240  }
2241  else {
2242    probp = probp * (wf + (1.e0-wf)/(1.e0-probf));
2243    probn = probn * (wf + (1.e0-wf)/(1.e0-probf));
2244    proba = proba * (wf + (1.e0-wf)/(1.e0-probf));
2245  }
2246 direct70:
2247  ptotl = probp+probn+proba+probf;
2248 
2249  ee = eer;
2250  ilast = inum;
2251
2252  // Return values:
2253  (*probp_par) = probp;
2254  (*probn_par) = probn;
2255  (*proba_par) = proba;
2256  (*probf_par) = probf;
2257  (*ptotl_par) = ptotl;
2258  (*sn_par) = sn;
2259  (*sbp_par) = sbp;
2260  (*sba_par) = sba;
2261  (*ecn_par) = ecn;
2262  (*ecp_par) = ecp;
2263  (*eca_par) = eca;
2264  (*bp_par) = bp;
2265  (*ba_par) = ba;
2266}
2267
2268void G4Abla::densniv(G4double a, G4double z, G4double ee, G4double esous, G4double *dens, G4double bshell, G4double bs, G4double bk, 
2269                     G4double *temp, G4int optshp, G4int optcol, G4double defbet)
2270{
2271  //   1498     C                                                                       
2272  //   1499     C     INPUT:                                                           
2273  //   1500     C             A,EE,ESOUS,OPTSHP,BS,BK,BSHELL,DEFBET                     
2274  //   1501     C                                                                       
2275  //   1502     C     LEVEL DENSITY PARAMETERS                                         
2276  //   1503     C     COMMON /ALD/    AV,AS,AK,OPTAFAN                                 
2277  //   1504     C     AV,AS,AK - VOLUME,SURFACE,CURVATURE DEPENDENCE OF THE             
2278  //   1505     C                LEVEL DENSITY PARAMETER                               
2279  //   1506     C     OPTAFAN - 0/1  AF/AN >=1 OR AF/AN ==1                             
2280  //   1507     C               RECOMMENDED IS OPTAFAN = 0                             
2281  //   1508     C--------------------------------------------------------------------- 
2282  //   1509     C     OUTPUT: DENS,TEMP                                                 
2283  //   1510     C                                                                       
2284  //   1511     C   ____________________________________________________________________
2285  //   1512     C  /                                                                   
2286  //   1513     C  /  PROCEDURE FOR CALCULATING THE STATE DENSITY OF A COMPOUND NUCLEUS
2287  //   1514     C  /____________________________________________________________________
2288  //   1515     C                                                                       
2289  //   1516           INTEGER AFP,IZ,OPTSHP,OPTCOL,J,OPTAFAN                           
2290  //   1517           REAL*8 A,EE,ESOUS,DENS,E,Y0,Y1,Y2,Y01,Y11,Y21,PA,BS,BK,TEMP       
2291  //   1518     C=====INSERTED BY KUDYAEV===============================================
2292  //   1519           COMMON /ALD/ AV,AS,AK,OPTAFAN                                     
2293  //   1520           REAL*8 ECR,ER,DELTAU,Z,DELTPP,PARA,PARZ,FE,HE,ECOR,ECOR1,Pi6     
2294  //   1521           REAL*8 BSHELL,DELTA0,AV,AK,AS,PONNIV,PONFE,DEFBET,QR,SIG,FP       
2295  //   1522     C=======================================================================
2296  //   1523     C                                                                       
2297  //   1524     C                                                                       
2298  //   1525     C-----------------------------------------------------------------------
2299  //   1526     C     A                 MASS NUMBER OF THE DAUGHTER NUCLEUS             
2300  //   1527     C     EE                EXCITATION ENERGY OF THE MOTHER NUCLEUS         
2301  //   1528     C     ESOUS             SEPARATION ENERGY PLUS EFFECTIVE COULOMB BARRIER
2302  //   1529     C     DENS              STATE DENSITY OF DAUGHTER NUCLEUS AT EE-ESOUS-EC
2303  //   1530     C     BSHELL            SHELL CORRECTION                               
2304  //   1531     C     TEMP              NUCLEAR TEMPERATURE                             
2305  //   1532     C     E        LOCAL    EXCITATION ENERGY OF THE DAUGHTER NUCLEUS       
2306  //   1533     C     E1       LOCAL    HELP VARIABLE                                   
2307  //   1534     C     Y0,Y1,Y2,Y01,Y11,Y21                                             
2308  //   1535     C              LOCAL    HELP VARIABLES                                 
2309  //   1536     C     PA       LOCAL    STATE-DENSITY PARAMETER                         
2310  //   1537     C     EC                KINETIC ENERGY OF EMITTED PARTICLE WITHOUT     
2311  //   1538     C                        COULOMB REPULSION                             
2312  //   1539     C     IDEN              FAKTOR FOR SUBSTRACTING KINETIC ENERGY IDEN*TEMP
2313  //   1540     C     DELTA0            PAIRING GAP 12 FOR GROUND STATE                 
2314  //   1541     C                       14 FOR SADDLE POINT                             
2315  //   1542     C     EITERA            HELP VARIABLE FOR TEMPERATURE ITERATION         
2316  //   1543     C-----------------------------------------------------------------------
2317  //   1544     C                                                                       
2318  //   1545     C                                                                       
2319  G4double afp = 0.0;
2320  G4double delta0 = 0.0;
2321  G4double deltau = 0.0;
2322  G4double deltpp = 0.0;
2323  G4double e = 0.0;
2324  G4double ecor = 0.0;
2325  G4double ecor1 = 0.0;
2326  G4double ecr = 0.0;
2327  G4double er = 0.0;
2328  G4double fe = 0.0;
2329  G4double fp = 0.0;
2330  G4double he = 0.0;
2331  G4double iz = 0.0;
2332  G4double pa = 0.0;
2333  G4double para = 0.0;
2334  G4double parz = 0.0;
2335  G4double ponfe = 0.0;
2336  G4double ponniv = 0.0;
2337  G4double qr = 0.0;
2338  G4double sig = 0.0;
2339  G4double y01 = 0.0;
2340  G4double y11 = 0.0;
2341  G4double y2 = 0.0;
2342  G4double y21 = 0.0;
2343  G4double y1 = 0.0;
2344  G4double y0 = 0.0;
2345
2346  G4double pi6 = std::pow(3.1415926535,2) / 6.0;
2347  ecr=10.0;
2348  er=28.0;
2349  afp=idnint(a);
2350  iz=idnint(z);
2351
2352  // level density parameter                                               
2353  if((ald->optafan == 1)) {
2354    pa = (ald->av)*a + (ald->as)*std::pow(a,(2.e0/3.e0)) + (ald->ak)*std::pow(a,(1.e0/3.e0));
2355  }
2356  else {
2357    pa = (ald->av)*a + (ald->as)*bs*std::pow(a,(2.e0/3.e0)) + (ald->ak)*bk*std::pow(a,(1.e0/3.e0));
2358  }
2359
2360  fp = 0.01377937231e0 * std::pow(a,(5.e0/3.e0)) * (1.e0 + defbet/3.e0);
2361
2362  // pairing corrections                                                   
2363  if (bs > 1.0) {
2364    delta0 = 14;
2365  }
2366  else {
2367    delta0 = 12;
2368  }
2369
2370  if (esous > 1.0e30) {
2371    (*dens) = 0.0;
2372    (*temp) = 0.0;
2373    goto densniv100;                                                       
2374  }
2375
2376  e = ee - esous;
2377
2378  if (e < 0.0) {
2379    (*dens) = 0.0;
2380    (*temp) = 0.0;
2381    goto densniv100;
2382  }
2383
2384  // shell corrections                                                     
2385  if (optshp > 0) {
2386    deltau = bshell;
2387    if (optshp == 2) {
2388      deltau = 0.0;
2389    }
2390    if (optshp >= 2) {
2391      // pairing energy shift with condensation energy a.r.j. 10.03.97       
2392      //      deltpp = -0.25e0* (delta0/std::pow(std::sqrt(a),2)) * pa /pi6 + 2.e0*delta0/std::sqrt(a);
2393      deltpp = -0.25e0* std::pow((delta0/std::sqrt(a)),2) * pa /pi6 + 2.e0*delta0/std::sqrt(a);
2394     
2395      parite(a,&para);
2396      if (para < 0.0) {
2397        e = e - delta0/std::sqrt(a);
2398      } else {                                                         
2399        parite(z,&parz);
2400        if (parz > 0.e0) {
2401          e = e - 2.0*delta0/std::sqrt(a);
2402        } else {
2403          e = e;
2404        }
2405      }
2406    } else {                                                         
2407      deltpp = 0.0;
2408    }
2409  } else {
2410    deltau = 0.0;
2411    deltpp = 0.0;
2412  }
2413  if (e < 0.0) {
2414    e = 0.0;
2415    (*temp) = 0.0;
2416  }
2417
2418  // washing out is made stronger ! g.k. 3.7.96                           
2419  ponfe = -2.5*pa*e*std::pow(a,(-4.0/3.0));
2420
2421  if (ponfe < -700.0)  {
2422    ponfe = -700.0;
2423  }
2424  fe = 1.0 - std::exp(ponfe);
2425  if (e < ecr) {
2426    // priv. comm. k.-h. schmidt                                         
2427    he = 1.0 - std::pow((1.0 - e/ecr),2);
2428  }
2429  else {
2430    he = 1.0;
2431  }
2432
2433  // Excitation energy corrected for pairing and shell effects             
2434  // washing out with excitation energy is included.                       
2435  ecor = e + deltau*fe + deltpp*he;
2436
2437  if (ecor <= 0.1) {
2438    ecor = 0.1;
2439  }
2440
2441  // statt 170.d0 a.r.j. 8.11.97                                           
2442
2443  // iterative procedure according to grossjean and feldmeier             
2444  // to avoid the singularity e = 0                                       
2445  if (ee < 5.0) {
2446    y1 = std::sqrt(pa*ecor);
2447    for(int j = 0; j < 5; j++) {
2448      y2 = pa*ecor*(1.e0-std::exp(-y1));
2449      y1 = std::sqrt(y2);
2450    }
2451   
2452    y0 = pa/y1;
2453    (*temp)=1.0/y0;
2454    (*dens) = std::exp(y0*ecor)/ (std::pow((std::pow(ecor,3)*y0),0.5)*std::pow((1.0-0.5*y0*ecor*std::exp(-y1)),0.5))* std::exp(y1)*(1.0-std::exp(-y1))*0.1477045;
2455    if (ecor < 1.0) {
2456      ecor1=1.0;
2457      y11 = std::sqrt(pa*ecor1);
2458      for(int j = 0; j < 7; j++) {
2459        y21 = pa*ecor1*(1.0-std::exp(-y11));
2460        y11 = std::sqrt(y21);
2461      }
2462
2463      y01 = pa/y11;
2464      (*dens) = (*dens)*std::pow((y01/y0),1.5);
2465      (*temp) = (*temp)*std::pow((y01/y0),1.5);
2466    }
2467  }
2468  else {
2469    ponniv = 2.0*std::sqrt(pa*ecor);
2470    if (ponniv > 700.0) {
2471      ponniv = 700.0;
2472    }
2473
2474    // fermi gas state density                                               
2475    (*dens) = std::pow(pa,(-0.25e0))*std::pow(ecor,(-1.25e0))*std::exp(ponniv) * 0.1477045e0;
2476    (*temp) = std::sqrt(ecor/pa);
2477  }
2478 densniv100:
2479
2480  // spin cutoff parameter                                                 
2481  sig = fp * (*temp);
2482
2483  // collective enhancement                                               
2484  if (optcol == 1) {
2485    qrot(z,a,defbet,sig,ecor,&qr);
2486  }
2487  else {
2488    qr   = 1.0;
2489  }
2490
2491  (*dens) = (*dens) * qr;
2492  if(verboseLevel > 2) {
2493    G4cout <<"PK::: dens = " << (*dens) << G4endl;
2494    G4cout <<"PK::: AFP, IZ, ECOR, ECOR1 " << afp << " " << iz << " " << ecor << " " << ecor1 << G4endl;
2495  }
2496}
2497
2498
2499G4double G4Abla::bfms67(G4double zms, G4double ams)
2500{
2501  // This subroutine calculates the fission barriers                                                                 
2502  // of the liquid-drop model of Myers and Swiatecki (1967).                                                                 
2503  // Analytic parameterization of Dahlinger 1982
2504  // replaces tables. Barrier heights from Myers and Swiatecki !!!                                                                 
2505
2506  G4double nms = 0.0, ims = 0.0, ksims = 0.0, xms = 0.0, ums = 0.0;
2507
2508  nms = ams - zms;
2509  ims = (nms-zms)/ams;
2510  ksims= 50.15e0 * (1.- 1.78 * std::pow(ims,2));
2511  xms = std::pow(zms,2) / (ams * ksims);
2512  ums = 0.368e0-5.057e0*xms+8.93e0*std::pow(xms,2)-8.71*std::pow(xms,3);
2513  return(0.7322e0*std::pow(zms,2)/std::pow(ams,(0.333333e0))*std::pow(10.e0,ums));
2514}
2515
2516void G4Abla::lpoly(G4double x, G4int n, G4double pl[])
2517{
2518  // THIS SUBROUTINE CALCULATES THE ORDINARY LEGENDRE POLYNOMIALS OF   
2519  // ORDER 0 TO N-1 OF ARGUMENT X AND STORES THEM IN THE VECTOR PL.   
2520  // THEY ARE CALCULATED BY RECURSION RELATION FROM THE FIRST TWO     
2521  // POLYNOMIALS.                                                     
2522  // WRITTEN BY A.J.SIERK  LANL  T-9  FEBRUARY, 1984                   
2523
2524  // NOTE: PL AND X MUST BE DOUBLE PRECISION ON 32-BIT COMPUTERS!     
2525
2526  pl[0] = 1.0;
2527  pl[1] = x;
2528
2529  for(int i = 2; i < n; i++) {
2530    pl[i] = ((2*double(i+1) - 3.0)*x*pl[i-1] - (double(i+1) - 2.0)*pl[i-2])/(double(i+1)-1.0);
2531  }
2532}
2533
2534G4double G4Abla::eflmac(G4int ia, G4int iz, G4int flag, G4int optshp)
2535{
2536  // CHANGED TO CALCULATE TOTAL BINDING ENERGY INSTEAD OF MASS EXCESS.     
2537  // SWITCH FOR PAIRING INCLUDED AS WELL.                                 
2538  // BINDING = EFLMAC(IA,IZ,0,OPTSHP)                                     
2539  // FORTRAN TRANSCRIPT OF /U/GREWE/LANG/EEX/FRLDM.C                       
2540  // A.J. 15.07.96                                                         
2541
2542  // this function will calculate the liquid-drop nuclear mass for spheri
2543  // configuration according to the preprint NUCLEAR GROUND-STATE       
2544  // MASSES and DEFORMATIONS by P. M"oller et al. from August 16, 1993 p.
2545  // All constants are taken from this publication for consistency.     
2546
2547  // Parameters:                                                         
2548  // a:    nuclear mass number                                         
2549  // z:    nuclear charge                                             
2550  // flag:     0       - return mass excess                           
2551  //       otherwise   - return pairing (= -1/2 dpn + 1/2 (Dp + Dn))   
2552
2553  G4double eflmacResult = 0.0;
2554
2555  G4int in = 0;
2556  G4double z = 0.0, n = 0.0, a = 0.0, av = 0.0, as = 0.0;
2557  G4double a0 = 0.0, c1 = 0.0, c4 = 0.0, b1 = 0.0, b3 = 0.0;
2558  G4double f = 0.0, ca = 0.0, w = 0.0, dp = 0.0, dn = 0.0, dpn = 0.0, efl = 0.0;
2559  G4double rmac = 0.0, bs = 0.0, h = 0.0, r0 = 0.0, kf = 0.0, ks = 0.0;
2560  G4double kv = 0.0, rp = 0.0, ay = 0.0, aden = 0.0, x0 = 0.0, y0 = 0.0;
2561  G4double mh = 0.0, mn = 0.0, esq = 0.0, ael = 0.0, i = 0.0;
2562  G4double pi = 3.141592653589793238e0;
2563
2564  // fundamental constants
2565  // hydrogen-atom mass excess
2566  mh  = 7.289034;
2567
2568  // neutron mass excess
2569  mn  = 8.071431;
2570
2571  // electronic charge squared
2572  esq = 1.4399764;
2573
2574  // constants from considerations other than nucl. masses
2575  // electronic binding
2576  ael = 1.433e-5;
2577
2578  // proton rms radius
2579  rp  = 0.8;
2580
2581  // nuclear radius constant
2582  r0  = 1.16;
2583
2584  // range of yukawa-plus-expon. potential
2585  ay  = 0.68;
2586
2587  // range of yukawa function used to generate                         
2588  // nuclear charge distribution
2589  aden= 0.70;
2590
2591  // constants from considering odd-even mass differences
2592  // average pairing gap
2593  rmac= 4.80;
2594
2595  // neutron-proton interaction
2596  h   = 6.6;
2597
2598  // wigner constant
2599  w   = 30.0;
2600
2601  // adjusted parameters
2602  // volume energy
2603  av  = 16.00126;
2604
2605  // volume asymmetry
2606  kv  =  1.92240;
2607
2608  // surface energy
2609  as  = 21.18466;
2610
2611  // surface asymmetry
2612  ks  =  2.345;
2613  // a^0 constant
2614  a0  =  2.615;
2615
2616  // charge asymmetry
2617  ca  =  0.10289;
2618
2619  // we will account for deformation by using the microscopic           
2620  // corrections tabulated from p. 68ff */                               
2621  bs = 1.0;
2622
2623  z   = double(iz);
2624  a   = double(ia);
2625  in  = ia - iz;                                                       
2626  n   = double(in);
2627  dn  = rmac*bs/std::pow(n,(1.0/3.0));
2628  dp  = rmac*bs/std::pow(z,(1.0/3.0));
2629  dpn = h/bs/std::pow(a,(2.0/3.0));
2630 
2631  c1  = 3.0/5.0*esq/r0;
2632  c4  = 5.0/4.0*std::pow((3.0/(2.0*pi)),(2.0/3.0)) * c1;
2633  kf  = std::pow((9.0*pi*z/(4.0*a)),(1.0/3.0))/r0;
2634 
2635  f = -1.0/8.0*rp*rp*esq/std::pow(r0,3) * (145.0/48.0 - 327.0/2880.0*std::pow(kf,2) * std::pow(rp,2) + 1527.0/1209600.0*std::pow(kf,4) * std::pow(rp,4));
2636  i   = (n-z)/a;
2637
2638  x0  = r0 * std::pow(a,(1.0/3.0)) / ay;
2639  y0  = r0 * std::pow(a,(1.0/3.0)) / aden;
2640
2641  b1  = 1.0 - 3.0/(std::pow(x0,2)) + (1.0 + x0) * (2.0 + 3.0/x0 + 3.0/std::pow(x0,2)) * std::exp(-2.0*x0);
2642
2643  b3  = 1.0 - 5.0/std::pow(y0,2) * (1.0 - 15.0/(8.0*y0) + 21.0/(8.0 * std::pow(y0,3))
2644                               - 3.0/4.0 * (1.0 + 9.0/(2.0*y0) + 7.0/std::pow(y0,2)
2645                                            + 7.0/(2.0 * std::pow(y0,3))) * std::exp(-2.0*y0));
2646
2647  // now calulation of total binding energy a.j. 16.7.96                   
2648
2649  efl = -1.0 * av*(1.0 - kv*i*i)*a + as*(1.0 - ks*i*i)*b1 * std::pow(a,(2.0/3.0)) + a0
2650    + c1*z*z*b3/std::pow(a,(1.0/3.0)) - c4*std::pow(z,(4.0/3.0))/std::pow(a,(1.e0/3.e0))
2651    + f*std::pow(z,2)/a -ca*(n-z) - ael * std::pow(z,(2.39e0));
2652
2653  if ((in == iz) && (mod(in,2) == 1) && (mod(iz,2) == 1)) {
2654    // n and z odd and equal
2655    efl = efl + w*(utilabs(i)+1.e0/a);
2656  }
2657  else {
2658    efl= efl + w* utilabs(i);
2659  }
2660
2661  // pairing is made optional                                             
2662  if (optshp >= 2) {
2663    // average pairing
2664    if ((mod(in,2) == 1) && (mod(iz,2) == 1)) {
2665      efl = efl - dpn;
2666    }
2667    if (mod(in,2) == 1) {
2668      efl = efl + dn;
2669    }
2670    if (mod(iz,2) == 1) {
2671      efl    = efl + dp;
2672    }
2673    // end if for pairing term                                               
2674  }
2675
2676  if (flag != 0) {
2677    eflmacResult =  (0.5*(dn + dp) - 0.5*dpn);
2678  }
2679  else {
2680    eflmacResult = efl;
2681  }
2682
2683  return eflmacResult;
2684}
2685
2686void G4Abla::appariem(G4double a, G4double z, G4double *del)
2687{
2688  // CALCUL DE LA CORRECTION, DUE A L'APPARIEMENT, DE L'ENERGIE DE     
2689  // LIAISON D'UN NOYAU                                               
2690  // PROCEDURE FOR CALCULATING THE PAIRING CORRECTION TO THE BINDING   
2691  // ENERGY OF A SPECIFIC NUCLEUS                                     
2692
2693  double para = 0.0, parz = 0.0;
2694  // A                 MASS NUMBER                                     
2695  // Z                 NUCLEAR CHARGE                                 
2696  // PARA              HELP VARIABLE FOR PARITY OF A                   
2697  // PARZ              HELP VARIABLE FOR PARITY OF Z                   
2698  // DEL               PAIRING CORRECTION                             
2699
2700  parite(a, &para);
2701
2702  if (para < 0.0) {
2703    (*del) = 0.0;
2704  }
2705  else {
2706    parite(z, &parz);
2707    if (parz > 0.0) {
2708      (*del) = -12.0/std::sqrt(a);
2709    }
2710    else {
2711      (*del) = 12.0/std::sqrt(a);
2712    }
2713  }
2714}
2715
2716void G4Abla::parite(G4double n, G4double *par)
2717{
2718  // CALCUL DE LA PARITE DU NOMBRE N                                   
2719  //
2720  // PROCEDURE FOR CALCULATING THE PARITY OF THE NUMBER N.             
2721  // RETURNS -1 IF N IS ODD AND +1 IF N IS EVEN                       
2722
2723  G4double n1 = 0.0, n2 = 0.0, n3 = 0.0;
2724
2725  // N                 NUMBER TO BE TESTED                             
2726  // N1,N2             HELP VARIABLES                                 
2727  // PAR               HELP VARIABLE FOR PARITY OF N                   
2728
2729  n3 = double(idnint(n));
2730  n1 = n3/2.0;
2731  n2 = n1 - dint(n1);
2732
2733  if (n2 > 0.0) {
2734    (*par) = -1.0;
2735  }
2736  else {
2737    (*par) = 1.0;
2738  }
2739}
2740
2741G4double G4Abla::tau(G4double bet, G4double homega, G4double ef, G4double t)
2742{
2743  // INPUT : BET, HOMEGA, EF, T                                         
2744  // OUTPUT: TAU - RISE TIME IN WHICH THE FISSION WIDTH HAS REACHED     
2745  //               90 PERCENT OF ITS FINAL VALUE                               
2746  //
2747  // BETA   - NUCLEAR VISCOSITY                                         
2748  // HOMEGA - CURVATURE OF POTENTIAL                                     
2749  // EF     - FISSION BARRIER                                           
2750  // T      - NUCLEAR TEMPERATURE                                       
2751
2752  G4double tauResult = 0.0;
2753
2754  G4double tlim = 8.e0 * ef;
2755  if (t > tlim) {
2756    t = tlim;
2757  }
2758
2759  // modified bj and khs 6.1.2000:
2760  if (bet/(std::sqrt(2.0)*10.0*(homega/6.582122)) <= 1.0) {
2761    tauResult = std::log(10.0*ef/t)/(bet*1.0e21);
2762  }
2763  else {
2764    tauResult = std::log(10.0*ef/t)/ (2.0*std::pow((10.0*homega/6.582122),2))*(bet*1.0e-21);
2765  } //end if                                                           
2766
2767  return tauResult;
2768}
2769
2770G4double G4Abla::cram(G4double bet, G4double homega)
2771{
2772  // INPUT : BET, HOMEGA  NUCLEAR VISCOSITY + CURVATURE OF POTENTIAL     
2773  // OUTPUT: KRAMERS FAKTOR  - REDUCTION OF THE FISSION PROBABILITY       
2774  //                           INDEPENDENT OF EXCITATION ENERGY                             
2775
2776  G4double rel = bet/(20.0*homega/6.582122);
2777  G4double cramResult = std::sqrt(1.0 + std::pow(rel,2)) - rel;
2778  // limitation introduced   6.1.2000  by  khs
2779
2780  if (cramResult > 1.0) {
2781    cramResult = 1.0;
2782  }
2783
2784  return cramResult;
2785}
2786
2787G4double G4Abla::bipol(int iflag, G4double y)
2788{
2789  // CALCULATION OF THE SURFACE BS OR CURVATURE BK OF A NUCLEUS       
2790  // RELATIVE TO THE SPHERICAL CONFIGURATION                           
2791  // BASED ON  MYERS, DROPLET MODEL FOR ARBITRARY SHAPES               
2792
2793  // INPUT: IFLAG - 0/1 BK/BS CALCULATION                             
2794  //         Y    - (1 - X) COMPLEMENT OF THE FISSILITY               
2795
2796  // LINEAR INTERPOLATION OF BS BK TABLE                               
2797
2798  int i = 0;
2799
2800  G4double bipolResult = 0.0;
2801
2802  const int bsbkSize = 54;
2803
2804  G4double bk[bsbkSize] = {0.0, 1.00000,1.00087,1.00352,1.00799,1.01433,1.02265,1.03306,
2805                           1.04576,1.06099,1.07910,1.10056,1.12603,1.15651,1.19348,
2806                           1.23915,1.29590,1.35951,1.41013,1.44103,1.46026,1.47339,
2807                           1.48308,1.49068,1.49692,1.50226,1.50694,1.51114,1.51502,
2808                           1.51864,1.52208,1.52539,1.52861,1.53177,1.53490,1.53803,
2809                           1.54117,1.54473,1.54762,1.55096,1.55440,1.55798,1.56173,
2810                           1.56567,1.56980,1.57413,1.57860,1.58301,1.58688,1.58688,
2811                           1.58688,1.58740,1.58740, 0.0}; //Zeroes at bk[0], and at the end added by PK
2812
2813  G4double bs[bsbkSize] = {0.0, 1.00000,1.00086,1.00338,1.00750,1.01319,
2814                           1.02044,1.02927,1.03974,
2815                           1.05195,1.06604,1.08224,1.10085,1.12229,1.14717,1.17623,1.20963,
2816                           1.24296,1.26532,1.27619,1.28126,1.28362,1.28458,1.28477,1.28450,
2817                           1.28394,1.28320,1.28235,1.28141,1.28042,1.27941,1.27837,1.27732,
2818                           1.27627,1.27522,1.27418,1.27314,1.27210,1.27108,1.27006,1.26906,
2819                           1.26806,1.26707,1.26610,1.26514,1.26418,1.26325,1.26233,1.26147,
2820                           1.26147,1.26147,1.25992,1.25992, 0.0};
2821
2822  i = idint(y/(2.0e-02)) + 1;
2823   
2824  if(i >= bsbkSize) {
2825    if(verboseLevel > 2) {
2826      G4cout <<"G4Abla error: index i = " << i << " is greater than array size permits." << G4endl;
2827    }
2828    bipolResult = 0.0;
2829  }
2830  else {
2831    if (iflag == 1) {
2832      bipolResult = bs[i] + (bs[i+1] - bs[i])/2.0e-02 * (y - 2.0e-02*(i - 1));
2833    }
2834    else {
2835      bipolResult = bk[i] + (bk[i+1] - bk[i])/2.0e-02 * (y - 2.0e-02*(i - 1));
2836    }
2837  }
2838 
2839  return bipolResult;
2840}
2841
2842void G4Abla::barfit(G4int iz, G4int ia, G4int il, G4double *sbfis, G4double *segs, G4double *selmax)
2843{
2844  //   2223     C     VERSION FOR 32BIT COMPUTER                                       
2845  //   2224     C     THIS SUBROUTINE RETURNS THE BARRIER HEIGHT BFIS, THE             
2846  //   2225     C     GROUND-STATE ENERGY SEGS, IN MEV, AND THE ANGULAR MOMENTUM       
2847  //   2226     C     AT WHICH THE FISSION BARRIER DISAPPEARS, LMAX, IN UNITS OF       
2848  //   2227     C     H-BAR, WHEN CALLED WITH INTEGER AGUMENTS IZ, THE ATOMIC           
2849  //   2228     C     NUMBER, IA, THE ATOMIC MASS NUMBER, AND IL, THE ANGULAR           
2850  //   2229     C     MOMENTUM IN UNITS OF H-BAR. (PLANCK'S CONSTANT DIVIDED BY         
2851  //   2230     C     2*PI).                                                           
2852  //   2231     C                                                                       
2853  //   2232     C        THE FISSION BARRIER FO IL = 0 IS CALCULATED FROM A 7TH         
2854  //   2233     C     ORDER FIT IN TWO VARIABLES TO 638 CALCULATED FISSION             
2855  //   2234     C     BARRIERS FOR Z VALUES FROM 20 TO 110. THESE 638 BARRIERS ARE     
2856  //   2235     C     FIT WITH AN RMS DEVIATION OF 0.10 MEV BY THIS 49-PARAMETER       
2857  //   2236     C     FUNCTION.                                                         
2858  //   2237     C     IF BARFIT IS CALLED WITH (IZ,IA) VALUES OUTSIDE THE RANGE OF     
2859  //   2238     C     THE BARRIER HEIGHT IS SET TO 0.0, AND A MESSAGE IS PRINTED       
2860  //   2239     C     ON THE DEFAULT OUTPUT FILE.                                       
2861  //   2240     C                                                                       
2862  //   2241     C        FOR IL VALUES NOT EQUAL TO ZERO, THE VALUES OF L AT WHICH     
2863  //   2242     C     THE BARRIER IS 80% AND 20% OF THE L=0 VALUE ARE RESPECTIVELY     
2864  //   2243     C     FIT TO 20-PARAMETER FUNCTIONS OF Z AND A, OVER A MORE             
2865  //   2244     C     RESTRICTED RANGE OF A VALUES, THAN IS THE CASE FOR L = 0.         
2866  //   2245     C     THE VALUE OF L WHERE THE BARRIER DISAPPEARS, LMAX IS FIT TO       
2867  //   2246     C     A 24-PARAMETER FUNCTION OF Z AND A, WITH THE SAME RANGE OF       
2868  //   2247     C     Z AND A VALUES AS L-80 AND L-20.                                 
2869  //   2248     C        ONCE AGAIN, IF AN (IZ,IA) PAIR IS OUTSIDE OF THE RANGE OF     
2870  //   2249     C     VALIDITY OF THE FIT, THE BARRIER VALUE IS SET TO 0.0 AND A       
2871  //   2250     C     MESSAGE IS PRINTED. THESE THREE VALUES (BFIS(L=0),L-80, AND       
2872  //   2251     C     L-20) AND THE CONSTRINTS OF BFIS = 0 AND D(BFIS)/DL = 0 AT       
2873  //   2252     C     L = LMAX AND L=0 LEAD TO A FIFTH-ORDER FIT TO BFIS(L) FOR         
2874  //   2253     C     L>L-20. THE FIRST THREE CONSTRAINTS LEAD TO A THIRD-ORDER FIT     
2875  //   2254     C     FOR THE REGION L < L-20.                                         
2876  //   2255     C                                                                       
2877  //   2256     C        THE GROUND STATE ENERGIES ARE CALCULATED FROM A               
2878  //   2257     C     120-PARAMETER FIT IN Z, A, AND L TO 214 GROUND-STATE ENERGIES     
2879  //   2258     C     FOR 36 DIFFERENT Z AND A VALUES.                                 
2880  //   2259     C     (THE RANGE OF Z AND A IS THE SAME AS FOR L-80, L-20, AND         
2881  //   2260     C     L-MAX)                                                           
2882  //   2261     C                                                                       
2883  //   2262     C        THE CALCULATED BARRIERS FROM WHICH THE FITS WERE MADE WERE     
2884  //   2263     C     CALCULATED IN 1983-1984 BY A. J. SIERK OF LOS ALAMOS             
2885  //   2264     C     NATIONAL LABORATORY GROUP T-9, USING YUKAWA-PLUS-EXPONENTIAL     
2886  //   2265     C     G4DOUBLE FOLDED NUCLEAR ENERGY, EXACT COULOMB DIFFUSENESS           
2887  //   2266     C     CORRECTIONS, AND DIFFUSE-MATTER MOMENTS OF INERTIA.               
2888  //   2267     C     THE PARAMETERS OF THE MODEL R-0 = 1.16 FM, AS 21.13 MEV,         
2889  //   2268     C     KAPPA-S = 2.3, A = 0.68 FM.                                       
2890  //   2269     C     THE DIFFUSENESS OF THE MATTER AND CHARGE DISTRIBUTIONS USED       
2891  //   2270     C     CORRESPONDS TO A SURFACE DIFFUSENESS PARAMETER (DEFINED BY       
2892  //   2271     C     MYERS) OF 0.99 FM. THE CALCULATED BARRIERS FOR L = 0 ARE         
2893  //   2272     C     ACCURATE TO A LITTLE LESS THAN 0.1 MEV; THE OUTPUT FROM           
2894  //   2273     C     THIS SUBROUTINE IS A LITTLE LESS ACCURATE. WORST ERRORS MAY BE   
2895  //   2274     C     AS LARGE AS 0.5 MEV; CHARACTERISTIC UNCERTAINY IS IN THE RANGE   
2896  //   2275     C     OF 0.1-0.2 MEV. THE RMS DEVIATION OF THE GROUND-STATE FIT         
2897  //   2276     C     FROM THE 214 INPUT VALUES IS 0.20 MEV. THE MAXIMUM ERROR         
2898  //   2277     C     OCCURS FOR LIGHT NUCLEI IN THE REGION WHERE THE GROUND STATE     
2899  //   2278     C     IS PROLATE, AND MAY BE GREATER THAN 1.0 MEV FOR VERY NEUTRON     
2900  //   2279     C     DEFICIENT NUCLEI, WITH L NEAR LMAX. FOR MOST NUCLEI LIKELY TO     
2901  //   2280     C     BE ENCOUNTERED IN REAL EXPERIMENTS, THE MAXIMUM ERROR IS         
2902  //   2281     C     CLOSER TO 0.5 MEV, AGAIN FOR LIGHT NUCLEI AND L NEAR LMAX.       
2903  //   2282     C                                                                       
2904  //   2283     C     WRITTEN BY A. J. SIERK, LANL T-9                                 
2905  //   2284     C     VERSION 1.0 FEBRUARY, 1984                                       
2906  //   2285     C                                                                       
2907  //   2286     C     THE FOLLOWING IS NECESSARY FOR 32-BIT MACHINES LIKE DEC VAX,     
2908  //   2287     C     IBM, ETC                                                         
2909
2910  G4double pa[7],pz[7],pl[10];
2911  for(G4int init_i = 0; init_i < 7; init_i++) {
2912    pa[init_i] = 0.0; 
2913    pz[init_i] = 0.0; 
2914  }
2915  for(G4int init_i = 0; init_i < 10; init_i++) {
2916    pl[init_i] = 0.0;
2917  }
2918
2919  G4double a = 0.0, z = 0.0, amin = 0.0, amax = 0.0, amin2 = 0.0;
2920  G4double amax2 = 0.0, aa = 0.0, zz = 0.0, bfis = 0.0;
2921  G4double bfis0 = 0.0, ell = 0.0, el = 0.0, egs = 0.0, el80 = 0.0, el20 = 0.0;
2922  G4double elmax = 0.0, sel80 = 0.0, sel20 = 0.0, x = 0.0, y = 0.0, q = 0.0, qa = 0.0, qb = 0.0;
2923  G4double aj = 0.0, ak = 0.0, a1 = 0.0, a2 = 0.0;
2924
2925  G4int i = 0, j = 0, k = 0, m = 0;
2926  G4int l = 0;
2927
2928  G4double emncof[4][5] = {{-9.01100e+2,-1.40818e+3, 2.77000e+3,-7.06695e+2, 8.89867e+2}, 
2929                           {1.35355e+4,-2.03847e+4, 1.09384e+4,-4.86297e+3,-6.18603e+2},
2930                           {-3.26367e+3, 1.62447e+3, 1.36856e+3, 1.31731e+3, 1.53372e+2},
2931                           {7.48863e+3,-1.21581e+4, 5.50281e+3,-1.33630e+3, 5.05367e-2}};
2932
2933  G4double elmcof[4][5] = {{1.84542e+3,-5.64002e+3, 5.66730e+3,-3.15150e+3, 9.54160e+2},
2934                           {-2.24577e+3, 8.56133e+3,-9.67348e+3, 5.81744e+3,-1.86997e+3},
2935                           {2.79772e+3,-8.73073e+3, 9.19706e+3,-4.91900e+3, 1.37283e+3},
2936                           {-3.01866e+1, 1.41161e+3,-2.85919e+3, 2.13016e+3,-6.49072e+2}};
2937
2938  G4double emxcof[4][6] = {{9.43596e4,-2.241997e5,2.223237e5,-1.324408e5,4.68922e4,-8.83568e3},
2939                           {-1.655827e5,4.062365e5,-4.236128e5,2.66837e5,-9.93242e4,1.90644e4},
2940                           {1.705447e5,-4.032e5,3.970312e5,-2.313704e5,7.81147e4,-1.322775e4},
2941                           {-9.274555e4,2.278093e5,-2.422225e5,1.55431e5,-5.78742e4,9.97505e3}};
2942
2943  G4double elzcof[7][7] = {{5.11819909e+5,-1.30303186e+6, 1.90119870e+6,-1.20628242e+6, 5.68208488e+5, 5.48346483e+4,-2.45883052e+4},
2944                           {-1.13269453e+6, 2.97764590e+6,-4.54326326e+6, 3.00464870e+6, -1.44989274e+6,-1.02026610e+5, 6.27959815e+4},
2945                           {1.37543304e+6,-3.65808988e+6, 5.47798999e+6,-3.78109283e+6, 1.84131765e+6, 1.53669695e+4,-6.96817834e+4},
2946                           {-8.56559835e+5, 2.48872266e+6,-4.07349128e+6, 3.12835899e+6, -1.62394090e+6, 1.19797378e+5, 4.25737058e+4},
2947                           {3.28723311e+5,-1.09892175e+6, 2.03997269e+6,-1.77185718e+6, 9.96051545e+5,-1.53305699e+5,-1.12982954e+4},
2948                           {4.15850238e+4, 7.29653408e+4,-4.93776346e+5, 6.01254680e+5, -4.01308292e+5, 9.65968391e+4,-3.49596027e+3},
2949                           {-1.82751044e+5, 3.91386300e+5,-3.03639248e+5, 1.15782417e+5, -4.24399280e+3,-6.11477247e+3, 3.66982647e+2}};
2950
2951  const G4int sizex = 5;
2952  const G4int sizey = 6;
2953  const G4int sizez = 4;
2954
2955  G4double egscof[sizey][sizey][sizez];
2956
2957  G4double egs1[sizey][sizex] = {{1.927813e5, 7.666859e5, 6.628436e5, 1.586504e5,-7.786476e3},
2958                                 {-4.499687e5,-1.784644e6,-1.546968e6,-4.020658e5,-3.929522e3},
2959                                 {4.667741e5, 1.849838e6, 1.641313e6, 5.229787e5, 5.928137e4},
2960                                 {-3.017927e5,-1.206483e6,-1.124685e6,-4.478641e5,-8.682323e4},
2961                                 {1.226517e5, 5.015667e5, 5.032605e5, 2.404477e5, 5.603301e4},
2962                                 {-1.752824e4,-7.411621e4,-7.989019e4,-4.175486e4,-1.024194e4}};
2963
2964  G4double egs2[sizey][sizex] = {{-6.459162e5,-2.903581e6,-3.048551e6,-1.004411e6,-6.558220e4},
2965                                 {1.469853e6, 6.564615e6, 6.843078e6, 2.280839e6, 1.802023e5},
2966                                 {-1.435116e6,-6.322470e6,-6.531834e6,-2.298744e6,-2.639612e5},
2967                                 {8.665296e5, 3.769159e6, 3.899685e6, 1.520520e6, 2.498728e5},     
2968                                 {-3.302885e5,-1.429313e6,-1.512075e6,-6.744828e5,-1.398771e5},
2969                                 {4.958167e4, 2.178202e5, 2.400617e5, 1.167815e5, 2.663901e4}};
2970
2971  G4double egs3[sizey][sizex] = {{3.117030e5, 1.195474e6, 9.036289e5, 6.876190e4,-6.814556e4},
2972                                 {-7.394913e5,-2.826468e6,-2.152757e6,-2.459553e5, 1.101414e5},
2973                                 {7.918994e5, 3.030439e6, 2.412611e6, 5.228065e5, 8.542465e3},
2974                                 {-5.421004e5,-2.102672e6,-1.813959e6,-6.251700e5,-1.184348e5},
2975                                 {2.370771e5, 9.459043e5, 9.026235e5, 4.116799e5, 1.001348e5},
2976                                 {-4.227664e4,-1.738756e5,-1.795906e5,-9.292141e4,-2.397528e4}};
2977
2978  G4double egs4[sizey][sizex] = {{-1.072763e5,-5.973532e5,-6.151814e5, 7.371898e4, 1.255490e5},
2979                                 {2.298769e5, 1.265001e6, 1.252798e6,-2.306276e5,-2.845824e5},
2980                                 {-2.093664e5,-1.100874e6,-1.009313e6, 2.705945e5, 2.506562e5},
2981                                 {1.274613e5, 6.190307e5, 5.262822e5,-1.336039e5,-1.115865e5},
2982                                 {-5.715764e4,-2.560989e5,-2.228781e5,-3.222789e3, 1.575670e4},
2983                                 {1.189447e4, 5.161815e4, 4.870290e4, 1.266808e4, 2.069603e3}};
2984
2985  for(i = 0; i < sizey; i++) {
2986    for(j = 0; j < sizex; j++) {
2987      //       egscof[i][j][0] = egs1[i][j];
2988      //       egscof[i][j][1] = egs2[i][j];
2989      //       egscof[i][j][2] = egs3[i][j];
2990      //       egscof[i][j][3] = egs4[i][j];
2991      egscof[i][j][0] = egs1[i][j];
2992      egscof[i][j][1] = egs2[i][j];
2993      egscof[i][j][2] = egs3[i][j];
2994      egscof[i][j][3] = egs4[i][j];
2995    }
2996  }
2997
2998  // the program starts here                                           
2999  if (iz < 19  ||  iz > 111) {
3000    goto barfit900;
3001  }
3002
3003  if(iz > 102   &&  il > 0) {
3004    goto barfit902;
3005  }
3006
3007  z=double(iz);
3008  a=double(ia);
3009  el=double(il);
3010  amin= 1.2e0*z + 0.01e0*z*z;
3011  amax= 5.8e0*z - 0.024e0*z*z;
3012
3013  if(<  amin  ||  a  >  amax) {
3014    goto barfit910;
3015  }
3016
3017  // angul.mom.zero barrier                 
3018  aa=2.5e-3*a;
3019  zz=1.0e-2*z;
3020  ell=1.0e-2*el;
3021  bfis0 = 0.0;
3022  lpoly(zz,7,pz);
3023  lpoly(aa,7,pa);
3024
3025  for(i = 0; i < 7; i++) { //do 10 i=1,7                                                       
3026    for(j = 0; j < 7; j++) { //do 10 j=1,7                                                       
3027      bfis0=bfis0+elzcof[j][i]*pz[i]*pa[j];
3028      //bfis0=bfis0+elzcof[i][j]*pz[j]*pa[i];
3029    }
3030  }
3031
3032  bfis=bfis0;
3033 
3034  (*sbfis)=bfis;
3035  egs=0.0;
3036  (*segs)=egs;
3037
3038  // values of l at which the barrier       
3039  // is 20%(el20) and 80%(el80) of l=0 value   
3040  amin2 = 1.4e0*z + 0.009e0*z*z;
3041  amax2 = 20.e0 + 3.0e0*z;
3042
3043  if((a < amin2-5.e0  ||  a > amax2+10.e0) &&  il > 0) {
3044    goto barfit920;
3045  }
3046
3047  lpoly(zz,5,pz);
3048  lpoly(aa,4,pa);
3049  el80=0.0;
3050  el20=0.0;
3051  elmax=0.0;
3052
3053  for(i = 0; i < 4; i++) {
3054    for(j = 0; j < 5; j++) {
3055//       el80 = el80 + elmcof[j][i]*pz[j]*pa[i];
3056//       el20 = el20 + emncof[j][i]*pz[j]*pa[i];
3057            el80 = el80 + elmcof[i][j]*pz[j]*pa[i];
3058            el20 = el20 + emncof[i][j]*pz[j]*pa[i];
3059    }
3060  }
3061
3062  sel80 = el80;
3063  sel20 = el20;
3064
3065  // value of l (elmax) where barrier disapp.
3066  lpoly(zz,6,pz);
3067  lpoly(ell,9,pl);
3068
3069  for(i = 0; i < 4; i++) { //do 30 i= 1,4                                                     
3070    for(j = 0; j < 6; j++) { //do 30 j=1,6                                                       
3071      //elmax = elmax + emxcof[j][i]*pz[j]*pa[i];
3072      //      elmax = elmax + emxcof[j][i]*pz[i]*pa[j];
3073      elmax = elmax + emxcof[i][j]*pz[j]*pa[i];
3074    }
3075  }
3076
3077  (*selmax)=elmax;
3078
3079  // value of barrier at ang.mom.  l         
3080  if(il < 1){
3081    return;                                               
3082  }
3083
3084  x = sel20/(*selmax);
3085  y = sel80/(*selmax);
3086 
3087  if(el <= sel20) {
3088    // low l             
3089    q = 0.2/(std::pow(sel20,2)*std::pow(sel80,2)*(sel20-sel80));
3090    qa = q*(4.0*std::pow(sel80,3) - std::pow(sel20,3));
3091    qb = -q*(4.0*std::pow(sel80,2) - std::pow(sel20,2));
3092    bfis = bfis*(1.0 + qa*std::pow(el,2) + qb*std::pow(el,3));
3093  }
3094  else {
3095    // high l             
3096    aj = (-20.0*std::pow(x,5) + 25.e0*std::pow(x,4) - 4.0)*std::pow((y-1.0),2)*y*y;
3097    ak = (-20.0*std::pow(y,5) + 25.0*std::pow(y,4) - 1.0) * std::pow((x-1.0),2)*x*x;
3098    q = 0.2/(std::pow((y-x)*((1.0-x)*(1.0-y)*x*y),2));
3099    qa = q*(aj*y - ak*x);
3100    qb = -q*(aj*(2.0*y + 1.0) - ak*(2.0*x + 1.0));
3101    z = el/(*selmax);
3102    a1 = 4.0*std::pow(z,5) - 5.0*std::pow(z,4) + 1.0;
3103    a2 = qa*(2.e0*z + 1.e0);
3104    bfis=bfis*(a1 + (z - 1.e0)*(a2 + qb*z)*z*z*(z - 1.e0));
3105  }
3106 
3107  if(bfis <= 0.0) {
3108    bfis=0.0;
3109  }
3110
3111  if(el > (*selmax)) {
3112    bfis=0.0;
3113  }
3114  (*sbfis)=bfis;
3115
3116  // now calculate rotating ground state energy                       
3117  if(el > (*selmax)) {
3118    return;                                           
3119  }
3120
3121  for(k = 0; k < 4; k++) {
3122    for(l = 0; l < 6; l++) {
3123      for(m = 0; m < 5; m++) {
3124        //egs = egs + egscof[l][m][k]*pz[l]*pa[k]*pl[2*m-1];
3125        egs = egs + egscof[l][m][k]*pz[l]*pa[k]*pl[2*m];
3126        // egs = egs + egscof[m][l][k]*pz[l]*pa[k]*pl[2*m-1];
3127      }
3128    }
3129  }
3130
3131  (*segs)=egs;
3132  if((*segs) < 0.0) {
3133    (*segs)=0.0;
3134  }
3135
3136  return;                                                           
3137
3138 barfit900:  //continue                                                         
3139  (*sbfis)=0.0;
3140  // for z<19 sbfis set to 1.0e3                                           
3141  if (iz < 19)  {
3142    (*sbfis) = 1.0e3;
3143  }
3144  (*segs)=0.0;
3145  (*selmax)=0.0;
3146  return;                                                           
3147
3148 barfit902:
3149  (*sbfis)=0.0;
3150  (*segs)=0.0;
3151  (*selmax)=0.0;
3152  return;                                                           
3153
3154 barfit910:
3155  (*sbfis)=0.0;
3156  (*segs)=0.0;
3157  (*selmax)=0.0;
3158  return;                                                           
3159
3160 barfit920:
3161  (*sbfis)=0.0;
3162  (*segs)=0.0;
3163  (*selmax)=0.0;
3164  return;                                                           
3165}
3166
3167G4double G4Abla::expohaz(G4int k, G4double T)
3168{
3169  // TIRAGE ALEATOIRE DANS UNE EXPONENTIELLLE : Y=EXP(-X/T)
3170
3171  return (-1.0*T*std::log(haz(k)));
3172}
3173
3174G4double G4Abla::fd(G4double E)
3175{
3176  // DISTRIBUTION DE MAXWELL
3177
3178  return (E*std::exp(-E));
3179}
3180
3181G4double G4Abla::f(G4double E)
3182{
3183  // FONCTION INTEGRALE DE FD(E)
3184  return (1.0 - (E + 1.0) * std::exp(-E));
3185}
3186
3187G4double G4Abla::fmaxhaz(G4double T)
3188{
3189  // tirage aleatoire dans une maxwellienne
3190  // t : temperature
3191  //
3192  // declaration des variables
3193  //
3194
3195  const int pSize = 101;
3196  static G4double p[pSize];
3197
3198  // ial generateur pour le cascade (et les iy pour eviter les correlations)
3199  static G4int i = 0;
3200  static G4int itest = 0;
3201  // programme principal
3202
3203  // calcul des p(i) par approximation de newton
3204  p[pSize-1] = 8.0;
3205  G4double x = 0.1;
3206  G4double x1 = 0.0;
3207  G4double y = 0.0;
3208
3209  if (itest == 1) {
3210    goto fmaxhaz120;
3211  }
3212
3213  for(i = 1; i <= 99; i++) {
3214  fmaxhaz20:
3215    x1 = x - (f(x) - double(i)/100.0)/fd(x);
3216    x = x1;
3217    if (std::fabs(f(x) - double(i)/100.0) < 1e-5) {
3218      goto fmaxhaz100;
3219    }
3220    goto fmaxhaz20;
3221  fmaxhaz100:
3222    p[i] = x;
3223  } //end do
3224
3225  //  itest = 1;
3226  itest = 0;
3227  // tirage aleatoire et calcul du x correspondant
3228  // par regression lineaire
3229 fmaxhaz120:
3230    y = randomGenerator->getRandom();
3231  //  standardRandom(&y, &(hazard->igraine[17]));
3232  i = nint(y*100);
3233
3234  //   2590     c ici on evite froidement les depassements de tableaux....(a.b. 3/9/99)       
3235  if(i == 0) {
3236    goto fmaxhaz120;
3237  }
3238
3239  if (i == 1) {
3240    x = p[i]*y*100;
3241  }
3242  else {
3243    x = (p[i] - p[i-1])*(y*100 - i) + p[i];
3244  }
3245
3246  return(x*T);
3247}
3248
3249G4double G4Abla::pace2(G4double a, G4double z)
3250{
3251  // PACE2
3252  // Cette fonction retourne le defaut de masse du noyau A,Z en MeV
3253  // Révisée pour a, z flottants 25/4/2002                           =
3254
3255  G4double pace2 = 0.0;
3256
3257  G4int ii = idint(a+0.5);
3258  G4int jj = idint(z+0.5);
3259
3260  if(ii <= 0 || jj < 0) {
3261    pace2=0.;
3262    return pace2;
3263  }
3264
3265  if(jj > 300) {
3266    pace2=0.0;
3267  }
3268  else {
3269    pace2=pace->dm[ii][jj];
3270  }
3271  pace2=pace2/1000.;
3272
3273  if(pace->dm[ii][jj] == 0.) {
3274    if(ii < 12) {
3275      pace2=-500.;
3276    }
3277    else {
3278      guet(&a, &z, &pace2);
3279      pace2=pace2-ii*931.5;
3280      pace2=pace2/1000.;
3281    }
3282  }
3283
3284  return pace2;
3285}
3286
3287void G4Abla::guet(G4double *x_par, G4double *z_par, G4double *find_par)
3288{
3289  // TABLE DE MASSES ET FORMULE DE MASSE TIRE DU PAPIER DE BRACK-GUET
3290  // Gives the theoritical value for mass excess...
3291  // Révisée pour x, z flottants 25/4/2002
3292
3293  //real*8 x,z
3294  //    dimension q(0:50,0:70)
3295  G4double x = (*x_par);
3296  G4double z = (*z_par);
3297  G4double find = (*find_par);
3298
3299  const G4int qrows = 50;
3300  const G4int qcols = 70;
3301  G4double q[qrows][qcols];
3302  for(G4int init_i = 0; init_i < qrows; init_i++) {
3303    for(G4int init_j = 0; init_j < qcols; init_j++) {
3304      q[init_i][init_j] = 0.0;
3305    }
3306  }
3307
3308  G4int ix=G4int(std::floor(x+0.5));
3309  G4int iz=G4int(std::floor(z+0.5));
3310  G4double zz = iz;
3311  G4double xx = ix;
3312  find = 0.0;
3313  G4double avol = 15.776;
3314  G4double asur = -17.22;
3315  G4double ac = -10.24;
3316  G4double azer = 8.0;
3317  G4double xjj = -30.03;
3318  G4double qq = -35.4;
3319  G4double c1 = -0.737;
3320  G4double c2 = 1.28;
3321
3322  if(ix <= 7) {
3323    q[0][1]=939.50;
3324    q[1][1]=938.21;
3325    q[1][2]=1876.1;
3326    q[1][3]=2809.39;
3327    q[2][4]=3728.34;
3328    q[2][3]=2809.4;
3329    q[2][5]=4668.8;
3330    q[2][6]=5606.5;
3331    q[3][5]=4669.1;
3332    q[3][6]=5602.9;
3333    q[3][7]=6535.27;
3334    q[4][6]=5607.3;
3335    q[4][7]=6536.1;
3336    q[5][7]=6548.3;
3337    find=q[iz][ix];
3338  }
3339  else {
3340    G4double xneu=xx-zz;
3341    G4double si=(xneu-zz)/xx;
3342    G4double x13=std::pow(xx,.333);
3343    G4double ee1=c1*zz*zz/x13;
3344    G4double ee2=c2*zz*zz/xx;
3345    G4double aux=1.+(9.*xjj/4./qq/x13);
3346    G4double ee3=xjj*xx*si*si/aux;
3347    G4double ee4=avol*xx+asur*(std::pow(xx,.666))+ac*x13+azer;
3348    G4double tota = ee1 + ee2 + ee3 + ee4;
3349    find = 939.55*xneu+938.77*zz - tota;
3350  }
3351
3352  (*x_par) = x;
3353  (*z_par) = z;
3354  (*find_par) = find;
3355}
3356
3357//       SUBROUTINE TRANSLAB(GAMREM,ETREM,CSREM,NOPART,NDEC)
3358void G4Abla::translab(G4double gamrem, G4double etrem, G4double csrem[4], G4int nopart, G4int ndec)
3359{
3360  // c Ce subroutine transforme dans un repere 1 les impulsions pcv des
3361  // c particules acv, zcv et de cosinus directeurs xcv, ycv, zcv calculees
3362  // c dans un repere 2.   
3363  // c La transformation de lorentz est definie par GAMREM (gamma) et
3364  // c ETREM (eta). La direction  du repere 2 dans 1 est donnees par les
3365  // c cosinus directeurs ALREM,BEREM,GAREM (axe oz du repere 2).
3366  // c L'axe oy(2) est fixe par le produit vectoriel oz(1)*oz(2).
3367  // c Le calcul est fait pour les particules de NDEC a iv du common volant.
3368  // C Resultats dans le NTUPLE (common VAR_NTP) decale de NOPART (cascade).
3369   
3370  //       REAL*8  GAMREM,ETREM,ER,PLABI(3),PLABF(3),R(3,3)
3371  //       real*8  MASSE,PTRAV2,CSREM(3),UMA,MELEC,EL
3372  //       real*4 acv,zpcv,pcv,xcv,ycv,zcv
3373  //       common/volant/acv(200),zpcv(200),pcv(200),xcv(200),
3374  //      s              ycv(200),zcv(200),iv
3375     
3376  //    parameter (max=250)                                                                       
3377  //    real*4 EXINI,ENERJ,BIMPACT,PLAB,TETLAB,PHILAB,ESTFIS
3378  //    integer AVV,ZVV,JREMN,KFIS,IZFIS,IAFIS
3379  //         common/VAR_NTP/MASSINI,MZINI,EXINI,MULNCASC,MULNEVAP,
3380  //      +MULNTOT,BIMPACT,JREMN,KFIS,ESTFIS,IZFIS,IAFIS,NTRACK,
3381  //      +ITYPCASC(max),AVV(max),ZVV(max),ENERJ(max),PLAB(max),
3382  //      +TETLAB(max),PHILAB(max)
3383     
3384  //       DATA UMA,MELEC/931.4942,0.511/
3385
3386  // C Matrice de rotation dans le labo:
3387  G4double avv = 0.0, zvv = 0.0, enerj = 0.0, plab = 0.0, tetlab = 0.0, philab = 0.0;
3388  G4int itypcasc = 0;
3389  G4double sitet = std::sqrt(std::pow(csrem[1],2)+std::pow(csrem[2],2));
3390  G4double cstet = 0.0, siphi = 0.0, csphi = 0.0;
3391  G4double R[4][4];
3392  for(G4int init_i = 0; init_i < 4; init_i++) {
3393    for(G4int init_j = 0; init_j < 4; init_j++) {
3394      R[init_i][init_j] = 0.0;
3395    }
3396  }
3397  if(verboseLevel > 1)
3398    G4cout <<"csrem = " << csrem[1] << ", " << csrem[2] << ", " << csrem[3] << ")" << G4endl;
3399  if(sitet > 1.0e-6) { //then
3400    cstet = csrem[3];
3401    siphi = csrem[2]/sitet;
3402    csphi = csrem[1]/sitet;     
3403
3404    R[1][1] = cstet*csphi;
3405    R[1][2] = -siphi;
3406    R[1][3] = sitet*csphi;
3407    R[2][1] = cstet*siphi;
3408    R[2][2] = csphi;
3409    R[2][3] = sitet*siphi;
3410    R[3][1] = -sitet;
3411    R[3][2] = 0.0;
3412    R[3][3] = cstet;
3413  }
3414  else {
3415    R[1][1] = 1.0;
3416    R[1][2] = 0.0;
3417    R[1][3] = 0.0;
3418    R[2][1] = 0.0;
3419    R[2][2] = 1.0;
3420    R[2][3] = 0.0;
3421    R[3][1] = 0.0;
3422    R[3][2] = 0.0;
3423    R[3][3] = 1.0;
3424  } //endif
3425
3426  G4int intp = 0;
3427  G4double el = 0.0;
3428  G4double masse = 0.0;
3429  G4double er = 0.0;
3430  G4double plabi[4];
3431  G4double ptrav2 = 0.0;
3432  G4double plabf[4];
3433  G4double bidon = 0.0;
3434  for(G4int init_i = 0; init_i < 4; init_i++) {
3435    plabi[init_i] = 0.0;
3436    plabf[init_i] = 0.0;
3437  }
3438  ndec = 1;
3439  for(G4int i = ndec; i <= volant->iv; i++) { //do i=ndec,iv
3440    intp = i + nopart;
3441    if(volant->copied[i]) continue; // Avoid double copying
3442#ifdef USE_LEGACY_CODE
3443    varntp->ntrack = varntp->ntrack + 1;
3444#endif
3445    if(nint(volant->acv[i]) == 0 && nint(volant->zpcv[i]) == 0) {
3446      if(verboseLevel > -1) {
3447        G4cout << __FILE__ << ":" << __LINE__ << " Error: Particles with A = 0 Z = 0 detected! " << G4endl;
3448      }
3449      continue;
3450    }
3451    if(varntp->ntrack >= VARNTPSIZE) {
3452      if(verboseLevel > 2) {
3453        G4cout <<"Error! Output data structure not big enough!" << G4endl;
3454      }
3455    }
3456#ifdef USE_LEGACY_CODE
3457    varntp->avv[intp] = nint(volant->acv[i]);
3458    varntp->zvv[intp] = nint(volant->zpcv[i]);
3459    varntp->itypcasc[intp] = 0;   
3460#else
3461    avv = nint(volant->acv[i]);
3462    zvv = nint(volant->zpcv[i]);
3463    itypcasc = 0;   
3464#endif
3465    // transformation de lorentz remnan --> labo:
3466#ifdef USE_LEGACY_CODE
3467    if (varntp->avv[intp] == -1) { //then
3468#else
3469    if(avv == -1) {
3470#endif
3471      masse = 138.00;   // cugnon
3472      // c              if (avv(intp).eq.1)  masse=938.2796     !cugnon
3473      // c              if (avv(intp).eq.4)  masse=3727.42      !ok
3474    }
3475    else {
3476      mglms(double(volant->acv[i]),double(volant->zpcv[i]),0, &el);
3477      masse = volant->zpcv[i]*938.27 + (volant->acv[i] - volant->zpcv[i])*939.56 + el;
3478    } //end if
3479       
3480    er = std::sqrt(std::pow(volant->pcv[i],2) + std::pow(masse,2));
3481    plabi[1] = volant->pcv[i]*(volant->xcv[i]);
3482    plabi[2] = volant->pcv[i]*(volant->ycv[i]);
3483    plabi[3] = er*etrem + gamrem*(volant->pcv[i])*(volant->zcv[i]);
3484       
3485    ptrav2 = std::pow(plabi[1],2) + std::pow(plabi[2],2) + std::pow(plabi[3],2);
3486#ifdef USE_LEGACY_CODE
3487    varntp->plab[intp] = std::sqrt(ptrav2); 
3488#else
3489    plab = std::sqrt(ptrav2);
3490#endif
3491#ifdef USE_LEGACY_CODE
3492    if(std::abs(varntp->plab[intp] - 122.009) < 1.0e-3) {
3493      G4cout <<__FILE__ << ":" << __LINE__ << " Error: varntp->plab["<< intp <<"] = " << varntp->plab[intp] << G4endl;
3494     
3495      volant->dump();
3496      varntp->dump();
3497#
3498      G4cout <<"varntp->plab[intp] = " << varntp->plab[intp] << G4endl;
3499      G4cout <<"ndec (starting index for loop) = " << ndec << G4endl;
3500      G4cout <<"volant->iv (stopping index for loop) = " << volant->iv << G4endl;
3501      G4cout <<"i (current position) = " << i << G4endl;
3502      G4cout <<"intp (index for writing to varntp) = " << intp << G4endl;
3503      //      exit(0);
3504    }
3505#endif
3506
3507#ifdef USE_LEGACY_CODE
3508    varntp->enerj[intp] = std::sqrt(ptrav2 + std::pow(masse,2)) - masse;
3509#else
3510    enerj = std::sqrt(ptrav2 + std::pow(masse,2)) - masse;
3511#endif
3512    // Rotation dans le labo:
3513    for(G4int j = 1; j <= 3; j++) { //do j=1,3
3514      plabf[j] = 0.0;
3515      for(G4int k = 1; k <= 3; k++) { //do k=1,3
3516        //plabf[j] = plabf[j] + R[k][j]*plabi[k]; // :::Fixme::: (indices?)
3517        plabf[j] = plabf[j] + R[j][k]*plabi[k]; // :::Fixme::: (indices?)
3518      } // end do
3519    }  // end do
3520    // C impulsions dans le nouveau systeme copiees dans /volant/
3521#ifdef USE_LEGACY_CODE
3522    volant->pcv[i] = varntp->plab[intp];
3523#else
3524    volant->pcv[i] = plab;
3525#endif
3526    ptrav2 = std::sqrt(std::pow(plabf[1],2) + std::pow(plabf[2],2) + std::pow(plabf[3],2));
3527    if(ptrav2 >= 1.0e-6) { //then
3528      volant->xcv[i] = plabf[1]/ptrav2;
3529      volant->ycv[i] = plabf[2]/ptrav2;
3530      volant->zcv[i] = plabf[3]/ptrav2;
3531    }
3532    else {
3533      volant->xcv[i] = 1.0;
3534      volant->ycv[i] = 0.0;
3535      volant->zcv[i] = 0.0;
3536    } //endif
3537    // impulsions dans le nouveau systeme copiees dans /VAR_NTP/       
3538#ifdef USE_LEGACY_CODE
3539    if(varntp->plab[intp] >= 1.0e-6) { //then
3540#else
3541    if(plab >= 1.0e-6) { //then
3542#endif
3543#ifdef USE_LEGACY_CODE
3544      bidon = plabf[3]/(varntp->plab[intp]);
3545#else
3546      bidon = plabf[3]/plab;
3547#endif
3548      if(bidon > 1.0) { 
3549        bidon = 1.0;
3550      }
3551      if(bidon < -1.0) {
3552        bidon = -1.0;
3553      }
3554#ifdef USE_LEGACY_CODE
3555      varntp->tetlab[intp] = std::acos(bidon);
3556      sitet = std::sin(varntp->tetlab[intp]);
3557      varntp->philab[intp] = std::atan2(plabf[2],plabf[1]);       
3558      varntp->tetlab[intp] = varntp->tetlab[intp]*57.2957795;
3559      varntp->philab[intp] = varntp->philab[intp]*57.2957795;
3560#else
3561      tetlab = std::acos(bidon);
3562      sitet = std::sin(tetlab);
3563      philab = std::atan2(plabf[2],plabf[1]);       
3564      tetlab = tetlab*57.2957795;
3565      philab = philab*57.2957795;
3566#endif
3567    }
3568    else {
3569#ifdef USE_LEGACY_CODE
3570      varntp->tetlab[intp] = 90.0;
3571      varntp->philab[intp] = 0.0;
3572#else
3573      tetlab = 90.0;
3574      philab = 0.0;
3575#endif
3576    } // endif
3577    volant->copied[i] = true;
3578#ifndef USE_LEGACY_CODE
3579    varntp->addParticle(avv, zvv, enerj, plab, tetlab, philab);
3580#else
3581    G4cout <<__FILE__ << ":" << __LINE__ << " volant -> varntp: " << " intp = " << intp << "Avv = " << varntp->avv[intp] << " Zvv = " << varntp->zvv[intp] << " Plab = " << varntp->plab[intp] << G4endl;
3582    G4cout <<__FILE__ << ":" << __LINE__ << " volant index i = " << i << " varnpt index intp = " << intp << G4endl;
3583#endif
3584  } // end do
3585}
3586// C-------------------------------------------------------------------------
3587
3588//       SUBROUTINE TRANSLABPF(MASSE1,T1,P1,CTET1,PHI1,GAMREM,ETREM,R,
3589//      s   PLAB1,GAM1,ETA1,CSDIR)
3590void G4Abla::translabpf(G4double masse1, G4double t1, G4double p1, G4double ctet1,
3591                        G4double phi1, G4double gamrem, G4double etrem, G4double R[][4],
3592                        G4double *plab1, G4double *gam1, G4double *eta1, G4double csdir[])
3593{
3594  // C Calcul de l'impulsion du PF (PLAB1, cos directeurs CSDIR(3)) dans le
3595  // C systeme remnant et des coefs de Lorentz GAM1,ETA1 de passage 
3596  // c du systeme PF --> systeme remnant.
3597  // c
3598  // C Input: MASSE1, T1 (energie cinetique), CTET1,PHI1 (cosTHETA et PHI)
3599  // C                    (le PF dans le systeme du Noyau de Fission (NF)).
3600  // C   GAMREM,ETREM les coefs de Lorentz systeme NF --> syst remnant,
3601  // C        R(3,3) la matrice de rotation systeme NF--> systeme remnant.
3602  // C
3603  // C     
3604  //            REAL*8 MASSE1,T1,P1,CTET1,PHI1,GAMREM,ETREM,R(3,3),
3605  //      s   PLAB1,GAM1,ETA1,CSDIR(3),ER,SITET,PLABI(3),PLABF(3)
3606     
3607  G4double er = t1 + masse1;
3608       
3609  G4double sitet = std::sqrt(1.0 - std::pow(ctet1,2));
3610
3611  G4double plabi[4];
3612  G4double plabf[4];
3613  for(G4int init_i = 0; init_i < 4; init_i++) {
3614    plabi[init_i] = 0.0;
3615    plabf[init_i] = 0.0;
3616  }
3617
3618  // C ----Transformation de Lorentz Noyau fissionnant --> Remnant:     
3619  plabi[1] = p1*sitet*std::cos(phi1);
3620  plabi[2] = p1*sitet*std::sin(phi1);
3621  plabi[3] = er*etrem + gamrem*p1*ctet1;
3622 
3623  // C ----Rotation du syst Noyaut Fissionant vers syst remnant:
3624  for(G4int j = 1; j <= 3; j++) { // do j=1,3
3625    plabf[j] = 0.0;
3626    for(G4int k = 1; k <= 3; k++) { //do k=1,3
3627      plabf[j] = plabf[j] + R[j][k]*plabi[k];
3628      //plabf[j] = plabf[j] + R[k][j]*plabi[k];
3629    } //end do
3630  } //end do
3631  // C ----Cosinus directeurs et coefs de la transf de Lorentz dans le
3632  // c     nouveau systeme:     
3633  (*plab1) = std::pow(plabf[1],2) + std::pow(plabf[2],2) + std::pow(plabf[3],2);
3634  (*gam1) = std::sqrt(std::pow(masse1,2) + (*plab1))/masse1;
3635  (*plab1) = std::sqrt((*plab1));
3636  (*eta1) = (*plab1)/masse1;
3637
3638  if((*plab1) <= 1.0e-6) { //then
3639    csdir[1] = 0.0;
3640    csdir[2] = 0.0;
3641    csdir[3] = 1.0;
3642  }
3643  else {   
3644    for(G4int i = 1; i <= 3; i++) { //do i=1,3
3645      csdir[i] = plabf[i]/(*plab1);
3646    } // end do
3647  } //endif
3648}
3649
3650//       SUBROUTINE LOR_AB(GAM,ETA,Ein,Pin,Eout,Pout)
3651void G4Abla::lorab(G4double gam, G4double eta, G4double ein, G4double pin[],
3652                   G4double *eout, G4double pout[])
3653{
3654  // C  Transformation de lorentz brute pour vérifs.
3655  // C  P(3) = P_longitudinal (transformé)
3656  // C  P(1) et P(2) = P_transvers (non transformés)
3657  //       DIMENSION Pin(3),Pout(3)
3658  //       REAL*8 GAM,ETA,Ein
3659
3660  pout[1] = pin[1];
3661  pout[2] = pin[2]; 
3662  (*eout) = gam*ein + eta*pin[3];
3663  pout[3] = eta*ein + gam*pin[3];
3664}
3665
3666//       SUBROUTINE ROT_AB(R,Pin,Pout)
3667void G4Abla::rotab(G4double R[4][4], G4double pin[4], G4double pout[4])
3668{
3669  // C  Rotation d'un vecteur
3670  //       DIMENSION Pin(3),Pout(3)
3671  //       REAL*8 R(3,3)
3672     
3673  for(G4int i = 1; i <= 3; i++) { // do i=1,3
3674    pout[i] = 0.0;
3675    for(G4int j = 1; j <= 3; j++) { //do j=1,3
3676      pout[i] = pout[i] + R[i][j]*pin[j];
3677      //pout[i] = pout[i] + R[j][i]*pin[j];
3678    } // enddo
3679  } //enddo
3680}
3681
3682// Methods related to the internal ABLA random number generator. In
3683// the future the random number generation must be factored into its
3684// own class
3685
3686void G4Abla::standardRandom(G4double *rndm, G4long *seed)
3687{
3688  (*seed) = (*seed); // Avoid warning during compilation.
3689  // Use Geant4 G4UniformRand
3690  (*rndm) = randomGenerator->getRandom();
3691}
3692
3693G4double G4Abla::haz(G4int k)
3694{
3695  const G4int pSize = 110;
3696  static G4double p[pSize];
3697  static G4long ix = 0, i = 0;
3698  static G4double x = 0.0, y = 0.0, a = 0.0, haz = 0.0;
3699  //  k =< -1 on initialise                                       
3700  //  k = -1 c'est reproductible                                   
3701  //  k < -1 || k > -1 ce n'est pas reproductible
3702
3703  // Zero is invalid random seed. Set proper value from our random seed collection:
3704  if(ix == 0) {
3705    ix = hazard->ial;
3706  }
3707
3708  if (k <= -1) { //then                                             
3709    if(k == -1) { //then                                           
3710      ix = 0;
3711    }
3712    else {
3713      x = 0.0;
3714      y = secnds(int(x));
3715      ix = int(y * 100 + 43543000);
3716      if(mod(ix,2) == 0) {
3717        ix = ix + 1;
3718      }
3719    }
3720
3721    // Here we are using random number generator copied from INCL code
3722    // instead of the CERNLIB one! This causes difficulties for
3723    // automatic testing since the random number generators, and thus
3724    // the behavior of the routines in C++ and FORTRAN versions is no
3725    // longer exactly the same!
3726    x = randomGenerator->getRandom();
3727    //    standardRandom(&x, &ix);
3728    for(G4int i = 0; i < pSize; i++) { //do i=1,110                                                 
3729      p[i] = randomGenerator->getRandom();
3730      //      standardRandom(&(p[i]), &ix);
3731    }
3732    a = randomGenerator->getRandom();
3733    standardRandom(&a, &ix);
3734    k = 0;
3735  }
3736
3737  i = nint(100*a)+1;
3738  haz = p[i];
3739  a = randomGenerator->getRandom();
3740  //  standardRandom(&a, &ix);
3741  p[i] = a;
3742
3743  hazard->ial = ix;
3744  return haz;
3745}
3746
3747// Utilities
3748
3749G4double G4Abla::min(G4double a, G4double b)
3750{
3751  if(a < b) {
3752    return a;
3753  }
3754  else {
3755    return b;
3756  }
3757}
3758
3759G4int G4Abla::min(G4int a, G4int b)
3760{
3761  if(a < b) {
3762    return a;
3763  }
3764  else {
3765    return b;
3766  }
3767}
3768
3769G4double G4Abla::max(G4double a, G4double b)
3770{
3771  if(a > b) {
3772    return a;
3773  }
3774  else {
3775    return b;
3776  }
3777}
3778
3779G4int G4Abla::max(G4int a, G4int b)
3780{
3781  if(a > b) {
3782    return a;
3783  }
3784  else {
3785    return b;
3786  }
3787}
3788
3789G4int G4Abla::nint(G4double number)
3790{
3791  G4double intpart = 0.0;
3792  G4double fractpart = 0.0;
3793  fractpart = std::modf(number, &intpart);
3794  if(number == 0) {
3795    return 0;
3796  }
3797  if(number > 0) {
3798    if(fractpart < 0.5) {
3799      return int(std::floor(number));
3800    }
3801    else {
3802      return int(std::ceil(number));
3803    }
3804  }
3805  if(number < 0) {
3806    if(fractpart < -0.5) {
3807      return int(std::floor(number));
3808    }
3809    else {
3810      return int(std::ceil(number));
3811    }
3812  }
3813
3814  return int(std::floor(number));
3815}
3816
3817G4int G4Abla::secnds(G4int x)
3818{
3819  time_t mytime;
3820  tm *mylocaltime;
3821
3822  time(&mytime);
3823  mylocaltime = localtime(&mytime);
3824
3825  if(x == 0) {
3826    return(mylocaltime->tm_hour*60*60 + mylocaltime->tm_min*60 + mylocaltime->tm_sec);
3827  }
3828  else {
3829    return(mytime - x);
3830  }
3831}
3832
3833G4int G4Abla::mod(G4int a, G4int b)
3834{
3835  if(b != 0) {
3836    return (a - (a/b)*b);
3837  }
3838  else {
3839    return 0;
3840  } 
3841}
3842
3843G4double G4Abla::dmod(G4double a, G4double b)
3844{
3845  if(b != 0) {
3846    return (a - (a/b)*b);
3847  }
3848  else {
3849    return 0.0;
3850  } 
3851}
3852
3853G4double G4Abla::dint(G4double a)
3854{
3855  G4double value = 0.0;
3856
3857  if(a < 0.0) {
3858    value = double(std::ceil(a));
3859  }
3860  else {
3861    value = double(std::floor(a));
3862  }
3863
3864  return value;
3865}
3866
3867G4int G4Abla::idint(G4double a)
3868{
3869  G4int value = 0;
3870
3871  if(a < 0) {
3872    value = int(std::ceil(a));
3873  }
3874  else {
3875    value = int(std::floor(a));
3876  }
3877
3878  return value;
3879}
3880
3881G4int G4Abla::idnint(G4double value)
3882{
3883  G4double valueCeil = int(std::ceil(value));
3884  G4double valueFloor = int(std::floor(value));
3885
3886  if(std::fabs(value - valueCeil) < std::fabs(value - valueFloor)) {
3887    return int(valueCeil);
3888  }
3889  else {
3890    return int(valueFloor);
3891  }
3892}
3893
3894G4double G4Abla::dmin1(G4double a, G4double b, G4double c)
3895{
3896  if(a < b && a < c) {
3897    return a;
3898  }
3899  if(b < a && b < c) {
3900    return b;
3901  }
3902  if(c < a && c < b) {
3903    return c;
3904  }
3905  return a;
3906}
3907
3908G4double G4Abla::utilabs(G4double a)
3909{
3910  if(a > 0) {
3911    return a;
3912  }
3913  if(a < 0) {
3914    return (-1*a);
3915  }
3916  if(a == 0) {
3917    return a;
3918  }
3919
3920  return a;
3921}
Note: See TracBrowser for help on using the repository browser.