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

Last change on this file was 1347, checked in by garnier, 14 years ago

geant4 tag 9.4

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